chiark / gitweb /
fishdescriptor: reorganise to my taste
authorIan Jackson <ian.jackson@eu.citrix.com>
Thu, 5 Oct 2017 15:25:41 +0000 (16:25 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Thu, 5 Oct 2017 15:32:16 +0000 (16:32 +0100)
Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
fishdescriptor/donate.c

index c2d59cb..60ca266 100644 (file)
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-int libxl__sendmsg_fds(libxl__gc *gc, int carrier,
-                       const void *data, size_t datalen,
-                       int nfds, const int fds[], const char *what) {
-    struct msghdr msg = { 0 };
-    struct cmsghdr *cmsg;
-    size_t spaceneeded = nfds * sizeof(fds[0]);
-    char control[CMSG_SPACE(spaceneeded)];
-    struct iovec iov;
-    int r;
+/* return conventions: functions here return errno values */
 
-    iov.iov_base = (void*)data;
-    iov.iov_len  = datalen;
+static int fishdescriptor_sendmsg_fds(int carrier,
+                                      int nfds, const int fds[]) {
+  struct msghdr msg = { 0 };
+  struct cmsghdr *cmsg;
+  size_t spaceneeded = nfds * sizeof(fds[0]);
+  char control[CMSG_SPACE(spaceneeded)];
+  struct iovec iov;
+  int r;
 
-    /* compose the message */
-    msg.msg_iov = &iov;
-    msg.msg_iovlen = 1;
-    msg.msg_control = control;
-    msg.msg_controllen = sizeof(control);
+  iov.iov_base = &nfds;
+  iov.iov_len  = sizeof(nfds);
 
-    /* attach open fd */
-    cmsg = CMSG_FIRSTHDR(&msg);
-    cmsg->cmsg_level = SOL_SOCKET;
-    cmsg->cmsg_type = SCM_RIGHTS;
-    cmsg->cmsg_len = CMSG_LEN(spaceneeded);
-    memcpy(CMSG_DATA(cmsg), fds, spaceneeded);
+  /* compose the message */
+  msg.msg_iov = &iov;
+  msg.msg_iovlen = 1;
+  msg.msg_control = control;
+  msg.msg_controllen = sizeof(control);
 
-    msg.msg_controllen = cmsg->cmsg_len;
-
-    r = sendmsg(carrier, &msg, 0);
-    if (r < 0) {
-        LOGE(ERROR, "failed to send fd-carrying message (%s)", what);
-        return ERROR_FAIL;
-    }
+  /* attach open fd */
+  cmsg = CMSG_FIRSTHDR(&msg);
+  cmsg->cmsg_level = SOL_SOCKET;
+  cmsg->cmsg_type = SCM_RIGHTS;
+  cmsg->cmsg_len = CMSG_LEN(spaceneeded);
+  memcpy(CMSG_DATA(cmsg), fds, spaceneeded);
 
+  msg.msg_controllen = cmsg->cmsg_len;
+    
+  r = sendmsg(carrier, &msg, 0);
+  if (r < 0)
     return 0;
 }