Annotation of xinu/sys/TEST/test.c.dsk2, revision 1.1.1.1

1.1       root        1: /* test.c - main */
                      2: 
                      3: #include <conf.h>
                      4: #include <kernel.h>
                      5: #include <proc.h>
                      6: #include <disk.h>
                      7: #include <file.h>
                      8: #include <dir.h>
                      9: 
                     10: #define        DISKID          33              /* an arbitrary disk id number  */
                     11: 
                     12: struct dir     *dirptr;                /* pointer to the in-core dir   */
                     13: int    dsize;                          /* disk size in blocks          */
                     14: int    niblks;                         /* number of i-blocks this disk */
                     15: char   buf[200];                       /* buffer for input line        */
                     16: char   dbuff[DBUFSIZ];                 /* one disk buffer              */
                     17: char   msg[] =
                     18: "Type C-clear S-size M-makeFS Q-quickM D-dir O-open Z-zap E-exit: ";
                     19: 
                     20: /*------------------------------------------------------------------------
                     21:  *  main  --  general disk utility and test program.
                     22:  *------------------------------------------------------------------------
                     23:  */
                     24: main()
                     25: {
                     26:        char    get1ch();
                     27: 
                     28:        kprintf("\n\n   ***Disk Utility Program***\n\n");
                     29:        dsize = 0;
                     30:        dirptr = dsdirec(DISK0);
                     31:        while (1) {
                     32:                kprintf(msg);
                     33:                switch( get1ch() ) {
                     34:                case 'c':
                     35:                case 'C':       dupclr();
                     36:                                break;
                     37:                case 's':
                     38:                case 'S':       dupsize();
                     39:                                break;
                     40:                case 'm':
                     41:                case 'M':       dupmkfs();
                     42:                                break;
                     43:                case 'd':
                     44:                case 'D':       dupdump();
                     45:                                break;
                     46:                case 'o':
                     47:                case 'O':       dupopen();
                     48:                                break;
                     49: 
                     50:                case 'q':
                     51:                case 'Q':       dupquick();
                     52:                                break;
                     53: 
                     54:                case 'z':
                     55:                case 'Z':       dupzap();
                     56:                                break;
                     57:                case 'e':
                     58:                case 'E':       dupexit();
                     59: 
                     60:                default:
                     61:                                kprintf("invalid response...\n");
                     62:                }
                     63:        read(CONSOLE, buf, 0);
                     64:        }
                     65: }
                     66: 
                     67: /*------------------------------------------------------------------------
                     68:  *  dupclr  --  clear the disk completely
                     69:  *------------------------------------------------------------------------
                     70:  */
                     71: dupclr()
                     72: {
                     73:        DBADDR  i;
                     74:        char    *j, *k;
                     75: 
                     76:        sizeup();
                     77:        kprintf("Clearing disk...\n");
                     78:        k = dbuff;
                     79:        j = (char *) dirptr;
                     80:        for (i=0 ; i<DBUFSIZ ; i++)
                     81:                *k++ = *j++ = '\000';
                     82:        for (i=0 ; i<dsize ; i++) {
                     83:                write(DISK0, dskbcpy(dbuff), i);
                     84:                if (i%1000 == 0)
                     85:                        kprintf("Finished clearing block %u\n", i);
                     86:        }
                     87:        kprintf("Finished clearing all %u blocks\n", dsize);
                     88: }
                     89: 
                     90: 
                     91: /*------------------------------------------------------------------------
                     92:  *  dupsize  --  size the disk and print out the number of blocks
                     93:  *------------------------------------------------------------------------
                     94:  */
                     95: dupsize()
                     96: {
                     97:        sizeup();
                     98:        kprintf("Disk has %u blocks on it\n", dsize);
                     99: }
                    100: 
                    101: /*------------------------------------------------------------------------
                    102:  *  dupmkfs  -- make a file system from scratch
                    103:  *------------------------------------------------------------------------
                    104:  */
                    105: dupmkfs()
                    106: {
                    107:        kprintf("Making a file system...\n");
                    108:        sizeup();
                    109:        dumkfs(DISK0, niblks, dsize, DISKID);
                    110:        kprintf("Finished rebuilding...\n");
                    111: }
                    112: 
                    113: /*------------------------------------------------------------------------
                    114:  *  dupdump  --  dump the disk directory
                    115:  *------------------------------------------------------------------------
                    116:  */
                    117: dupdump()
                    118: {
                    119:        sizeup();
                    120:        kprintf("Dumping disk directory...\n");
                    121:        dudir(DISK0);
                    122: }
                    123: 
                    124: /*------------------------------------------------------------------------
                    125:  *  dupopen  --  open a file on the disk
                    126:  *------------------------------------------------------------------------
                    127:  */
                    128: dupopen()
                    129: {
                    130:        int     strt, stp, val;
                    131:        char    *p;
                    132: 
                    133:        sizeup();
                    134:        kprintf("Enter name of file to open: ");
                    135:        if ( (buf[0] = getc(CONSOLE) ) == SYSERR ||
                    136:             read(CONSOLE, &buf[1], 0) == SYSERR) {
                    137:                kprintf("Invalid length...\n");
                    138:                return;
                    139:        }
                    140:        for (strt=0 ; buf[strt]==' ' ; strt++)
                    141:                ;
                    142:        for (stp=strt ; buf[stp]!='\n' ; stp++)
                    143:                ;
                    144:        buf[stp] = '\000';
                    145:        val = open(DISK0, &buf[strt], "rw");
                    146:        kprintf("Open returns %d...\n",val);
                    147:        if (val > 0) {
                    148:                kprintf("Closing file %d...\n", val);
                    149:                close(val);
                    150:        }
                    151: }
                    152: 
                    153: 
                    154: /*------------------------------------------------------------------------
                    155:  *  dupquick  --  quick rebuild of directory block only
                    156:  *------------------------------------------------------------------------
                    157:  */
                    158: dupquick()
                    159: {
                    160:        int     i;
                    161: 
                    162:        sizeup();
                    163:        kprintf("Rebuilding directory block only...\n");
                    164:        for (i=0 ; i<DBUFSIZ ; i++)
                    165:                dbuff[i] = '\000';
                    166:        dirptr->d_iblks = niblks;
                    167:        dirptr->d_fblst = (DBADDR)ibtodb(niblks)+1;
                    168:        dirptr->d_filst = niblks-1;
                    169:        dirptr->d_id = 62; /*random id*/
                    170:        dirptr->d_nfiles = 0;
                    171:        write(DISK0, dskbcpy(dirptr), DIRBLK);
                    172: }
                    173: 
                    174: 
                    175: /*------------------------------------------------------------------------
                    176:  *  dupzap  --  zap a file from the directory
                    177:  *------------------------------------------------------------------------
                    178:  */
                    179: dupzap()
                    180: {
                    181:        struct  fdes    *fdptr, *fdptr2;
                    182:        int     i, j, strt, stp;
                    183: 
                    184:        sizeup();
                    185:        kprintf("Enter name of file to remove: ");
                    186:        if ( (buf[0] = getc(CONSOLE) ) == SYSERR ||
                    187:             read(CONSOLE, &buf[1], 0) == SYSERR) {
                    188:                kprintf("Invalid length...\n");
                    189:                return;
                    190:        }
                    191:        for (strt=0 ; buf[strt]==' ' ; strt++)
                    192:                ;
                    193:        for (stp=strt ; buf[stp]!='\n' ; stp++)
                    194:                ;
                    195:        buf[stp] = '\000';
                    196:        for (i=0 ; i<dirptr->d_nfiles ; i++) {
                    197:                fdptr = &dirptr->d_files[i];
                    198:                if (strcmp(&buf[strt],fdptr->fdname)==0) {
                    199:                        iblfree(DISK0, fdptr->fdiba);
                    200:                        dirptr->d_nfiles--;
                    201:                        fdptr2 = &dirptr->d_files[i+1];
                    202:                        for (j=i ; j<dirptr->d_nfiles ; j++) {
                    203:                                fdptr->fdlen = fdptr2->fdlen;
                    204:                                fdptr->fdiba = fdptr2->fdiba;
                    205:                                strcpy(fdptr->fdname, fdptr2->fdname);
                    206:                                fdptr++;
                    207:                                fdptr2++;
                    208:                        }
                    209:                        write(DISK0, dskbcpy(dirptr), DIRBLK);
                    210:                        return;
                    211:                }
                    212:        }
                    213:        kprintf("Name not found in directory\n");
                    214: }
                    215: 
                    216: 
                    217: /*------------------------------------------------------------------------
                    218:  *  dupexit  --  exit from the program
                    219:  *------------------------------------------------------------------------
                    220:  */
                    221: dupexit()
                    222: {
                    223:        int     i;
                    224: 
                    225:        kprintf("Exiting utility program...\n");
                    226:        for (i=1 ; i<NPROC ; i++)
                    227:                if (i != currpid)
                    228:                        kill(i);
                    229:        kill(currpid);
                    230: }
                    231: 
                    232: 
                    233: /*------------------------------------------------------------------------
                    234:  *  sizeup  --  size up the disk and place number of blocks in dsize
                    235:  *------------------------------------------------------------------------
                    236:  */
                    237: sizeup()
                    238: {
                    239:        DBADDR  low, high, mid;
                    240: 
                    241:        if (dsize != 0)
                    242:                return(dsize);
                    243:        low = 0;
                    244:        high = 31000;
                    245:        while (low < high-1) {
                    246:                mid = (DBADDR)(low + high)/(DBADDR)2;
                    247:                if (read(DISK0,dbuff,mid) == SYSERR)
                    248:                        high = mid;
                    249:                else
                    250:                        low = mid;
                    251:        }
                    252:        dsize = low+1;
                    253:        niblks = dsize/20;
                    254: }
                    255: 
                    256: /*------------------------------------------------------------------------
                    257:  *  get1ch  --  get one nonblank character from input and flush line
                    258:  *------------------------------------------------------------------------
                    259:  */
                    260: char   get1ch()
                    261: {
                    262:        char    ch;
                    263: 
                    264:        while ( (ch=getc(CONSOLE)) == ' ')
                    265:                ;
                    266:        read(CONSOLE, buf, 0);
                    267:        sleep10(1);
                    268:        return(ch);
                    269: }

unix.superglobalmegacorp.com

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