Annotation of 43BSDReno/contrib/jove/portsrv.c, revision 1.1

1.1     ! root        1: /***************************************************************************
        !             2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
        !             3:  * is provided to you without charge, and with no warranty.  You may give  *
        !             4:  * away copies of JOVE, including sources, provided that this notice is    *
        !             5:  * included in all the files.                                              *
        !             6:  ***************************************************************************/
        !             7: 
        !             8: /* This is a server for jove sub processes.  By the time we get here, our
        !             9:    standard output goes to jove's process input. */
        !            10: 
        !            11: #include "jove.h"
        !            12: 
        !            13: #if defined(IPROCS) && defined(PIPEPROCS)      /* the whole file! */
        !            14: 
        !            15: #include <signal.h>
        !            16: #include <sys/ioctl.h>
        !            17: #include "wait.h"
        !            18: 
        !            19: private struct header {
        !            20:        int     pid;
        !            21:        int     nbytes;
        !            22:        char    buf[512];
        !            23: } header;
        !            24: 
        !            25: private int    tty_fd;
        !            26: 
        !            27: #define HEADSIZE       ((sizeof header.pid) + sizeof (header.nbytes))
        !            28: 
        !            29: private void
        !            30: proc_write(ptr, n)
        !            31: UnivConstPtr   ptr;
        !            32: size_t n;
        !            33: {
        !            34:        (void) write(1, ptr, n);
        !            35: }
        !            36: 
        !            37: private void
        !            38: read_pipe(fd)
        !            39: int    fd;
        !            40: {
        !            41:        register size_t n;
        !            42: 
        !            43:        while ((header.nbytes = read(fd, header.buf, sizeof header.buf)) > 0) {
        !            44:                n = HEADSIZE + header.nbytes;
        !            45:                proc_write((UnivConstPtr) &header, n);
        !            46:        }
        !            47: }
        !            48: 
        !            49: private void
        !            50: proc_error(str)
        !            51: char   *str;
        !            52: {
        !            53:        header.pid = getpid();
        !            54:        header.nbytes = strlen(str);
        !            55:        strcpy(header.buf, str);
        !            56:        proc_write((UnivConstPtr) &header, header.nbytes + HEADSIZE);
        !            57:        write(tty_fd, str, strlen(str));
        !            58:        exit(-2);
        !            59: }
        !            60: 
        !            61: /* ARGSUSED */
        !            62: int
        !            63: main(argc, argv)
        !            64: int    argc;
        !            65: char   *argv[];
        !            66: {
        !            67:        int     p[2];
        !            68:        int     pid;
        !            69: 
        !            70:        if (pipe(p) == -1)
        !            71:                proc_error("Cannot pipe jove portsrv.\n");
        !            72: 
        !            73:        switch (pid = fork()) {
        !            74:        case -1:
        !            75:                proc_error("portsrv: cannot fork.\n");
        !            76:                /*NOTREACHED*/
        !            77: 
        !            78:        case 0:
        !            79:                /* We'll intercept childs output in p[0] */
        !            80:                (void) dup2(p[1], 1);
        !            81:                (void) dup2(p[1], 2);
        !            82:                (void) close(p[0]);
        !            83:                (void) close(p[1]);
        !            84: 
        !            85:                (void) setpgrp(getpid(), getpid());
        !            86:                execv(argv[1], (const char **) &argv[2]);
        !            87:                _exit(-4);
        !            88:                /*NOTREACHED*/
        !            89: 
        !            90:        default:
        !            91:                (void) close(0);
        !            92:                tty_fd = open("/dev/tty", 1);
        !            93: 
        !            94: #ifdef NEVER
        !            95:                {
        !            96:                        int     i;
        !            97:                        for (i = 0; i < argc; i++) {
        !            98:                                write(tty_fd, "*argv++ = ", 10);
        !            99:                                write(tty_fd, argv[i], strlen(argv[i]));
        !           100:                                write(tty_fd, "\n", 1);
        !           101:                        }
        !           102:                }
        !           103: #endif /* NEVER */
        !           104: 
        !           105:                (void) signal(SIGINT, SIG_IGN);
        !           106:                (void) signal(SIGQUIT, SIG_IGN);
        !           107:                (void) close(p[1]);
        !           108: 
        !           109:                /* tell jove the pid of the real child as opposed to us */
        !           110:                header.pid = getpid();
        !           111:                header.nbytes = sizeof (int);
        !           112:                *(int *) header.buf = pid;
        !           113:                (void) write(1, (char *) &header, sizeof pid + HEADSIZE);
        !           114: 
        !           115:                /* read proc's output and send it to jove */
        !           116:                read_pipe(p[0]);
        !           117: 
        !           118:                /* received EOF - wait for child to die and then exit
        !           119:                   ourself in the same way so that JOVE knows how the
        !           120:                   child died.  This is sort of a kludge, but the alternative
        !           121:                   is to write the childs status to JOVE, which seems sorta
        !           122:                   yucky, too.
        !           123: 
        !           124:                   Actually, 4 or 5 years later I like that idea much better,
        !           125:                   so remind me to implement it that way when I get a chance.
        !           126: 
        !           127:                   7-23-89  Gee thanks, whoever implemented this for me! */
        !           128: 
        !           129:                (void) close(p[0]);
        !           130:                header.pid = getpid();
        !           131:                header.nbytes = EOF;    /* tell jove we are finished */
        !           132:                /* try to exit like our child did ... */
        !           133:                {
        !           134:                        union wait      status;
        !           135: 
        !           136:                        while (wait(&status) != pid)
        !           137:                                ;
        !           138:                        *(int *) header.buf = status.w_status;
        !           139:                }
        !           140:                (void) write(1, (UnivConstPtr) &header, HEADSIZE + sizeof (int));
        !           141:        }
        !           142:        return 0;
        !           143: }
        !           144: 
        !           145: #else /* IPROCS && PIPEPROCS */
        !           146: int
        !           147: main()
        !           148: {
        !           149:        return 0;
        !           150: }
        !           151: #endif

unix.superglobalmegacorp.com

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