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