Annotation of coherent/d/bin/sh/exec2.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * sh/exec2.c
                      3:  * Bourne shell.
                      4:  * System part of execution.
                      5:  */
                      6: 
                      7: #include "sh.h"
                      8: #include <errno.h>
                      9: #include <sys/param.h>
                     10: #include <signal.h>
                     11: #include <sys/stat.h>
                     12: 
                     13: /*
                     14:  * Wait for the given process to complete.
                     15:  */
                     16: waitc(pid)
                     17: int pid;
                     18: {
                     19:        register int f;
                     20:        unsigned s;
                     21:        register int w, n;
                     22:        int     (*ssig)();
                     23: 
                     24:        if (pid < 0)
                     25:                f = -pid;
                     26:        else
                     27:                f = pid;
                     28:        if ((ssig=signal(SIGINT, SIG_IGN)) != SIG_IGN)
                     29:                signal(SIGINT, sigintr);
                     30:        for (;;) {
                     31:                if ((w=wait(&s)) >= 0) {
                     32:                        if (n = (s&0177)) {
                     33:                                if (n==SIGINT)
                     34:                                        sigintr(n);
                     35:                                else if (n==SIGPIPE && spipe
                     36:                                         && (w >= spipe && w <= f))
                     37:                                        ;
                     38:                                else {
                     39:                                        if (w != f)
                     40:                                                prints("%d: ", w);
                     41:                                        if (n==SIGSYS && (s&0200)==0)
                     42:                                            prints("exec failed");
                     43:                                        else if (n>0 && n<=NSIG)
                     44:                                                prints("%s", signame[n]);
                     45:                                        else
                     46:                                                prints("status %d", n);
                     47:                                        if (s & 0200)
                     48:                                                prints(" -- core dumped");
                     49:                                        prints("\n");
                     50:                                }
                     51:                                s = 200 + n;
                     52:                        } else
                     53:                                s >>= 8;
                     54:                        if (w == f) {
                     55:                                slret = s;
                     56:                                break;
                     57:                        }
                     58:                } else if (errno==EINTR) {
                     59:                        if (pid > 0)
                     60:                                continue;
                     61:                        else {
                     62:                                slret = 0;
                     63:                                break;
                     64:                        }
                     65:                } else if (errno==ECHILD) {
                     66:                        if (pid == 0)   
                     67:                                slret = 0;
                     68:                        else
                     69:                                slret = ECHILD;
                     70:                        break;
                     71:                } else {
                     72:                        panic(6);
                     73:                        NOTREACHED;
                     74:                }
                     75:        }
                     76:        signal(SIGINT, ssig);
                     77:        return (slret);
                     78: }
                     79: 
                     80: /*
                     81:  * Make an imperfect copy of ourself.
                     82:  */
                     83: clone()
                     84: {
                     85:        register int f;
                     86:        register SES *sp;
                     87: 
                     88:        if ((f=fork()) < 0) {
                     89:                prints("Try again\n");
                     90:                reset(RSYSER);
                     91:                NOTREACHED;
                     92:        } else if (f == 0) {
                     93:                nllflag = 1;
                     94:                sflag = iflag = cflag = no1flag = lgnflag = 0;
                     95:                slret = spipe = 0;
                     96:                sp = sesp;
                     97:                sp->s_con->c_next = NULL;
                     98:                while (sp) {
                     99:                        if (sp->s_type == SFILE)
                    100:                                fclose(sp->s_ifp);
                    101:                        sp = sp->s_next;
                    102:                }
                    103:                dflttrp(IFORK);
                    104:        }
                    105:        return (f);
                    106: }
                    107: 
                    108: /*
                    109:  * Open a pipe, panic on failure.
                    110:  * Otherwise return as a clone.
                    111:  */
                    112: pipeline(pv)
                    113: int *pv;
                    114: {
                    115:        if (pipe(pv) < 0) {
                    116:                prints("Pipe failed\n");
                    117:                reset(RSYSER);
                    118:                NOTREACHED;
                    119:        }
                    120:        return (clone());
                    121: }
                    122: 
                    123: /*
                    124:  * Try to execute a file in several ways.
                    125:  *     A return is always an error.
                    126:  *     Used by exec in inline.
                    127:  */
                    128: flexec()
                    129: {
                    130:        ffind(NULL);
                    131:        while (ffind(vpath, *nargv, 1)) {
                    132:                execve(strt, nargv, nenvp);
                    133:                if (errno==ENOEXEC) {
                    134:                        scmdp = duplstr(strt, 0);
                    135:                        nargc += 1;
                    136:                        nargv -= 1;
                    137:                        nargv = vdupl(nargv);
                    138:                        nenvp = vdupl(nenvp);
                    139:                        while (sesp) {
                    140:                                freebuf(sesp->s_bpp);
                    141:                                sesp = sesp->s_next;
                    142:                        }
                    143:                        longjmp(restart, 1);
                    144:                }
                    145:                if (errno==E2BIG) {
                    146:                        e2big(nargv[0]);
                    147:                        return(-1);
                    148:                }
                    149:        }
                    150:        ecantfind(nargv[0]);
                    151:        return (-1);
                    152: }
                    153: 
                    154: /*
                    155:  * Process a redirection vector.
                    156:  * Abort and return -1 at the first failure, return 0 for success.
                    157:  */
                    158: redirect(iovp)
                    159: char **iovp;
                    160: {
                    161:        register char **iopp;
                    162:        register char *io;
                    163:        register int op;
                    164:        int u1, u2;
                    165: 
                    166:        for (iopp = iovp;(io = *iopp++)!=NULL; ) {
                    167:                if (class(*io, MDIGI))
                    168:                        u1 = *io++ - '0';
                    169:                else
                    170:                        u1 = *io=='<' ? 0 : 1;
                    171:                for (op=0; ; io+=1)
                    172:                        if (*io=='>')
                    173:                                op += 1;
                    174:                        else if (*io=='<')
                    175:                                op -= 1;
                    176:                        else
                    177:                                break;
                    178:                if (*io++ == '&') {
                    179:                        if (op != 1 && op != -1) {
                    180:                                panic(7);
                    181:                                NOTREACHED;
                    182:                        }
                    183:                        u2 = *io++;
                    184:                        if (u2 == '-') {
                    185:                                close(u1);
                    186:                                continue;
                    187:                        } else if (!class(u2, MDIGI)) {
                    188:                                eredir();
                    189:                                return (-1);
                    190:                        } else {
                    191:                                u2 -= '0';
                    192:                                dup2(u2, u1);
                    193:                                continue;
                    194:                        }
                    195:                }
                    196:                for (io-=1; *io==' '||*io=='\t'; io+=1);
                    197:                switch (op) {
                    198:                case -2:        /* Unquoted here */
                    199:                                /* Fall through */
                    200:                case -1:        /* Input file, quoted here */
                    201:                        if ((u2 = open(io, 0)) < 0) {
                    202:                                ecantopen(io);
                    203:                                return (-1);
                    204:                        }
                    205:                        if (op == -2 && (u2 = evalhere(u2)) < 0)
                    206:                                return (-1);
                    207:                        dup2(u2, u1);
                    208:                        close(u2);
                    209:                        continue;
                    210:                case 2:         /* Append to output */
                    211:                        if ((u2 = open(io, 1)) >= 0) {
                    212:                                lseek(u2, 0L, 2);
                    213:                                dup2(u2, u1);
                    214:                                close(u2);
                    215:                                continue;
                    216:                        } /* else fall through */
                    217:                case 1:         /* Output file */
                    218:                        if ((u2 = creat(io, 0666)) < 0) {
                    219:                                ecantmake(io);
                    220:                                return (-1);
                    221:                        }
                    222:                        dup2(u2, u1);
                    223:                        close(u2);
                    224:                        continue;
                    225:                default:
                    226:                        panic(8);
                    227:                        NOTREACHED;
                    228:                }
                    229:        }
                    230:        return (0);
                    231: }
                    232: 
                    233: #ifdef NAMEPIPE
                    234: /*
                    235:  * Create a named pipe.
                    236:  */
                    237: npipe(np)
                    238: register NODE *np;
                    239: {
                    240:        register char *tmp;
                    241:        register int f;
                    242:        char *tvec[2];
                    243: 
                    244:        tmp = shtmp();
                    245:        mknod(tmp, S_IFPIP, 0);
                    246:        if ((f = clone()) == 0) {
                    247:                if (np->n_type==NRPIPE)
                    248:                        strt[0] = '<';
                    249:                else
                    250:                        strt[0] = '>';
                    251:                strt[1] = '\0';
                    252:                tvec[0] = strcat(strt, tmp);
                    253:                tvec[1] = NULL;
                    254:                redirect(tvec);
                    255:                command(np->n_auxp);
                    256:                exit(slret);
                    257:                NOTREACHED;
                    258:        }
                    259:        cleanup(0, tmp);
                    260:        strcpy(strt, tmp);
                    261:        return;
                    262: }
                    263: #endif
                    264: 
                    265: /*
                    266:  * Search a path, perhaps repeatedly, for a file with access mode.
                    267:  * Is called with paths == NULL to reset pointers.
                    268:  * UGLY, but it works.
                    269:  */
                    270: ffind(paths, file, mode)
                    271: char *paths, *file;
                    272: {
                    273:        register char c, *cp1, *cp2;
                    274:        static char *fp, *ff, *fcp;
                    275: 
                    276:        if (paths==NULL) {
                    277:                fp = ff = fcp = NULL;
                    278:                return (0);
                    279:        }
                    280:        if (ff!=file) {
                    281:                fp = fcp = paths;
                    282:                ff = file;
                    283:                if (index(ff, '/')!=NULL)
                    284:                        fcp = "";
                    285:        }
                    286:        for (c=':'; c==':'; ) {
                    287:                cp1 = fcp;
                    288:                cp2 = strt;
                    289:                while (*cp1 && *cp1!=':')
                    290:                        *cp2++ = *cp1++;
                    291:                if (cp2 != strt)
                    292:                        *cp2++ = '/';
                    293:                c = *cp1++;
                    294:                fcp = cp1;
                    295:                cp1 = ff;
                    296:                while (*cp2++ = *cp1++);
                    297:                if (access(strt, mode)>=0)
                    298:                        return (1);
                    299:        }
                    300:        return (0);
                    301: }
                    302: 
                    303: /*
                    304:  * execute a non standard shell.
                    305:  */
                    306: exshell(vp) VAR *vp;
                    307: {
                    308:        char *vshell;
                    309:        register char *p;
                    310: 
                    311:        vshell = vp->v_strp;
                    312:        while (*vshell && *vshell++ != '=');
                    313:        /* Construct -name argv[0] */
                    314:        if ((p = rindex(vshell, '/')) != NULL)
                    315:                p += 1;
                    316:        else
                    317:                p = vshell;
                    318:        strcpy(strt, "-");
                    319:        strcat(strt, p);
                    320:        /* Construct argv */
                    321:        nargv = makargl();
                    322:        nargv = addargl(nargv, "sh");
                    323:        nargv = addargl(nargv, duplstr(strt, 0));
                    324:        nargc = 2;
                    325:        /* Construct envp */
                    326:        nenvp = makargl();
                    327:        nenvp = envlvar(nenvp);
                    328:        /* Try exec */
                    329:        execve(vshell, nargv+1, nenvp);
                    330: 
                    331:        if (errno==ENOEXEC) {
                    332:                fakearg(1, nargc, nargv, nenvp);
                    333:                sargc = 0;
                    334:                sargp = nargv+2;
                    335:                sarg0 = nargv[1];
                    336:                nllflag = 0;
                    337:                return session(SFILE, vshell);
                    338:        }
                    339:        fprintf(stderr, "No shell: %s\n", vshell);
                    340:        exit(1);
                    341: }
                    342: 
                    343: /*
                    344:  * Check to see if we have mail.
                    345:  */
                    346: checkmail()
                    347: {
                    348:        static long mailsize = -1;
                    349:        struct stat sbuf;
                    350: 
                    351:        if (*vmail == '\0')
                    352:                return;
                    353:        if (stat(vmail, &sbuf)<0) {
                    354:                mailsize = 0;
                    355:        } else {
                    356:                if (sbuf.st_size != 0
                    357:                 && sbuf.st_size > mailsize) {
                    358:                        if (mailsize == -1)
                    359:                                prints("You have mail.\n");
                    360:                        else
                    361:                                prints("You have new mail.\n");
                    362:                }
                    363:                mailsize = sbuf.st_size;
                    364:        }
                    365: }
                    366: 
                    367: /* end of sh/exec2.c */

unix.superglobalmegacorp.com

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