Package-Name: cdrtools
Gentoo-Package: app-cdr/cdrkit
#Homepage: http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html
Source: ftp://ftp.berlios.de/pub/cdrecord/cdrtools-(\d+(.\d+)+).tar.bz2 $1
#Source: ftp://ftp.berlios.de/pub/cdrecord/alpha/cdrtools-(\d+(.\d+)+a\d+).tar.bz2 $1
Zap-Before-Install: 1
Repack:
	tar xjvfp "$(SOURCE)"
	test -d cdrtools-"$(VERSION)" || mv cdrtools* cdrtools-"$(VERSION)"
Compile:
	cp -pf COPYING "$(PREFIX)/"
	mkdir -p "$(PREFIX)"/doc/{cdda2wav,cdrecord,mkisofs}
	cp -pf ABOUT README README.{ATAPI,WORM,audio,cdplus,cdrw,copy,linux,mkisofs,parallel,sony,verify} "$(PREFIX)"/doc/
	cp -pf cdda2wav/{Change*,FAQ,Frontends,GPL,HOWTOUSE,NEEDED,OtherProgs,README,THANKS,TODO} "$(PREFIX)"/doc/cdda2wav/
	cp -pf cdrecord/LIMITATIONS "$(PREFIX)"/doc/cdrecord/
	cp -p mkisofs/{Change*,README*} "$(PREFIX)"/doc/mkisofs/
	./Gmake.linux all install INS_BASE="$(PREFIX)"
	chmod u-s "$(PREFIX)"/sbin/rscsi  # security hole (patched in 2.01a18)
Install:
	$(MAKE) instbin BIN="cdda2wav cdrecord devdump isodump isoinfo isovfy mkhybrid mkisofs readcd scgcheck"
	$(MAKE) instsbin SBIN=rscsi
	$(MAKE) instman SECTION=1 MAN="cdda2wav cdrecord readcd scgcheck"
	$(MAKE) instman SECTION=8 MAN="isoinfo mkhybrid mkisofs"
Patch: <<EOT
######## begin no stupid warning fix
--- ../cdrtools-2.01-orig/RULES/mk-gmake.id	2004-09-09 01:10:02 +0900
+++ RULES/mk-gmake.id	2005-02-15 02:24:11 +0900
@@ -37,7 +37,7 @@
 
 ifndef		ARCH_DONE
 
-__gmake_warn:=	$(shell cat $(SRCROOT)/$(RULESDIR)/gmake.wrn 1>&2; sleep 5)
+#__gmake_warn:=	$(shell cat $(SRCROOT)/$(RULESDIR)/gmake.wrn 1>&2; sleep 5)
 
 _MACHCMD=	(mach || uname -p || true)	2> /dev/null
 _ARCHCMD=	(arch || /usr/ucb/arch || true)	2> /dev/null
######## end no stupid warning fix
######## begin UTF-8 fix
diff -urN ../cdrtools-2.01-orig/mkisofs/joliet.c mkisofs/joliet.c
--- ../cdrtools-2.01-orig/mkisofs/joliet.c	2003-04-28 07:36:08 +0900
+++ mkisofs/joliet.c	2007-06-05 14:34:18 +0900
@@ -263,11 +263,60 @@
 		buffer[i] = inls->charset2uni[uc].uni2;	/* final UNICODE */
 							/* conversion */
 		buffer[i + 1] = inls->charset2uni[uc].uni1;
-	}
 
