myserver-commit
[Top][All Lists]
Advanced

[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
+}





reply via email to

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