Annotation of 42BSD/usr.bin/uucp/gwd.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)gwd.c      5.1 (Berkeley) 7/2/83";
        !             3: #endif
        !             4: 
        !             5: #include "uucp.h"
        !             6: 
        !             7: /*******
        !             8:  *     gwd(wkdir)      get working directory
        !             9:  *
        !            10:  *     return codes  0 | FAIL
        !            11:  */
        !            12: 
        !            13: gwd(wkdir)
        !            14: register char *wkdir;
        !            15: {
        !            16:        register FILE *fp;
        !            17:        extern FILE *rpopen();
        !            18:        extern int rpclose();
        !            19:        register char *c;
        !            20: 
        !            21:        *wkdir = '\0';
        !            22:        /* PATH added to rpopen.  Suggested by Henry Spencer (utzoo!henry) */
        !            23:        if ((fp = rpopen("PATH=/bin:/usr/bin;pwd 2>&-", "r")) == NULL)
        !            24:                return(FAIL);
        !            25:        if (fgets(wkdir, 100, fp) == NULL) {
        !            26:                pclose(fp);
        !            27:                return(FAIL);
        !            28:        }
        !            29:        if (*(c = wkdir + strlen(wkdir) - 1) == '\n')
        !            30:                *c = '\0';
        !            31:        rpclose(fp);
        !            32:        return(0);
        !            33: }
        !            34: 
        !            35: /*
        !            36:  * rti!trt: gwd uses 'reverting' version of popen
        !            37:  * which runs process with permissions of real gid/uid
        !            38:  * rather than the effective gid/uid.
        !            39:  * Bug noted by we13!rjk  (Randy King).
        !            40:  */
        !            41: /* @(#)popen.c 4.1 (Berkeley) 12/21/80 */
        !            42: #include <signal.h>
        !            43: #define        tst(a,b)        (*mode == 'r'? (b) : (a))
        !            44: #define        RDR     0
        !            45: #define        WTR     1
        !            46: static int     popen_pid[20];
        !            47: 
        !            48: FILE *
        !            49: rpopen(cmd,mode)
        !            50: char   *cmd;
        !            51: char   *mode;
        !            52: {
        !            53:        int p[2];
        !            54:        register myside, hisside, pid;
        !            55: 
        !            56:        if(pipe(p) < 0)
        !            57:                return NULL;
        !            58:        myside = tst(p[WTR], p[RDR]);
        !            59:        hisside = tst(p[RDR], p[WTR]);
        !            60:        if((pid = fork()) == 0) {
        !            61:                /* myside and hisside reverse roles in child */
        !            62:                close(myside);
        !            63:                dup2(hisside, tst(0, 1));
        !            64:                close(hisside);
        !            65:                /* revert permissions */
        !            66:                setgid(getgid());
        !            67:                setuid(getuid());
        !            68:                execl("/bin/sh", "sh", "-c", cmd, (char *)0);
        !            69:                _exit(1);
        !            70:        }
        !            71:        if(pid == -1)
        !            72:                return NULL;
        !            73:        popen_pid[myside] = pid;
        !            74:        close(hisside);
        !            75:        return(fdopen(myside, mode));
        !            76: }
        !            77: 
        !            78: rpclose(ptr)
        !            79: FILE *ptr;
        !            80: {
        !            81:        register f, r, (*hstat)(), (*istat)(), (*qstat)();
        !            82:        int status;
        !            83: 
        !            84:        f = fileno(ptr);
        !            85:        fclose(ptr);
        !            86:        istat = signal(SIGINT, SIG_IGN);
        !            87:        qstat = signal(SIGQUIT, SIG_IGN);
        !            88:        hstat = signal(SIGHUP, SIG_IGN);
        !            89:        while((r = wait(&status)) != popen_pid[f] && r != -1)
        !            90:                ;
        !            91:        if(r == -1)
        !            92:                status = -1;
        !            93:        signal(SIGINT, istat);
        !            94:        signal(SIGQUIT, qstat);
        !            95:        signal(SIGHUP, hstat);
        !            96:        return(status);
        !            97: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.