int writetao(struct track_head *thp) { u_char modebuf[70], bdlen; struct track_info *tr; int r, track = 0; if ((r = mode_sense_write(modebuf)) != SCCMD_OK) { warnx("mode sense failed: %d", r); return (r); } bdlen = modebuf[7]; modebuf[2+8+bdlen] |= 0x40; /* Buffer Underrun Free Enable */ modebuf[2+8+bdlen] |= 0x01; /* change write type to TAO */ SLIST_FOREACH(tr, thp, track_list) { track++; switch (tr->type) { case 'd': modebuf[3+8+bdlen] = 0x04; /* track mode = data */ modebuf[4+8+bdlen] = 0x08; /* 2048 block track mode */ modebuf[8+8+bdlen] = 0x00; /* turn off XA */ break; case 'a': modebuf[3+8+bdlen] = 0x00; /* track mode = audio */ modebuf[4+8+bdlen] = 0x00; /* 2352 block track mode */ modebuf[8+8+bdlen] = 0x00; /* turn off XA */ break; default: warn("impossible tracktype detected"); break; } while (unit_ready() != SCCMD_OK) continue; if ((r = mode_select_write(modebuf)) != SCCMD_OK) { warnx("mode select failed: %d", r); return (r); } set_speed(tr->speed); writetrack(tr, track); synchronize_cache(); }
void main(int argc, char **argv) { int fd = -1, tmp, i, j; struct floppy_raw_cmd raw_cmd; FILE *in; if (argc != 2) { printf("usage: writedisk <image to write>\n"); exit(1); } in = fopen(argv[1], "rb"); if (!in) { printf("could not open %s\n",argv[1]); exit(1); } fd = open("/dev/fd0", O_ACCMODE | O_NDELAY); if (!fd) { printf("could not open /dev/fd0 for writing\n"); exit(1); } seektrack(fd, 0); for(i = 0; i< 80; i++) { printf("track %d\n", i); fread(buffer, sizeof(char), 5632, in); writetrack(fd, i, buffer); seekin(fd); } printf("done \n"); close(fd); fclose(in); }