Annotation of researchv9/ipc/src/mgrs/svcmgr/proc.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * stuff concerned with the table
        !             3:  * of processes we've spawned
        !             4:  * almost everything in this file should go away;
        !             5:  * it's needed only to keep /etc/utmp up to date
        !             6:  */
        !             7: 
        !             8: #include "mgr.h"
        !             9: #include <utmp.h>
        !            10: #include <wait.h>
        !            11: #include <libc.h>
        !            12: 
        !            13: typedef struct {
        !            14:        int pid;
        !            15:        char *tty;
        !            16: } Proc;
        !            17: 
        !            18: #define        MAXPROC 200
        !            19: Proc proc[MAXPROC];
        !            20: Proc *maxproc;
        !            21: 
        !            22: /*
        !            23:  * make ourselves into a new process
        !            24:  * returns 0 if we're the parent, or we can't
        !            25:  * returns 1 in the child
        !            26:  */
        !            27: newproc(rp)
        !            28:        Request *rp;
        !            29: {
        !            30:        int pid;
        !            31:        register Proc *p;
        !            32:        char *ttyname(), *tty;
        !            33: 
        !            34:        if ((pid = fork()) < 0) {
        !            35:                logevent("can't fork; gave up\n");
        !            36:                close(rp->i->cfd);
        !            37:                return (0);
        !            38:        }
        !            39:        if (pid == 0)
        !            40:                return (1);
        !            41:        tty = ttyname(rp->i->cfd);
        !            42:        close(rp->i->cfd);
        !            43:        if (tty==NULL)
        !            44:                return (0);
        !            45:        logevent("newproc(%d, %s)\n", pid, tty);
        !            46:        for (p = proc; p < &proc[MAXPROC]; p++)
        !            47:                if (p->pid == 0) {
        !            48:                        if ((p->tty = strdup(tty)) != NULL)
        !            49:                                p->pid = pid;
        !            50:                        return (0);
        !            51:                }
        !            52:        /* too bad */
        !            53:        logevent("no internal proc; didn't bother\n");
        !            54:        return (0);
        !            55: }
        !            56: 
        !            57: /*
        !            58:  * clean up after any dead children
        !            59:  */
        !            60: checkkids()
        !            61: {
        !            62:        int pid;
        !            63: 
        !            64:        while ((pid = wait3(NULL, WNOHANG, NULL)) > 0)
        !            65:                deadproc(pid);
        !            66: }
        !            67: 
        !            68: deadproc(pid)
        !            69: int pid;
        !            70: {
        !            71:        register Proc *p;
        !            72: 
        !            73:        logevent("deadproc(%d)\n", pid);
        !            74:        for (p = proc; p < &proc[MAXPROC]; p++)
        !            75:                if (p->pid == pid) {
        !            76:                        rmutmp(p->tty);
        !            77:                        p->pid = 0;
        !            78:                        free(p->tty);
        !            79:                        break;
        !            80:                }
        !            81: }
        !            82: 
        !            83: /*
        !            84:  * this should really be somewhere else ...
        !            85:  */
        !            86: 
        !            87: rmutmp(tty)
        !            88: char *tty;
        !            89: {
        !            90:        static struct utmp ut, vt;
        !            91:        int fd;
        !            92:        long time();
        !            93: 
        !            94:        if (strncmp(tty, "/dev/", 5) == 0)
        !            95:                tty += 5;
        !            96:        strncpy(vt.ut_line, tty, sizeof(vt.ut_line));
        !            97:        vt.ut_time = time((long *)0);
        !            98:        if ((fd = open("/etc/utmp", 2)) >= 0) {
        !            99:                while (read(fd, (char *)&ut, sizeof(ut)) == sizeof(ut))
        !           100:                        if (strncmp(tty, ut.ut_line, sizeof(ut.ut_line)) == 0) {
        !           101:                                lseek(fd, (long)-sizeof(ut), 1);
        !           102:                                write(fd, (char *)&vt, sizeof(vt));
        !           103:                                break;
        !           104:                        }
        !           105:                close(fd);
        !           106:        }
        !           107:        if ((fd = open("/usr/adm/wtmp", 1)) >= 0) {
        !           108:                lseek(fd, 0L, 2);
        !           109:                write(fd, (char *)&vt, sizeof(vt));
        !           110:                close(fd);
        !           111:        }
        !           112: }

unix.superglobalmegacorp.com

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