diff options
Diffstat (limited to 'usr.sbin/burncd')
-rw-r--r-- | usr.sbin/burncd/Makefile | 6 | ||||
-rw-r--r-- | usr.sbin/burncd/burncd.8 | 222 | ||||
-rw-r--r-- | usr.sbin/burncd/burncd.c | 741 |
3 files changed, 0 insertions, 969 deletions
diff --git a/usr.sbin/burncd/Makefile b/usr.sbin/burncd/Makefile deleted file mode 100644 index 11e07c7..0000000 --- a/usr.sbin/burncd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# $FreeBSD$ - -PROG= burncd -MAN= burncd.8 - -.include <bsd.prog.mk> diff --git a/usr.sbin/burncd/burncd.8 b/usr.sbin/burncd/burncd.8 deleted file mode 100644 index e2996ba..0000000 --- a/usr.sbin/burncd/burncd.8 +++ /dev/null @@ -1,222 +0,0 @@ -.\" -.\" Copyright (c) 2000,2001,2002 Søren Schmidt <sos@FreeBSD.org> -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer, -.\" without modification, immediately at the beginning of the file. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" $FreeBSD$ -.\" -.Dd December 21, 2009 -.Dt BURNCD 8 -.Os -.Sh NAME -.Nm burncd -.Nd control the ATAPI CD-R/RW driver -.Sh SYNOPSIS -.Nm -.Op Fl deFlmnpqtv -.Op Fl f Ar device -.Op Fl s Ar speed -.Op Ar command -.Op Ar command Ar -.Sh DESCRIPTION -The -.Nm -utility is used to burn CD-R/RW media using the ATAPI cd driver. -.Pp -Available options and operands: -.Bl -tag -width XXXXXXXXXXXX -.It Fl d -burn the CD-R/RW in DAO (disk at once) mode. -.It Fl e -eject the medium when done. -.It Fl f Ar device -set the device to use for the burning process. -.It Fl F -force operation regardless of warnings. -.It Fl l -read a list of image files from filename. -.It Fl m -close disk in multisession mode (otherwise disk is closed as singlesession). -.It Fl n -do not write gaps between data tracks in DAO mode. -.It Fl p -use preemphasis on audio tracks. -.It Fl q -quiet, do not print progress messages. -.It Fl s Ar speed -set the speed of the burner device. -Defaults to 4. -Specify -.Dq Li max -to use the drive's fastest speed. -.It Fl t -test write, do not actually write on the media. -.It Fl v -verbose, print extra progress messages. -.El -.Pp -.Ar command -may be one of: -.Bl -tag -width XXXXXXXXXXXX -.It Cm msinfo -Show the first LBA of the last track on the media -and the next writeable address on the media for use with the -.Xr mkisofs 8 Ns 's Pq Pa ports/sysutils/cdrtools -.Fl C -switch when adding additional data to ISO file systems with extra sessions. -.It Cm blank -Blank a CD-RW medium. -This uses the fast blanking method, so data are not physically overwritten, -only those areas that make the media appear blank for further usage are erased. -.It Cm eject -Eject the medium when done. -This is equivalent to the -.Fl e -option. -.It Cm erase -Erase a CD-RW medium. -This erases the entire media. -Can take up to 1 hour to finish. -.It Cm format Brq Cm dvd+rw | dvd-rw -Formats a DVD+RW or DVD-RW media to the default max size and 2048 byte blocks. -This operation can take a long time to finish. -Progress reporting is done during the process. -.It Cm fixate -Fixate the medium so that the TOC is generated and the media can be used -in an ordinary CD drive. -The driver defaults to creating singlesession media (see -.Fl m -option). -Ignored in DAO mode (see -.Fl d -option). -.It Cm raw | audio -Set the write mode to produce audio (raw mode) tracks for the following -images on the command line. -.It Cm data | mode1 -Set the write mode to produce data (mode1) tracks for the following -image files -on the command line. -.It Cm mode2 -Set the write mode to produce data (mode2) tracks for the following -image files -on the command line. -.It Cm XAmode1 -Set the write mode to produce data (XAmode1) tracks for the following image -files on the command line. -.It Cm XAmode2 -Set the write mode to produce data (XAmode2) tracks for the following image -files on the command line. -.It Cm vcd -Set the write mode to produce VCD/SVCD tracks for the following image files -on the command line. -This automatically sets DAO -.Pq Fl d -and -.Dq "no gaps" -.Pq Fl n -modes. -.It Cm dvdrw -Set the write mode to write a DVD+RW from the following image. -DVDs only have one track. -.It Ar file -All other arguments are treated as filenames of images to write to the media, -or in case the -.Fl l -option is used as files containing lists of images. -.El -.Pp -Files whose length are not a multiple of the current media blocksize are -quietly zero padded to fit the blocksize requirement. -The conventional filename -.Fl -refers to stdin, and can only be used once. -.Sh ENVIRONMENT -The following environment variables affect the execution of -.Nm : -.Bl -tag -width ".Ev BURNCD_SPEED" -.It Ev BURNCD_SPEED -The write speed to use if one is not specified with the -.Fl s -flag. -.It Ev CDROM -The CD device to use if one is not specified with the -.Fl f -flag. -.El -.Sh FILES -.Bl -tag -width ".Pa /dev/acd0" -.It Pa /dev/acd0 -The default device, if not overridden by the -.Ev CDROM -environment variable or the -.Fl f -option. -.El -.Sh EXAMPLES -The typical usage for burning a data CD-R: -.Pp -.Dl "burncd -f /dev/acd0 data file1 fixate" -.Pp -The typical usage for burning an audio CD-R: -.Pp -.Dl "burncd -f /dev/acd0 audio file1 file2 file3 fixate" -.Pp -The typical usage for burning an audio CD-R in DAO mode: -.Pp -.Dl "burncd -f /dev/acd0 -d audio file1 file2 file3" -.Pp -The typical usage for burning a mixed mode CD-R: -.Pp -.Dl "burncd -f /dev/acd0 data file1 audio file2 file3 fixate" -.Pp -The typical usage for burning from a compressed image file on stdin: -.Pp -.Dl "gunzip -c file.iso.gz | burncd -f /dev/acd0 data - fixate" -.Pp -In the examples above, the files burned to data CD-Rs are assumed to -be ISO9660 file systems. -.Xr mkisofs 8 , -available in the -.Fx -Ports Collection, -as part of the -.Pa sysutils/cdrtools -port, is commonly used to create ISO9660 file system images -from a given directory tree. -.Sh HISTORY -The -.Nm -utility appeared in -.Fx 4.0 . -.Sh AUTHORS -The -.Nm -utility and this manpage was contributed by -.An S\(/oren Schmidt , -Denmark -.Aq sos@FreeBSD.org . -.Sh BUGS -Probably, please report when found. diff --git a/usr.sbin/burncd/burncd.c b/usr.sbin/burncd/burncd.c deleted file mode 100644 index 43a0a09..0000000 --- a/usr.sbin/burncd/burncd.c +++ /dev/null @@ -1,741 +0,0 @@ -/*- - * Copyright (c) 2000,2001,2002 Søren Schmidt <sos@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <unistd.h> -#include <signal.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <err.h> -#include <sysexits.h> -#include <fcntl.h> -#include <sys/errno.h> -#include <sys/ioctl.h> -#include <sys/stat.h> -#include <sys/cdio.h> -#include <sys/cdrio.h> -#include <sys/dvdio.h> -#include <sys/param.h> -#include <arpa/inet.h> - -#define BLOCKS 16 - -struct track_info { - int file; - char file_name[MAXPATHLEN + 1]; - off_t file_size; - int block_size; - int block_type; - int pregap; - int addr; -}; -static struct track_info tracks[100]; -static int quiet, verbose, saved_block_size, notracks; -static volatile sig_atomic_t global_fd_for_cleanup; - -void add_track(char *, int, int, int); -void do_DAO(int fd, int, int); -void do_TAO(int fd, int, int, int); -void do_format(int, int, char *); -int write_file(int fd, struct track_info *); -int roundup_blocks(struct track_info *); -void cue_ent(struct cdr_cue_entry *, int, int, int, int, int, int, int); -void cleanup(int); -void cleanup_flush(void); -void cleanup_signal(int); -void usage(void); - -int -main(int argc, char **argv) -{ - int arg, addr, ch, fd; - int dao = 0, eject = 0, fixate = 0, list = 0, multi = 0, preemp = 0; - int nogap = 0, speed = 4 * 177, test_write = 0, force = 0; - int block_size = 0, block_type = 0, cdopen = 0, dvdrw = 0; - const char *dev, *env_speed; - - if ((dev = getenv("CDROM")) == NULL) - dev = "/dev/acd0"; - - env_speed = getenv("BURNCD_SPEED"); - - while ((ch = getopt(argc, argv, "def:Flmnpqs:tv")) != -1) { - switch (ch) { - case 'd': - dao = 1; - break; - - case 'e': - eject = 1; - break; - - case 'f': - dev = optarg; - break; - - case 'F': - force = 1; - break; - - case 'l': - list = 1; - break; - - case 'm': - multi = 1; - break; - - case 'n': - nogap = 1; - break; - - case 'p': - preemp = 1; - break; - - case 'q': - quiet = 1; - break; - - case 's': - env_speed = optarg; - break; - - case 't': - test_write = 1; - break; - - case 'v': - verbose = 1; - break; - - default: - usage(); - } - } - argc -= optind; - argv += optind; - - if (env_speed == NULL) - ; - else if (strcasecmp("max", env_speed) == 0) - speed = CDR_MAX_SPEED; - else - speed = atoi(env_speed) * 177; - if (speed <= 0) - errx(EX_USAGE, "Invalid speed: %s", env_speed); - - if (argc == 0) - usage(); - - if ((fd = open(dev, O_RDWR, 0)) < 0) - err(EX_NOINPUT, "open(%s)", dev); - - if (ioctl(fd, CDRIOCGETBLOCKSIZE, &saved_block_size) < 0) - err(EX_IOERR, "ioctl(CDRIOCGETBLOCKSIZE)"); - - if (ioctl(fd, CDRIOCWRITESPEED, &speed) < 0) - err(EX_IOERR, "ioctl(CDRIOCWRITESPEED)"); - - global_fd_for_cleanup = fd; - err_set_exit(cleanup); - signal(SIGHUP, cleanup_signal); - signal(SIGINT, cleanup_signal); - signal(SIGTERM, cleanup_signal); - - for (arg = 0; arg < argc; arg++) { - if (!strcasecmp(argv[arg], "fixate")) { - fixate = 1; - continue; - } - if (!strcasecmp(argv[arg], "eject")) { - eject = 1; - break; - } - if (!strcasecmp(argv[arg], "msinfo")) { - struct ioc_read_toc_single_entry entry; - struct ioc_toc_header header; - - if (ioctl(fd, CDIOREADTOCHEADER, &header) < 0) - err(EX_IOERR, "ioctl(CDIOREADTOCHEADER)"); - bzero(&entry, sizeof(struct ioc_read_toc_single_entry)); - entry.address_format = CD_LBA_FORMAT; - entry.track = header.ending_track; - if (ioctl(fd, CDIOREADTOCENTRY, &entry) < 0) - err(EX_IOERR, "ioctl(CDIOREADTOCENTRY)"); - if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) - err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); - fprintf(stdout, "%d,%d\n", - ntohl(entry.entry.addr.lba), addr); - - break; - } - if ((!strcasecmp(argv[arg], "erase") || - !strcasecmp(argv[arg], "blank")) && !test_write) { - int blank, pct, last = 0; - - if (!strcasecmp(argv[arg], "erase")) - blank = CDR_B_ALL; - else - blank = CDR_B_MIN; - if (!quiet) - fprintf(stderr, "%sing CD, please wait..\r", - blank == CDR_B_ALL ? "eras" : "blank"); - - if (ioctl(fd, CDRIOCBLANK, &blank) < 0) - err(EX_IOERR, "ioctl(CDRIOCBLANK)"); - while (1) { - sleep(1); - if (ioctl(fd, CDRIOCGETPROGRESS, &pct) == -1) - err(EX_IOERR,"ioctl(CDRIOGETPROGRESS)"); - if (pct > 0 && !quiet) - fprintf(stderr, - "%sing CD - %d %% done \r", - blank == CDR_B_ALL ? - "eras" : "blank", pct); - if (pct == 100 || (pct == 0 && last > 90)) - break; - last = pct; - } - if (!quiet) - printf("\n"); - continue; - } - if (!strcasecmp(argv[arg], "format") && !test_write) { - if (arg + 1 < argc && - (!strcasecmp(argv[arg + 1], "dvd+rw") || - !strcasecmp(argv[arg + 1], "dvd-rw"))) - do_format(fd, force, argv[arg + 1]); - else - errx(EX_NOINPUT, "format media type invalid"); - arg++; - continue; - } - if (!strcasecmp(argv[arg], "audio") || !strcasecmp(argv[arg], "raw")) { - block_type = CDR_DB_RAW; - block_size = 2352; - continue; - } - if (!strcasecmp(argv[arg], "data") || !strcasecmp(argv[arg], "mode1")) { - block_type = CDR_DB_ROM_MODE1; - block_size = 2048; - continue; - } - if (!strcasecmp(argv[arg], "mode2")) { - block_type = CDR_DB_ROM_MODE2; - block_size = 2336; - continue; - } - if (!strcasecmp(argv[arg], "xamode1")) { - block_type = CDR_DB_XA_MODE1; - block_size = 2048; - continue; - } - if (!strcasecmp(argv[arg], "xamode2")) { - block_type = CDR_DB_XA_MODE2_F2; - block_size = 2324; - continue; - } - if (!strcasecmp(argv[arg], "vcd")) { - block_type = CDR_DB_XA_MODE2_F2; - block_size = 2352; - dao = 1; - nogap = 1; - continue; - } - if (!strcasecmp(argv[arg], "dvdrw")) { - block_type = CDR_DB_ROM_MODE1; - block_size = 2048; - dvdrw = 1; - continue; - } - - if (!block_size) - errx(EX_NOINPUT, "no data format selected"); - if (list) { - char file_buf[MAXPATHLEN + 1], *eol; - FILE *fp; - - if ((fp = fopen(argv[arg], "r")) == NULL) - err(EX_NOINPUT, "fopen(%s)", argv[arg]); - - while (fgets(file_buf, sizeof(file_buf), fp) != NULL) { - if (*file_buf == '#' || *file_buf == '\n') - continue; - if ((eol = strchr(file_buf, '\n'))) - *eol = '\0'; - add_track(file_buf, block_size, block_type, nogap); - } - if (feof(fp)) - fclose(fp); - else - err(EX_IOERR, "fgets(%s)", file_buf); - } - else - add_track(argv[arg], block_size, block_type, nogap); - } - if (notracks) { - if (dvdrw && notracks > 1) - errx(EX_USAGE, "DVD's only have 1 track"); - if (ioctl(fd, CDIOCSTART, 0) < 0) - err(EX_IOERR, "ioctl(CDIOCSTART)"); - if (!cdopen) { - if (ioctl(fd, CDRIOCINITWRITER, &test_write) < 0) - err(EX_IOERR, "ioctl(CDRIOCINITWRITER)"); - cdopen = 1; - } - if (dao) - do_DAO(fd, test_write, multi); - else - do_TAO(fd, test_write, preemp, dvdrw); - } - if (!test_write && fixate && !dao && !dvdrw) { - if (!quiet) - fprintf(stderr, "fixating CD, please wait..\n"); - if (ioctl(fd, CDRIOCFIXATE, &multi) < 0) - err(EX_IOERR, "ioctl(CDRIOCFIXATE)"); - } - - 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)"); - - signal(SIGHUP, SIG_DFL); - signal(SIGINT, SIG_DFL); - signal(SIGTERM, SIG_DFL); - close(fd); - exit(EX_OK); -} - -void -add_track(char *name, int block_size, int block_type, int nogap) -{ - struct stat sb; - int file; - static int done_stdin = 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 (fstat(file, &sb) < 0) - err(EX_IOERR, "fstat(%s)", name); - tracks[notracks].file = file; - strncpy(tracks[notracks].file_name, name, MAXPATHLEN); - if (file == STDIN_FILENO) - tracks[notracks].file_size = -1; - else - tracks[notracks].file_size = sb.st_size; - tracks[notracks].block_size = block_size; - tracks[notracks].block_type = block_type; - - if (nogap && notracks) - tracks[notracks].pregap = 0; - else { - if (tracks[notracks - (notracks > 0)].block_type == block_type) - tracks[notracks].pregap = 150; - else - tracks[notracks].pregap = 255; - } - - if (verbose) { - int pad = 0; - - if (tracks[notracks].file_size / tracks[notracks].block_size != - roundup_blocks(&tracks[notracks])) - pad = 1; - fprintf(stderr, - "adding type 0x%02x file %s size %jd KB %d blocks %s\n", - tracks[notracks].block_type, name, - (intmax_t)sb.st_size/1024, - roundup_blocks(&tracks[notracks]), - pad ? "(0 padded)" : ""); - } - notracks++; -} - -void -do_DAO(int fd, int test_write, int multi) -{ - struct cdr_cuesheet sheet; - struct cdr_cue_entry cue[100]; - int format = CDR_SESS_CDROM; - int addr, i, j = 0; - - int bt2ctl[16] = { 0x0, -1, -1, -1, -1, -1, -1, -1, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, -1, -1 }; - - int bt2df[16] = { 0x0, -1, -1, -1, -1, -1, -1, -1, - 0x10, 0x30, 0x20, -1, 0x21, -1, -1, -1 }; - - if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, &addr) < 0) - err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); - if (verbose) - fprintf(stderr, "next writeable LBA %d\n", addr); - - cue_ent(&cue[j++], bt2ctl[tracks[0].block_type], 0x01, 0x00, 0x0, - (bt2df[tracks[0].block_type] & 0xf0) | - (tracks[0].block_type < 8 ? 0x01 : 0x04), 0x00, addr); - - for (i = 0; i < notracks; i++) { - if (bt2ctl[tracks[i].block_type] < 0 || - bt2df[tracks[i].block_type] < 0) - errx(EX_IOERR, "track type not supported in DAO mode"); - - if (tracks[i].block_type >= CDR_DB_XA_MODE1) - format = CDR_SESS_CDROM_XA; - - if (i == 0) { - addr += tracks[i].pregap; - tracks[i].addr = addr; - - cue_ent(&cue[j++], bt2ctl[tracks[i].block_type], - 0x01, i+1, 0x1, bt2df[tracks[i].block_type], - 0x00, addr); - - } - else { - if (tracks[i].pregap) { - if (tracks[i].block_type > 0x7) { - cue_ent(&cue[j++],bt2ctl[tracks[i].block_type], - 0x01, i+1, 0x0, - (bt2df[tracks[i].block_type] & 0xf0) | - (tracks[i].block_type < 8 ? 0x01 :0x04), - 0x00, addr); - } - else - cue_ent(&cue[j++],bt2ctl[tracks[i].block_type], - 0x01, i+1, 0x0, - bt2df[tracks[i].block_type], - 0x00, addr); - } - tracks[i].addr = tracks[i - 1].addr + - roundup_blocks(&tracks[i - 1]); - - cue_ent(&cue[j++], bt2ctl[tracks[i].block_type], - 0x01, i+1, 0x1, bt2df[tracks[i].block_type], - 0x00, addr + tracks[i].pregap); - - if (tracks[i].block_type > 0x7) - addr += tracks[i].pregap; - } - addr += roundup_blocks(&tracks[i]); - } - - cue_ent(&cue[j++], bt2ctl[tracks[i - 1].block_type], 0x01, 0xaa, 0x01, - (bt2df[tracks[i - 1].block_type] & 0xf0) | - (tracks[i - 1].block_type < 8 ? 0x01 : 0x04), 0x00, addr); - - sheet.len = j * 8; - sheet.entries = cue; - sheet.test_write = test_write; - sheet.session_type = multi ? CDR_SESS_MULTI : CDR_SESS_NONE; - sheet.session_format = format; - if (verbose) { - u_int8_t *ptr = (u_int8_t *)sheet.entries; - - fprintf(stderr,"CUE sheet:"); - for (i = 0; i < sheet.len; i++) - if (i % 8) - fprintf(stderr," %02x", ptr[i]); - else - fprintf(stderr,"\n%02x", ptr[i]); - fprintf(stderr,"\n"); - } - - if (ioctl(fd, CDRIOCSENDCUE, &sheet) < 0) - err(EX_IOERR, "ioctl(CDRIOCSENDCUE)"); - - for (i = 0; i < notracks; i++) { - if (write_file(fd, &tracks[i])) { - cleanup_flush(); - err(EX_IOERR, "write_file"); - } - } - - ioctl(fd, CDRIOCFLUSH); -} - -void -do_TAO(int fd, int test_write, int preemp, int dvdrw) -{ - struct cdr_track track; - int i; - - for (i = 0; i < notracks; i++) { - track.test_write = test_write; - track.datablock_type = tracks[i].block_type; - track.preemp = preemp; - if (ioctl(fd, CDRIOCINITTRACK, &track) < 0) - err(EX_IOERR, "ioctl(CDRIOCINITTRACK)"); - - if (dvdrw) - tracks[i].addr = 0; - else - if (ioctl(fd, CDRIOCNEXTWRITEABLEADDR, - &tracks[i].addr) < 0) - err(EX_IOERR, "ioctl(CDRIOCNEXTWRITEABLEADDR)"); - - if (!quiet) - fprintf(stderr, "next writeable LBA %d\n", - tracks[i].addr); - if (write_file(fd, &tracks[i])) { - cleanup_flush(); - err(EX_IOERR, "write_file"); - } - if (ioctl(fd, CDRIOCFLUSH) < 0) - err(EX_IOERR, "ioctl(CDRIOCFLUSH)"); - } -} - -#define NTOH3B(x) ((x&0x0000ff)<<16) | (x&0x00ff00) | ((x&0xff0000)>>16) - -void -do_format(int the_fd, int force, char *type) -{ - struct cdr_format_capacities capacities; - struct cdr_format_params format_params; - int count, i, pct, last = 0; - - if (ioctl(the_fd, CDRIOCREADFORMATCAPS, &capacities) == -1) - err(EX_IOERR, "ioctl(CDRIOCREADFORMATCAPS)"); - - if (verbose) { - fprintf(stderr, "format list entries=%zd\n", - capacities.length / sizeof(struct cdr_format_capacity)); - fprintf(stderr, "current format: blocks=%u type=0x%x block_size=%u\n", - ntohl(capacities.blocks), capacities.type, - NTOH3B(capacities.block_size)); - } - - count = capacities.length / sizeof(struct cdr_format_capacity); - if (verbose) { - for (i = 0; i < count; ++i) - fprintf(stderr, - "format %d: blocks=%u type=0x%x param=%u\n", - i, ntohl(capacities.format[i].blocks), - capacities.format[i].type, - NTOH3B(capacities.format[i].param)); - } - - for (i = 0; i < count; ++i) { - if (!strcasecmp(type, "dvd+rw")) { - if (capacities.format[i].type == 0x26) { - break; - } - } - if (!strcasecmp(type, "dvd-rw")) { - if (capacities.format[i].type == 0x0) { - break; - } - } - } - if (i == count) - errx(EX_IOERR, "could not find a valid format capacity"); - - if (!quiet) - fprintf(stderr,"formatting with blocks=%u type=0x%x param=%u\n", - ntohl(capacities.format[i].blocks), - capacities.format[i].type, - NTOH3B(capacities.format[i].param)); - - if (!force && capacities.type == 2) - errx(EX_IOERR, "media already formatted (use -F to override)"); - - memset(&format_params, 0, sizeof(struct cdr_format_params)); - format_params.fov = 1; - format_params.immed = 1; - format_params.length = ntohs(sizeof(struct cdr_format_capacity)); - memcpy(&format_params.format, &capacities.format[i], - sizeof(struct cdr_format_capacity)); - - if(ioctl(the_fd, CDRIOCFORMAT, &format_params) == -1) - err(EX_IOERR, "ioctl(CDRIOCFORMAT)"); - - while (1) { - sleep(1); - if (ioctl(the_fd, CDRIOCGETPROGRESS, &pct) == -1) - err(EX_IOERR, "ioctl(CDRIOGETPROGRESS)"); - if (pct > 0 && !quiet) - fprintf(stderr, "formatting DVD - %d %% done \r", - pct); - if (pct == 100 || (pct == 0 && last > 90)) - break; - last = pct; - } - if (!quiet) - fprintf(stderr, "\n"); -} - -int -write_file(int fd, struct track_info *track_info) -{ - off_t size, count, filesize; - char buf[2352*BLOCKS]; - static off_t tot_size = 0; - - filesize = track_info->file_size / 1024; - - if (ioctl(fd, CDRIOCSETBLOCKSIZE, &track_info->block_size) < 0) - err(EX_IOERR, "ioctl(CDRIOCSETBLOCKSIZE)"); - - if (track_info->addr >= 0) - lseek(fd, track_info->addr * track_info->block_size, SEEK_SET); - - if (verbose) - fprintf(stderr, "addr = %d size = %jd blocks = %d\n", - track_info->addr, (intmax_t)track_info->file_size, - roundup_blocks(track_info)); - - if (!quiet) { - if (track_info->file == STDIN_FILENO) - fprintf(stderr, "writing from stdin\n"); - else - fprintf(stderr, - "writing from file %s size %jd KB\n", - track_info->file_name, (intmax_t)filesize); - } - size = 0; - - while ((count = read(track_info->file, buf, - track_info->file_size == -1 - ? track_info->block_size * BLOCKS - : MIN((track_info->file_size - size), - track_info->block_size * BLOCKS))) > 0) { - int res; - - if (count % track_info->block_size) { - /* pad file to % block_size */ - bzero(&buf[count], - (track_info->block_size * BLOCKS) - count); - count = ((count / track_info->block_size) + 1) * - track_info->block_size; - } - if ((res = write(fd, buf, count)) != count) { - if (res == -1) { - fprintf(stderr, "\n"); - close(track_info->file); - return errno; - } else - fprintf(stderr, "\nonly wrote %d of %jd" - " bytes\n", res, (intmax_t)count); - break; - } - size += count; - tot_size += count; - if (!quiet) { - int pct; - - fprintf(stderr, "written this track %jd KB", - (intmax_t)size/1024); - if (track_info->file != STDIN_FILENO && filesize) { - pct = (size / 1024) * 100 / filesize; - fprintf(stderr, " (%d%%)", pct); - } - fprintf(stderr, " total %jd KB\r", - (intmax_t)tot_size / 1024); - } - if (track_info->file_size != -1 - && size >= track_info->file_size) - break; - } - - if (!quiet) - fprintf(stderr, "\n"); - close(track_info->file); - return 0; -} - -int -roundup_blocks(struct track_info *track) -{ - return ((track->file_size + track->block_size - 1) / track->block_size); -} - -void -cue_ent(struct cdr_cue_entry *cue, int ctl, int adr, int track, int idx, - int dataform, int scms, int lba) -{ - cue->adr = adr; - cue->ctl = ctl; - cue->track = track; - cue->index = idx; - cue->dataform = dataform; - cue->scms = scms; - lba += 150; - cue->min = lba / (60*75); - cue->sec = (lba % (60*75)) / 75; - cue->frame = (lba % (60*75)) % 75; -} - -void -cleanup(int dummy __unused) -{ - if (ioctl(global_fd_for_cleanup, CDRIOCSETBLOCKSIZE, - &saved_block_size) < 0) - err(EX_IOERR, "ioctl(CDRIOCSETBLOCKSIZE)"); -} - -void -cleanup_flush(void) -{ - if (ioctl(global_fd_for_cleanup, CDRIOCFLUSH) < 0) - err(EX_IOERR, "ioctl(CDRIOCFLUSH)"); -} - -void -cleanup_signal(int sig) -{ - signal(sig, SIG_IGN); - ioctl(global_fd_for_cleanup, CDRIOCFLUSH); - write(STDERR_FILENO, "\nAborted\n", 10); - _exit(EXIT_FAILURE); -} - -void -usage(void) -{ - fprintf(stderr, - "usage: %s [-deFlmnpqtv] [-f device] [-s speed] [command]" - " [command file ...]\n", getprogname()); - exit(EX_USAGE); -} |