[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[myserver-commit] [3058] The `UnixSocket' class is able to migrate file
From: |
Giuseppe Scrivano |
Subject: |
[myserver-commit] [3058] The `UnixSocket' class is able to migrate file descriptors. |
Date: |
Mon, 27 Apr 2009 21:32:56 +0000 |
Revision: 3058
http://svn.sv.gnu.org/viewvc/?view=rev&root=myserver&revision=3058
Author: gscrivano
Date: 2009-04-27 21:32:56 +0000 (Mon, 27 Apr 2009)
Log Message:
-----------
The `UnixSocket' class is able to migrate file descriptors.
Modified Paths:
--------------
trunk/myserver/include/base/unix_socket/unix_socket.h
trunk/myserver/include/base/utility.h
trunk/myserver/src/base/socket_pair/socket_pair.cpp
trunk/myserver/src/base/unix_socket/unix_socket.cpp
trunk/myserver/src/base/utility.cpp
Modified: trunk/myserver/include/base/unix_socket/unix_socket.h
===================================================================
--- trunk/myserver/include/base/unix_socket/unix_socket.h 2009-04-27
12:43:32 UTC (rev 3057)
+++ trunk/myserver/include/base/unix_socket/unix_socket.h 2009-04-27
21:32:56 UTC (rev 3058)
@@ -47,6 +47,9 @@
sockaddr_un addr;
#endif
+ int readHandle (FileHandle* fd);
+ int writeHandle (FileHandle fd);
+
private:
#ifdef AF_UNIX
void makeAddrInfo (sockaddr_un *info, const char *path)
Modified: trunk/myserver/include/base/utility.h
===================================================================
--- trunk/myserver/include/base/utility.h 2009-04-27 12:43:32 UTC (rev
3057)
+++ trunk/myserver/include/base/utility.h 2009-04-27 21:32:56 UTC (rev
3058)
@@ -1,7 +1,7 @@
/* -*- mode: c++ -*- */
/*
MyServer
-Copyright (C) 2002, 2003, 2004, 2006, 2008 Free Software Foundation, Inc.
+Copyright (C) 2002, 2003, 2004, 2006, 2008, 2009 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
@@ -55,5 +55,7 @@
int setcwd(const char * cwd);
int freecwdBuffer();
+int readFileHandle (FileHandle s, FileHandle* fd);
+int writeFileHandle (FileHandle s, FileHandle fd);
#endif
Modified: trunk/myserver/src/base/socket_pair/socket_pair.cpp
===================================================================
--- trunk/myserver/src/base/socket_pair/socket_pair.cpp 2009-04-27 12:43:32 UTC
(rev 3057)
+++ trunk/myserver/src/base/socket_pair/socket_pair.cpp 2009-04-27 21:32:56 UTC
(rev 3058)
@@ -227,32 +227,7 @@
*/
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
+ return readFileHandle (handles[0], fd);
}
/*!
@@ -262,27 +237,5 @@
*/
int SocketPair::writeHandle (FileHandle fd)
{
-#ifdef WIN32
- return -1;
-#else
- struct msghdr mh;
- struct cmsghdr cmh[2];
- struct iovec iov;
- char tbuf[4];
- 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 = tbuf;
- iov.iov_len = 4;
- 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[0], &mh, 0);
-#endif
+ return writeFileHandle (handles[0], fd);
}
Modified: trunk/myserver/src/base/unix_socket/unix_socket.cpp
===================================================================
--- trunk/myserver/src/base/unix_socket/unix_socket.cpp 2009-04-27 12:43:32 UTC
(rev 3057)
+++ trunk/myserver/src/base/unix_socket/unix_socket.cpp 2009-04-27 21:32:56 UTC
(rev 3058)
@@ -18,6 +18,7 @@
#include "stdafx.h"
#include <include/base/unix_socket/unix_socket.h>
+#include <include/base/utility.h>
UnixSocket::UnixSocket ()
{
@@ -120,3 +121,24 @@
return s;
#endif
}
+
+
+/*!
+ *Read a file handle on the socket pair.
+ *\param fd The file descriptor to read.
+ *\return 0 on success.
+ */
+int UnixSocket::readHandle (FileHandle* fd)
+{
+ return readFileHandle (getHandle (), fd);
+}
+
+/*!
+ *Transmit a file descriptor on the socket.
+ *\param fd The file descriptor to transmit.
+ *\return 0 on success.
+ */
+int UnixSocket::writeHandle (FileHandle fd)
+{
+ return writeFileHandle (getHandle (), fd);
+}
Modified: trunk/myserver/src/base/utility.cpp
===================================================================
--- trunk/myserver/src/base/utility.cpp 2009-04-27 12:43:32 UTC (rev 3057)
+++ trunk/myserver/src/base/utility.cpp 2009-04-27 21:32:56 UTC (rev 3058)
@@ -318,3 +318,72 @@
return (tval.tv_sec * 1000) + (tval.tv_usec / 1000);
#endif
}
+
+/*!
+ *Read a file handle from a socket.
+ *\param s Socket handle to read from.
+ *\param File handle received.
+ *\return 0 on success.
+ */
+int readFileHandle (FileHandle s, 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 (s, &mh, 0);
+
+ if (ret < 0)
+ return ret;
+
+ *fd = *(FileHandle *)&cmh[1];
+
+ return 0;
+#endif
+}
+
+/*!
+ *Write a file handle to a socket.
+ *\param s Socket handle to write to.
+ *\param File handle received.
+ *\return 0 on success.
+ */
+int writeFileHandle (FileHandle s, FileHandle fd)
+{
+#ifdef WIN32
+ return -1;
+#else
+ struct msghdr mh;
+ struct cmsghdr cmh[2];
+ struct iovec iov;
+ char tbuf[4];
+ 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 = tbuf;
+ iov.iov_len = 4;
+ 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 (s, &mh, 0);
+#endif
+}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [myserver-commit] [3058] The `UnixSocket' class is able to migrate file descriptors.,
Giuseppe Scrivano <=