Annotation of xinu/sys/LSI/dutil.c, revision 1.1

1.1     ! root        1: /* dutil.c - dutil */
        !             2: 
        !             3: #include <conf.h>
        !             4: #include <kernel.h>
        !             5: #include <proc.h>
        !             6: #include <disk.h>
        !             7: #include <lfile.h>
        !             8: #include <dir.h>
        !             9: #include <tty.h>
        !            10: 
        !            11: #define        TERMEOF         '\004'          /* interpreted as EOF at console*/
        !            12: #define        DISKID          33              /* an arbitrary disk id number  */
        !            13: #ifndef        DISK0
        !            14: #define        DISK0           4
        !            15: #endif
        !            16: 
        !            17: struct dir     *dirptr;                /* pointer to the in-core dir   */
        !            18: int    diskdev;                        /* disk device operated on      */
        !            19: int    dsize;                          /* disk size in blocks          */
        !            20: int    niblks;                         /* number of i-blocks this disk */
        !            21: char   buf[200];                       /* buffer for input line        */
        !            22: char   dbuff[DBUFSIZ];                 /* one disk buffer              */
        !            23: char   msg[] =
        !            24: "Choose from: dir, read, write, create, or type help\n";
        !            25: #define        PROMPT  "\ncmd: "
        !            26: char   arg1[150];
        !            27: char   arg2[150];
        !            28: Bool   verbose;
        !            29: 
        !            30: struct cmdname {                       /* list of valid commands       */
        !            31:        char    *cname;
        !            32:        int     cargs;
        !            33:        char    *cexpl;
        !            34: } cmds[] = {   "append",       2,      "append file1 onto file2",
        !            35:                "create",       1,      "create a new (empty) file",
        !            36:                "dir",          0,      "list directory",
        !            37:                "exec",         1,      "execute a program from disk",
        !            38:                "freeze",       1,      "freeze this program & save",
        !            39:                "help",         0,      "print this page of info",
        !            40:                "iblock",       1,      "print an iblock",
        !            41:                "init",         1,      "initialize disk device number",
        !            42:                "mkfs",         0,      "make a file system",
        !            43:                "name",         2,      "rename file1 to file2",
        !            44:                "quit",         0,      "quit running this program",
        !            45:                "read",         1,      "read a file and display it",
        !            46:                "size",         0,      "report the size of the disk",
        !            47:                "trace",        1,      "trace a file's iblock list",
        !            48:                "verbose",      1,      "set verbose output y or n",
        !            49:                "write",        1,      "write a file from terminal",
        !            50:                "zap",          1,      "remove a file from the disk",
        !            51:                "?",            0,      "synonym for 'help'"};
        !            52: #define        NCMDS   sizeof(cmds)/sizeof(struct cmdname)
        !            53: int    ncmds;
        !            54: 
        !            55: 
        !            56: /*------------------------------------------------------------------------
        !            57:  *  dutil  --  general disk utility program.
        !            58:  *------------------------------------------------------------------------
        !            59:  */
        !            60: dutil()
        !            61: {
        !            62:        int     ret;
        !            63: 
        !            64:        kprintf("\n\n*** Disk Utility Program ***\n\n");
        !            65:        diskdev = DISK0;
        !            66:        verbose = FALSE;
        !            67:        ncmds = NCMDS;
        !            68:        kprintf("Starting with disk DISK0 (device id = %d)",diskdev);
        !            69:        kprintf("         type '?' for help\n");
        !            70:        dirptr = dsdirec(diskdev);
        !            71:        sizeup(diskdev);
        !            72:        while (1) {
        !            73:                switch( getcmd() ) {
        !            74: 
        !            75:                case 0:         ret = duapp(diskdev, arg1, arg2);
        !            76:                                break;
        !            77: 
        !            78:                case 1:         ret = ducreat(diskdev, arg1);
        !            79:                                break;
        !            80: 
        !            81:                case 2:         ret = dudir(diskdev);
        !            82:                                break;
        !            83: 
        !            84:                case 3:         ret = duexec(diskdev, arg1);
        !            85:                                break;
        !            86: 
        !            87:                case 4:         ret = dufreeze(diskdev, arg1);
        !            88:                                break;
        !            89: 
        !            90:                case 5:         ret = duhelp();
        !            91:                                break;
        !            92: 
        !            93:                case 6:         ret = duiblk(diskdev, arg1);
        !            94:                                break;
        !            95: 
        !            96:                case 7:         ret = duinit(arg1);
        !            97:                                if (ret != SYSERR)
        !            98:                                        diskdev = ret;
        !            99:                                break;
        !           100: 
        !           101:                case 8:         ret = dupmkfs(diskdev);
        !           102:                                break;
        !           103: 
        !           104:                case 9:         ret = duname(diskdev, arg1, arg2);
        !           105:                                break;
        !           106: 
        !           107:                case 10:        ret = duquit();
        !           108:                                break;
        !           109: 
        !           110:                case 11:        ret = duread(diskdev, arg1);
        !           111:                                break;
        !           112: 
        !           113:                case 12:        ret = dusize(diskdev);
        !           114:                                break;
        !           115: 
        !           116:                case 13:        ret = dutrace(diskdev, arg1);
        !           117:                                break;
        !           118: 
        !           119:                case 14:        ret = duverbose(arg1);
        !           120:                                break;
        !           121: 
        !           122:                case 15:        ret = duwrite(diskdev, arg1);
        !           123:                                break;
        !           124: 
        !           125:                case 16:        ret = duzap(diskdev, arg1);
        !           126:                                break;
        !           127: 
        !           128:                case 17:        ret = duhelp();
        !           129:                                break;
        !           130: 
        !           131:                default:        ret = SYSERR;
        !           132: 
        !           133:                }
        !           134:                if (verbose)
        !           135:                        kprintf("Command completed with code %d\n",ret);
        !           136:        }
        !           137: }
        !           138: 
        !           139: 
        !           140: /*------------------------------------------------------------------------
        !           141:  *  duapp  --  append one file to the end of another
        !           142:  *------------------------------------------------------------------------
        !           143:  */
        !           144: duapp(diskdev, from, to)
        !           145: int    diskdev;
        !           146: char   *from, *to;
        !           147: {
        !           148:        int     f1, f2;
        !           149:        int     ich;
        !           150: 
        !           151:        if (verbose)
        !           152:                kprintf("Appending files...\n");
        !           153:        if ( (f2=open(diskdev,to,"rwo")) == SYSERR) {
        !           154:                kprintf("Can't open file %s\n",to);
        !           155:                return(SYSERR);
        !           156:        }
        !           157:        if (verbose)
        !           158:                kprintf("device id for file '%s' is %d\n",to,f2);
        !           159:        if (strcmp(from,"-") == 0)
        !           160:                f1 = CONSOLE;
        !           161:        else
        !           162:                if ( (f1=open(diskdev,from,"ro")) == SYSERR) {
        !           163:                        kprintf("Can't open input file %s\n",from);
        !           164:                        close(f2);
        !           165:                        return(SYSERR);
        !           166:                }
        !           167:        if (verbose)
        !           168:                kprintf("device id for file '%s' is %d\n",from,f1);
        !           169:        while ( (ich=getc(f2)) != EOF)
        !           170:                if (ich == SYSERR)
        !           171:                        kprintf("Error positioning file %s\n",to);
        !           172:        while ( (ich=inchar(f1)) != EOF) {
        !           173:                if (ich == SYSERR) {
        !           174:                        kprintf("Error reading file %s\n", from);
        !           175:                        close(f1);
        !           176:                        close(f2);
        !           177:                        return(SYSERR);
        !           178:                }
        !           179:                putc(f2, ich);
        !           180:        }
        !           181:        close(f1);
        !           182:        close(f2);
        !           183:        return(OK);
        !           184: }
        !           185: 
        !           186: 
        !           187: /*------------------------------------------------------------------------
        !           188:  *  ducreat  --  create an empty disk file given its name
        !           189:  *------------------------------------------------------------------------
        !           190:  */
        !           191: ducreat(diskdev, name)
        !           192: int    diskdev;
        !           193: char   *name;
        !           194: {
        !           195:        int     f1;
        !           196: 
        !           197:        if (verbose)
        !           198:                kprintf("Creating file %s\n", name);
        !           199:        if ( (f1=open(diskdev,name,"nr")) == SYSERR) {
        !           200:                kprintf("Can't create new file %s\n", name);
        !           201:                return(SYSERR);
        !           202:        }
        !           203:        close(f1);
        !           204:        return(OK);
        !           205: }
        !           206: 
        !           207: 
        !           208: /*------------------------------------------------------------------------
        !           209:  *  duexec  --  unfreeze a program and execute from disk
        !           210:  *------------------------------------------------------------------------
        !           211:  */
        !           212: duexec(diskdir, name)
        !           213: int    diskdir;
        !           214: char   *name;
        !           215: {
        !           216:        int     f1;
        !           217: 
        !           218:        if ( (f1=open(diskdev, name, "ro")) == SYSERR) {
        !           219:                kprintf("Can't frind program %s\n", name);
        !           220:                return(SYSERR);
        !           221:        }
        !           222:        kprintf("Command not implemented\n");
        !           223:        close(f1);
        !           224:        return(SYSERR);
        !           225: }
        !           226: 
        !           227: 
        !           228: /*------------------------------------------------------------------------
        !           229:  *  dufreeze  --  freeze this program and save it on disk
        !           230:  *------------------------------------------------------------------------
        !           231:  */
        !           232: dufreeze(diskdev, name)
        !           233: int    diskdev;
        !           234: char   *name;
        !           235: {
        !           236:        int     f1;
        !           237: 
        !           238:        if ( (f1 = open(diskdev,name,"wn")) == SYSERR) {
        !           239:                kprintf("Can't create file %s\n", name);
        !           240:                return(SYSERR);
        !           241:        }
        !           242:        kprintf("Command not implemented\n");
        !           243:        close(f1);
        !           244:        return(SYSERR);
        !           245: }
        !           246: 
        !           247: 
        !           248: /*------------------------------------------------------------------------
        !           249:  *  duhelp  -- print help message
        !           250:  *------------------------------------------------------------------------
        !           251:  */
        !           252: duhelp()
        !           253: {
        !           254:        int     i, len;
        !           255: 
        !           256:        kprintf("\nCommands available are:\n\n");
        !           257:        kprintf("   Command      #args     Description\n");
        !           258:        for (i=0 ; i<ncmds ; i++) {
        !           259:                kprintf("   %s",cmds[i].cname);
        !           260:                for (len=strlen(cmds[i].cname) ; len<16 ; len++)
        !           261:                        kprintf(" ");
        !           262:                kprintf("%d    %s\n",cmds[i].cargs, cmds[i].cexpl);
        !           263:        }
        !           264:        kprintf("\n");
        !           265:        return(OK);             
        !           266: }
        !           267: 
        !           268: 
        !           269: /*------------------------------------------------------------------------
        !           270:  *  duiblk  --  print an iblock given its index
        !           271:  *------------------------------------------------------------------------
        !           272:  */
        !           273: duiblk(diskdev, arg)
        !           274: int    diskdev;
        !           275: char   *arg;
        !           276: {
        !           277:        struct  iblk    iblock;
        !           278:        int     k, j;
        !           279:        char    ch;
        !           280:        IBADDR  ibnum;
        !           281: 
        !           282:        for (ibnum=0 ; (ch = *arg)!='\000' ; arg++) {
        !           283:                if (ch<'0' || ch>'9')
        !           284:                        return(SYSERR);
        !           285:                ibnum = 10*ibnum + (ch - '0');
        !           286:        }
        !           287:        if (ibnum < 0)
        !           288:                return(SYSERR);
        !           289:        ibget(diskdev, ibnum, &iblock);
        !           290:        kprintf("iblock %d: offset=%U  next=%d\n\n   ",
        !           291:                ibnum, iblock.ib_byte, iblock.ib_next);
        !           292:        for (j=IBLEN-1 ; j>=0&&iblock.ib_dba[j]==DBNULL ; j--)
        !           293:                ;
        !           294:        if (j < 0)
        !           295:                kprintf("empty\n");
        !           296:        else {
        !           297:                for (k=0 ; k<=j ; k++)
        !           298:                        kprintf("%u ", iblock.ib_dba[k]);
        !           299:                kprintf("\n");
        !           300:        }
        !           301:        return(OK);
        !           302: }
        !           303: 
        !           304: 
        !           305: /*------------------------------------------------------------------------
        !           306:  *  duinit  --  initialize disk drive number and size
        !           307:  *------------------------------------------------------------------------
        !           308:  */
        !           309: duinit(drive)
        !           310: char   *drive;
        !           311: {
        !           312:        int     i,n;
        !           313:        char    ch;
        !           314: 
        !           315:        n = 0;
        !           316:        for (i=0 ; i<20 ; i++) {
        !           317:                if ( (ch = *drive++) == '\000' || ch=='\n') {
        !           318:                        sizeup(n);
        !           319:                        return(n);
        !           320:                } else {
        !           321:                        if (ch<'0' || ch>'9') {
        !           322:                                kprintf("Digit expected; got '%c'\n",ch);
        !           323:                                return(SYSERR);
        !           324:                        }
        !           325:                        n = 10*n + (ch - '0');
        !           326:                }
        !           327:        }
        !           328:        kprintf("Argument too long.\n");
        !           329:        return(SYSERR);
        !           330: }
        !           331: 
        !           332: 
        !           333: /*------------------------------------------------------------------------
        !           334:  *  dupmkfs  -- make a file system from scratch
        !           335:  *------------------------------------------------------------------------
        !           336:  */
        !           337: dupmkfs(diskdev)
        !           338: int    diskdev;
        !           339: {
        !           340:        int     ret;
        !           341: 
        !           342:        if (verbose)
        !           343:                kprintf("Making a file system...\n");
        !           344:        ret = dumkfs(diskdev, niblks, dsize, DISKID, verbose);
        !           345:        return(ret);
        !           346: }
        !           347: 
        !           348: /*------------------------------------------------------------------------
        !           349:  *  duname  -- rename one file into another
        !           350:  *------------------------------------------------------------------------
        !           351:  */
        !           352: duname(diskdev, fname, tname)
        !           353: int    diskdev;
        !           354: char   *fname;
        !           355: char   *tname;
        !           356: {
        !           357:        struct  fdes    *fdptr, *fdptr2;
        !           358:        struct  dir     *dirptr;
        !           359:        int     i, pos;
        !           360:        int     sem;
        !           361: 
        !           362:        if (verbose)
        !           363:                kprintf("Renaming file '%s' to '%s'\n", fname, tname);
        !           364:        dirptr = dsdirec(diskdev);
        !           365:        sem = ( (struct dsblk *)devtab[diskdev].dvioblk)->ddirsem;
        !           366:        wait(sem);
        !           367:        for (pos= -1,i=0 ; i<dirptr->d_nfiles ; i++) {
        !           368:                fdptr = &dirptr->d_files[i];
        !           369:                if (strcmp(fname, fdptr->fdname) == 0) {
        !           370:                        pos = i;
        !           371:                } else if (strcmp(tname, fdptr->fdname) == 0) {
        !           372:                        kprintf("File '%s' already exists\n",tname);
        !           373:                        signal(sem);
        !           374:                        return(SYSERR);
        !           375:                }
        !           376:        }
        !           377:        if (pos >= 0) {
        !           378:                strcpy(dirptr->d_files[pos].fdname, tname);
        !           379:                write(diskdev, dskbcpy(dirptr), DIRBLK);
        !           380:                signal(sem);
        !           381:                return(OK);
        !           382:        }
        !           383:        kprintf("File '%s' not found in directory\n", fname);
        !           384:        signal(sem);
        !           385:        return(SYSERR);
        !           386: }
        !           387: 
        !           388: 
        !           389: /*------------------------------------------------------------------------
        !           390:  *  duquit  --  stop executing
        !           391:  *------------------------------------------------------------------------
        !           392:  */
        !           393: duquit()
        !           394: {
        !           395:        int     i;
        !           396: 
        !           397:        if (verbose)
        !           398:                kprintf("Exiting utility program...\n");
        !           399:        for (i=1 ; i<NPROC ; i++)
        !           400:                if (i != currpid)
        !           401:                        kill(i);
        !           402:        kill(currpid);
        !           403: }
        !           404: 
        !           405: 
        !           406: /*------------------------------------------------------------------------
        !           407:  *  duread  -- read a file and display on the terminal
        !           408:  *------------------------------------------------------------------------
        !           409:  */
        !           410: duread(diskdev, fname)
        !           411: int    diskdev;
        !           412: char   *fname;
        !           413: {
        !           414:        int     f, ich;
        !           415: 
        !           416:        if (verbose)
        !           417:                kprintf("Read file %s\n", fname);
        !           418:        if ( (f=open(diskdev, fname, "ro")) == SYSERR) {
        !           419:                kprintf("Can't open file %s\n", fname);
        !           420:                return(SYSERR);
        !           421:        }
        !           422:        while( (ich=getc(f)) != EOF )
        !           423:                if (ich == SYSERR) {
        !           424:                        kprintf("***ERROR ON READ***\n");
        !           425:                        return(SYSERR);
        !           426:                } else
        !           427:                        kprintf("%c", ich);
        !           428:        close(f);
        !           429:        return(OK);
        !           430: }
        !           431: 
        !           432: 
        !           433: /*------------------------------------------------------------------------
        !           434:  *  dusize  --  size the disk and print out the number of blocks
        !           435:  *------------------------------------------------------------------------
        !           436:  */
        !           437: dusize()
        !           438: {
        !           439:        kprintf("Disk has %u blocks on it\n", dsize);
        !           440: }
        !           441: 
        !           442: 
        !           443: /*------------------------------------------------------------------------
        !           444:  *  dutrace  --  trace the iblock list for a given file
        !           445:  *------------------------------------------------------------------------
        !           446:  */
        !           447: dutrace(diskdev, fname)
        !           448: int    diskdev;
        !           449: char   *fname;
        !           450: {
        !           451:        int     f;
        !           452:        int     inum, i, j,k;
        !           453:        struct  iblk    iblock;
        !           454:        struct  flblk   *flptr;
        !           455: 
        !           456:        if (verbose)
        !           457:                kprintf("Tracing iblocks for file %s\n", fname);
        !           458:        if ( (f=open(diskdev, fname, "ro")) == SYSERR) {
        !           459:                kprintf("Can't open file %s\n", fname);
        !           460:                return(SYSERR);
        !           461:        }
        !           462:        flptr = (struct flblk *)devtab[f].dvioblk;
        !           463:        inum = flptr->fl_iba;
        !           464:        for (i=0 ; inum!=IBNULL && i<10 ; i++) {
        !           465:                kprintf("iblock %d: ",inum);
        !           466:                ibget(diskdev, inum, &iblock);
        !           467:                for (j=IBLEN-1 ; j>=0&&iblock.ib_dba[j]==DBNULL ; j--)
        !           468:                        ;
        !           469:                if (j < 0)
        !           470:                        kprintf("empty\n");
        !           471:                else {
        !           472:                        for (k=0 ; k<=j ; k++)
        !           473:                                kprintf("%u ", iblock.ib_dba[k]);
        !           474:                        kprintf("\n");
        !           475:                }
        !           476:                inum = iblock.ib_next;
        !           477:        }
        !           478:        close(f);
        !           479:        return(OK);
        !           480: }
        !           481: 
        !           482: /*------------------------------------------------------------------------
        !           483:  *  duverbose  --  turn on/off verbose output switch
        !           484:  *------------------------------------------------------------------------
        !           485:  */
        !           486: duverbose(arg)
        !           487: char   *arg;
        !           488: {
        !           489:        int     len;
        !           490: 
        !           491:        if (verbose)
        !           492:                kprintf("Setting verbose option.\n");
        !           493:        len = strlen(arg);
        !           494:        if (len<=3 && strncmp(arg,"yes",len) == 0) {
        !           495:                verbose = TRUE;
        !           496:                return(OK);
        !           497:        } else if (len<=2 && strncmp(arg,"no",len) == 0) {
        !           498:                verbose = FALSE;
        !           499:                return(OK);
        !           500:        }
        !           501:        kprintf("Argument must be 'yes' or 'no', not '%s'\n", arg);
        !           502:        return(SYSERR);
        !           503: }
        !           504: 
        !           505: 
        !           506: /*------------------------------------------------------------------------
        !           507:  *  duwrite  --  overwrite a file taking input from terminal
        !           508:  *------------------------------------------------------------------------
        !           509:  */
        !           510: duwrite(diskdev, fname)
        !           511: {
        !           512:        int     f, ich;
        !           513: 
        !           514:        if (verbose)
        !           515:                kprintf("Writing file %s\n", fname);
        !           516:        if ( (f=open(diskdev,fname,"wo")) == SYSERR) {
        !           517:                kprintf("Error opening file %s -- will attempt to create\n",
        !           518:                        fname);
        !           519:                if ( (f=open(diskdev,fname,"wn")) == SYSERR) {
        !           520:                        kprintf("Can't create file %s\n", fname);
        !           521:                        return(SYSERR);
        !           522:                }
        !           523:        }
        !           524:        kprintf("Enter text; terminate with CNTL-d\n\n");
        !           525:        while( (ich=inchar(CONSOLE)) != EOF )
        !           526:                putc(f, ich);
        !           527:        close(f);
        !           528:        return(OK);
        !           529: }
        !           530: 
        !           531: 
        !           532: /*------------------------------------------------------------------------
        !           533:  *  dupzap  --  zap a file from the directory
        !           534:  *------------------------------------------------------------------------
        !           535:  */
        !           536: duzap(diskdev, fname)
        !           537: int    diskdev;
        !           538: char   *fname;
        !           539: {
        !           540:        struct  fdes    *fdptr, *fdptr2;
        !           541:        struct  dir     *dirptr;
        !           542:        int     i, j, sem;
        !           543:        IBADDR  ilist;
        !           544: 
        !           545:        if (verbose)
        !           546:                kprintf("Removing file %s from directory\n", fname);
        !           547:        dirptr = dsdirec(diskdev);
        !           548:        sem = ((struct dsblk *)devtab[diskdev].dvioblk)->ddirsem;
        !           549:        wait(sem);
        !           550:        for (i=0 ; i<dirptr->d_nfiles ; i++) {
        !           551:                fdptr = &dirptr->d_files[i];
        !           552:                if (strcmp(fname, fdptr->fdname) == 0) {
        !           553:                        ilist = fdptr->fdiba;
        !           554:                        dirptr->d_nfiles--;
        !           555:                        fdptr2 = &dirptr->d_files[i+1];
        !           556:                        for (j=i ; j<dirptr->d_nfiles ; j++)
        !           557:                                *fdptr++ = *fdptr2++;
        !           558:                        write(diskdev, dskbcpy(dirptr), DIRBLK);
        !           559:                        signal(sem);
        !           560:                        iblfree(diskdev, ilist);
        !           561:                        return(OK);
        !           562:                }
        !           563:        }
        !           564:        kprintf("File %s not found in directory\n", fname);
        !           565:        signal(sem);
        !           566:        return(SYSERR);
        !           567: }
        !           568: 
        !           569: 
        !           570: /*------------------------------------------------------------------------
        !           571:  *  sizeup  --  size up the disk and place number of blocks in dsize
        !           572:  *------------------------------------------------------------------------
        !           573:  */
        !           574: LOCAL  sizeup(diskdev)
        !           575: int    diskdev;
        !           576: {
        !           577:        DBADDR  low, high, mid;
        !           578: 
        !           579:        low = 0;
        !           580:        high = 31000;
        !           581:        while (low < high-1) {
        !           582:                mid = (DBADDR)(low + high)/(DBADDR)2;
        !           583:                if (read(diskdev,dbuff,mid) == SYSERR)
        !           584:                        high = mid;
        !           585:                else
        !           586:                        low = mid;
        !           587:        }
        !           588:        dsize = low+1;
        !           589:        niblks = dsize/20;
        !           590: }
        !           591: 
        !           592: 
        !           593: /*------------------------------------------------------------------------
        !           594:  *  inchar  --  get next input character
        !           595:  *------------------------------------------------------------------------
        !           596:  */
        !           597: LOCAL  inchar(dev)
        !           598: {
        !           599:        int     ich;
        !           600: 
        !           601:        if (dev!=CONSOLE)
        !           602:                return(getc(dev));
        !           603:        if ( (ich=getc(CONSOLE)) == TERMEOF) {
        !           604:                while( getc(CONSOLE) != NEWLINE)
        !           605:                        ;
        !           606:                return(EOF);
        !           607:        } else
        !           608:                return(ich);
        !           609: }
        !           610: 
        !           611: 
        !           612: /*------------------------------------------------------------------------
        !           613:  *  getcmd  -- get next command and appropriate number of args.
        !           614:  *------------------------------------------------------------------------
        !           615:  */
        !           616: getcmd()
        !           617: {
        !           618:        int     i;
        !           619: 
        !           620:        while (1) {
        !           621:                kprintf("%s", PROMPT);
        !           622:                i = duparse();
        !           623:                sleep10(1);
        !           624:                if (i != SYSERR)
        !           625:                        return(i);
        !           626:                else                    
        !           627:                        kprintf("%s\n", msg);
        !           628:        }
        !           629: }
        !           630: 
        !           631: 
        !           632: /*------------------------------------------------------------------------
        !           633:  *  duparse  -- parse one command line and return command index
        !           634:  *------------------------------------------------------------------------
        !           635:  */
        !           636: LOCAL  duparse()
        !           637: {
        !           638:        int     len, i, nargs, cindex;
        !           639:        char    ch;
        !           640: 
        !           641:        while( (ch=getc(CONSOLE)) == ' ')
        !           642:                ;
        !           643:        for (len=0 ; ch!='\n' && ch!=' ' ; ch=getc(CONSOLE))
        !           644:                buf[len++] = ch;
        !           645:        if (len == 0)
        !           646:                return(SYSERR);
        !           647:        buf[len] = '\000';
        !           648:        if ( (cindex=lookup(len)) == SYSERR) {
        !           649:                read(CONSOLE, buf, 0);
        !           650:                return(SYSERR);
        !           651:        }
        !           652:        if ( (nargs=cmds[cindex].cargs) == 0) {
        !           653:                while (ch != '\n')
        !           654:                        ch = getc(CONSOLE);
        !           655:                return(cindex);
        !           656:        }
        !           657:        while (ch == ' ')
        !           658:                 ch=getc(CONSOLE);
        !           659:        if (ch == '\n') {
        !           660:                kprintf("\nToo few arguments for '%s'\n",
        !           661:                        cmds[cindex].cname);
        !           662:                return(SYSERR);
        !           663:        }
        !           664:        for (len=0 ; ch!='\n' && ch!=' ' ; ch=getc(CONSOLE))
        !           665:                arg1[len++] = ch;
        !           666:        arg1[len] = '\000';
        !           667:        if ( (nargs=cmds[cindex].cargs) <= 1) {
        !           668:                while (ch != '\n')
        !           669:                        ch = getc(CONSOLE);
        !           670:                return(cindex);
        !           671:        }
        !           672:        while (ch == ' ')
        !           673:                 ch=getc(CONSOLE);
        !           674:        if (ch == '\n') {
        !           675:                kprintf("\nToo few arguments for '%s'\n",
        !           676:                        cmds[cindex].cname);
        !           677:                return(SYSERR);
        !           678:        }
        !           679:        for (len=0 ; ch!='\n' && ch!=' ' ; ch=getc(CONSOLE))
        !           680:                arg2[len++] = ch;
        !           681:        arg2[len] = '\000';
        !           682:        while (ch != '\n')
        !           683:                ch = getc(CONSOLE);
        !           684:        return(cindex);
        !           685: }
        !           686: 
        !           687: 
        !           688: /*------------------------------------------------------------------------
        !           689:  *  lookup  -- lookup a command name in the table, returning its index
        !           690:  *------------------------------------------------------------------------
        !           691:  */
        !           692: LOCAL  lookup(len)
        !           693: int    len;
        !           694: {
        !           695:        int     i;
        !           696: 
        !           697:        for (i=0 ; i<ncmds ; i++)
        !           698:                if (len <= strlen(cmds[i].cname) &&
        !           699:                    strncmp(cmds[i].cname, buf, len) == 0)
        !           700:                        return(i);
        !           701:        return(SYSERR);
        !           702: }

unix.superglobalmegacorp.com

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