Annotation of coherent/e/bin/script/recorder.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * File:       recorder.c
        !             3:  *
        !             4:  * Purpose:    recording proces
        !             5:  *
        !             6:  * $Log:       recorder.c,v $
        !             7:  * Revision 1.3  93/02/04  12:02:49  bin
        !             8:  * hal: changed from sys/fcntl.h to fcntl.h in getps* , changed from execvp
        !             9:  * to execvpe in recorder.c
        !            10:  * 
        !            11:  */
        !            12: 
        !            13: /*
        !            14:  * Includes.
        !            15:  */
        !            16: #include <stdio.h>
        !            17: #include <errno.h>
        !            18: #include <signal.h>
        !            19: 
        !            20: /*
        !            21:  * Definitions.
        !            22:  *     Constants.
        !            23:  *     Macros with argument lists.
        !            24:  *     Typedefs.
        !            25:  *     Enums.
        !            26:  */
        !            27: #define BSIZE  512
        !            28: 
        !            29: typedef unsigned char uchar;
        !            30: typedef unsigned int  uint;
        !            31: typedef unsigned long ulong;
        !            32: 
        !            33: /*
        !            34:  * Functions.
        !            35:  *     Import Functions.
        !            36:  *     Export Functions.
        !            37:  *     Local Functions.
        !            38:  */
        !            39: void exec_shell();
        !            40: void pass_all();
        !            41: static void sig_term();
        !            42: 
        !            43: /*
        !            44:  * Global Data.
        !            45:  *     Import Variables.
        !            46:  *     Export Variables.
        !            47:  *     Local Variables.
        !            48:  */
        !            49: static int sigcaught;
        !            50: 
        !            51: /*
        !            52:  * exec_shell()
        !            53:  */
        !            54: void
        !            55: exec_shell(fd, argv, envp)
        !            56: int fd;
        !            57: char ** argv, ** envp;
        !            58: {
        !            59:        char * shell;
        !            60:        char * genenv(), * rindex();
        !            61: 
        !            62:        close(0);
        !            63:        close(1);
        !            64:        close(2);
        !            65:        if (dup(fd) != 0 || dup(fd) != 1 || dup(fd) != 2) {
        !            66:                /*  dup failed */
        !            67:                exit (1);
        !            68:        }
        !            69: 
        !            70:        if (*argv == NULL) {
        !            71:                char * args[2];
        !            72:                args[1] = NULL;
        !            73:                if ( (shell = getenv("SHELL")) == NULL)
        !            74:                        shell = "/bin/sh";
        !            75:                args[0] = shell;
        !            76:                execvpe(shell, args, envp);
        !            77: #if 0
        !            78:                if ( (shell = getenv("SHELL")) == NULL)
        !            79:                        shell = "/bin/sh";
        !            80:                if ( (argv[0] = rindex(shell, '/')) != NULL)
        !            81:                        argv[0]++;
        !            82:                else
        !            83:                        argv[0] = shell;
        !            84:                execvpe(shell, argv, envp);
        !            85: #endif
        !            86:        } else
        !            87:                execvpe(argv[0], argv, envp);
        !            88: 
        !            89:        /* execvpe failed */
        !            90:        exit (1);
        !            91: }
        !            92: 
        !            93: /*
        !            94:  * pass_all()
        !            95:  */
        !            96: void
        !            97: pass_all(fd, lf)
        !            98: int fd;
        !            99: char * lf;
        !           100: {
        !           101:        int newpid, nread;
        !           102:        char buff[BSIZE];
        !           103:        int ppid = getpid();
        !           104: 
        !           105:        if ( (newpid = fork()) < 0) {
        !           106:                /* pass_all can't fork */
        !           107:                exit (1);
        !           108:        } else if (newpid == 0) {
        !           109:                /*
        !           110:                 * Child process.
        !           111:                 * Copy terminal stdin to fd for pty master.
        !           112:                 */
        !           113:                for (;;){
        !           114:                        nread = read(0, buff, BSIZE);
        !           115:                        if (nread < 0) {
        !           116:                                /* pass_all read err on stdin */
        !           117:                                exit (1);
        !           118:                        }
        !           119:                        if (nread == 0)
        !           120:                                break;  /* EOF */
        !           121:                        if (write(fd, buff, nread) != nread) {
        !           122:                                /* pass_all write err to fd */
        !           123:                                exit(1);
        !           124:                        }
        !           125:                }
        !           126:                kill(ppid, SIGTERM);
        !           127:                exit(0);
        !           128:        }
        !           129: 
        !           130:        /*
        !           131:         * Parent process.
        !           132:         * Copy from pty master fd to terminal stdout.
        !           133:         */
        !           134: {
        !           135:        int lfd;
        !           136: 
        !           137:        if((lfd = creat(lf, 0666)) == -1) {
        !           138:                printf("Can't open log file \"%s\"\n", lf);
        !           139:                goto bye;
        !           140:        }
        !           141:        sigcaught = 0;
        !           142:        signal(SIGTERM, sig_term);
        !           143:        for (;;) {
        !           144:                nread = read(fd, buff, BSIZE);
        !           145:                if (nread <= 0)
        !           146:                        break;  /* error or EOF */
        !           147:                write(lfd, buff, nread);
        !           148:                if (write(1, buff, nread) != nread) {
        !           149:                        /* pass_all write error to stdout */
        !           150:                        close(lfd);
        !           151:                        exit (1);
        !           152:                }
        !           153:        }
        !           154:        close(lfd);
        !           155: bye:
        !           156:        if (sigcaught == 0) {
        !           157:                kill(newpid, SIGTERM);
        !           158:        }
        !           159: }
        !           160: }
        !           161: 
        !           162: void
        !           163: sig_term()
        !           164: {
        !           165:        sigcaught = 1;
        !           166: }

unix.superglobalmegacorp.com

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