Annotation of 43BSD/contrib/jove/iproc.c, revision 1.1

1.1     ! root        1: /*************************************************************************
        !             2:  * This program is copyright (C) 1985, 1986 by Jonathan Payne.  It is    *
        !             3:  * provided to you without charge for use only on a licensed Unix        *
        !             4:  * system.  You may copy JOVE provided that this notice is included with *
        !             5:  * the copy.  You may not sell copies of this program or versions        *
        !             6:  * modified for use on microcomputer systems, unless the copies are      *
        !             7:  * included with a Unix system distribution and the source is provided.  *
        !             8:  *************************************************************************/
        !             9: 
        !            10: #include "jove.h"
        !            11: 
        !            12: #ifdef IPROCS
        !            13: 
        !            14: int    proc_child();
        !            15: 
        !            16: #ifdef PIPEPROCS
        !            17: #   include "iproc-pipes.c"
        !            18: #else
        !            19: #   include "iproc-ptys.c"
        !            20: #endif
        !            21: 
        !            22: KillProcs()
        !            23: {
        !            24:        register Process        *p;
        !            25:        int     killem = -1;            /* -1 means undetermined */
        !            26:        char    *yorn;
        !            27: 
        !            28:        for (p = procs; p != 0; p = p->p_next)
        !            29:                if (!isdead(p)) {
        !            30:                        if (killem == -1) {
        !            31:                                yorn = ask("y", "Should I kill your i-processes? ");
        !            32:                                killem = (Upper(*yorn) == 'Y');
        !            33:                        }
        !            34:                        if (killem)
        !            35:                                proc_kill(p, SIGKILL);
        !            36:                }
        !            37: }
        !            38: 
        !            39: static Process *
        !            40: proc_exists(name)
        !            41: char   *name;
        !            42: {
        !            43:        register Process        *p;
        !            44: 
        !            45:        for (p = procs; p != 0; p = p->p_next)
        !            46:                if (strcmp(proc_buf(p), name) == 0) {
        !            47:                        (void) pstate(p);
        !            48:                        if (p->p_eof) {
        !            49:                                DealWDeath();
        !            50:                                return 0;
        !            51:                        }
        !            52:                        break;
        !            53:                }
        !            54: 
        !            55:        return p;
        !            56: }
        !            57: 
        !            58: assign_p()
        !            59: {
        !            60:        register Process        *p;
        !            61: 
        !            62:        for (p = procs; p != 0; p = p->p_next)
        !            63:                if (p->p_buffer == curbuf) {
        !            64:                        cur_proc = p;
        !            65:                        break;
        !            66:                }
        !            67: }
        !            68: 
        !            69: pbuftiedp(b)
        !            70: Buffer *b;
        !            71: {
        !            72:        register Process        *p;
        !            73: 
        !            74:        for (p = procs; p != 0; p = p->p_next)
        !            75:                if (p->p_buffer == b && !p->p_eof)
        !            76:                        complain("[There is a process tied to %s]", proc_buf(p));
        !            77: }
        !            78: 
        !            79: /* Process receive: receives the characters in buf, and appends them to
        !            80:    the buffer associated with p. */
        !            81: 
        !            82: static
        !            83: proc_rec(p, buf)
        !            84: register Process       *p;
        !            85: char   *buf;
        !            86: {
        !            87:        Buffer  *saveb = curbuf;
        !            88:        Window  *w;
        !            89:        Mark    *savepoint;
        !            90:        int     sameplace = 0,
        !            91:                do_disp = 0;
        !            92: 
        !            93:        if (curwind->w_bufp == p->p_buffer)
        !            94:                w = curwind;
        !            95:        else
        !            96:                w = windbp(p->p_buffer);        /* Is this window visible? */
        !            97:        if (w != 0)
        !            98:                do_disp = (in_window(w, p->p_mark->m_line) != -1);
        !            99:        SetBuf(p->p_buffer);
        !           100:        savepoint = MakeMark(curline, curchar, FLOATER);
        !           101:        ToMark(p->p_mark);      /* Where output last stopped. */
        !           102:        if (savepoint->m_line == curline && savepoint->m_char == curchar)
        !           103:                sameplace++;
        !           104: 
        !           105:        ins_str(buf, YES);
        !           106:        if (do_disp) {
        !           107:                w->w_line = curline;
        !           108:                w->w_char = curchar;
        !           109:                redisplay();
        !           110:        }
        !           111:        MarkSet(p->p_mark, curline, curchar);
        !           112:        if (!sameplace)
        !           113:                ToMark(savepoint);      /* Back to where we were. */
        !           114:        DelMark(savepoint);
        !           115:        SetBuf(saveb);
        !           116: }
        !           117: 
        !           118: proc_kill(p, sig)
        !           119: Process        *p;
        !           120: {
        !           121:        if (p == 0 || p->p_state == DEAD)
        !           122:                return;
        !           123:        if (killpg(p->p_pid, sig) == -1)
        !           124:                s_mess("Cannot kill %s!", proc_buf(p));
        !           125: }
        !           126: 
        !           127: /* Deal with a process' death.  proc_rec turns on the FREEUP bit when it
        !           128:    it gets the "EOF" from portsrv.  FREEUP'd processes get unlinked from
        !           129:    the list, and the proc stucture and proc_buf(p) get free'd up, here. */
        !           130: 
        !           131: static
        !           132: DealWDeath()
        !           133: {
        !           134:        register Process        *p,
        !           135:                                *next,
        !           136:                                *prev = 0;
        !           137:        
        !           138:        for (p = procs; p != 0; p = next) {
        !           139:                next = p->p_next;
        !           140:                if (!p->p_eof) {
        !           141:                        prev = p;
        !           142:                        continue;
        !           143:                }
        !           144:                if (cur_proc == p)
        !           145:                        cur_proc = next ? next : prev;
        !           146:                proc_close(p);
        !           147:                free((char *) p->p_name);
        !           148:                free((char *) p);
        !           149:                if (prev)
        !           150:                        prev->p_next = next;
        !           151:                else
        !           152:                        procs = next;
        !           153:        }
        !           154: }
        !           155: 
        !           156: ProcList()
        !           157: {
        !           158:        register Process        *p;
        !           159:        char    *fmt = "%-15s  %-15s  %-8s %s",
        !           160:                pidstr[10];
        !           161: 
        !           162:        if (procs == 0) {
        !           163:                message("[No subprocesses]");
        !           164:                return;
        !           165:        }
        !           166:        TOstart("Process list", TRUE);
        !           167: 
        !           168:        Typeout(fmt, "Buffer", "Status", "Pid ", "Command");
        !           169:        Typeout(fmt, "------", "------", "--- ", "-------");
        !           170:        for (p = procs; p != 0; p = p->p_next) {
        !           171:                sprintf(pidstr, "%d", p->p_pid);
        !           172:                Typeout(fmt, proc_buf(p), pstate(p), pidstr, p->p_name);
        !           173:        }
        !           174:        DealWDeath();
        !           175:        TOstop();
        !           176: }
        !           177: 
        !           178: ProcNewline()
        !           179: {
        !           180:        if (isdead(cur_proc))
        !           181:                return;
        !           182:        if (lastp(curline)) {
        !           183:                Eol();
        !           184:                LineInsert();
        !           185:                do_rtp(cur_proc->p_mark);
        !           186:                MarkSet(cur_proc->p_mark, curline, curchar);
        !           187:        } else {
        !           188:                Bol();
        !           189:                while (LookingAt(proc_prompt, linebuf, curchar))
        !           190:                        SetDot(dosearch(proc_prompt, 1, 1));
        !           191:                strcpy(genbuf, linebuf + curchar);
        !           192:                ToLast();
        !           193:                ins_str(genbuf, NO);
        !           194:        }
        !           195: }
        !           196: 
        !           197: IShell()
        !           198: {
        !           199:        char    shell[30];
        !           200:        int     number = 1;
        !           201: 
        !           202:        do
        !           203:                sprintf(shell, "shell-%d", number++);
        !           204:        while (proc_exists(shell));
        !           205: 
        !           206:        proc_strt(shell, "i-shell", Shell, basename(Shell), "-i", 0);
        !           207:        SetWind(windlook(shell));
        !           208: }
        !           209: 
        !           210: Iprocess()
        !           211: {
        !           212:        extern char     ShcomBuf[100],
        !           213:                        *MakeName();
        !           214:        char    *command;
        !           215: 
        !           216:        command = ask(ShcomBuf, ProcFmt);
        !           217:        null_ncpy(ShcomBuf, command, (sizeof ShcomBuf) - 1);
        !           218:        proc_strt(MakeName(command), command, Shell, basename(Shell), ShFlags, command, 0);
        !           219: }
        !           220: 
        !           221: proc_child()
        !           222: {
        !           223:        union wait      w;
        !           224:        int     pid;
        !           225: 
        !           226:        for (;;) {
        !           227: #ifndef VMUNIX
        !           228:                pid = wait2(&w.w_status, (WNOHANG | WUNTRACED));
        !           229: #else
        !           230:                pid = wait3(&w, (WNOHANG | WUNTRACED), (struct rusage *) 0);
        !           231: #endif
        !           232:                if (pid <= 0)
        !           233:                        break;
        !           234:                kill_off(pid, w);
        !           235:        }
        !           236: }
        !           237: 
        !           238: kill_off(pid, w)
        !           239: int    pid;
        !           240: union wait     w;
        !           241: {
        !           242:        Process *child;
        !           243: 
        !           244:        if ((child = proc_pid(pid)) == 0)
        !           245:                return;
        !           246: 
        !           247:        if (WIFSTOPPED(w))
        !           248:                child->p_state = STOPPED;
        !           249:        else {
        !           250:                child->p_state = DEAD;
        !           251:                if (WIFEXITED(w))
        !           252:                        child->p_howdied = EXITED;
        !           253:                else if (WIFSIGNALED(w)) {
        !           254:                        child->p_reason = w.w_termsig;
        !           255:                        child->p_howdied = KILLED;
        !           256:                }
        !           257:                proc_close(child);
        !           258:        }
        !           259:        s_mess("%s [%s]    %s", pstate(child), proc_buf(child), proc_cmd(child));
        !           260: }
        !           261: 
        !           262: /* Push/pod process bindings.  I openly acknowledge that this is a
        !           263:    kludge, but I can't be bothered making it right. */
        !           264: 
        !           265: struct proc_bind {
        !           266:        int             pb_key;
        !           267:        data_obj        **pb_map;
        !           268:        data_obj        *pb_push;
        !           269:        data_obj        *pb_cmd;
        !           270:        struct proc_bind *pb_next;
        !           271: };
        !           272: 
        !           273: struct proc_bind *PBinds = 0;
        !           274: 
        !           275: PopPBs()
        !           276: {
        !           277:        register struct proc_bind *p;
        !           278: 
        !           279:        for (p = PBinds; p != 0; p = p->pb_next)
        !           280:                p->pb_map[p->pb_key] = p->pb_push;
        !           281: }
        !           282: 
        !           283: PushPBs()
        !           284: {
        !           285:        register struct proc_bind *p;
        !           286: 
        !           287:        for (p = PBinds; p != 0; p = p->pb_next) {
        !           288:                p->pb_push = p->pb_map[p->pb_key];
        !           289:                p->pb_map[p->pb_key] = p->pb_cmd;
        !           290:        }
        !           291: }
        !           292: /* VARARGS0 */
        !           293: 
        !           294: ProcBind()
        !           295: {
        !           296:        data_obj        *d;
        !           297: 
        !           298:        if ((d = findcom(ProcFmt, NOTHING)) == 0)
        !           299:                return;
        !           300:        s_mess(": %f %s ", d->Name);
        !           301:        ProcB2(mainmap, EOF, d);
        !           302: }
        !           303: 
        !           304: ProcB2(map, lastkey, cmd)
        !           305: data_obj       **map,
        !           306:                *cmd;
        !           307: {
        !           308:        register struct proc_bind *p;
        !           309:        data_obj        **nextmap;
        !           310:        int     c;
        !           311: 
        !           312:        c = addgetc();
        !           313:        if (c == EOF) {
        !           314:                if (lastkey == EOF)
        !           315:                        complain("[Empty key sequence]");
        !           316:                complain("[Unexpected end-of-line]");
        !           317:        } else {
        !           318:                if (nextmap = IsPrefix(map[c]))
        !           319:                        ProcB2(nextmap, c, cmd);
        !           320:                else {
        !           321:                        if (curbuf->b_type == B_IPROCESS)
        !           322:                                PopPBs();
        !           323: 
        !           324:                        for (p = PBinds; p != 0; p = p->pb_next)
        !           325:                                if (p->pb_key == c && p->pb_map == map)
        !           326:                                        break;
        !           327:                        if (p == 0) {
        !           328:                                p = (struct proc_bind *) emalloc(sizeof *p);
        !           329:                                p->pb_next = PBinds;
        !           330:                                PBinds = p;
        !           331:                        }
        !           332:                        p->pb_map = map;
        !           333:                        p->pb_key = c;
        !           334:                        p->pb_cmd = cmd;
        !           335: 
        !           336:                        if (curbuf->b_type == B_IPROCESS)
        !           337:                                PushPBs();
        !           338:                }
        !           339:        }
        !           340: }
        !           341: 
        !           342: #endif IPROCS

unix.superglobalmegacorp.com

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