Annotation of coherent/d/etc/fdformat.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.