Date: Wed, 3 Jul 2013 16:05:54 GMT From: dpl@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r253907 - soc2013/dpl/head/contrib/bzip2 Message-ID: <201307031605.r63G5sTI087469@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dpl Date: Wed Jul 3 16:05:53 2013 New Revision: 253907 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=253907 Log: Stop passing fd, start using a new architecture. Modified: soc2013/dpl/head/contrib/bzip2/bzip2.c Modified: soc2013/dpl/head/contrib/bzip2/bzip2.c ============================================================================== --- soc2013/dpl/head/contrib/bzip2/bzip2.c Wed Jul 3 14:58:11 2013 (r253906) +++ soc2013/dpl/head/contrib/bzip2/bzip2.c Wed Jul 3 16:05:53 2013 (r253907) @@ -223,73 +223,7 @@ Int32 workFactor; #if CAPSICUM -int sv[2], len; - -int sendfd(int, int); -int recvfd(int); - -#define DATALEN CMSG_LEN(sizeof(int)) - -int -sendfd(int s, int fd) -{ - printf("sendfd sending: %d\n", fd); - struct msghdr msg; - struct cmsghdr *cmsg; - struct iovec io[1]; - char buf[1] = { "!" }; - int ret; - - io[0].iov_base = buf; - io[0].iov_len = 1; - - if( (cmsg = malloc(DATALEN)) == NULL ) - return -1; - - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_iov = io; - msg.msg_iovlen = 1; - msg.msg_control =cmsg; - msg.msg_controllen = DATALEN; - - cmsg->cmsg_len = DATALEN; - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - *(int *)CMSG_DATA(cmsg) = fd; - if( (ret = sendmsg(s, &msg, 0)) <= 0) - return -1; - free(cmsg); - return 0; -} - -int -recvfd(int s) -{ - int fd; - struct msghdr msg; - struct cmsghdr cmsg; - char buf[1] = { "!" }; - struct iovec io[1]; - - io[0].iov_base = buf; - io[0].iov_len = 1; - - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_iov = io; - msg.msg_iovlen = 1; - msg.msg_control = &cmsg; - msg.msg_controllen = DATALEN; - - cmsg.cmsg_len = DATALEN; - cmsg.cmsg_level = SOL_SOCKET; - cmsg.cmsg_type = SCM_RIGHTS; - if(recvmsg(s, &msg, 0) < 0) - return -1; - fd = *(int *)CMSG_DATA(&cmsg); - return 0; -} +int capret; #endif static void panic ( const Char* ) NORETURN; @@ -1218,7 +1152,6 @@ FILE *outStr; Int32 n, i; # if CAPSICUM - Int32 infd, outfd; pid_t forkpid; # endif struct MY_STAT statBuf; @@ -1376,108 +1309,33 @@ } # if CAPSICUM - infd = dup(fileno(inStr)); - outfd = dup(fileno(outStr)); - if ( infd == -1 || outfd == -1){ - fprintf ( stderr, "%s: Couldn't close inStr: %s.\n", - progName, strerror(errno) ); - setExit(1); - exit(exitValue); - } - - cap_rights_limit(infd, CAP_READ); - cap_rights_limit(outfd, CAP_WRITE); - - if(fclose(inStr) < 0){ - fprintf ( stderr, "%s: Couldn't close inStr: %s.\n", - progName, strerror(errno) ); - setExit(1); - exit(exitValue); - } - if(fclose(outStr) < 0){ - fprintf ( stderr, "%s: Couldn't close outStr: %s.\n", - progName, strerror(errno) ); - setExit(1); - exit(exitValue); - } - /* Pass the limited file descriptors via unix domain socket. */ if ( (forkpid = fork()) == -1 ){ fprintf ( stderr, "%s: Couldn't fork: %s.\n", progName, strerror(errno) ); setExit(1); exit(exitValue); } else if ( forkpid != 0) { - printf("Parent= infd:%d, outfd:%d\n", infd, outfd); - if ((close(sv[0])) < 0){ - fprintf ( stderr, "%s: Couldn't close fd: %s.\n", - progName, strerror(errno) ); - wait(NULL); - setExit(1); - exit(exitValue); - } - if ((close(infd)) < 0){ - fprintf ( stderr, "%s: Couldn't close fd: %s.\n", - progName, strerror(errno) ); - setExit(1); - exit(exitValue); - } - if ((close(outfd)) < 0){ - fprintf ( stderr, "%s: Couldn't close fd: %s.\n", - progName, strerror(errno) ); - setExit(1); - exit(exitValue); - } - if (sendfd(sv[1], infd) < 0){ - fprintf ( stderr, "%s: Couldn't send infd: %s.\n", - progName, strerror(errno) ); - if (kill(forkpid, SIGTERM) < 0) - printf("Couldn't kill the child process, please press ^C\n"); - wait(NULL); - setExit(1); - exit(exitValue); - } - if (sendfd(sv[1], outfd) < 0){ - fprintf ( stderr, "%s: Couldn't send outfd: %s.\n", - progName, strerror(errno) ); - if (kill(forkpid, SIGTERM) < 0) - printf("Couldn't kill the child process, please press ^C\n"); - wait(NULL); - setExit(1); - exit(exitValue); - } /* Let the children compress */ + wait(NULL); return; } else if (forkpid == 0){ - if ((close(sv[1])) < 0){ - fprintf ( stderr, "%s: Couldn't close socket: %s.\n", - progName, strerror(errno) ); - setExit(1); - exit(exitValue); - } - if ((infd = recvfd(sv[0])) < 0){ - fprintf ( stderr, "%s: Couldn't get infd: %s.\n", - progName, strerror(errno) ); + capret = cap_rights_limit(fileno(inStr), CAP_READ); + capret |= cap_rights_limit(fileno(outStr), CAP_WRITE); + + if ( capret ){ + fprintf ( stderr, "%s: Couldn't enter capability mode: %s.\n", + progName, strerror(errno) ); setExit(1); exit(exitValue); - } - if ((outfd = recvfd(sv[0])) < 0){ - fprintf ( stderr, "%s: Couldn't get outfd: %s.\n", - progName, strerror(errno) ); + } + if (cap_enter() < 0){ + fprintf ( stderr, "%s: Couldn't enter capability mode: %s.\n", + progName, strerror(errno) ); setExit(1); exit(exitValue); - } - printf("Child: infd:%d, outfd:%d\n", infd, outfd); - inStr = fdopen(infd, "rb"); - outStr = fdopen(outfd, "wb"); - - if (cap_enter() < 0) { - fprintf ( stderr, "%s: Couldn't enter capability mode: %s.\n", - progName, strerror(errno) ); - setExit(1); - exit(exitValue); - } -# endif + } +# endif /*--- Now the input and output handles are sane. Do the Biz. ---*/ outputHandleJustInCase = outStr; deleteOutputOnInterrupt = True; @@ -1486,17 +1344,19 @@ /*--- If there was an I/O error, we won't get here. ---*/ if ( srcMode == SM_F2F ) { - applySavedTimeInfoToOutputFile ( outName ); - deleteOutputOnInterrupt = False; - if ( !keepInputFiles ) { - IntNative retVal = remove ( inName ); - ERROR_IF_NOT_ZERO ( retVal ); - } + applySavedTimeInfoToOutputFile ( outName ); + deleteOutputOnInterrupt = False; + if ( !keepInputFiles ) { + IntNative retVal = remove ( inName ); + ERROR_IF_NOT_ZERO ( retVal ); + } } deleteOutputOnInterrupt = False; - return; +# if CAPSICUM + exit(0); } +# endif } /*---------------------------------------------*/ @@ -2146,15 +2006,6 @@ # endif } -# if CAPSICUM - if ( socketpair(PF_LOCAL, SOCK_STREAM, 0, sv) < 0 ){ - fprintf (stderr, "%s: Can't create socket: %s.\n", - progName, strerror(errno) ); - setExit(1); - exit(exitValue); - } -# endif - if (opMode == OM_Z) { if (srcMode == SM_I2O) { compress ( NULL );
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307031605.r63G5sTI087469>