|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: char copyright[] =
9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)newfs.c 5.2 (Berkeley) 9/11/85";
15: #endif not lint
16:
17: /*
18: * newfs: friendly front end to mkfs
19: */
20: #include <sys/param.h>
21: #include <sys/stat.h>
22: #include <sys/fs.h>
23: #include <sys/dir.h>
24:
25: #include <stdio.h>
26: #include <disktab.h>
27:
28: #define BOOTDIR "/usr/mdec" /* directory for boot blocks */
29:
30: int Nflag; /* run mkfs without writing file system */
31: int verbose; /* show mkfs line before exec */
32: int noboot; /* do not fill boot blocks */
33: int fssize; /* file system size */
34: int fsize; /* fragment size */
35: int bsize; /* block size */
36: int ntracks; /* # tracks/cylinder */
37: int nsectors; /* # sectors/track */
38: int sectorsize; /* bytes/sector */
39: int cpg; /* cylinders/cylinder group */
40: int minfree = -1; /* free space threshold */
41: int opt; /* optimization preference (space or time) */
42: int rpm; /* revolutions/minute of drive */
43: int density; /* number of bytes per inode */
44:
45: char *av[20]; /* argv array and buffers for exec */
46: char a2[20];
47: char a3[20];
48: char a4[20];
49: char a5[20];
50: char a6[20];
51: char a7[20];
52: char a8[20];
53: char a9[20];
54: char a10[20];
55: char device[MAXPATHLEN];
56: char cmd[BUFSIZ];
57:
58: char *index();
59: char *rindex();
60: char *sprintf();
61:
62: main(argc, argv)
63: int argc;
64: char *argv[];
65: {
66: char *cp, *special;
67: register struct disktab *dp;
68: register struct partition *pp;
69: struct stat st;
70: register int i;
71: int status;
72:
73: argc--, argv++;
74: while (argc > 0 && argv[0][0] == '-') {
75: for (cp = &argv[0][1]; *cp; cp++)
76: switch (*cp) {
77:
78: case 'v':
79: verbose++;
80: break;
81:
82: case 'N':
83: Nflag++;
84: /* fall through to */
85:
86: case 'n':
87: noboot++;
88: break;
89:
90: case 's':
91: if (argc < 1)
92: fatal("-s: missing file system size");
93: argc--, argv++;
94: fssize = atoi(*argv);
95: if (fssize < 0)
96: fatal("%s: bad file system size",
97: *argv);
98: goto next;
99:
100: case 't':
101: if (argc < 1)
102: fatal("-t: missing track total");
103: argc--, argv++;
104: ntracks = atoi(*argv);
105: if (ntracks < 0)
106: fatal("%s: bad total tracks", *argv);
107: goto next;
108:
109: case 'o':
110: if (argc < 1)
111: fatal("-o: missing optimization preference");
112: argc--, argv++;
113: if (strcmp(*argv, "space") == 0)
114: opt = FS_OPTSPACE;
115: else if (strcmp(*argv, "time") == 0)
116: opt = FS_OPTTIME;
117: else
118: fatal("%s: bad optimization preference %s",
119: *argv,
120: "(options are `space' or `time')");
121: goto next;
122:
123: case 'b':
124: if (argc < 1)
125: fatal("-b: missing block size");
126: argc--, argv++;
127: bsize = atoi(*argv);
128: if (bsize < 0 || bsize < MINBSIZE)
129: fatal("%s: bad block size", *argv);
130: goto next;
131:
132: case 'f':
133: if (argc < 1)
134: fatal("-f: missing frag size");
135: argc--, argv++;
136: fsize = atoi(*argv);
137: if (fsize < 0)
138: fatal("%s: bad frag size", *argv);
139: goto next;
140:
141: case 'S':
142: if (argc < 1)
143: fatal("-S: missing sector size");
144: argc--, argv++;
145: sectorsize = atoi(*argv);
146: if (sectorsize < 0)
147: fatal("%s: bad sector size", *argv);
148: goto next;
149:
150: case 'c':
151: if (argc < 1)
152: fatal("-c: missing cylinders/group");
153: argc--, argv++;
154: cpg = atoi(*argv);
155: if (cpg < 0)
156: fatal("%s: bad cylinders/group", *argv);
157: goto next;
158:
159: case 'm':
160: if (argc < 1)
161: fatal("-m: missing free space %%\n");
162: argc--, argv++;
163: minfree = atoi(*argv);
164: if (minfree < 0 || minfree > 99)
165: fatal("%s: bad free space %%\n",
166: *argv);
167: goto next;
168:
169: case 'r':
170: if (argc < 1)
171: fatal("-r: missing revs/minute\n");
172: argc--, argv++;
173: rpm = atoi(*argv);
174: if (rpm < 0)
175: fatal("%s: bad revs/minute\n", *argv);
176: goto next;
177:
178: case 'i':
179: if (argc < 1)
180: fatal("-i: missing bytes per inode\n");
181: argc--, argv++;
182: density = atoi(*argv);
183: if (density < 0)
184: fatal("%s: bad bytes per inode\n",
185: *argv);
186: goto next;
187:
188: default:
189: fatal("-%c: unknown flag", cp);
190: }
191: next:
192: argc--, argv++;
193: }
194: if (argc < 2) {
195: fprintf(stderr, "usage: newfs [ -v ] [ mkfs-options ] %s\n",
196: "special-device device-type");
197: fprintf(stderr, "where mkfs-options are:\n");
198: fprintf(stderr, "\t-N do not create file system, %s\n",
199: "just print out parameters");
200: fprintf(stderr, "\t-s file system size (sectors)\n");
201: fprintf(stderr, "\t-b block size\n");
202: fprintf(stderr, "\t-f frag size\n");
203: fprintf(stderr, "\t-t tracks/cylinder\n");
204: fprintf(stderr, "\t-c cylinders/group\n");
205: fprintf(stderr, "\t-m minimum free space %%\n");
206: fprintf(stderr, "\t-o optimization preference %s\n",
207: "(`space' or `time')");
208: fprintf(stderr, "\t-r revolutions/minute\n");
209: fprintf(stderr, "\t-S sector size\n");
210: fprintf(stderr, "\t-i number of bytes per inode\n");
211: exit(1);
212: }
213: special = argv[0];
214: cp = rindex(special, '/');
215: if (cp != 0)
216: special = cp + 1;
217: if (*special == 'r' && special[1] != 'a' && special[1] != 'b')
218: special++;
219: special = sprintf(device, "/dev/r%s", special);
220: if (stat(special, &st) < 0) {
221: fprintf(stderr, "newfs: "); perror(special);
222: exit(2);
223: }
224: if ((st.st_mode & S_IFMT) != S_IFCHR)
225: fatal("%s: not a character device", special);
226: dp = getdiskbyname(argv[1]);
227: if (dp == 0)
228: fatal("%s: unknown disk type", argv[1]);
229: cp = index(argv[0], '\0') - 1;
230: if (cp == 0 || *cp < 'a' || *cp > 'h')
231: fatal("%s: can't figure out file system partition", argv[0]);
232: pp = &dp->d_partitions[*cp - 'a'];
233: if (fssize == 0) {
234: fssize = pp->p_size;
235: if (fssize < 0)
236: fatal("%s: no default size for `%c' partition",
237: argv[1], *cp);
238: }
239: if (nsectors == 0) {
240: nsectors = dp->d_nsectors;
241: if (nsectors < 0)
242: fatal("%s: no default #sectors/track", argv[1]);
243: }
244: if (ntracks == 0) {
245: ntracks = dp->d_ntracks;
246: if (ntracks < 0)
247: fatal("%s: no default #tracks", argv[1]);
248: }
249: if (sectorsize == 0) {
250: sectorsize = dp->d_secsize;
251: if (sectorsize < 0)
252: fatal("%s: no default sector size", argv[1]);
253: }
254: if (bsize == 0) {
255: bsize = pp->p_bsize;
256: if (bsize < 0)
257: fatal("%s: no default block size for `%c' partition",
258: argv[1], *cp);
259: }
260: if (fsize == 0) {
261: fsize = pp->p_fsize;
262: if (fsize < 0)
263: fatal("%s: no default frag size for `%c' partition",
264: argv[1], *cp);
265: }
266: if (rpm == 0) {
267: rpm = dp->d_rpm;
268: if (rpm < 0)
269: fatal("%s: no default revolutions/minute value",
270: argv[1]);
271: }
272: if (density <= 0)
273: density = 2048;
274: if (minfree < 0)
275: minfree = 10;
276: if (minfree < 10 && opt != FS_OPTSPACE) {
277: fprintf(stderr, "setting optimization for space ");
278: fprintf(stderr, "with minfree less than 10%\n");
279: opt = FS_OPTSPACE;
280: }
281: if (cpg == 0)
282: cpg = 16;
283: i = 0;
284: if (Nflag)
285: av[i++] = "-N";
286: av[i++] = special;
287: av[i++] = sprintf(a2, "%d", fssize);
288: av[i++] = sprintf(a3, "%d", nsectors);
289: av[i++] = sprintf(a4, "%d", ntracks);
290: av[i++] = sprintf(a5, "%d", bsize);
291: av[i++] = sprintf(a6, "%d", fsize);
292: av[i++] = sprintf(a7, "%d", cpg);
293: av[i++] = sprintf(a8, "%d", minfree);
294: av[i++] = sprintf(a9, "%d", rpm / 60);
295: av[i++] = sprintf(a10, "%d", density);
296: av[i++] = opt == FS_OPTSPACE ? "s" : "t";
297: av[i++] = 0;
298: strcpy(cmd, "/etc/mkfs");
299: for (i = 0; av[i] != 0; i++) {
300: strcat(cmd, " ");
301: strcat(cmd, av[i]);
302: }
303: if (verbose)
304: printf("%s\n", cmd);
305: if (status = system(cmd))
306: exit(status >> 8);
307: if (*cp == 'a' && !noboot) {
308: char type[3];
309: struct stat sb;
310:
311: cp = rindex(special, '/');
312: if (cp == NULL)
313: fatal("%s: can't figure out disk type from name",
314: special);
315: if (stat(special, &sb) >= 0 && (sb.st_mode & S_IFMT) == S_IFCHR)
316: cp++;
317: type[0] = *++cp;
318: type[1] = *++cp;
319: type[2] = '\0';
320: installboot(special, type);
321: }
322: exit(0);
323: }
324:
325: installboot(dev, type)
326: char *dev, *type;
327: {
328: int fd;
329: char bootblock[MAXPATHLEN], standalonecode[MAXPATHLEN];
330: char bootimage[BBSIZE];
331:
332: sprintf(bootblock, "%s/%sboot", BOOTDIR, type);
333: sprintf(standalonecode, "%s/boot%s", BOOTDIR, type);
334: if (verbose) {
335: printf("installing boot code\n");
336: printf("sector 0 boot = %s\n", bootblock);
337: printf("1st level boot = %s\n", standalonecode);
338: }
339: fd = open(bootblock, 0);
340: if (fd < 0) {
341: fprintf(stderr, "newfs: "); perror(bootblock);
342: exit(1);
343: }
344: if (read(fd, bootimage, DEV_BSIZE) < 0) {
345: fprintf(stderr, "newfs: "); perror(bootblock);
346: exit(2);
347: }
348: close(fd);
349: fd = open(standalonecode, 0);
350: if (fd < 0) {
351: fprintf(stderr, "newfs: "); perror(standalonecode);
352: exit(1);
353: }
354: if (read(fd, &bootimage[DEV_BSIZE], BBSIZE - DEV_BSIZE) < 0) {
355: fprintf(stderr, "newfs: "); perror(standalonecode);
356: exit(2);
357: }
358: close(fd);
359: fd = open(dev, 1);
360: if (fd < 0) {
361: fprintf(stderr, "newfs: "); perror(dev);
362: exit(1);
363: }
364: if (write(fd, bootimage, BBSIZE) != BBSIZE) {
365: fprintf(stderr, "newfs: "); perror(dev);
366: exit(2);
367: }
368: close(fd);
369: }
370:
371: /*VARARGS*/
372: fatal(fmt, arg1, arg2)
373: char *fmt;
374: {
375:
376: fprintf(stderr, "newfs: ");
377: fprintf(stderr, fmt, arg1, arg2);
378: putc('\n', stderr);
379: exit(10);
380: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.