This patch fixes several assumptions in cdrwtool about the packet size being 32 sectors which caused breakage when the -z option was used to change the packet size. Also documented the -z option in the cdrwtool man page. - Phillip Susi diff -ru udftools-1.0.0b3.orig/cdrwtool/cdrwtool.h udftools-1.0.0b3/cdrwtool/cdrwtool.h --- udftools-1.0.0b3.orig/cdrwtool/cdrwtool.h 2002-11-26 02:18:50.000000000 -0500 +++ udftools-1.0.0b3/cdrwtool/cdrwtool.h 2006-01-03 21:02:25.000000000 -0500 @@ -89,6 +89,7 @@ unsigned int close_track; unsigned int close_session; struct udf_disc udf_disc; + int fd; }; #ifndef be16_to_cpu diff -ru udftools-1.0.0b3.orig/cdrwtool/defaults.c udftools-1.0.0b3/cdrwtool/defaults.c diff -ru udftools-1.0.0b3.orig/cdrwtool/main.c udftools-1.0.0b3/cdrwtool/main.c --- udftools-1.0.0b3.orig/cdrwtool/main.c 2004-02-22 22:33:11.000000000 -0500 +++ udftools-1.0.0b3/cdrwtool/main.c 2006-01-03 21:18:47.000000000 -0500 @@ -41,14 +41,15 @@ { static char *buffer = NULL; static int bufferlen = 0, lastpacket = -1; - int fd = *(int *)disc->write_data; + struct cdrw_disc *cdisc = (struct cdrw_disc *)disc->write_data; + int fd = cdisc->fd; int offset, packet; struct udf_desc *desc; struct udf_data *data; if (buffer == NULL) { - bufferlen = disc->blocksize * 32; + bufferlen = disc->blocksize * cdisc->packet_size; buffer = calloc(bufferlen, 1); } @@ -56,7 +57,7 @@ { if (lastpacket != -1) { - if (write_blocks(fd, buffer, lastpacket * 32, 32) < 0) + if (write_blocks(fd, buffer, lastpacket * cdisc->packet_size, cdisc->packet_size) < 0) return -1; } } @@ -65,21 +66,21 @@ desc = ext->head; while (desc != NULL) { - packet = (uint64_t)(ext->start + desc->offset) / 32; + packet = (uint64_t)(ext->start + desc->offset) / cdisc->packet_size; if (lastpacket != -1 && packet != lastpacket) { - if (write_blocks(fd, buffer, lastpacket * 32, 32) < 0) + if (write_blocks(fd, buffer, lastpacket * cdisc->packet_size, cdisc->packet_size) < 0) return -1; memset(buffer, 0x00, bufferlen); } data = desc->data; - offset = ((uint64_t)(ext->start + desc->offset) - (packet * 32)) << disc->blocksize_bits; + offset = ((uint64_t)(ext->start + desc->offset) - (packet * cdisc->packet_size)) << disc->blocksize_bits; while (data != NULL) { if (data->length + offset > bufferlen) { memcpy(buffer + offset, data->buffer, bufferlen - offset); - if (write_blocks(fd, buffer, packet * 32, 32) < 0) + if (write_blocks(fd, buffer, packet * cdisc->packet_size, cdisc->packet_size) < 0) return -1; memset(buffer, 0x00, bufferlen); lastpacket = ++ packet; @@ -94,9 +95,9 @@ offset += data->length; } - if (offset == disc->blocksize * 32) + if (offset == disc->blocksize * cdisc->packet_size) { - if (write_blocks(fd, buffer, packet * 32, 32) < 0) + if (write_blocks(fd, buffer, packet * cdisc->packet_size, cdisc->packet_size) < 0) return -1; memset(buffer, 0x00, bufferlen); lastpacket = -1; @@ -248,7 +249,8 @@ return fd; } disc.udf_disc.write = write_func; - disc.udf_disc.write_data = &fd; + disc.fd = fd; + disc.udf_disc.write_data = &disc; if ((ret = cdrom_open_check(fd))) { diff -ru udftools-1.0.0b3.orig/debian/changelog udftools-1.0.0b3/debian/changelog diff -ru udftools-1.0.0b3.orig/doc/cdrwtool.1 udftools-1.0.0b3/doc/cdrwtool.1 --- udftools-1.0.0b3.orig/doc/cdrwtool.1 2002-11-26 02:18:51.000000000 -0500 +++ udftools-1.0.0b3/doc/cdrwtool.1 2006-01-03 21:26:00.000000000 -0500 @@ -127,6 +127,10 @@ variable and fixed packet sizes respectively. .IP "\fB\-o \fIoffset\fP" Set write offset. +.IP "\fB\-z \fIsize\fP" +Set packet length in sectors ( default = 32 ). Longer packets allow for +more usable space on the disc, but may slow down access to smaller files. +Switching from 32 to 128 on a 700 MB cdrw gives about 100 MB more usable space. .SH AUTHORS .nf diff -ru udftools-1.0.0b3.orig/mkudffs/defaults.c udftools-1.0.0b3/mkudffs/defaults.c