|
|
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.