-	if (size & 1) {	/* beautification */
-		buffer[size - 1] = 0;
+		// convert UTF-8 to UTF-16
+		int octet = tmpbuf[j];
+		if (octet == 0)
+			break;
+		else
+		if ((octet & 0x80) == 0) {
+			buffer[i] = 0;
+			buffer[i + 1] = octet;
+		}
+		else
+		if ((octet & 0xE0) == 0xC0) {
+			int octet2 = tmpbuf[j + 1];
+			if (octet2 == 0)
+				break;
+			int code = ((octet & 0x1F) << 6)
+				| (octet2 & 0x3F);
+			buffer[i] = (code & 0xFF00) >> 8;
+			buffer[i + 1] = code & 0xFF;
+			j++;
+		}
+		else
+		if ((octet & 0xF0) == 0xE0) {
+			int octet2 = tmpbuf[j + 1];
+			int octet3 = tmpbuf[j + 2];
+			if (octet2 == 0 || octet3 == 0)
+				break;
+			int code = ((octet & 0x0F) << 12)
+				| ((octet2 & 0x3F) << 6)
+				| (octet3 & 0x3F);
+			buffer[i] = (code & 0xFF00) >> 8;
+			buffer[i + 1] = code & 0xFF;
+			j += 2;
+		}
+
+		if (buffer[i] == 0) {
+			// replace illegal characters by '_'
+			switch (uc) {
+			case '*':
+			case '/':
+			case ':':
+			case ';':
+			case '?':
+			case '\\':
+			case '\0':
+				buffer[i + 1] = '_';
+			}
+		}
 	}
+
+	// fill end of buffer with zeros
+	for (; i < size; i++)
+		buffer[i] = 0;
+
 	if (source == NULL) {
 		free(tmpbuf);
 	}
@@ -294,6 +343,34 @@
 
 	rtn = strlen(string) << 1;
 
+	rtn = 0;
+	int i = 0;
+	while (1) {
+		int octet = string[i];
+		if (octet == 0)
+			break;
+		else
+		if ((octet & 0x80) == 0) {
+			rtn += 2;
+			i++;
+		}
+		else
+		if ((octet & 0xE0) == 0xC0) {
+			if (string[i + 1] == 0)
+				break;
+			rtn += 2;
+			i += 2;
+		}
+		else
+		if ((octet & 0xF0) == 0xE0) {
+			if (string[i + 1] == 0
+				|| string[i + 2] == 0)
+				break;
+			rtn += 2;
+			i += 3;
+		}
+	}
+
 	/*
 	 * We do clamp the maximum length of a Joliet string to be the
 	 * maximum path size.  This helps to ensure that we don't completely
@@ -1033,7 +1110,8 @@
 			"Error: %s and %s have the same Joliet name\n",
 			(*r)->whole_name, (*l)->whole_name);
 #endif
-		jsort_goof++;
+		if (strncmp((*r)->whole_name, "/rr_moved/", 10) != 0)
+			jsort_goof++;
 	}
 	/*
 	 * Put the '.' and '..' entries on the head of the sorted list.
diff -urN ../cdrtools-2.01-orig/mkisofs/write.c mkisofs/write.c
--- ../cdrtools-2.01-orig/mkisofs/write.c	2004-08-25 01:21:55 +0900
+++ mkisofs/write.c	2007-06-05 14:34:18 +0900
@@ -684,7 +684,8 @@
 				(*r)->whole_name, (*l)->whole_name,
 				(*r)->name);
 #endif
-			sort_goof++;
+			if (strstr((*r)->whole_name, "/rr_moved/") == NULL)
+				sort_goof++;
 		}
 	}
 	/*
######## end UTF-8 fix
######## rest is local stuff
diff -ur ../cdrtools-2.01-orig/cdrecord/cdrecord.c ../cdrtools-2.01/cdrecord/cdrecord.c
--- ../cdrtools-2.01-orig/cdrecord/cdrecord.c	2004-09-09 02:26:35 +0900
+++ ../cdrtools-2.01/cdrecord/cdrecord.c	2005-02-15 02:25:57 +0900
@@ -1460,7 +1460,7 @@
 				*didgracep = FALSE;
 			return (-1);
 		}
-		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b%4d seconds.", i);
+		printf("\b\b\b\b\b\b\b\b\b\b%d seconds.", i);
 		flush();
 	}
 grace_done:
Only in ../cdrtools-2.01/cdrecord: cdrecord.c~
diff -ur ../cdrtools-2.01-orig/cdrecord/drv_jvc.c ../cdrtools-2.01/cdrecord/drv_jvc.c
--- ../cdrtools-2.01-orig/cdrecord/drv_jvc.c	2004-03-01 18:57:37 +0900
+++ ../cdrtools-2.01/cdrecord/drv_jvc.c	2005-02-15 02:25:57 +0900
@@ -1279,7 +1279,7 @@
 
 	scgp->cmdname = "read peak buffer capacity";
 
-#define	BDEBUG
+//#define	BDEBUG
 #ifndef	BDEBUG
 	return (scg_cmd(scgp));
 #else
Only in ../cdrtools-2.01/cdrecord: drv_jvc.c~
diff -ur ../cdrtools-2.01-orig/include/mconfig.h ../cdrtools-2.01/include/mconfig.h
--- ../cdrtools-2.01-orig/include/mconfig.h	2004-07-11 07:46:53 +0900
+++ ../cdrtools-2.01/include/mconfig.h	2005-02-15 02:25:57 +0900
@@ -31,6 +31,8 @@
 #ifndef _MCONFIG_H
 #define	_MCONFIG_H
 
+#define NO_PRINT_OVR
+
 /*
  * Tell our users that this is a Schily SING compile environment.
  */
