|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.