[Top][All Lists]
[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
+}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [myserver-commit] [2985] SocketPair can now transmit file descriptors.,
Giuseppe Scrivano <=