Date: Mon, 24 Jun 2013 18:54:14 GMT From: dpl@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r253432 - soc2013/dpl/head/contrib/bzip2 Message-ID: <201306241854.r5OIsE36048975@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 ) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306241854.r5OIsE36048975>