socsvn commit: r253432 - soc2013/dpl/head/contrib/bzip2

dpl at FreeBSD.org dpl at FreeBSD.org
Mon Jun 24 18:54:15 UTC 2013


Author: dpl
Date: Mon Jun 24 18:54:14 2013
New Revision: 253432
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253432

Log:
  Added recvfds() and sendfds().
  

Modified:
  soc2013/dpl/head/contrib/bzip2/bzip2.c

Modified: soc2013/dpl/head/contrib/bzip2/bzip2.c
==============================================================================
--- soc2013/dpl/head/contrib/bzip2/bzip2.c	Mon Jun 24 18:40:06 2013	(r253431)
+++ soc2013/dpl/head/contrib/bzip2/bzip2.c	Mon Jun 24 18:54:14 2013	(r253432)
@@ -221,28 +221,74 @@
 FILE    *outputHandleJustInCase;
 Int32   workFactor;
 
-#if CAPSICUM
-int sv[2], len;
-char buf[1];
-char cms[CMSG_SPACE(sizeof(int))];
-struct iovec iov;
-struct cmsghdr  *cmsg;
-struct msghdr msg;
-
-buf[0] = 0;
-iov.iov_base = buf;
-iov.iov_len = 1;
-
-cmsg->cmsg_len = CMSG_LEN(sizeof (int));
-cmsg->cmsg_level = SOL_SOCKET;
-cmsg->cmsg_type = SOL_RIGHTS;
-
-msg.msg_name = NULL;
-msg.,msg_namelen = 0;
-msg.msg_iov = &iov;
-msg.msg_iovlen = 1;
-/* msg.msg_control = (caddr_t)cms; */
-/* msg.msg_controllen = CMSG_LEN(sizeof(int)); */
+#if CAPSICUM == 1
+int sv[2], fds[2], len;
+int sendfds(int, int*);
+int recvfds(int);
+
+int
+sendfds(int s, int fd[2])
+{
+	char buf[1];
+	struct iovec iov;
+	struct msghdr msg;
+	struct cmsghdr *cmsg;
+	char cms[CMSG_SPACE(2*sizeof(int))];
+	
+	buf[0] = 0;
+	iov.iov_base = buf;
+	iov.iov_len = 1;
+
+	memset(&msg, 0, sizeof msg);
+	msg.msg_iov = &iov;
+	msg.msg_iovlen = 1;
+	msg.msg_control = (caddr_t)cms;
+	msg.msg_controllen = CMSG_LEN(2*sizeof(int));
+
+	cmsg = CMSG_FIRSTHDR(&msg);
+	cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+	cmsg->cmsg_level = SOL_SOCKET;
+	cmsg->cmsg_type = SCM_RIGHTS;
+	memmove(CMSG_DATA(cmsg), &fd, 2*sizeof(int));
+
+	if((sendmsg(s, &msg, 0)) != (int)iov.iov_len)
+		return -1;
+	return 0;
+}
+
+int
+recvfds(int s)
+{
+	int n;
+	int fds[2];
+	char buf[1];
+	struct iovec iov;
+	struct msghdr msg;
+	struct cmsghdr *cmsg;
+	char cms[CMSG_SPACE(2*sizeof(int))];
+
+	iov.iov_base = buf;
+	iov.iov_len = 1;
+
+	memset(&msg, 0, sizeof msg);
+	msg.msg_iov = &iov;
+	msg.msg_iovlen = 1;
+
+	msg.msg_control = (caddr_t)cms;
+	msg.msg_controllen = sizeof cms;
+
+	if((n = recvmsg(s, &msg, 0)) < 0)
+		return -1;
+	if(n == 0){
+		fprintf ( stderr, 
+				  "\n%s: recvfds: Unexpected EOF.\n",
+				  progName);
+		return -1;
+	}
+	cmsg = CMSG_FIRSTHDR(&msg);
+	memmove(&fds, CMSG_DATA(cmsg), sizeof(int));
+	return fds;
+}
 #endif
 
 static void    panic                 ( const Char* ) NORETURN;
@@ -1377,8 +1423,7 @@
          exit(1);
 
 	  default:
-		 /* Send the two FDs */
-		 /* sendmsg(); */
+
          wait(NULL);
          return;
    }
@@ -1394,10 +1439,6 @@
    FILE  *inStr;
    FILE  *outStr;
    Int32 n, i;
-#  if CAPSICUM
-   Int32 infd;
-   pid_t forkpid;
-#  endif
    Bool  magicNumberOK;
    Bool  cantGuess;
    struct MY_STAT statBuf;
@@ -1491,13 +1532,13 @@
    }
 
    if ( srcMode != SM_I2O ){
-#	if CAPSICUM
-		 infd = open( inName, O_RDONLY );
-		 cap_rights_limit(infd, CAP_READ);
-         inStr = fdopen ( infd, "rb" );
-#	else
+/*#	if CAPSICUM*/
+		 /*infd = open( inName, O_RDONLY );*/
+		 /*cap_rights_limit(infd, CAP_READ);*/
+         /*inStr = fdopen ( infd, "rb" );*/
+/*#	else*/
          inStr = fopen ( inName, "rb" );
-#	endif
+/*#	endif*/
    }
 
    switch ( srcMode ) {


More information about the svn-soc-all mailing list