Annotation of xinu/sys/shell/shell.c, revision 1.1.1.1

1.1       root        1: /* shell.c - shell */
                      2: 
                      3: #include <conf.h>
                      4: #include <kernel.h>
                      5: #include <proc.h>
                      6: #include <shell.h>
                      7: #include <cmd.h>
                      8: #include <tty.h>
                      9: 
                     10: struct shvars  Shl;                    /* globals used by Xinu shell   */
                     11: struct cmdent  cmds[]  = {CMDS};       /* shell commands               */
                     12: LOCAL  char    errhd[] = "Syntax error\n";/* global error messages     */
                     13: LOCAL  char    fmt[]   = "Cannot open %s\n";
                     14: LOCAL  char    fmt2[]  = "[%d]\n";
                     15: 
                     16: /*------------------------------------------------------------------------
                     17:  *  shell  -  Xinu shell with file redirection and background processing
                     18:  *------------------------------------------------------------------------
                     19:  */
                     20: shell(dev)
                     21: int    dev;
                     22: {
                     23:        int     ntokens;
                     24:        int     i, j, len;
                     25:        int     com;
                     26:        char    *outnam, *innam;
                     27:        int     stdin, stdout, stderr;
                     28:        Bool    backgnd;
                     29:        char    ch, mach[SHMLEN];
                     30:        int     child;
                     31: 
                     32:        Shl.shncmds = sizeof(cmds)/sizeof(struct cmdent);
                     33:        for (getname(mach) ; TRUE ; ) {
                     34:                fprintf(dev, "%s %% ", mach);
                     35:                getutim(&Shl.shlast);
                     36:                if ( (len = read(dev, Shl.shbuf, SHBUFLEN)) == 0)
                     37:                        len = read(dev, Shl.shbuf, SHBUFLEN);
                     38:                if (len == EOF)
                     39:                        break;
                     40:                Shl.shbuf[len-1] = NULLCH;
                     41:                if ( (ntokens=lexan(Shl.shbuf)) == SYSERR) {
                     42:                        fprintf(dev, errhd);
                     43:                        continue;
                     44:                } else if (ntokens == 0)
                     45:                        continue;
                     46:                outnam = innam = NULL;
                     47:                backgnd = FALSE;
                     48: 
                     49:                /* handle '&' */
                     50: 
                     51:                if (Shl.shtktyp[ntokens-1] == '&') {
                     52:                        ntokens-- ;
                     53:                        backgnd = TRUE;
                     54:                }
                     55: 
                     56:                /* scan tokens, accumulating length;  handling redirect */
                     57: 
                     58:                for (len=0,i=0 ; i<ntokens ; ) {
                     59:                        if ((ch = Shl.shtktyp[i]) == '&') {
                     60:                                ntokens = -1;
                     61:                                break;
                     62:                        } else if (ch == '>') {
                     63:                                if (outnam != NULL || i >= --ntokens) {
                     64:                                        ntokens = -1;
                     65:                                        break;
                     66:                                }
                     67:                                outnam = Shl.shtok[i+1];
                     68:                                for (ntokens--,j=i ; j<ntokens ; j++) {
                     69:                                        Shl.shtktyp[j] = Shl.shtktyp[j+2];
                     70:                                        Shl.shtok  [j] = Shl.shtok  [j+2];
                     71:                                }
                     72:                                continue;
                     73:                        } else if (ch == '<') {
                     74:                                if (innam != NULL || i >= --ntokens) {
                     75:                                        ntokens = -1;
                     76:                                        break;
                     77:                                }
                     78:                                innam = Shl.shtok[i+1];
                     79:                                for (ntokens--,j=i ; j < ntokens ; j++) {
                     80:                                        Shl.shtktyp[j] = Shl.shtktyp[j+2];
                     81:                                        Shl.shtok  [j] = Shl.shtok  [j+2];
                     82:                                }
                     83:                                continue;
                     84:                        } else {
                     85:                                 len += strlen(Shl.shtok[i++])+1;
                     86:                        }
                     87:                }
                     88:                if (ntokens <= 0) {
                     89:                        fprintf(dev, errhd);
                     90:                        continue;
                     91:                }
                     92:                stdin = stdout = stderr = dev;
                     93: 
                     94:                /* Look up command in table */
                     95: 
                     96:                for (com=0 ; com<Shl.shncmds ; com++) {
                     97:                        if (strcmp(cmds[com].cmdnam,Shl.shtok[0]) == 0)
                     98:                                break;
                     99:                }
                    100:                if (com >= Shl.shncmds) {
                    101:                        fprintf(dev, "%s: not found\n", Shl.shtok[0]);
                    102:                        continue;
                    103:                }
                    104: 
                    105:                /* handle built-in commands with procedure call */
                    106: 
                    107:                if (cmds[com].cbuiltin) {
                    108:                        if (innam != NULL || outnam != NULL || backgnd)
                    109:                                fprintf(dev, errhd);
                    110:                        else if ( (*cmds[com].cproc)(stdin, stdout,
                    111:                                stderr, ntokens, Shl.shtok) == SHEXIT)
                    112:                                break;
                    113:                        continue;
                    114:                }
                    115: 
                    116:                /* Open files and redirect I/O if specified */
                    117: 
                    118:                if (innam != NULL && (stdin=open(NAMESPACE,innam,"ro"))
                    119:                        == SYSERR) {
                    120:                        fprintf(dev, fmt, innam);
                    121:                        continue;
                    122:                }
                    123:                if (outnam != NULL && (stdout=open(NAMESPACE,outnam,"w"))
                    124:                        == SYSERR) {
                    125:                        fprintf(dev, fmt, outnam);
                    126:                        continue;
                    127:                }
                    128: 
                    129:                /* compute space needed for string args. (in bytes) */
                    130: 
                    131:                len += (ntokens+2) * sizeof(char *);
                    132:                len = (len+sizeof(int)-1)&(~(sizeof(int)-1));
                    133:                control(dev, TCINT, getpid());
                    134: 
                    135:                /* create process to execute conventional command */
                    136: 
                    137:                if ( (child = create(cmds[com].cproc, SHCMDSTK, SHCMDPRI,
                    138:                                Shl.shtok[0],(len/sizeof(int)) + 4,
                    139:                                stdin, stdout, stderr, ntokens))
                    140:                                == SYSERR) {
                    141:                        fprintf(dev, "Cannot create\n");
                    142:                        close(stdout);
                    143:                        close(stdin);
                    144:                        continue;
                    145:                }
                    146:                addarg(child, ntokens, len);
                    147:                setdev(child, stdin, stdout);
                    148:                if (backgnd) {
                    149:                        fprintf(dev, fmt2, child);
                    150:                        resume(child);
                    151:                } else {
                    152:                        setnok(getpid(), child);
                    153:                        recvclr();
                    154:                        resume(child);
                    155:                        if (receive() == INTRMSG) {
                    156:                                setnok(BADPID, child);
                    157:                                fprintf(dev, fmt2, child);
                    158:                        }
                    159:                }
                    160:        }
                    161:        return(OK);
                    162: }

unix.superglobalmegacorp.com

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