summaryrefslogtreecommitdiffstats
path: root/usr.sbin/burncd
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2000-01-06 22:46:20 +0000
committersos <sos@FreeBSD.org>2000-01-06 22:46:20 +0000
commita50163c17d53f79f1e493fd7bd66530cb1dddf90 (patch)
tree787fd187d948d080e39590c04edd9904b5d3eb1d /usr.sbin/burncd
parentbc3fd6e895c52db42e963d8be347a75871cef837 (diff)
downloadFreeBSD-src-a50163c17d53f79f1e493fd7bd66530cb1dddf90.zip
FreeBSD-src-a50163c17d53f79f1e493fd7bd66530cb1dddf90.tar.gz
New ATAPI burner utility. Replaces wormcontrol.
Diffstat (limited to 'usr.sbin/burncd')
-rw-r--r--usr.sbin/burncd/Makefile6
-rw-r--r--usr.sbin/burncd/burncd.8111
-rw-r--r--usr.sbin/burncd/burncd.c190
3 files changed, 307 insertions, 0 deletions
diff --git a/usr.sbin/burncd/Makefile b/usr.sbin/burncd/Makefile
new file mode 100644
index 0000000..d4518d9
--- /dev/null
+++ b/usr.sbin/burncd/Makefile
@@ -0,0 +1,6 @@
+$FreeBSD$
+
+PROG= burncd
+MAN8= burncd.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/burncd/burncd.8 b/usr.sbin/burncd/burncd.8
new file mode 100644
index 0000000..e560ab4
--- /dev/null
+++ b/usr.sbin/burncd/burncd.8
@@ -0,0 +1,111 @@
+.\"
+.\" Copyright (c) 2000 Søren Schmidt
+.\" 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 January 6, 2000
+.Os
+.Dt BURNCD 8
+.Sh NAME
+.Nm burncd
+.Nd control the ATAPI CD-R/RW driver
+.Sh SYNOPSIS
+.Nm burncd
+.Op Fl f Ar device
+.Op Fl s Ar speed
+.Op Fl e
+.Op Fl p
+.Op Fl q
+.Ar [command]
+.Ar [command filename...]
+.Sh DESCRIPTION
+The
+.Nm
+utility is used to burn CD-R/RW media using the ATAPI cd driver.
+.Pp
+Available options and operands:
+.Pp
+.Bl -tag -width XXXXXXXXXXXX
+.It Fl f Ar device
+set the device to use for the burning process.
+.It Fl s Ar speed
+set the speed of the burner device, typically 1, 2 or 4. Defaults to 1.
+.It Fl e
+eject the CD-R/RW when done.
+.It Fl p
+use preemphasis on audio tracks.
+.It Fl q
+quiet, dont print progress messages.
+.El
+.Pp
+.Ar command
+may be one of:
+.Pp
+.Bl -tag -width XXXXXXXXXXXX
+.It Ar 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.
+.It Ar 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 multisession media. Should be the last command to
+.Nm
+as the program exits when this has been done.
+.It Ar raw | audio
+Set the write mode to produce audio (raw mode) tracks for the following images on the command line.
+.It Ar data | mode1
+Set the write mode to produce data (mode1) tracks for the following image files
+on the command line.
+.It Ar filename
+All other arguments are treated as filenames of images to write to the media.
+.El
+.Pp
+Files whose length are not a multiple of the current media blocksize are quietly zero padded to fit the blocksize requirement.
+.Pp
+.Sh EXAMPLES
+The typical usage for burning a data CD-R:
+.Bd -literal
+# burncd -f /dev/acd0c data file1 fixate
+.Pp
+The typical usage for burning an audio CD-R:
+.Bd -literal
+# burncd -f /dev/acd0c audio file1 file2 file3 fixate
+.Pp
+The typical usage for burning a mixed mode CD-R:
+.Bd -literal
+# burncd -f /dev/acd0c data file1 audio file2 file3 fixate
+.Pp
+.Sh BUGS
+Probably, please report when found.
+.Sh HISTORY
+.Nm burncd
+is currently under development. The
+.Nm
+command appeared in
+.Fx 4.0 .
+.Sh AUTHORS
+The program has been contributed by
+.ie t S/oren Schmidt,
+.el Søren Schmidt,
+Denmark.
diff --git a/usr.sbin/burncd/burncd.c b/usr.sbin/burncd/burncd.c
new file mode 100644
index 0000000..5dac15c
--- /dev/null
+++ b/usr.sbin/burncd/burncd.c
@@ -0,0 +1,190 @@
+/*-
+ * Copyright (c) 2000 Søren Schmidt
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <err.h>
+#include <sysexits.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/cdio.h>
+#include <sys/cdrio.h>
+
+#define BLOCKS 32
+
+static int fd, saved_block_size;
+void cleanup(int);
+
+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;
+ int block_size, cdopen = 0, size, tot_size = 0;
+ struct cdr_track track;
+
+ while ((ch = getopt(argc, argv, "ef:pqs:")) != -1) {
+ switch (ch) {
+ case 'e':
+ eject = 1;
+ break;
+
+ case 'f':
+ devname = optarg;
+ break;
+
+ case 'p':
+ preemp = 1;
+ break;
+
+ case 'q':
+ quiet = 1;
+ break;
+
+ case 's':
+ speed = atoi(optarg);
+ break;
+
+ case 't':
+ test_write = 1;
+ break;
+
+ default:
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if ((fd = open(devname, O_RDWR, 0)) < 0)
+ err(EX_NOINPUT, "open(%s)", devname);
+
+ if (ioctl(fd, CDRIOCWRITESPEED, &speed) < 0)
+ err(EX_IOERR, "ioctl(CDRIOCWRITESPEED)");
+
+ if (ioctl(fd, CDRIOCGETBLOCKSIZE, &saved_block_size) < 0)
+ err(EX_IOERR, "ioctl(CDRIOCGETBLOCKSIZE)");
+
+ err_set_exit(cleanup);
+
+ for (arg = 0; arg < argc; arg++) {
+ if (!strcmp(argv[arg], "blank")) {
+ if (!quiet)
+ fprintf(stderr, "blanking CD, please wait..\n");
+ if (ioctl(fd, CDRIOCBLANK) < 0)
+ err(EX_IOERR, "ioctl(CDRIOCBLANK)");
+ continue;
+ }
+ if (!strcmp(argv[arg], "fixate")) {
+ if (!quiet)
+ fprintf(stderr, "fixating CD, please wait..\n");
+ if (ioctl(fd, CDRIOCCLOSEDISK) < 0)
+ err(EX_IOERR, "ioctl(CDRIOCCLOSEDISK)");
+ break;
+ }
+ if (!strcmp(argv[arg], "audio") || !strcmp(argv[arg], "raw")) {
+ track.test_write = test_write;
+ track.track_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.preemp = 0;
+ block_size = 2048;
+ continue;
+ }
+ if ((file = open(argv[arg], O_RDONLY, 0)) < 0) {
+ err(EX_NOINPUT, "open(%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 (!quiet) {
+ fprintf(stderr, "next writeable LBA %d\n", addr);
+ fprintf(stderr, "writing from file %s\n", argv[arg]);
+ }
+ lseek(fd, 0, SEEK_SET);
+ size = 0;
+
+ while ((count = read(file, buf, block_size * BLOCKS)) > 0) {
+ if (count % block_size) {
+ /* pad file to % block_size */
+ bzero(&buf[count], block_size * BLOCKS - count);
+ count = ((count / block_size) + 1) * block_size;
+ }
+ if (write(fd, buf, count) != count) {
+ int res;
+
+ fprintf(stderr, "\nonly wrote %d of %d bytes\n",
+ res, count);
+ break;
+ }
+ size += count;
+ tot_size += count;
+ if (!quiet)
+ fprintf(stderr, "written this track %d KB"
+ " total %d KB\r",
+ size/1024, tot_size/1024);
+ }
+ if (!quiet)
+ fprintf(stderr, "\n");
+ close(file);
+ if (ioctl(fd, CDRIOCCLOSETRACK) < 0)
+ err(EX_IOERR, "ioctl(CDRIOCCLOSETRACK)");
+ }
+
+ if (ioctl(fd, CDRIOCGETBLOCKSIZE, &saved_block_size) < 0)
+ err(EX_IOERR, "ioctl(CDRIOCGETBLOCKSIZE)");
+
+ if (eject)
+ if (ioctl(fd, CDIOCEJECT) < 0)
+ err(EX_IOERR, "ioctl(CDIOCEJECT)");
+ close(fd);
+}
+
+void cleanup(int dummy)
+{
+ if (ioctl(fd, CDRIOCGETBLOCKSIZE, &saved_block_size) < 0)
+ err(EX_IOERR, "ioctl(CDRIOCGETBLOCKSIZE)");
+}
OpenPOWER on IntegriCloud