|
|
1.1 ! root 1: char helpmessage[] = "\ ! 2: /etc/fdformat -- format a floppy disk\n\ ! 3: Usage: /etc/fdformat [-a] [-i n] [-o n] [-v] [-w file] special\n\ ! 4: Options:\n\ ! 5: -a write information line during format\n\ ! 6: -i n use interleave factor n (default: 6)\n\ ! 7: -o n use offset factor n for numbering sectors (default: 0)\n\ ! 8: -v verify by reading each track (may be specified repeatedly)\n\ ! 9: -w file write file to the diskette\n\ ! 10: "; ! 11: ! 12: #include <stdio.h> ! 13: #include <sys/fdioctl.h> ! 14: #include <sys/stat.h> ! 15: #include <errno.h> ! 16: ! 17: extern char *malloc(); ! 18: ! 19: int aflag = 0; ! 20: int dvfd = 0; ! 21: char *dvname = NULL; ! 22: char *dvbuff = NULL; ! 23: int wrfd = 0; ! 24: char *wrname = NULL; ! 25: char *wrbuff = NULL; ! 26: int interleave = 6; ! 27: int offset = 0; ! 28: int verify = 0; ! 29: ! 30: struct fform fform[16]; ! 31: ! 32: struct fdata { ! 33: int fd_cyladdress; /* Use cylinder addressing */ ! 34: int fd_heads; /* Number of heads */ ! 35: int fd_tracks; /* Number of tracks per surface */ ! 36: int fd_sectors; /* Number of sectors per track */ ! 37: int fd_size; /* Sector size parameter */ ! 38: int fd_tsz; /* Track size in bytes */ ! 39: } fdata[] = { ! 40: { 0, 1, 40, 8, 2 , 8*512 }, /* minor device 0 - /dev/f8s0 */ ! 41: { 0, 2, 40, 8, 2 , 8*512 }, /* minor device 1 - /dev/f8d0 */ ! 42: { 0, 2, 80, 8, 2 , 8*512 }, /* minor device 2 - /dev/f8q0 */ ! 43: { 0, 1, 40, 9, 2, 9*512 }, /* minor device 3 - /dev/f9s0 */ ! 44: { 0, 2, 40, 9, 2, 9*512 }, /* minor device 4 - /dev/f9d0 */ ! 45: { 0, 2, 80, 9, 2, 9*512 }, /* minor device 5 - /dev/fqd0 */ ! 46: { 0, 2, 80,15, 2, 15*512 }, /* minor device 6 - /dev/fhd0 */ ! 47: { 0, 2, 80,18, 2, 18*512 }, /* minor device 7 - /dev/fvd0 */ ! 48: ! 49: { 0, 0, 0, 0, 0, 0* 0 }, /* minor device 8 - unused */ ! 50: { 1, 2, 40, 8, 2, 8*512 }, /* minor device 9 - /dev/f8a0 */ ! 51: { 0, 0, 0, 0, 0, 0* 0 }, /* minor device 10 - unused */ ! 52: { 0, 0, 0, 0, 0, 0* 0 }, /* minor device 11 - unused */ ! 53: { 1, 2, 40, 9, 2, 9*512 }, /* minor device 12 - /dev/f9a0 */ ! 54: { 1, 2, 80, 9, 2, 9*512 }, /* minor device 13 - /dev/fqa0 */ ! 55: { 1, 2, 80,15, 2, 15*512 }, /* minor device 14 - /dev/fha0 */ ! 56: { 1, 2, 80,18, 2, 18*512 } /* minor device 15 - /dev/fva0 */ ! 57: }; ! 58: ! 59: struct fdata fkind; ! 60: #define NKINDS (sizeof(fdata)/sizeof(fdata[0])) ! 61: struct stat sbuf; ! 62: ! 63: main(argc, argv) ! 64: char *argv[]; ! 65: { ! 66: register int i; ! 67: register char *p; ! 68: int head, retry; ! 69: ! 70: for (i=1; i<argc && argv[i][0]=='-'; ++i) { ! 71: for (p=&argv[i][1]; *p!='\0'; p+=1) { ! 72: switch (*p) { ! 73: ! 74: case 'a': ! 75: ++aflag; ! 76: break; ! 77: ! 78: case 'i': ! 79: if (++i>argc ! 80: || (interleave = atoi(argv[i]))<0) ! 81: usage(); ! 82: break; ! 83: ! 84: case 'o': ! 85: if (++i>argc ! 86: || (offset = atoi(argv[i]))<0) ! 87: usage(); ! 88: break; ! 89: ! 90: case 'v': ! 91: verify += 1; ! 92: break; ! 93: ! 94: case 'w': ! 95: if (++i>argc) ! 96: usage(); ! 97: ! 98: wrname = argv[i]; ! 99: ! 100: if ((wrfd = open(wrname, 0)) < 0) { ! 101: dvname = wrname; ! 102: xxerror("open", 1); ! 103: } ! 104: ! 105: break; ! 106: ! 107: default: ! 108: usage(); ! 109: } ! 110: } ! 111: } ! 112: ! 113: dvname = argv[i++]; ! 114: ! 115: if (i != argc) ! 116: usage(); ! 117: ! 118: if ((dvfd = open(dvname, 2)) < 0) ! 119: xxerror("open", 1); ! 120: ! 121: if (fstat(dvfd, &sbuf) < 0) ! 122: xxerror("fstat", 1); ! 123: ! 124: sbuf.st_rdev &= 0xF; ! 125: ! 126: if (sbuf.st_rdev >= NKINDS) { ! 127: errno = ENXIO; ! 128: xxerror("kind check", 1); ! 129: } ! 130: ! 131: fkind = fdata[sbuf.st_rdev]; ! 132: ! 133: if (offset >= fkind.fd_sectors || interleave >= fkind.fd_sectors) ! 134: usage(); ! 135: ! 136: if (verify && (dvbuff = malloc(fkind.fd_tsz)) == NULL) ! 137: xxerror("cannot allocate verify buffer", 1); ! 138: ! 139: if (wrfd && (wrbuff = malloc(fkind.fd_tsz)) == NULL) ! 140: xxerror("cannot allocate copy buffer", 1); ! 141: ! 142: for (i = 0; i < fkind.fd_tracks; i += 1) ! 143: for (head = 0; head < fkind.fd_heads; head += 1) { ! 144: retry = 0; ! 145: makeform(i, head, offset, interleave); ! 146: if (aflag) { ! 147: printf("cyl=%2d hd=%d\r", i, head); ! 148: fflush(stdout); ! 149: } ! 150: do ! 151: if (ioctl(dvfd, FDFORMAT, (char *)fform) < 0) ! 152: xxerror("ioctl", 1); ! 153: while ((verify || wrfd) ! 154: && doextra(i, head) < 0 ! 155: && ++retry < verify); ! 156: ! 157: if (verify && (retry == verify)) { ! 158: errno = 0; ! 159: xxerror("verify failed", 1); ! 160: } ! 161: } ! 162: if (aflag) { ! 163: printf(" \r"); ! 164: fflush(stdout); ! 165: } ! 166: exit(0); ! 167: } ! 168: ! 169: /* ! 170: * Construct a track format buffer for the floopy. ! 171: */ ! 172: makeform(c, h, o, i) ! 173: { ! 174: register int psect, lsect; ! 175: register int nspt; ! 176: ! 177: nspt = fkind.fd_sectors; ! 178: ! 179: for (psect=0; psect<nspt; psect+=1) ! 180: fform[psect].ff_sect = 0; ! 181: ! 182: psect = 0; ! 183: lsect = c * o; ! 184: ! 185: while (psect<nspt) { ! 186: while (lsect>=nspt || fform[lsect].ff_sect!=0) ! 187: if (lsect>=nspt) ! 188: lsect-=nspt; ! 189: else ! 190: lsect+=1; ! 191: ! 192: fform[lsect].ff_cylin = c; ! 193: fform[lsect].ff_head = h; ! 194: fform[lsect].ff_sect = psect+1; ! 195: fform[lsect].ff_size = fkind.fd_size; ! 196: psect += 1; ! 197: lsect += i; ! 198: } ! 199: /* printform(); */ ! 200: } ! 201: ! 202: /* ! 203: printform() ! 204: { ! 205: register int i; ! 206: register struct fform *f; ! 207: for (i = 0; i < fkind.fd_sectors; i += 1) { ! 208: f = &fform[i]; ! 209: printf("%x %x %x %x\n", ! 210: f->ff_cylin, f->ff_head, f->ff_sect, f->ff_size); ! 211: } ! 212: } ! 213: */ ! 214: ! 215: doextra(track, head) ! 216: int track, head; ! 217: { ! 218: long pos; ! 219: register int size; ! 220: register unsigned char *p, *q; ! 221: ! 222: if (fkind.fd_cyladdress) ! 223: pos = 2 * track + head; ! 224: else ! 225: pos = head * fkind.fd_tracks + track; ! 226: ! 227: pos *= fkind.fd_tsz; ! 228: size = fkind.fd_tsz; ! 229: ! 230: if (wrfd) { ! 231: lseek(wrfd, pos, 0); ! 232: ! 233: if (read(wrfd, wrbuff, size) != size) ! 234: return (xxerror("read file", 0)); ! 235: ! 236: lseek(dvfd, pos, 0); ! 237: ! 238: if (write(dvfd, wrbuff, size) != size) ! 239: return (xxerror("write floppy", 0)); ! 240: } ! 241: ! 242: if (verify) { ! 243: lseek(dvfd, pos, 0); ! 244: ! 245: if (read(dvfd, dvbuff, size) != size) ! 246: return (xxerror("read floppy", 0)); ! 247: } ! 248: ! 249: if (verify && wrfd) { ! 250: p = dvbuff; ! 251: q = wrbuff; ! 252: ! 253: while (--size >= 0) ! 254: if (*p++ != *q++) ! 255: return (xxerror("verify compare", 0)); ! 256: } else if (verify) { ! 257: p = dvbuff; ! 258: ! 259: while (--size >= 0) ! 260: if (*p++ != 0xF6) ! 261: return (xxerror("verify compare", 0)); ! 262: } ! 263: ! 264: return (0); ! 265: } ! 266: ! 267: usage() ! 268: { ! 269: printf(helpmessage); ! 270: exit(1); ! 271: } ! 272: ! 273: xxerror(s, f) char *s; int f; ! 274: { ! 275: extern int errno; ! 276: int uerror; ! 277: ! 278: uerror = errno; ! 279: fprintf(stderr, "fdformat: %s: ", dvname); ! 280: ! 281: if ((errno = uerror) > 0 && errno < sys_nerr) ! 282: perror(s); ! 283: ! 284: else if (errno != 0) ! 285: fprintf(stderr, "%s: errno==%d\n", s, errno); ! 286: ! 287: else ! 288: fprintf(stderr, "%s\n", s); ! 289: ! 290: if (f) ! 291: exit(1); ! 292: ! 293: return (-1); ! 294: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.