fdwrite.c revision 29559
12849Sphk/* 22849Sphk * ---------------------------------------------------------------------------- 32849Sphk * "THE BEER-WARE LICENSE" (Revision 42): 42849Sphk * <phk@login.dkuug.dk> wrote this file. As long as you retain this notice you 52849Sphk * can do whatever you want with this stuff. If we meet some day, and you think 62849Sphk * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 72849Sphk * ---------------------------------------------------------------------------- 82849Sphk * 929559Scharnier * $Id: fdwrite.c,v 1.6 1997/02/22 16:05:49 peter Exp $ 102849Sphk * 112849Sphk */ 122849Sphk 1329559Scharnier#include <ctype.h> 1429559Scharnier#include <err.h> 1529559Scharnier#include <fcntl.h> 162849Sphk#include <stdio.h> 172849Sphk#include <stdlib.h> 1829559Scharnier#include <strings.h> 192849Sphk#include <unistd.h> 202849Sphk 212849Sphk#include <machine/ioctl_fd.h> 222849Sphk 232849Sphkint 242849Sphkformat_track(int fd, int cyl, int secs, int head, int rate, 252849Sphk int gaplen, int secsize, int fill,int interleave) 262849Sphk{ 272849Sphk struct fd_formb f; 282849Sphk register int i,j; 292849Sphk int il[100]; 302849Sphk 312849Sphk memset(il,0,sizeof il); 322849Sphk for(j = 0, i = 1; i <= secs; i++) { 332849Sphk while(il[(j%secs)+1]) j++; 342849Sphk il[(j%secs)+1] = i; 352849Sphk j += interleave; 362849Sphk } 372849Sphk 382849Sphk f.format_version = FD_FORMAT_VERSION; 392849Sphk f.head = head; 402849Sphk f.cyl = cyl; 412849Sphk f.transfer_rate = rate; 422849Sphk 432849Sphk f.fd_formb_secshift = secsize; 442849Sphk f.fd_formb_nsecs = secs; 452849Sphk f.fd_formb_gaplen = gaplen; 462849Sphk f.fd_formb_fillbyte = fill; 472849Sphk for(i = 0; i < secs; i++) { 482849Sphk f.fd_formb_cylno(i) = cyl; 492849Sphk f.fd_formb_headno(i) = head; 502849Sphk f.fd_formb_secno(i) = il[i+1]; 512849Sphk f.fd_formb_secsize(i) = secsize; 522849Sphk } 532849Sphk return ioctl(fd, FD_FORM, (caddr_t)&f); 542849Sphk} 552849Sphk 562849Sphkstatic void 5729559Scharnierusage() 582849Sphk{ 5929559Scharnier fprintf(stderr, "usage: fdwrite [-v] [-y] [-f inputfile] [-d device]\n"); 602849Sphk exit(2); 612849Sphk} 622849Sphk 632849Sphkint 642849Sphkmain(int argc, char **argv) 652849Sphk{ 662849Sphk int inputfd = -1, c, fdn = 0, i,j,fd; 672849Sphk int bpt, verbose=1, nbytes=0, track; 6818573Sjkh int interactive = 1; 692849Sphk char *device= "/dev/rfd0", *trackbuf = 0,*vrfybuf = 0; 702849Sphk struct fd_type fdt; 712849Sphk FILE *tty; 722849Sphk 732849Sphk setbuf(stdout,0); 7429559Scharnier while((c = getopt(argc, argv, "d:f:vy")) != -1) 752849Sphk switch(c) { 762849Sphk case 'd': /* Which drive */ 772849Sphk device = optarg; 782849Sphk break; 792849Sphk 802849Sphk case 'f': /* input file */ 812849Sphk if (inputfd >= 0) 822849Sphk close(inputfd); 832849Sphk inputfd = open(optarg,O_RDONLY); 8429559Scharnier if (inputfd < 0) 8529559Scharnier err(1, "%s", optarg); 862849Sphk break; 872849Sphk 882849Sphk case 'v': /* Toggle verbosity */ 892849Sphk verbose = !verbose; 902849Sphk break; 912849Sphk 9218573Sjkh case 'y': /* Don't confirm? */ 9318573Sjkh interactive = 0; 9418573Sjkh break; 9518573Sjkh 962849Sphk case '?': default: 972849Sphk usage(); 982849Sphk } 992849Sphk 1002849Sphk if (inputfd < 0) 1012849Sphk inputfd = 0; 1022849Sphk 10318573Sjkh if (!isatty(1)) 10418573Sjkh interactive = 0; 10518573Sjkh 1062849Sphk if(optind < argc) 1072849Sphk usage(); 1082849Sphk 1092849Sphk tty = fopen("/dev/tty","r+"); 11029559Scharnier if(!tty) 11129559Scharnier err(1, "/dev/tty"); 1122849Sphk setbuf(tty,0); 1132849Sphk 1142849Sphk for(j=1;j > 0;) { 1152849Sphk fdn++; 11618573Sjkh if (interactive) { 11718573Sjkh fprintf(tty, 11818573Sjkh "Please insert floppy #%d in drive %s and press return >", 11918573Sjkh fdn,device); 12018573Sjkh while(1) { 12118573Sjkh i = getc(tty); 12218573Sjkh if(i == '\n') break; 12318573Sjkh } 1242849Sphk } 1252849Sphk 12629559Scharnier if((fd = open(device, O_RDWR)) < 0) 12729559Scharnier err(1, "%s", device); 1282849Sphk 12929559Scharnier if(ioctl(fd, FD_GTYPE, &fdt) < 0) 13029559Scharnier errx(1, "not a floppy disk: %s", device); 1312849Sphk 1322849Sphk bpt = fdt.sectrac * (1<<fdt.secsize) * 128; 1332849Sphk if(!trackbuf) { 1342849Sphk trackbuf = malloc(bpt); 13529559Scharnier if(!trackbuf) errx(1, "malloc"); 1362849Sphk } 1372849Sphk if(!vrfybuf) { 1382849Sphk vrfybuf = malloc(bpt); 13929559Scharnier if(!vrfybuf) errx(1, "malloc"); 1402849Sphk } 1412849Sphk 1422849Sphk if(fdn == 1) { 1432849Sphk if(verbose) { 1442849Sphk printf("Format: %d cylinders, %d heads, %d sectors, %d bytes = %dkb\n", 1452849Sphk fdt.tracks,fdt.heads,fdt.sectrac,(1<<fdt.secsize) * 128, 1462849Sphk fdt.tracks*bpt*fdt.heads/1024); 1478857Srgrimes 1482849Sphk } 1492849Sphk memset(trackbuf,0,bpt); 1502849Sphk for(j=0;inputfd >= 0 && j<bpt;j+=i) { 1512849Sphk if(!(i = read(inputfd,trackbuf+j,bpt-j))) { 1522849Sphk close(inputfd); 1532849Sphk inputfd = -1; 1542849Sphk break; 1552849Sphk } 1562849Sphk nbytes += i; 1572849Sphk } 1582849Sphk } 1592849Sphk for (track = 0; track < fdt.tracks * fdt.heads; track++) { 1602849Sphk if(verbose) printf("\r%3d ",fdt.tracks * fdt.heads-track); 1612849Sphk if(verbose) putc((j ? 'I':'Z'),stdout); 1622849Sphk format_track(fd, track / fdt.heads, fdt.sectrac, track % fdt.heads, 1632849Sphk fdt.trans, fdt.f_gap, fdt.secsize, 0xe6, 1642849Sphk fdt.f_inter); 1652849Sphk if(verbose) putc('F',stdout); 1662849Sphk 16729559Scharnier if (lseek (fd, (long) track*bpt, 0) < 0) err(1, "lseek"); 16829559Scharnier if (write (fd, trackbuf, bpt) != bpt) err(1, "write"); 1692849Sphk if(verbose) putc('W',stdout); 1702849Sphk 17129559Scharnier if (lseek (fd, (long) track*bpt, 0) < 0) err(1, "lseek"); 17229559Scharnier if (read (fd, vrfybuf, bpt) != bpt) err(1, "read"); 1732849Sphk if(verbose) putc('R',stdout); 1742849Sphk 17529559Scharnier if (memcmp(trackbuf,vrfybuf,bpt)) err(1, "compare"); 1762849Sphk if(verbose) putc('C',stdout); 1772849Sphk 1782849Sphk memset(trackbuf,0,bpt); 1792849Sphk for(j=0;inputfd >= 0 && j<bpt;j+=i) { 1802849Sphk if(!(i = read(inputfd,trackbuf+j,bpt-j))) { 1812849Sphk close(inputfd); 1822849Sphk inputfd = -1; 1832849Sphk break; 1842849Sphk } 1852849Sphk nbytes += i; 1862849Sphk } 1872849Sphk } 1882849Sphk close(fd); 1892849Sphk putc('\r',stdout); 1902849Sphk } 1912849Sphk if(verbose) 1922849Sphk printf("%d bytes on %d flopp%s\n",nbytes,fdn,fdn==1?"y":"ies"); 1932849Sphk exit(0); 1942849Sphk} 195