Update of /cvsroot/monetdb/sql/src/backends/monet5/merovingian
In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv30205
Modified Files:
merovingian_proxy.c
Log Message:
send an initial byte (type '0' -- no ancillary data) for UNIX domain sockets,
such that we can talk with mserver5 properly again
Index: merovingian_proxy.c
===================================================================
RCS file:
/cvsroot/monetdb/sql/src/backends/monet5/merovingian/merovingian_proxy.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- merovingian_proxy.c 15 Mar 2010 14:51:47 -0000 1.3
+++ merovingian_proxy.c 17 Mar 2010 12:37:14 -0000 1.4
@@ -112,8 +112,12 @@
}
if (ssock != INVALID_SOCKET) {
+ /* UNIX socket connect, don't proxy, but pass socket fd */
struct sockaddr_un server;
- /* UNIX socket connect */
+ struct msghdr msg;
+ struct iovec vec;
+ char buf[1];
+
if ((ssock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
return(newErr("cannot open socket: %s",
strerror(errno)));
memset(&server, 0, sizeof(struct sockaddr_un));
@@ -121,6 +125,64 @@
strncpy(server.sun_path, conn, sizeof(server.sun_path) - 1);
if (connect(ssock, (SOCKPTR) &server, sizeof(struct
sockaddr_un)))
return(newErr("cannot connect: %s", strerror(errno)));
+
+ /* send first byte, nothing special to happen */
+ msg.msg_name = (struct sockaddr*)&server;
+ msg.msg_namelen = sizeof(server);
+ *buf = '0'; /* normal */
+ vec.iov_base = buf;
+ vec.iov_len = 1;
+ msg.msg_iov = &vec;
+ msg.msg_iovlen = 1;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ msg.msg_flags = 0;
+
+ if (sendmsg(ssock, &msg, 0) < 0) {
+ close(ssock);
+ return(newErr("could not send initial byte: %s",
strerror(errno)));
+ }
+
+#if 0
+ /* consume prompt */
+ sfdin = block_stream(socket_rastream(ssock,
"merovingian<-server (proxy read)"));
+ /* eat away server welcome */
+ stream_read_block(fdin, buf, sizeof(buf), 1);
+ /* write sock response */
+ sfout = block_stream(socket_wastream(ssock,
"merovingian->server (proxy write)"));
+ stream_printf(sfout, "SOCK:pass\n");
+ stream_flush(sfout);
+
+ int fd = getSock(cfdin);
+ char ccmsg[CMSG_SPACE(sizeof(fd))];
+ struct cmsghdr *cmsg;
+ struct iovec vec; /* must send at least one byte */
+ char *str = "x";
+ int rv;
+
+ msg.msg_name = (struct sockaddr*)&unix_socket_name;
+ msg.msg_namelen = sizeof(unix_socket_name);
+
+ vec.iov_base = str;
+ vec.iov_len = 1;
+ msg.msg_iov = &vec;
+ msg.msg_iovlen = 1;
+
+ msg.msg_control = ccmsg;
+ msg.msg_controllen = sizeof(ccmsg);
+ cmsg = CMSG_FIRSTHDR(&msg);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(fd));
+ *(int*)CMSG_DATA(cmsg) = fd;
+ msg.msg_controllen = cmsg->cmsg_len;
+
+ msg.msg_flags = 0;
+
+ rv = (sendmsg(ssock, &msg, 0) != -1);
+ if (rv) close(fd);
+ return rv;
+#endif
} else {
hp = gethostbyname(conn);
if (hp == NULL)
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins