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