Update of /cvsroot/monetdb/sql/src/backends/monet5/merovingian
In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv21900

Modified Files:
        ChangeLog merovingian_proxy.c 
Log Message:
When a proxy connection is made to a local UNIX domain socket, pass on the 
filedescriptor instead of proxying.

Index: merovingian_proxy.c
===================================================================
RCS file: 
/cvsroot/monetdb/sql/src/backends/monet5/merovingian/merovingian_proxy.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- merovingian_proxy.c 17 Mar 2010 12:37:14 -0000      1.4
+++ merovingian_proxy.c 17 Mar 2010 14:06:16 -0000      1.5
@@ -115,8 +115,11 @@
                /* UNIX socket connect, don't proxy, but pass socket fd */
                struct sockaddr_un server;
                struct msghdr msg;
+               char ccmsg[CMSG_SPACE(sizeof(ssock))];
+               struct cmsghdr *cmsg;
                struct iovec vec;
                char buf[1];
+               int psock = getSock(cfdin);
 
                if ((ssock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
                        return(newErr("cannot open socket: %s", 
strerror(errno)));
@@ -129,60 +132,31 @@
                /* send first byte, nothing special to happen */
                msg.msg_name = (struct sockaddr*)&server;
                msg.msg_namelen = sizeof(server);
-               *buf = '0'; /* normal */
+               *buf = '1'; /* pass fd */
                vec.iov_base = buf;
                vec.iov_len = 1;
                msg.msg_iov = &vec;
                msg.msg_iovlen = 1;
-               msg.msg_control = NULL;
-               msg.msg_controllen = 0;
+               cmsg = CMSG_FIRSTHDR(&msg);
+               cmsg->cmsg_level = SOL_SOCKET;
+               cmsg->cmsg_type = SCM_RIGHTS;
+               cmsg->cmsg_len = CMSG_LEN(sizeof(psock));
+               *(int *)CMSG_DATA(cmsg) = psock;
+               msg.msg_control = ccmsg;
+               msg.msg_controllen = cmsg->cmsg_len;
                msg.msg_flags = 0;
 
+               Mfprintf(stdout, "target connection is on local UNIX domain 
socket, "
+                               "passing on filedescriptor instead of 
proxying\n");
                if (sendmsg(ssock, &msg, 0) < 0) {
                        close(ssock);
                        return(newErr("could not send initial byte: %s", 
strerror(errno)));
                }
+               close(psock);
                
-#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
+               close_stream(cfdin);
+               close_stream(cfout);
+               return(NO_ERR);
        } else {
                hp = gethostbyname(conn);
                if (hp == NULL)

Index: ChangeLog
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/merovingian/ChangeLog,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- ChangeLog   16 Mar 2010 11:44:29 -0000      1.34
+++ ChangeLog   17 Mar 2010 14:06:15 -0000      1.35
@@ -1,6 +1,10 @@
 # ChangeLog file for sql/src/backends/monet5
 # This file is updated with mchangelog (Gentoo echangelog bastard script)
 
+  17 Mar 2010; Fabian Groffen <[email protected]> merovingian_proxy.c:
+  When a proxy connection is made to a local UNIX domain socket, pass
+  on the filedescriptor instead of proxying.
+
   16 Mar 2010; Fabian Groffen <[email protected]>
   merovingian_forkmserver.c, merovingian_proxy.c:
   Use mserver5's UNIX domain socket support when Merovingian is supposed


------------------------------------------------------------------------------
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