diff -ur ../cdrtools-2.01-orig/libschily/format.c ../cdrtools-2.01/libschily/format.c
--- ../cdrtools-2.01-orig/libschily/format.c	2003-10-18 22:26:50 +0900
+++ ../cdrtools-2.01/libschily/format.c	2005-02-15 02:25:57 +0900
@@ -149,6 +149,7 @@
 #else
 	char buf[8192];
 #endif
+	char buf2[64];
 	const char *sfmt;
 	register int unsflag;
 	register long val;
@@ -396,18 +397,21 @@
 			continue;
 
 #ifndef	NO_FLOATINGPOINT
+#undef sprintf
 		case 'e':
 			if (fa.signific == -1)
 				fa.signific = 6;
 			dval = va_arg(args, double);
-			ftoes(buf, dval, 0, fa.signific);
+			sprintf(buf2, "%%.%de", fa.signific);
+			sprintf(buf, buf2, dval);
 			count += prbuf(buf, &fa);
 			continue;
 		case 'f':
 			if (fa.signific == -1)
 				fa.signific = 6;
 			dval = va_arg(args, double);
-			ftofs(buf, dval, 0, fa.signific);
+			sprintf(buf2, "%%.%df", fa.signific);
+			sprintf(buf, buf2, dval);
 			count += prbuf(buf, &fa);
 			continue;
 		case 'g':
@@ -416,9 +420,11 @@
 			if (fa.signific == 0)
 				fa.signific = 1;
 			dval = va_arg(args, double);
-			gcvt(dval, fa.signific, buf);
+			sprintf(buf2, "%%.%dg", fa.signific);
+			sprintf(buf, buf2, dval);
 			count += prbuf(buf, &fa);
 			continue;
+#define sprintf Xsprintf
 #else
 #	ifdef	USE_FLOATINGARGS
 		case 'e':
EOT
NoPatch: <<EOT
######## begin linux 2.6 scsi.h fix
--- libscg/scsi-linux-sg.c.old	2002-10-22 01:20:35 +0900
+++ libscg/scsi-linux-sg.c	2004-06-07 19:26:15 +0900
@@ -66,6 +66,7 @@
 #if LINUX_VERSION_CODE >= 0x01031a /* <linux/scsi.h> introduced in 1.3.26 */
 #if LINUX_VERSION_CODE >= 0x020000 /* <scsi/scsi.h> introduced somewhere. */
 /* Need to fine tune the ifdef so we get the transition point right. */
+#define u8 __u8
 #include <scsi/scsi.h>
 #else
 #include <linux/scsi.h>
######## end linux 2.6 scsi.h fix
######## begin old mkisofs large files fix
diff -ur ../cdrtools-2.00-orig/mkisofs/mkisofs.c mkisofs/mkisofs.c
--- ../cdrtools-2.00-orig/mkisofs/mkisofs.c	2002-12-08 04:59:41 +0900
+++ mkisofs/mkisofs.c	2003-08-27 15:17:44 +0900
@@ -202,6 +202,7 @@
 #endif	/* APPLE_HYB */
 
 #ifdef UDF
+int	allow_large_files = 0;	/* Allow >=2GB-1 files for UDF filesystems */
 int	use_udf = 0;
 #endif
 
