Annotation of researchv9/ipc/src/mgrs/svcmgr/proc.c, revision 1.1.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.