myserver-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myserver-commit] [2985] SocketPair can now transmit file descriptors.


From: Giuseppe Scrivano
Subject: [myserver-commit] [2985] SocketPair can now transmit file descriptors.
Date: Fri, 30 Jan 2009 22:38:37 +0000

Revision: 2985
          http://svn.sv.gnu.org/viewvc/?view=rev&root=myserver&revision=2985
Author:   gscrivano
Date:     2009-01-30 22:38:36 +0000 (Fri, 30 Jan 2009)

Log Message:
-----------
SocketPair can now transmit file descriptors.

Modified Paths:
--------------
    trunk/myserver/include/base/process/fork_server.h
    trunk/myserver/include/base/socket_pair/socket_pair.h
    trunk/myserver/src/base/socket_pair/socket_pair.cpp

Modified: trunk/myserver/include/base/process/fork_server.h
===================================================================
--- trunk/myserver/include/base/process/fork_server.h   2009-01-20 21:13:52 UTC 
(rev 2984)
+++ trunk/myserver/include/base/process/fork_server.h   2009-01-30 22:38:36 UTC 
(rev 2985)
@@ -53,6 +53,7 @@
   u_short getPort (){return port;}
   bool isInitialized (){return initialized;}
   int generateListenerSocket (Socket &socket, u_short *port);
+
  private:
   Mutex serverLock;
   u_short port;

Modified: trunk/myserver/include/base/socket_pair/socket_pair.h
===================================================================
--- trunk/myserver/include/base/socket_pair/socket_pair.h       2009-01-20 
21:13:52 UTC (rev 2984)
+++ trunk/myserver/include/base/socket_pair/socket_pair.h       2009-01-30 
22:38:36 UTC (rev 2985)
@@ -41,6 +41,9 @@
        void closeSecondHandle ();
   void setNonBlocking (bool blocking);
        virtual u_long bytesToRead();
+
+  int readHandle (FileHandle*);
+  int writeHandle (FileHandle);
 private:
        FileHandle handles[2];
 };

Modified: trunk/myserver/src/base/socket_pair/socket_pair.cpp
===================================================================
--- trunk/myserver/src/base/socket_pair/socket_pair.cpp 2009-01-20 21:13:52 UTC 
(rev 2984)
+++ trunk/myserver/src/base/socket_pair/socket_pair.cpp 2009-01-30 22:38:36 UTC 
(rev 2985)
@@ -33,6 +33,9 @@
 #include <string.h>
 #include <math.h>
 #include <time.h>
+
+#include <sys/socket.h>
+#include <sys/uio.h>
 }
 #else
 #include <windows.h>
@@ -228,3 +231,69 @@
   Socket sock (handles[0]);
   return sock.bytesToRead ();
 }
+
+/*!
+ *Read a file handle on the socket pair.
+ *\param fd The file descriptor to read.
+ *\return 0 on success.
+ */
+int SocketPair::readHandle (FileHandle* fd)
+{
+#ifdef WIN32
+  return -1;
+#else
+  struct msghdr mh;
+  struct cmsghdr cmh[2];
+  struct iovec iov;
+  int ret;
+  char tbuf[4];
+  mh.msg_name = 0;
+  mh.msg_namelen = 0;
+  mh.msg_iov = &iov;
+  mh.msg_iovlen = 1;
+  mh.msg_control = (caddr_t)&cmh[0];
+  mh.msg_controllen = sizeof (cmh[0]) * 2;
+  iov.iov_base = tbuf;
+  iov.iov_len = 4;
+  cmh[0].cmsg_len = sizeof (cmh[0]) + sizeof(int);
+  ret = recvmsg (handles[0], &mh, 0);
+  
+  if (ret < 0)
+    return ret;
+
+  *fd = *(FileHandle *)&cmh[1];
+
+  return 0;
+#endif
+}
+
+/*!
+ *Transmit a file descriptor on the socket.
+ *\param fd The file descriptor to transmit.
+ *\return 0 on success.
+ */
+int SocketPair::writeHandle (FileHandle fd)
+{
+#ifdef WIN32
+  return -1;
+#else
+  struct msghdr mh;
+  struct cmsghdr cmh[2];
+  struct iovec iov;
+  memset (&mh,0,sizeof (mh));
+  mh.msg_name = 0;
+  mh.msg_namelen = 0;
+  mh.msg_iov = &iov;
+  mh.msg_iovlen = 1;
+  mh.msg_control = (caddr_t)&cmh[0];
+  mh.msg_controllen = sizeof (cmh[0]) + sizeof (int);
+  mh.msg_flags = 0;
+  iov.iov_base = NULL;
+  iov.iov_len = (strlen ((const char*)iov.iov_base) + 1);
+  cmh[0].cmsg_level = SOL_SOCKET;
+  cmh[0].cmsg_type = SCM_RIGHTS;
+  cmh[0].cmsg_len = sizeof(cmh[0]) + sizeof(int);
+  *(int *)&cmh[1] = fd;
+  return sendmsg (handles[1], &mh, 0);
+#endif
+}






reply via email to

[Prev in Thread] Current Thread [Next in Thread]