@@ -346,6 +347,7 @@
 #define OPTION_JLONG			1063
 
 #ifdef UDF
+#define OPTION_LARGE_FILES		1499
 #define OPTION_UDF			1500
 #endif
 #ifdef DVD_VIDEO
@@ -556,6 +558,8 @@
 	'\0', "LEVEL", "Set Joliet UCS level (1..3)", ONE_DASH},
 
 #ifdef UDF
+	{{"large-files", no_argument, NULL, OPTION_LARGE_FILES},
+	'\0', NULL, "Allow files >= 2GB-1 (for UDF)", ONE_DASH},
 	{{"udf", no_argument, NULL, OPTION_UDF},
 	'\0', NULL, "Generate UDF file system", ONE_DASH},
 #endif
@@ -1674,6 +1678,9 @@
 							ucs_level);
 			break;
 #ifdef UDF
+		case OPTION_LARGE_FILES:
+			allow_large_files++;
+			break;
 		case OPTION_UDF:
 			use_udf++;
 			break;
diff -ur ../cdrtools-2.00-orig/mkisofs/mkisofs.h mkisofs/mkisofs.h
--- ../cdrtools-2.00-orig/mkisofs/mkisofs.h	2002-12-08 04:59:42 +0900
+++ mkisofs/mkisofs.h	2003-08-27 15:18:23 +0900
@@ -356,6 +356,10 @@
 #define JLONGMAX	103	/* out of spec Joliet file name length */
 extern int	jlen;		/* selected maximum Joliet file name length */
 
+#ifdef UDF
+extern int	allow_large_files;
+#endif /* UDF */
+
 #ifdef DVD_VIDEO
 extern int	dvd_video;
 #endif /* DVD_VIDEO */
diff -ur ../cdrtools-2.00-orig/mkisofs/tree.c mkisofs/tree.c
--- ../cdrtools-2.00-orig/mkisofs/tree.c	2002-12-08 05:40:47 +0900
+++ mkisofs/tree.c	2003-08-27 15:19:04 +0900
@@ -1517,7 +1517,7 @@
 	/*
 	 * >= is required by the large file summit standard.
 	 */
-	if (S_ISREG(lstatbuf.st_mode) && (lstatbuf.st_size >= (off_t)0x7FFFFFFF)) {
+	if (!allow_large_files && S_ISREG(lstatbuf.st_mode) && (lstatbuf.st_size >= (off_t)0x7FFFFFFF)) {
 #ifdef	EOVERFLOW
 		errno = EOVERFLOW;
 #else
diff -ur ../cdrtools-2.00-orig/mkisofs/write.c mkisofs/write.c
--- ../cdrtools-2.00-orig/mkisofs/write.c	2002-12-23 23:16:45 +0900
+++ mkisofs/write.c	2003-08-27 15:37:54 +0900
@@ -383,7 +383,7 @@
 	 */
 static	char		buffer[SECTOR_SIZE * NSECT];
 	FILE		*infile;
-	int		remain;
+	unsigned int	remain;
 	int	use;
 
 
@@ -449,7 +449,10 @@
 			fflush(stderr);
 		}
 #endif
-		remain -= use;
+		if (use > remain)
+			remain = 0;
+		else
+			remain -= use;
 	}
 	fclose(infile);
 }/* write_one_file(... */
######## end old mkisofs large files fix
EOT

/pkg/cdrtools/
/usr/bin/cdda2wav
/usr/bin/cdrecord
/usr/bin/devdump
/usr/bin/isodump
/usr/bin/isoinfo
/usr/bin/isovfy
/usr/bin/mkhybrid
/usr/bin/mkisofs
/usr/bin/readcd
/usr/bin/scgcheck
/usr/man/man1/cdda2wav.1.gz
/usr/man/man1/cdrecord.1.gz
/usr/man/man1/readcd.1.gz
/usr/man/man1/scgcheck.1.gz
/usr/man/man8/isoinfo.8.gz
/usr/man/man8/mkhybrid.8.gz
/usr/man/man8/mkisofs.8.gz
/usr/sbin/rscsi
