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&#174; 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

Reply via email to