diff options
Diffstat (limited to 'usr.sbin/burncd/burncd.c')
-rw-r--r-- | usr.sbin/burncd/burncd.c | 244 |
1 files changed, 164 insertions, 80 deletions
diff --git a/usr.sbin/burncd/burncd.c b/usr.sbin/burncd/burncd.c index e60c21a7571a..40938ffb5634 100644 --- a/usr.sbin/burncd/burncd.c +++ b/usr.sbin/burncd/burncd.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000 Søren Schmidt + * Copyright (c) 2000,2001 Søren Schmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,24 +40,27 @@ #include <sys/stat.h> #include <sys/cdio.h> #include <sys/cdrio.h> +#include <sys/param.h> #define BLOCKS 16 -static int fd, saved_block_size; void cleanup(int); +void write_file(const char *, int); +void usage(const char *); + +static int fd, quiet, saved_block_size; +static struct cdr_track track; int main(int argc, char **argv) { - int ch, speed = 1, preemp = 0, test_write = 0, eject = 0, quiet = 0; - char *devname = "/dev/acd0c"; - char buf[2352*BLOCKS]; - int arg, file, addr, count, filesize; - int block_size = 0, cdopen = 0, size, tot_size = 0; - struct cdr_track track; - struct stat stat; + int ch, arg, addr; + int eject=0, list=0, multi=0, preemp=0, speed=1, test_write=0; + char *devname = "/dev/acd0c", *prog_name; + int block_size = 0; - while ((ch = getopt(argc, argv, "ef:pqs:t")) != -1) { + prog_name = argv[0]; + while ((ch = getopt(argc, argv, "ef:lmpqs:t")) != -1) { switch (ch) { case 'e': eject = 1; @@ -67,6 +70,14 @@ main(int argc, char **argv) devname = optarg; break; + case 'l': + list = 1; + break; + + case 'm': + multi = 1; + break; + case 'p': preemp = 1; break; @@ -77,6 +88,8 @@ main(int argc, char **argv) case 's': speed = atoi(optarg); + if (speed <= 0) + errx(EX_USAGE, "Invalid speed: %s", optarg); break; case 't': @@ -84,12 +97,15 @@ main(int argc, char **argv) break; default: - exit(EX_USAGE); + usage(prog_name); } } argc -= optind; argv += optind; + if (argc == 0) + usage(prog_name); + if ((fd = open(devname, O_RDWR, 0)) < 0) err(EX_NOINPUT, "open(%s)", devname); @@ -105,7 +121,7 @@ main(int argc, char **argv) if (!strcmp(argv[arg], "fixate")) { if (!quiet) fprintf(stderr, "fixating CD, please wait..\n"); - if (ioctl(fd, CDRIOCCLOSEDISK) < 0) + if (ioctl(fd, CDRIOCCLOSEDISK, &multi) < 0) err(EX_IOERR, "ioctl(CDRIOCCLOSEDISK)"); break; } @@ -118,23 +134,31 @@ main(int argc, char **argv) err(EX_IOERR, "ioctl(CDIOREADTOCENTRY)"); if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); - fprintf(stderr, "%d, %d\n", entry.entry.addr.lba, addr); + fprintf(stderr, "%d, %d\n", + ntohl(entry.entry.addr.lba), addr); + break; } - if (!strcmp(argv[arg], "blank")) { - int error, percent; + if (!strcmp(argv[arg], "erase") || !strcmp(argv[arg], "blank")){ + int error, blank, percent; if (!quiet) - fprintf(stderr, "blanking CD, please wait..\r"); - if (ioctl(fd, CDRIOCBLANK) < 0) + fprintf(stderr, "%sing CD, please wait..\r", + argv[arg]); + if (!strcmp(argv[arg], "erase")) + blank = CDR_B_ALL; + else + blank = CDR_B_MIN; + + if (ioctl(fd, CDRIOCBLANK, &blank) < 0) err(EX_IOERR, "ioctl(CDRIOCBLANK)"); while (1) { sleep(1); error = ioctl(fd, CDRIOCGETPROGRESS, &percent); if (percent > 0 && !quiet) fprintf(stderr, - "blanking CD - %d %% done" + "%sing CD - %d %% done" " \r", - percent); + argv[arg], percent); if (error || percent == 100) break; } @@ -144,104 +168,164 @@ main(int argc, char **argv) } if (!strcmp(argv[arg], "audio") || !strcmp(argv[arg], "raw")) { track.test_write = test_write; - track.track_type = CDR_DB_RAW; + track.datablock_type = CDR_DB_RAW; track.preemp = preemp; block_size = 2352; continue; } if (!strcmp(argv[arg], "data") || !strcmp(argv[arg], "mode1")) { track.test_write = test_write; - track.track_type = CDR_DB_ROM_MODE1; + track.datablock_type = CDR_DB_ROM_MODE1; track.preemp = 0; block_size = 2048; continue; } if (!strcmp(argv[arg], "mode2")) { track.test_write = test_write; - track.track_type = CDR_DB_ROM_MODE2; + track.datablock_type = CDR_DB_ROM_MODE2; track.preemp = 0; block_size = 2336; continue; } if (!strcmp(argv[arg], "XAmode1")) { track.test_write = test_write; - track.track_type = CDR_DB_XA_MODE1; + track.datablock_type = CDR_DB_XA_MODE1; track.preemp = 0; block_size = 2048; continue; } if (!block_size) err(EX_NOINPUT, "no data format selected"); + if (list) { + char file_buf[MAXPATHLEN + 1], *eol; + FILE *fp; - if ((file = open(argv[arg], O_RDONLY, 0)) < 0) - err(EX_NOINPUT, "open(%s)", argv[arg]); + if ((fp = fopen(argv[arg], "r")) == NULL) + err(EX_NOINPUT, "fopen(%s)", argv[arg]); - if (!cdopen) { - if (ioctl(fd, CDRIOCOPENDISK) < 0) - err(EX_IOERR, "ioctl(CDRIOCOPENDISK)"); - cdopen = 1; - } - if (ioctl(fd, CDRIOCOPENTRACK, &track) < 0) - err(EX_IOERR, "ioctl(CDRIOCOPENTRACK)"); - - if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) - err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); - - if (fstat(file, &stat) < 0) - err(EX_IOERR, "fstat(%s)", argv[arg]); - filesize = stat.st_size / 1024; - if (!quiet) { - fprintf(stderr, "next writeable LBA %d\n", addr); - fprintf(stderr, "writing from file %s size %d KB\n", - argv[arg], filesize); - } - lseek(fd, addr * block_size, SEEK_SET); - size = 0; - if (filesize == 0) - filesize++; /* cheat, avoid divide by zero */ - - while ((count = read(file, buf, block_size * BLOCKS)) > 0) { - int res; - if (count % block_size) { - /* pad file to % block_size */ - bzero(&buf[count], block_size * BLOCKS - count); - count = ((count / block_size) + 1) * block_size; - } - if ((res = write(fd, buf, count)) != count) { - - fprintf(stderr, "\nonly wrote %d of %d bytes\n", - res, count); - break; - } - size += count; - tot_size += count; - if (!quiet) { - int pct; - - pct = (size / 1024) * 100 / filesize; - fprintf(stderr, "written this track %d KB" - " (%d%%) total %d KB\r", - size/1024, pct, tot_size/1024); + while (fgets(file_buf, sizeof(file_buf), fp) != NULL) { + if (*file_buf == '#' || *file_buf == '\n') + continue; + if (eol = strchr(file_buf, '\n')) + *eol = NULL; + write_file(file_buf, block_size); } + if (feof(fp)) + fclose(fp); + else + err(EX_IOERR, "fgets(%s)", file_buf); } - if (!quiet) - fprintf(stderr, "\n"); - close(file); - if (ioctl(fd, CDRIOCCLOSETRACK) < 0) - err(EX_IOERR, "ioctl(CDRIOCCLOSETRACK)"); + else + write_file(argv[arg], block_size); } - if (ioctl(fd, CDRIOCSETBLOCKSIZE, &saved_block_size) < 0) - err(EX_IOERR, "ioctl(CDRIOCSETBLOCKSIZE)"); + if (ioctl(fd, CDRIOCSETBLOCKSIZE, &saved_block_size) < 0) { + err_set_exit(NULL); + err(EX_IOERR, "ioctl(CDRIOCSETBLOCKSIZE)"); + } if (eject) if (ioctl(fd, CDIOCEJECT) < 0) err(EX_IOERR, "ioctl(CDIOCEJECT)"); close(fd); + exit(EX_OK); } -void cleanup(int dummy) +void +cleanup(int dummy) { if (ioctl(fd, CDRIOCSETBLOCKSIZE, &saved_block_size) < 0) - err(EX_IOERR, "ioctl(CDRIOCSETBLOCKSIZE)"); + err(EX_IOERR, "ioctl(CDRIOCSETBLOCKSIZE)"); +} + +void +usage(const char *prog_name) +{ + fprintf(stderr, "Usage: %s [-f device] [-s speed] [-e] [-l] [-m] [-p]\n" + "\t[-q] [command] [command filename...]\n", prog_name); + exit(EX_USAGE); +} + +void +write_file(const char *name, int block_size) +{ + int addr, count, file, filesize, size; + char buf[2352*BLOCKS]; + struct stat stat; + static int cdopen, done_stdin, tot_size = 0; + + if (!strcmp(name, "-")) { + if (done_stdin) { + warn("skipping multiple usages of stdin"); + return; + } + file = STDIN_FILENO; + done_stdin = 1; + } + else if ((file = open(name, O_RDONLY, 0)) < 0) + err(EX_NOINPUT, "open(%s)", name); + + if (!cdopen) { + if (ioctl(fd, CDRIOCOPENDISK) < 0) + err(EX_IOERR, "ioctl(CDRIOCOPENDISK)"); + cdopen = 1; + } + + if (ioctl(fd, CDRIOCOPENTRACK, &track) < 0) + err(EX_IOERR, "ioctl(CDRIOCOPENTRACK)"); + + if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) + err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); + + if (fstat(file, &stat) < 0) + err(EX_IOERR, "fstat(%s)", name); + filesize = stat.st_size / 1024; + + if (!quiet) { + fprintf(stderr, "next writeable LBA %d\n", addr); + if (file == STDIN_FILENO) + fprintf(stderr, "writing from stdin\n"); + else + fprintf(stderr, + "writing from file %s size %d KB\n", + name, filesize); + } + + lseek(fd, addr * block_size, SEEK_SET); + size = 0; + if (filesize == 0) + filesize++; /* cheat, avoid divide by zero */ + + while ((count = read(file, buf, block_size * BLOCKS)) > 0) { + int res; + if (count % block_size) { + /* pad file to % block_size */ + bzero(&buf[count], block_size * BLOCKS - count); + count = ((count / block_size) + 1) * block_size; + } + if ((res = write(fd, buf, count)) != count) { + fprintf(stderr, "\nonly wrote %d of %d bytes\n", + res, count); + break; + } + size += count; + tot_size += count; + if (!quiet) { + int pct; + + fprintf(stderr, "written this track %d KB", size/1024); + if (file != STDIN_FILENO) { + pct = (size / 1024) * 100 / filesize; + fprintf(stderr, " (%d%%)", pct); + } + fprintf(stderr, " total %d KB\r", tot_size/1024); + } + } + + if (!quiet) + fprintf(stderr, "\n"); + + close(file); + if (ioctl(fd, CDRIOCCLOSETRACK) < 0) + err(EX_IOERR, "ioctl(CDRIOCCLOSETRACK)"); } |