diff --git a/README.md b/README.md index 5802f69..c3e67c4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ # cdrtools +Cdrtools supports many features including cdrecord, cdda2wav and mkisofs/mkhybrid in a single source tree. +Cdrecord supports DVD-R and DVD-RW with all known DVD-writers on all UNIX-like OS and on Win32. +DVD writing support is implemented in cdrecord since march 1998. +Cdrecord writes DVD media similar to CD media. + diff --git a/cdrtools-2.01-CAN-2004-0806.patch b/cdrtools-2.01-CAN-2004-0806.patch new file mode 100644 index 0000000..7fa7449 --- /dev/null +++ b/cdrtools-2.01-CAN-2004-0806.patch @@ -0,0 +1,15 @@ +--- cdrecord-2.01/librscg/scsi-remote.c.org 2004-08-30 16:09:33.000000000 -0600 ++++ cdrecord-2.01/librscg/scsi-remote.c 2004-08-30 16:11:06.000000000 -0600 +@@ -1071,9 +1071,9 @@ + /* + * Become 'locuser' to tell the rsh program the local user id. + */ +- if (getuid() != pw->pw_uid && +- setuid(pw->pw_uid) == -1) { +- errmsg("setuid(%lld) failed.\n", ++ if ((pw->pw_uid) != geteuid() && ++ seteuid(pw->pw_uid) == -1) { ++ errmsg("seteuid(%lld) failed.\n", + (Llong)pw->pw_uid); + _exit(EX_BAD); + /* NOTREACHED */ diff --git a/cdrtools-2.01-gcc4.patch b/cdrtools-2.01-gcc4.patch new file mode 100644 index 0000000..a865c2f --- /dev/null +++ b/cdrtools-2.01-gcc4.patch @@ -0,0 +1,61 @@ +--- cdrtools-2.01/mkisofs/write.c.jj 2005-08-27 10:16:33.000000000 +0200 ++++ cdrtools-2.01/mkisofs/write.c 2005-08-27 10:29:41.000000000 +0200 +@@ -1907,7 +1907,7 @@ pvd_write(outfile) + /* Next we write out the primary descriptor for the disc */ + memset(&vol_desc, 0, sizeof (vol_desc)); + vol_desc.type[0] = ISO_VD_PRIMARY; +- memcpy(vol_desc.id, ISO_STANDARD_ID, sizeof (ISO_STANDARD_ID)); ++ memcpy(vol_desc.id, ISO_STANDARD_ID, sizeof (ISO_STANDARD_ID) - 1); + vol_desc.version[0] = 1; + + memset(vol_desc.system_id, ' ', sizeof (vol_desc.system_id)); +@@ -2030,7 +2030,7 @@ evd_write(outfile) + */ + memset(&evol_desc, 0, sizeof (evol_desc)); + evol_desc.type[0] = (unsigned char) ISO_VD_END; +- memcpy(evol_desc.id, ISO_STANDARD_ID, sizeof (ISO_STANDARD_ID)); ++ memcpy(evol_desc.id, ISO_STANDARD_ID, sizeof (ISO_STANDARD_ID) - 1); + evol_desc.version[0] = 1; + xfwrite(&evol_desc, SECTOR_SIZE, 1, outfile, 0, TRUE); + last_extent_written += 1; +--- cdrtools-2.01/mkisofs/eltorito.c.jj 2004-05-23 22:46:05.000000000 +0200 ++++ cdrtools-2.01/mkisofs/eltorito.c 2005-08-27 10:30:50.000000000 +0200 +@@ -270,7 +270,7 @@ get_torito_desc(boot_desc) + + memset(boot_desc, 0, sizeof (*boot_desc)); + boot_desc->type[0] = 0; +- memcpy(boot_desc->id, ISO_STANDARD_ID, sizeof (ISO_STANDARD_ID)); ++ memcpy(boot_desc->id, ISO_STANDARD_ID, sizeof (ISO_STANDARD_ID) - 1); + boot_desc->version[0] = 1; + + memcpy(boot_desc->system_id, EL_TORITO_ID, sizeof (EL_TORITO_ID)); +--- cdrtools-2.01/cdda2wav/toc.c.jj 2004-05-21 22:56:44.000000000 +0200 ++++ cdrtools-2.01/cdda2wav/toc.c 2005-08-27 10:25:04.000000000 +0200 +@@ -959,7 +959,12 @@ process_cddb_titles(sock_fd, inbuff, rea + if (*target != NULL) + **target = '\0'; + } else { +- realloc(*target, strlen(*target) + clen - 1); ++ char *newp = realloc(*target, strlen(*target) + clen - 1); ++ if (newp == NULL) { ++ free (*target); ++ *target = NULL; ++ } else ++ *target = newp; + } + if (*target != NULL) { + strcat((char *)*target, inbuff+ind+7); +@@ -994,7 +999,12 @@ process_cddb_titles(sock_fd, inbuff, rea + if (global.tracktitle[tno] != NULL) + *(global.tracktitle[tno]) = '\0'; + } else { +- realloc(global.tracktitle[tno], strlen((char *)global.tracktitle[tno]) + p - q + 1 ); ++ char *newp = realloc(global.tracktitle[tno], strlen((char *)global.tracktitle[tno]) + p - q + 1 ); ++ if (newp == NULL) { ++ free (global.tracktitle[tno]); ++ global.tracktitle[tno] = NULL; ++ } else ++ global.tracktitle[tno] = newp; + } + if (global.tracktitle[tno] != NULL) { + strcat((char *)global.tracktitle[tno], q+1); diff --git a/cdrtools-2.01-gcc_static.patch b/cdrtools-2.01-gcc_static.patch new file mode 100644 index 0000000..d69d6b0 --- /dev/null +++ b/cdrtools-2.01-gcc_static.patch @@ -0,0 +1,12 @@ +diff -pur cdrtools-2.01/cdrecord/drv_mmc.c cdrtools-2.01-fix/cdrecord/drv_mmc.c +--- cdrtools-2.01/cdrecord/drv_mmc.c 2006-03-16 14:33:59.000000000 +0100 ++++ cdrtools-2.01-fix/cdrecord/drv_mmc.c 2006-03-16 14:35:55.000000000 +0100 +@@ -1087,7 +1087,7 @@ check_writemodes_mmc(scgp, dp) + return (0); + } + +-LOCAL int ++EXPORT int + check_writemodes_mdvd(scgp, dp) + SCSI *scgp; + cdr_t *dp; diff --git a/cdrtools-2.01-warnings.patch b/cdrtools-2.01-warnings.patch new file mode 100644 index 0000000..690b855 --- /dev/null +++ b/cdrtools-2.01-warnings.patch @@ -0,0 +1,11 @@ +--- cdrtools-2.01/RULES/mk-gmake.id 2004-09-08 18:10:02.000000000 +0200 ++++ cdrtools-2.01/RULES/mk-gmake.id.nowarn 2006-03-16 12:55:18.000000000 +0100 +@@ -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 diff --git a/cdrtools-2.01a32-ossdvd.patch b/cdrtools-2.01a32-ossdvd.patch new file mode 100644 index 0000000..2c69011 --- /dev/null +++ b/cdrtools-2.01a32-ossdvd.patch @@ -0,0 +1,1031 @@ +diff -u -r -3 cdrtools-2.01/cdrecord/cdr_drv.c cdrtools-2.01.ossdvd/cdrecord/cdr_drv.c +--- cdrtools-2.01/cdrecord/cdr_drv.c 2004-03-02 02:06:26.000000000 +0100 ++++ cdrtools-2.01.ossdvd/cdrecord/cdr_drv.c 2004-08-27 05:22:37.000000000 +0200 +@@ -42,6 +42,7 @@ + extern cdr_t cdr_oldcd; + extern cdr_t cdr_cd; + extern cdr_t cdr_mmc; ++extern cdr_t cdr_mdvd; + extern cdr_t cdr_mmc_sony; + extern cdr_t cdr_cd_dvd; + extern cdr_t cdr_philips_cdd521O; +@@ -80,6 +81,7 @@ + cdr_t *drivers[] = { + &cdr_cd_dvd, + &cdr_mmc, ++ &cdr_mdvd, + &cdr_mmc_sony, + &cdr_cd, + &cdr_oldcd, +diff -u -r -3 cdrtools-2.01/cdrecord/cdrecord.c cdrtools-2.01.ossdvd/cdrecord/cdrecord.c +--- cdrtools-2.01/cdrecord/cdrecord.c 2004-06-17 11:24:50.000000000 +0200 ++++ cdrtools-2.01.ossdvd/cdrecord/cdrecord.c 2004-08-27 05:22:37.000000000 +0200 +@@ -215,7 +215,7 @@ + LOCAL BOOL checkdsize __PR((SCSI *scgp, cdr_t *dp, + long tsize, int flags)); + LOCAL void raise_fdlim __PR((void)); +-LOCAL void gargs __PR((int, char **, int *, track_t *, char **, ++LOCAL int gargs __PR((int, char **, int *, track_t *, char **, + int *, cdr_t **, + int *, long *, int *)); + LOCAL void set_trsizes __PR((cdr_t *, int, track_t *)); +@@ -270,6 +270,7 @@ + SCSI *scgp = NULL; + char errstr[80]; + BOOL gracedone = FALSE; ++ int ispacket; + + #ifdef __EMX__ + /* This gives wildcard expansion with Non-Posix shells with EMX */ +@@ -284,7 +285,7 @@ + track[i].track = track[i].trackno = i; + track[0].tracktype = TOC_MASK; + raise_fdlim(); +- gargs(ac, av, &tracks, track, &dev, &timeout, &dp, &speed, &flags, ++ ispacket = gargs(ac, av, &tracks, track, &dev, &timeout, &dp, &speed, &flags, + &blanktype); + if ((track[0].tracktype & TOC_MASK) == TOC_MASK) + comerrno(EX_BAD, "Internal error: Bad TOC type.\n"); +@@ -351,6 +352,10 @@ + CLONE_TITLE, + cdr_version, + HOST_CPU, HOST_VENDOR, HOST_OS); ++ printf("NOTE: this is OSS DVD extensions for cdrtools and thus may have bugs\n"); ++ printf(" related to DVD issues that are not present in the original cdrtools. For\n"); ++ printf(" more information see http://crashrecovery.org/oss-dvd.html. The original\n"); ++ printf(" cdrtools author should not be bothered with problems in this version.\n"); + + #if defined(SOURCE_MODIFIED) || !defined(IS_SCHILY_XCONFIG) + #define INSERT_YOUR_EMAIL_ADDRESS_HERE +@@ -591,6 +596,19 @@ + } else if (!is_unknown_dev(scgp) && dp != get_cdrcmds(scgp)) { + errmsgno(EX_BAD, "WARNING: Trying to use other driver on known device.\n"); + } ++ if (ispacket) { ++ BOOL is_cdwr = FALSE; ++ BOOL is_dvdwr = FALSE; ++ is_mmc(scgp, &is_cdwr, &is_dvdwr); ++ if (is_dvdwr) { ++ track[0].flags |= TI_PACKET; ++ /*XXX put here to only affect DVD writing, should be in gargs. ++ * however if set in args for all mode, packet writing is then ++ * broken for all disc as cdrecord assume that PACKET imply TAO which ++ * is not true at all???? */ ++ track[0].flags &= ~TI_TAO; ++ } ++ } + + if (!is_cddrive(scgp)) + comerrno(EX_BAD, "Sorry, no CD/DVD-Drive found on this target.\n"); +@@ -632,7 +650,7 @@ + if (!is_mmc(scgp, &is_cdwr, &is_dvdwr)) + is_cdwr = TRUE; /* If it is not MMC, it must be a CD writer */ + +- if (is_dvdwr && !set_cdrcmds("mmc_dvd", (cdr_t **)NULL)) { ++ if (is_dvdwr && !set_cdrcmds("mmc_mdvd", (cdr_t **)NULL)) { + errmsgno(EX_BAD, + "This version of cdrecord does not include DVD-R/DVD-RW support code.\n"); + errmsgno(EX_BAD, +@@ -1180,6 +1198,14 @@ + trackno = 0; + } + scgp->silent--; ++ ++ /* If it is DVD, the information in TOC is fabricated :) ++ The real information is from read disk info command*/ ++ if((dp->cdr_dstat->ds_disktype&DT_DVD) && (dp->cdr_dstat->ds_trlast>0)){ ++ trackno=dp->cdr_dstat->ds_trlast-1; ++ printf("trackno=%d\n",trackno); ++ } ++ + if ((tracks + trackno) > MAX_TRACK) { + /* + * XXX How many tracks are allowed on a DVD? +@@ -2911,10 +2937,13 @@ + /* + * dsp->ds_maxblocks == 0 (disk capacity is unknown). + */ +- if (endsec >= (405000-300)) { /*<90 min disk*/ +- errmsgno(EX_BAD, +- "Data will not fit on any disk.\n"); +- goto toolarge; ++ if (endsec >= (2300000)) { ++ errmsgno(EX_BAD, ++ "ERROR: Could not manage to find medium size, and more than 4.3 GB of data.\n"); ++ goto toolarge; ++ } else if (endsec >= (405000-300)) { /*<90 min disk or DVD*/ ++ errmsgno(EX_BAD, ++ "WARNING: Could not manage to find medium size, and more than 90 mins of data.\n"); + } else if (endsec >= (333000-150)) { /* 74 min disk*/ + errmsgno(EX_BAD, + "WARNING: Data may not fit on standard 74min disk.\n"); +@@ -2998,7 +3027,7 @@ + #define M_RAW 4 /* Raw mode */ + #define M_PACKET 8 /* Packed mode */ + +-LOCAL void ++LOCAL int + gargs(ac, av, tracksp, trackp, devp, timeoutp, dpp, speedp, flagsp, blankp) + int ac; + char **av; +@@ -3666,14 +3695,14 @@ + ((strncmp(*devp, "HELP", 4) == 0) || + (strncmp(*devp, "help", 4) == 0))) { + *flagsp |= F_CHECKDRIVE; /* Set this for not calling mlockall() */ +- return; ++ return ispacket; + } + if (*flagsp & (F_LOAD|F_DLCK|F_SETDROPTS|F_MSINFO|F_TOC|F_PRATIP|F_FIX|F_VERSION|F_CHECKDRIVE|F_PRCAP|F_INQUIRY|F_SCANBUS|F_RESET|F_ABORT)) { + if (tracks != 0) { + errmsgno(EX_BAD, "No tracks allowed with this option\n"); + susage(EX_BAD); + } +- return; ++ return ispacket; + } + *tracksp = tracks; + if (*flagsp & F_SAO) { +@@ -3702,12 +3731,13 @@ + susage(EX_BAD); + } + cuefilename = cuefile; +- return; ++ return ispacket; + } + if (tracks == 0 && (*flagsp & (F_LOAD|F_DLCK|F_EJECT|F_BLANK|F_FORMAT)) == 0) { + errmsgno(EX_BAD, "No tracks specified. Need at least one.\n"); + susage(EX_BAD); + } ++ return ispacket; + } + + LOCAL void +@@ -4131,9 +4161,11 @@ + /* + * Verify that scheduling is available + */ ++ seteuid ( 0 ); + #ifdef _SC_PRIORITY_SCHEDULING + if (sysconf(_SC_PRIORITY_SCHEDULING) == -1) { + errmsg("WARNING: RR-scheduler not available, disabling.\n"); ++ seteuid ( getuid() ); + return (-1); + } + #endif +@@ -4141,8 +4173,10 @@ + scp.sched_priority = sched_get_priority_max(SCHED_RR) - pri; + if (sched_setscheduler(0, SCHED_RR, &scp) < 0) { + errmsg("WARNING: Cannot set RR-scheduler\n"); ++ seteuid ( getuid() ); + return (-1); + } ++ seteuid ( getuid() ); + return (0); + } + +diff -u -r -3 cdrtools-2.01/cdrecord/cdrecord.h cdrtools-2.01.ossdvd/cdrecord/cdrecord.h +--- cdrtools-2.01/cdrecord/cdrecord.h 2004-05-25 00:36:01.000000000 +0200 ++++ cdrtools-2.01.ossdvd/cdrecord/cdrecord.h 2004-08-27 05:22:37.000000000 +0200 +@@ -570,6 +570,12 @@ + #define DSF_NEED_FORMAT 0x0800 /* Disk needs to be formatted */ + + /* ++ * Definitions for disktype flags ++ */ ++#define DT_CD 0x001 /*is a CD */ ++#define DT_DVD 0x002 /*is a DVD */ ++ ++/* + * Definitions for disk_status disk type + * used in "ds_type". + */ +diff -u -r -3 cdrtools-2.01/cdrecord/drv_mmc.c cdrtools-2.01.ossdvd/cdrecord/drv_mmc.c +--- cdrtools-2.01/cdrecord/drv_mmc.c 2004-05-25 00:36:01.000000000 +0200 ++++ cdrtools-2.01.ossdvd/cdrecord/drv_mmc.c 2004-08-27 05:23:18.000000000 +0200 +@@ -84,8 +84,11 @@ + EXPORT char *hasdrvopt __PR((char *optstr, char *optname)); + LOCAL cdr_t *identify_mmc __PR((SCSI *scgp, cdr_t *, struct scsi_inquiry *)); + LOCAL int attach_mmc __PR((SCSI *scgp, cdr_t *)); ++LOCAL int attach_mdvd __PR((SCSI *scgp, cdr_t *)); + EXPORT int check_writemodes_mmc __PR((SCSI *scgp, cdr_t *dp)); ++EXPORT int check_writemodes_mdvd __PR((SCSI *scgp, cdr_t *dp)); + LOCAL int deflt_writemodes_mmc __PR((SCSI *scgp, BOOL reset_dummy)); ++LOCAL int deflt_writemodes_mdvd __PR((SCSI *scgp, BOOL reset_dummy)); + LOCAL int get_diskinfo __PR((SCSI *scgp, struct disk_info *dip)); + LOCAL void di_to_dstat __PR((struct disk_info *dip, dstat_t *dsp)); + LOCAL int get_atip __PR((SCSI *scgp, struct atipinfo *atp)); +@@ -94,18 +97,26 @@ + #endif + LOCAL int init_mmc __PR((SCSI *scgp, cdr_t *dp)); + LOCAL int getdisktype_mmc __PR((SCSI *scgp, cdr_t *dp)); ++LOCAL int getdisktype_mdvd __PR((SCSI *scgp, cdr_t *dp)); + LOCAL int speed_select_mmc __PR((SCSI *scgp, cdr_t *dp, int *speedp)); ++LOCAL int speed_select_mdvd __PR((SCSI *scgp, cdr_t *dp, int *speedp)); + LOCAL int mmc_set_speed __PR((SCSI *scgp, int readspeed, int writespeed, int rotctl)); + LOCAL int next_wr_addr_mmc __PR((SCSI *scgp, track_t *trackp, long *ap)); ++LOCAL int next_wr_addr_mdvd __PR((SCSI *scgp, track_t *trackp, long *ap)); + LOCAL int write_leadin_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); + LOCAL int open_track_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); ++LOCAL int open_track_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); + LOCAL int close_track_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); ++LOCAL int close_track_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); + LOCAL int open_session_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); ++LOCAL int open_session_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); + LOCAL int waitfix_mmc __PR((SCSI *scgp, int secs)); + LOCAL int fixate_mmc __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); ++LOCAL int fixate_mdvd __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); + LOCAL int blank_mmc __PR((SCSI *scgp, cdr_t *dp, long addr, int blanktype)); + LOCAL int send_opc_mmc __PR((SCSI *scgp, caddr_t, int cnt, int doopc)); + LOCAL int opt1_mmc __PR((SCSI *scgp, cdr_t *dp)); ++LOCAL int opt1_mdvd __PR((SCSI *scgp, cdr_t *dp)); + LOCAL int opt2_mmc __PR((SCSI *scgp, cdr_t *dp)); + LOCAL int scsi_sony_write __PR((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast)); + LOCAL int gen_cue_mmc __PR((track_t *trackp, void *vcuep, BOOL needgap)); +@@ -197,6 +208,46 @@ + opt2_mmc, + }; + ++cdr_t cdr_mdvd = { ++ 0, 0, ++ CDR_SWABAUDIO, ++ 370,370, ++ "mmc_mdvd", ++ "generic SCSI-3/mmc DVD-R(W) driver", ++ 0, ++ (dstat_t *)0, ++ identify_mmc, ++ attach_mdvd, ++ init_mmc, ++ getdisktype_mdvd, ++ scsi_load, ++ scsi_unload, ++ read_buff_cap, ++ cmd_dummy, /* recovery_needed */ ++ (int(*)__PR((SCSI *, int)))cmd_dummy, /* recover */ ++ speed_select_mdvd, ++ select_secsize, ++ next_wr_addr_mdvd, ++ (int(*)__PR((SCSI *, Ulong)))cmd_ill, /* reserve_track */ ++ scsi_cdr_write, ++ (int(*)__PR((SCSI *scgp, int, track_t *)))cmd_dummy, /* gen_cue */ ++ (int(*)__PR((SCSI *scgp, cdr_t *, track_t *)))cmd_dummy, /* send_cue */ ++ write_leadin_mmc, ++ open_track_mdvd, ++ close_track_mdvd, ++ open_session_mdvd, ++ cmd_dummy, ++ cmd_dummy, /* abort */ ++ read_session_offset, ++ fixate_mdvd, ++ stats_mmc, ++ blank_mmc, ++ format_dummy, ++ send_opc_mmc, ++ opt1_mdvd, ++ opt2_mmc, ++}; ++ + /* + * Sony MMC CD-writer + */ +@@ -589,11 +640,8 @@ + } + } else if (profile >= 0x10 && profile < 0x18) { + errmsgno(EX_BAD, +- "Found DVD media but DVD-R/DVD-RW support code is missing.\n"); +- errmsgno(EX_BAD, +- "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n"); +- errmsgno(EX_BAD, +- "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n"); ++ "Found DVD media: using cdr_mdvd.\n"); ++ dp = &cdr_mdvd; + return (dp); + } + } else { +@@ -662,11 +710,8 @@ + } + if (is_dvd) { + errmsgno(EX_BAD, +- "Found DVD media but DVD-R/DVD-RW support code is missing.\n"); +- errmsgno(EX_BAD, +- "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n"); +- errmsgno(EX_BAD, +- "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n"); ++ "Found DVD media: using cdr_mdvd.\n"); ++ dp = &cdr_mdvd; + } + return (dp); + } +@@ -856,6 +901,42 @@ + return (0); + } + ++LOCAL int ++attach_mdvd(scgp, dp) ++ SCSI *scgp; ++ cdr_t *dp; ++{ ++ struct cd_mode_page_2A *mp; ++ ++ ++ allow_atapi(scgp, TRUE);/* Try to switch to 10 byte mode cmds */ ++ ++ scgp->silent++; ++ mp = mmc_cap(scgp, NULL);/* Get MMC capabilities in allocated mp */ ++ scgp->silent--; ++ if (mp == NULL) ++ return (-1); /* Pre SCSI-3/mmc drive */ ++ ++ dp->cdr_cdcap = mp; /* Store MMC cap pointer */ ++ ++ if (mp->loading_type == LT_TRAY) ++ dp->cdr_flags |= CDR_TRAYLOAD; ++ else if (mp->loading_type == LT_CADDY) ++ dp->cdr_flags |= CDR_CADDYLOAD; ++ ++ if (mp->BUF != 0) ++ dp->cdr_flags |= CDR_BURNFREE; ++ ++ check_writemodes_mdvd(scgp, dp); ++ ++ if (driveropts != NULL) { ++ if (strcmp(driveropts, "help") == 0) { ++ mmc_opthelp(dp, 0); ++ } ++ } ++ ++ return (0); ++} + + EXPORT int + check_writemodes_mmc(scgp, dp) +@@ -1007,6 +1088,77 @@ + } + + LOCAL int ++check_writemodes_mdvd(scgp, dp) ++ SCSI *scgp; ++ cdr_t *dp; ++{ ++ Uchar mode[0x100]; ++ int len; ++ struct cd_mode_page_05 *mp; ++ ++ if (xdebug) ++ printf("Checking possible write modes: "); ++ ++ deflt_writemodes_mdvd(scgp, FALSE); ++ ++ fillbytes((caddr_t)mode, sizeof(mode), '\0'); ++ ++ scgp->silent++; ++ if (!get_mode_params(scgp, 0x05, "CD write parameter", ++ mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) { ++ scgp->silent--; ++ return (-1); ++ } ++ if (len == 0) { ++ scgp->silent--; ++ return (-1); ++ } ++ ++ mp = (struct cd_mode_page_05 *) ++ (mode + sizeof(struct scsi_mode_header) + ++ ((struct scsi_mode_header *)mode)->blockdesc_len); ++ ++ mp->test_write = 0; ++ ++ /*We only check for PACKET and SAO since these are the only supported modes for DVD */ ++ /*XXX these checks are irrelevant because they are not medium sensitive. ie the device returns ++ error only when it does not support a given mode for ALL mediums. It should check using ++ GET CONFIGURATION command.*/ ++ ++ mp->write_type = WT_PACKET; ++ mp->fp = 0; ++ i_to_4_byte(mp->packet_size, 0); ++ ++ if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) { ++ dp->cdr_flags |= CDR_PACKET; ++ if (xdebug) ++ printf("PACKET "); ++ } else ++ dp->cdr_flags &= ~CDR_PACKET; ++ mp->fp = 0; ++ i_to_4_byte(mp->packet_size, 0); ++ mp->track_mode = TM_DATA; ++ ++ ++ mp->write_type = WT_SAO; ++ ++ if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) { ++ dp->cdr_flags |= CDR_SAO; ++ if (xdebug) ++ printf("SAO "); ++ } else ++ dp->cdr_flags &= ~CDR_SAO; ++ ++ ++ if (xdebug) ++ printf("\n"); ++ ++ deflt_writemodes_mdvd(scgp, TRUE); ++ scgp->silent--; ++ return (0); ++} ++ ++LOCAL int + deflt_writemodes_mmc(scgp, reset_dummy) + SCSI *scgp; + BOOL reset_dummy; +@@ -1080,6 +1232,61 @@ + return (0); + } + ++LOCAL int ++deflt_writemodes_mdvd(scgp, reset_dummy) ++ SCSI *scgp; ++ BOOL reset_dummy; ++{ ++ Uchar mode[0x100]; ++ int len; ++ struct cd_mode_page_05 *mp; ++ ++ fillbytes((caddr_t)mode, sizeof(mode), '\0'); ++ ++ scgp->silent++; ++ if (!get_mode_params(scgp, 0x05, "DVD write parameter", ++ mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) { ++ scgp->silent--; ++ return (-1); ++ } ++ if (len == 0) { ++ scgp->silent--; ++ return (-1); ++ } ++ ++ mp = (struct cd_mode_page_05 *) ++ (mode + sizeof(struct scsi_mode_header) + ++ ((struct scsi_mode_header *)mode)->blockdesc_len); ++ ++ mp->test_write = 0; ++ /* ++ * This is the only place where we reset mp->test_write (-dummy) ++ */ ++ if (reset_dummy) ++ mp->test_write = 0; ++ ++ ++ /* ++ * Set default values: ++ * Write type = 02 (session at once) ++ * ++ * XXX Note: the same code appears in check_writemodes_mmc() and ++ * XXX in speed_select_mmc(). ++ */ ++ mp->write_type = WT_SAO; ++ mp->track_mode = TM_DATA; ++ mp->dbtype = DB_ROM_MODE1; ++ mp->session_format = SES_DA_ROM; ++ ++ ++ if (set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1) < 0) { ++ scgp->silent--; ++ return (-1); ++ } ++ scgp->silent--; ++ return (0); ++} ++ + #ifdef PRINT_ATIP + LOCAL void print_di __PR((struct disk_info *dip)); + LOCAL void atip_printspeed __PR((char *fmt, int speedindex, char speedtab[])); +@@ -1149,6 +1356,9 @@ + + if (dsp->ds_last_leadout == 0 && dsp->ds_maxblocks >= 0) + dsp->ds_last_leadout = dsp->ds_maxblocks; ++ dsp->ds_trfirst=dip->first_track; ++ dsp->ds_trlast=dip->last_track_ls; ++ dsp->ds_trfirst_ls=dip->first_track_ls; + } + + LOCAL int +@@ -1259,6 +1469,30 @@ + } + + LOCAL int ++getdisktype_mdvd(scgp, dp) ++ SCSI *scgp; ++ cdr_t *dp; ++{ ++ int ret; ++ dstat_t *dsp = dp->cdr_dstat; ++ ++ struct track_info track_info; ++ if(getdisktype_mmc(scgp, dp)<0) ++ return -1; ++ ++ /* read rzone info to get the space left on disk */ ++ /*ds_trlast is the last rzone on disk, can be invisible */ ++ if(read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info))>=0) ++ dsp->ds_maxblocks=a_to_u_4_byte(track_info.free_blocks)+a_to_4_byte(track_info.next_writable_addr); ++ ++ dsp->ds_disktype&= ~DT_CD; ++ dsp->ds_disktype|= DT_DVD; ++ ++ return (ret); ++ ++} ++ ++LOCAL int + getdisktype_mmc(scgp, dp) + SCSI *scgp; + cdr_t *dp; +@@ -1762,6 +1996,68 @@ + } + + LOCAL int ++speed_select_mdvd(scgp, dp, speedp) ++ SCSI *scgp; ++ cdr_t *dp; ++ int *speedp; ++{ ++ int retcode; ++ unsigned char perf_desc[28]; ++ int write_speed = *speedp * 1385; ++ int val = 0, val2 = 0; ++ int i; ++ ++/* For the moment we just divide the CD speed by 7*/ ++ ++ if(speedp!=NULL) ++ (*speedp)=(*speedp)*8; ++ ++ memset(perf_desc, 0, sizeof(perf_desc)); ++ ++ /* Write Rotation Control = ROTCTL_CLV ++ * | Restore Logical Unit Defaults = 0 ++ * | Exact = 0 ++ * | Random Access = 0) ++ */ ++ perf_desc[0]= ROTCTL_CLV << 3 | 0 << 2 | 0 << 1 | 0; ++ /* Start LBA to 0 */ ++ perf_desc[4] = 0; ++ perf_desc[5] = 0; ++ perf_desc[6] = 0; ++ perf_desc[7] = 0; ++ /* End LBA set to 0 (setting to 0xffffffff failed on my LG burner ++ */ ++ perf_desc[8] = 0; ++ perf_desc[9] = 0; ++ perf_desc[10] = 0; ++ perf_desc[11] = 0; ++ /* Read Speed = 0xFFFF */ ++ perf_desc[12] = 0; ++ perf_desc[13] = 0; ++ perf_desc[14] = 0xFF; ++ perf_desc[15] = 0xFF; ++ /* Read Time = 1s */ ++ perf_desc[18] = 1000 >> 8; ++ perf_desc[19] = 1000 & 0xFF; ++ /* Write Speed */ ++ perf_desc[20] = write_speed >> 24; ++ perf_desc[21] = write_speed >> 16 & 0xFF; ++ perf_desc[22] = write_speed >> 8 & 0xFF; ++ perf_desc[23] = write_speed & 0xFF; ++ /* Write Time = 1s */ ++ perf_desc[26] = 1000 >> 8; ++ perf_desc[27] = 1000 & 0xFF; ++ ++ //retcode = scsi_set_streaming(scgp, NULL, 0); ++ retcode = scsi_set_streaming(scgp, &perf_desc, sizeof(perf_desc)); ++ if (retcode == -1) return retcode; ++ retcode = speed_select_mmc(scgp, dp, speedp); ++ if(speedp!=NULL) ++ (*speedp)=(*speedp)/7; ++ return retcode; ++} ++ ++LOCAL int + next_wr_addr_mmc(scgp, trackp, ap) + SCSI *scgp; + track_t *trackp; +@@ -1898,6 +2194,48 @@ + }; + + LOCAL int ++next_wr_addr_mdvd(scgp, trackp, ap) ++ SCSI *scgp; ++ track_t *trackp; ++ long *ap; ++{ ++ int track; ++ struct track_info track_info; ++ long next_addr; ++ int result = -1; ++ struct disk_info disk_info; ++ if (trackp){ ++ track = trackp->trackno; ++ } ++ ++ if (trackp != 0 && track > 0 && is_packet(trackp)) { ++ scgp->silent++; ++ result = read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info)); ++ scgp->silent--; ++ if (scsi_in_progress(scgp)){ ++ return -1; ++ } ++ ++ } ++ ++ if (result < 0) { ++ /* Get the last rzone*/ ++ if(read_disk_info(scgp,(caddr_t)&disk_info,8)<0) ++ return (-1); ++ ++ if (read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info)) < 0) ++ return (-1); ++ } ++ if (scgp->verbose) ++ scg_prbytes("track info:", (Uchar *)&track_info, ++ sizeof(track_info)-scg_getresid(scgp)); ++ next_addr = a_to_4_byte(track_info.next_writable_addr); ++ if (ap) ++ *ap = next_addr; ++ return (0); ++} ++ ++LOCAL int + open_track_mmc(scgp, dp, trackp) + SCSI *scgp; + cdr_t *dp; +@@ -1978,6 +2316,45 @@ + } + + LOCAL int ++open_track_mdvd(scgp, dp, trackp) ++ SCSI *scgp; ++ cdr_t *dp; ++ track_t *trackp; ++{ ++ Uchar mode[0x100]; ++ int len; ++ struct cd_mode_page_05 *mp; ++ ++ if (is_packet(trackp)) { ++ fillbytes((caddr_t)mode, sizeof(mode), '\0'); ++ ++ if (!get_mode_params(scgp, 0x05, "DVD write parameter", ++ mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) ++ return (-1); ++ if (len == 0) ++ return (-1); ++ ++ mp = (struct cd_mode_page_05 *) ++ (mode + sizeof(struct scsi_mode_header) + ++ ((struct scsi_mode_header *)mode)->blockdesc_len); ++ ++ mp->write_type = WT_PACKET; ++ mp->LS_V = 1; ++ /*For now we set the link size to 0x10(32k) because Pioneer-A03 only support this */ ++ mp->link_size=0x10; ++ mp->fp = 1; ++ i_to_4_byte(mp->packet_size, trackp->pktsize); ++ } else { ++ return 0; ++ } ++ ++ if (!set_mode_params(scgp, "CD write parameter", mode, len, 0, trackp->secsize)) ++ return (-1); ++ ++ return (0); ++} ++ ++LOCAL int + close_track_mmc(scgp, dp, trackp) + SCSI *scgp; + cdr_t *dp; +@@ -2003,6 +2380,30 @@ + return (0); + } + ++LOCAL int ++close_track_mdvd(scgp, dp, trackp) ++ SCSI *scgp; ++ cdr_t *dp; ++ track_t *trackp; ++{ ++ int ret; ++ if (!is_packet(trackp)) ++ return (0); ++ ++ if (scsi_flush_cache(scgp, (dp->cdr_cmdflags&F_IMMED) != 0) < 0) { ++ printf("Trouble flushing the cache\n"); ++ return -1; ++ } ++ wait_unit_ready(scgp, 300); /* XXX Wait for ATAPI */ ++ if (is_packet(trackp) && !is_noclose(trackp)) { ++ /* close the incomplete track */ ++ ret = scsi_close_tr_session(scgp, 1, 0xFF, (dp->cdr_cmdflags&F_IMMED) != 0); ++ wait_unit_ready(scgp, 300); /* XXX Wait for ATAPI */ ++ return (ret); ++ } ++ return (0); ++} ++ + int toc2sess[] = { + SES_DA_ROM, /* CD-DA */ + SES_DA_ROM, /* CD-ROM */ +@@ -2086,6 +2487,80 @@ + } + + LOCAL int ++open_session_mdvd(scgp, dp, trackp) ++ SCSI *scgp; ++ cdr_t *dp; ++ track_t *trackp; ++{ ++ Uchar mode[0x100]; ++ int tracks = trackp->tracks; ++ ++ int len; ++ struct cd_mode_page_05 *mp; ++ Ulong totalsize; ++ int i; ++ struct track_info track_info; ++ ++ fillbytes((caddr_t)mode, sizeof(mode), '\0'); ++ ++ if (!get_mode_params(scgp, 0x05, "DVD write parameter", ++ mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) ++ return (-1); ++ if (len == 0) ++ return (-1); ++ ++ mp = (struct cd_mode_page_05 *) ++ (mode + sizeof(struct scsi_mode_header) + ++ ((struct scsi_mode_header *)mode)->blockdesc_len); ++ if(is_packet(trackp)){ ++ mp->write_type=WT_PACKET; ++ mp->multi_session = (track_base(trackp)->tracktype & TOCF_MULTI) ? MS_MULTI : MS_NONE; ++ mp->fp=0; ++ mp->BUFE=1; ++ mp->track_mode=1; ++ }else{ ++ mp->write_type = WT_SAO; ++ } ++ ++ ++ if (lverbose && dp->cdr_cdcap->BUF != 0) ++ printf("BURN-Free is %s.\n", mp->BUFE?"ON":"OFF"); ++ if (driveropts != NULL) { ++ if ((strcmp(driveropts, "burnproof") == 0 || ++ strcmp(driveropts, "burnfree") == 0) && dp->cdr_cdcap->BUF != 0) { ++ errmsgno(EX_BAD, "Turning BURN-Free on\n"); ++ mp->BUFE = 1; ++ } else if ((strcmp(driveropts, "noburnproof") == 0 || ++ strcmp(driveropts, "noburnfree") == 0)) { ++ errmsgno(EX_BAD, "Turning BURN-Free off\n"); ++ mp->BUFE = 0; ++ } else if (strcmp(driveropts, "help") == 0) { ++ mmc_opthelp(dp, 0); ++ } else { ++ errmsgno(EX_BAD, "Bad driver opts '%s'.\n", driveropts); ++ mmc_opthelp(dp, EX_BAD); ++ } ++ } ++ ++ ++ if (!set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1)) ++ return (-1); ++ ++ ++ totalsize=0; ++ for(i=1;i<=tracks;i++) { ++ totalsize+=trackp[i].tracksecs; ++ } ++ ++ if(!is_packet(trackp)){ ++ /* in DAO mode we need to reserve space for the track*/ ++ if(reserve_track(scgp, totalsize)<0) ++ return (-1); ++ } ++ return (0); ++} ++ ++LOCAL int + waitfix_mmc(scgp, secs) + SCSI *scgp; + int secs; +@@ -2215,6 +2690,25 @@ + return (ret); + } + ++LOCAL int ++fixate_mdvd(scgp, dp, trackp) ++ SCSI *scgp; ++ cdr_t *dp; ++ track_t *trackp; ++{ ++ /*set a really BIG timeout and call fixate_mmc ++ The BIG timeout is needed in case there was a very short rzone to write at the ++ beginning of the disk, because lead-out needs to be at some distance. ++ */ ++ scg_settimeout(scgp, 1000); ++ if(is_packet(trackp)){ ++ scsi_close_tr_session(scgp, 2, 0, FALSE); ++ } ++ fixate_mmc(scgp, dp, trackp); ++ scg_settimeout(scgp, 200); ++ ++} ++ + char *blank_types[] = { + "entire disk", + "PMA, TOC, pregap", +@@ -2453,6 +2947,42 @@ + } + + LOCAL int ++opt1_mdvd(scgp, dp) ++ SCSI *scgp; ++ cdr_t *dp; ++{ ++ int oflags = dp->cdr_dstat->ds_cdrflags; ++ ++ if ((dp->cdr_dstat->ds_cdrflags & RF_AUDIOMASTER) != 0) { ++ printf("Turning Audio Master Q. R. on\n"); ++ if (set_audiomaster_yamaha(scgp, dp, TRUE) < 0) ++ return (-1); ++ if (!debug && lverbose <= 1) ++ dp->cdr_dstat->ds_cdrflags &= ~RF_PRATIP; ++ if (getdisktype_mdvd(scgp, dp) < 0) { ++ dp->cdr_dstat->ds_cdrflags = oflags; ++ return (-1); ++ } ++ dp->cdr_dstat->ds_cdrflags = oflags; ++ if (oflags & RF_PRATIP) { ++ msf_t msf; ++ lba_to_msf(dp->cdr_dstat->ds_first_leadin, &msf); ++ printf("New start of lead in: %ld (%02d:%02d/%02d)\n", ++ (long)dp->cdr_dstat->ds_first_leadin, ++ msf.msf_min, ++ msf.msf_sec, ++ msf.msf_frame); ++ lba_to_msf(dp->cdr_dstat->ds_maxblocks, &msf); ++ printf("New start of lead out: %ld (%02d:%02d/%02d)\n", ++ (long)dp->cdr_dstat->ds_maxblocks, ++ msf.msf_min, ++ msf.msf_sec, ++ msf.msf_frame); ++ } ++ } ++ return (0); ++} ++LOCAL int + scsi_sony_write(scgp, bp, sectaddr, size, blocks, islast) + SCSI *scgp; + caddr_t bp; /* address of buffer */ +diff -u -r -3 cdrtools-2.01/cdrecord/scsi_cdr.c cdrtools-2.01.ossdvd/cdrecord/scsi_cdr.c +--- cdrtools-2.01/cdrecord/scsi_cdr.c 2004-05-25 00:36:01.000000000 +0200 ++++ cdrtools-2.01.ossdvd/cdrecord/scsi_cdr.c 2004-08-27 05:46:33.000000000 +0200 +@@ -107,6 +107,7 @@ + EXPORT int send_cue_sheet __PR((SCSI *scgp, caddr_t bp, long size)); + EXPORT int read_buff_cap __PR((SCSI *scgp, long *, long *)); + EXPORT int scsi_blank __PR((SCSI *scgp, long addr, int blanktype, BOOL immed)); ++EXPORT int scsi_set_streaming __PR((SCSI *scgp, caddr_t addr, int size)); + EXPORT BOOL allow_atapi __PR((SCSI *scgp, BOOL new)); + EXPORT int mode_select __PR((SCSI *scgp, Uchar *, int, int, int)); + EXPORT int mode_sense __PR((SCSI *scgp, Uchar *dp, int cnt, int page, int pcf)); +@@ -519,6 +520,32 @@ + } + + EXPORT int ++scsi_set_streaming(scgp, perf_desc, size) ++ SCSI *scgp; ++ caddr_t perf_desc; ++ int size; ++{ ++ register struct scg_cmd *scmd = scgp->scmd; ++ ++ fillbytes((caddr_t)scmd, sizeof (*scmd), '\0'); ++ scmd->addr = perf_desc; ++ scmd->size = size; ++ scmd->flags = SCG_DISRE_ENA; ++ scmd->cdb_len = SC_G5_CDBLEN; ++ scmd->sense_len = CCS_SENSE_LEN; ++ scmd->cdb.g5_cdb.cmd = 0xB6; ++ scmd->cdb.cmd_cdb[11] = 0; ++ scmd->cdb.cmd_cdb[10] = size; ++ ++ scgp->cmdname = "set streaming"; ++ ++ printf("scsi_set_streaming\n"); ++ if (scg_cmd(scgp) < 0) ++ return (-1); ++ return (0); ++} ++ ++EXPORT int + scsi_set_speed(scgp, readspeed, writespeed, rotctl) + SCSI *scgp; + int readspeed; +@@ -1042,6 +1069,32 @@ + return (0); + } + ++ ++EXPORT int ++reserve_track(scgp, size) ++ SCSI *scgp; ++ Ulong size; ++ ++{ ++ register struct scg_cmd *scmd = scgp->scmd; ++ ++ fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); ++ scmd->flags = SCG_DISRE_ENA; ++ scmd->cdb_len = SC_G1_CDBLEN; ++ scmd->sense_len = CCS_SENSE_LEN; ++ scmd->cdb.g1_cdb.cmd = 0x53; ++ scmd->cdb.g1_cdb.lun = scg_lun(scgp); ++ i_to_4_byte(&scmd->cdb.g1_cdb.addr[3], size); ++ ++ scgp->cmdname = "reserve track"; ++ ++ if (scg_cmd(scgp) < 0) ++ return (-1); ++ ++ return (0); ++ ++} ++ + EXPORT int + read_rzone_info(scgp, bp, cnt) + SCSI *scgp; +diff -u -r -3 cdrtools-2.01/include/utypes.h cdrtools-2.01.ossdvd/include/utypes.h +--- cdrtools-2.01/include/utypes.h 2003-06-15 23:41:23.000000000 +0200 ++++ cdrtools-2.01.ossdvd/include/utypes.h 2004-08-27 07:13:09.076574488 +0200 +@@ -75,6 +75,25 @@ + typedef unsigned char Uchar; + + /* ++ * Added these cause Linux distro's using kernel 2.6.x seems ++ * to want them. ++ */ ++typedef unsigned char u8; ++typedef unsigned short u16; ++typedef unsigned int u32; ++#if defined(__GNUC__) /* this is defined gcc-3.x */ ++typedef unsigned long long u64; ++#endif ++ ++/* ++ * Dodge the __attribute_const__ out of sneaky kernel includes. ++ * cdrtools is a userland program, so no kernel attribute's ++ */ ++#ifndef __attribute_const__ ++# define __attribute_const__ /* unimplemented */ ++#endif ++ ++/* + * This is a definition for a compiler dependant 64 bit type. + * It currently is silently a long if the compiler does not + * support it. Check if this is the right way. +diff -u -r -3 cdrtools-2.01/cdda2wav/interface.c cdrtools-2.01.ossdvd/cdda2wav/interface.c +--- cdrtools-2.01/cdda2wav/interface.c 2004-06-07 11:49:18.000000000 +0200 ++++ cdrtools-2.01.ossdvd/cdda2wav/interface.c 2004-08-27 05:35:20.000000000 +0200 +@@ -44,6 +44,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -79,7 +80,6 @@ + #include "exitcodes.h" + #include "scsi_cmds.h" + +-#include + #include + #include "scsi_scan.h" + +diff -u -r -3 cdrtools-2.01/cdda2wav/ioctl.c cdrtools-2.01.ossdvd/cdda2wav/ioctl.c +--- cdrtools-2.01/cdda2wav/ioctl.c 2003-12-27 17:29:28.000000000 +0100 ++++ cdrtools-2.01.ossdvd/cdda2wav/ioctl.c 2004-08-27 05:37:59.000000000 +0200 +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + #include + +@@ -55,7 +56,6 @@ + #include "global.h" + #include "exitcodes.h" + +-#include + #include + + #if defined (HAVE_IOCTL_INTERFACE) diff --git a/cdrtools.spec b/cdrtools.spec new file mode 100644 index 0000000..2f45b61 --- /dev/null +++ b/cdrtools.spec @@ -0,0 +1,225 @@ +%define cdrecording_group 12 +%define sourcever %(echo %version | cut -da -f1) +Name: cdrtools +Version: 3.01a23 +Release: 1mamba +Summary: Tools for CD/DVD recorders +Group: System/Tools +Vendor: openmamba +Distribution: openmamba +Packager: Silvan Calarco +URL: http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html +Source: ftp://ftp.berlios.de/pub/cdrecord/alpha/cdrtools-%{version}.tar.bz2 +Patch0: %{name}-2.01-CAN-2004-0806.patch +Patch1: %{name}-2.01-warnings.patch +Patch2: http://crashrecovery.org/oss-dvd/cdrtools-2.01a32-ossdvd.patch.bz2 +Patch3: %{name}-2.01-gcc4.patch +Patch4: %{name}-2.01-gcc_static.patch +License: GPL, Common Development and Distribution License +## AUTOBUILDREQ-BEGIN +BuildRequires: bash +BuildRequires: glibc-devel +## AUTOBUILDREQ-END +BuildRequires: libcap-devel +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +%description +Cdrtools supports many features including cdrecord, cdda2wav and mkisofs/mkhybrid in a single source tree. +Cdrecord supports DVD-R and DVD-RW with all known DVD-writers on all UNIX-like OS and on Win32. +DVD writing support is implemented in cdrecord since march 1998. +Cdrecord writes DVD media similar to CD media. + +%package devel +Summary: Development files for cdrtools +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +Cdrtools supports many features including cdrecord, cdda2wav and mkisofs/mkhybrid in a single source tree. +Cdrecord supports DVD-R and DVD-RW with all known DVD-writers on all UNIX-like OS and on Win32. +DVD writing support is implemented in cdrecord since march 1998. +Cdrecord writes DVD media similar to CD media. +This is the development package. + +%prep +%setup -q -n %{name}-%{sourcever} +#%patch0 -p1 -b .CAN-2004-0806 +#%patch1 -p1 -b .warning +#%patch2 -p1 +#%patch3 -p1 -b .gcc4 +#%patch4 -p1 -b .gcc_static + +%build +mandir=%{_mandir} +%make \ + -j1 \ + INS_BASE=%{_prefix} \ + MANDIR=%{_mandir} \ + DEFINSUSR=root \ + DEFINSGRP=cdrecording + +%install +[ "%{buildroot}" != / ] && rm -rf %{buildroot} +%makeinstall \ + INS_BASE=%{_prefix} + +## fix permissions +#chmod 644 %{buildroot}%{_libdir}/*.a + +%clean +[ "%{buildroot}" != / ] && rm -rf %{buildroot} + +%pre +/usr/sbin/groupadd cdrecording -g %{group_cdrecording} 2>/dev/null +: + +%files +%defattr(-,root,root) +%config(noreplace) %{_sysconfdir}/default/cdrecord +%config(noreplace) %{_sysconfdir}/default/rscsi +%{_bindir}/cdda2wav +%attr(4710,root,cdrecording) %{_bindir}/cdrecord +%{_bindir}/devdump +%{_bindir}/isodebug +%{_bindir}/isodump +%{_bindir}/isoinfo +%{_bindir}/isovfy +%{_bindir}/mkhybrid +%{_bindir}/mkisofs +%{_bindir}/btcflash +%{_bindir}/scgskeleton +%{_bindir}/cdda2mp3 +%{_bindir}/cdda2ogg +%{_libdir}/siconv/* +%{_mandir}/man1/* +%{_mandir}/man5/* +%{_mandir}/man8/* +%attr(0750,root,cdrecording) %{_bindir}/readcd +%{_bindir}/scgcheck +#%{_bindir}/skel +%{_sbindir}/rscsi +%{_docdir}/cdda2wav/README +%{_docdir}/cdrecord/README* +%{_docdir}/libparanoia/README.* +%{_docdir}/mkisofs/README* +%doc GPL-2.0.txt LGPL-2.1.txt + +%files devel +%defattr(-,root,root) +%{_includedir}/schily/*.h +%{_includedir}/schily/*-linux-cc/*.h +%{_includedir}/scg/*.h +%{_libdir}/*.a +%{_libdir}/profiled/*.a +%{_docdir}/rscsi/default-rscsi.sample +%doc AN-* Changelog +%doc ABOUT CDDL.Schily.txt +%doc README.linux-shm README.mkisofs + +%changelog +* Sat Mar 08 2014 Automatic Build System 3.01a23-1mamba +- automatic version update by autodist + +* Tue Jan 21 2014 Automatic Build System 3.01a22-1mamba +- automatic version update by autodist + +* Sun Jan 12 2014 Automatic Build System 3.01a21-1mamba +- automatic version update by autodist + +* Tue Dec 31 2013 Automatic Build System 3.01a20-1mamba +- automatic version update by autodist + +* Sat Nov 23 2013 Automatic Build System 3.01a19-1mamba +- automatic version update by autodist + +* Sun Oct 20 2013 Automatic Build System 3.01a18-1mamba +- automatic version update by autodist + +* Tue Aug 06 2013 Automatic Build System 3.01a17-1mamba +- automatic version update by autodist + +* Thu Jul 11 2013 Automatic Build System 3.01a16-1mamba +- automatic version update by autodist + +* Mon Jun 03 2013 Automatic Build System 3.01a15-1mamba +- automatic version update by autodist + +* Mon Apr 22 2013 Automatic Build System 3.01a14-1mamba +- automatic version update by autodist + +* Fri Mar 01 2013 Automatic Build System 3.01a13-1mamba +- automatic version update by autodist + +* Tue Feb 19 2013 Automatic Build System 3.01a12-1mamba +- automatic version update by autodist + +* Sun Jan 13 2013 Automatic Build System 3.01a11-1mamba +- automatic version update by autodist + +* Thu Dec 27 2012 Automatic Build System 3.01a10-1mamba +- automatic version update by autodist + +* Mon Oct 17 2011 Silvan Calarco 3.01a05-2mamba +- set cdrecord suid 4710 root.cdrecording + +* Sun Jun 19 2011 Automatic Build System 3.01a05-1mamba +- automatic update by autodist + +* Fri May 20 2011 Automatic Build System 3.01a04-1mamba +- automatic update by autodist + +* Sun Mar 13 2011 Automatic Build System 3.01a03-1mamba +- automatic update by autodist + +* Mon Dec 27 2010 Automatic Build System 3.01a02-1mamba +- automatic update by autodist + +* Thu Nov 25 2010 Automatic Build System 3.01a01-1mamba +- automatic update by autodist + +* Sun Aug 15 2010 Automatic Build System 2.01.01a80-1mamba +- automatic update by autodist + +* Wed Jun 02 2010 Silvan Calarco 2.01.01a39-1mamba +- set real package version +- use globbing in files lists +- updated license + +* Wed Jun 02 2010 Ercole 'ercolinux' Carpanetto 2.01.01-2mamba +- update to 2.01.01a79 + +* Thu Nov 04 2009 Ercole 'ercolinux' Carpanetto 2.01.01a67 +- update to 2.01.01a67 + +* Thu Dec 06 2007 Silvan Calarco 2.01-6mamba +- removed man page for missing cdda2ogg tool +- removed makefiles and makefiles man pages + +* Mon Nov 26 2007 Silvan Calarco 2.01-5mamba +- revert to previous patchlevel and version (2.01) due to problems in 2.0.1-4mamba + +* Thu Nov 15 2007 Aleph0 2.01-4mamba +- update to 2.01.01a05 +- updated patches from crashrecovery.org + +* Thu Mar 16 2006 Davide Madrisan 2.01-3qilnx +- create the cdrecording group +- added (again?) patch to fix CAN-2004-0806 +- fixed gcc4 compilation errors + +* Mon Feb 07 2005 Silvan Calarco 2.01-2qilnx +- make cdrecord and cdread not suid because of kernel 2.6 behaviour +- added OSS DVD extensions patch from http://crashrecovery.org/oss-dvd.html + +* Tue Sep 14 2004 Davide Madrisan 2.01-1qilnx +- update to version 2.01 by autospec. + fix a local root vulnerability: CAN-2004-0806 + +* Mon Dec 15 2003 Silvan Calarco 2.00.3-3qilnx +- readcd suided + +* Tue Oct 14 2003 Silvan Calarco 2.00.3-2qilnx +- changed group name from cdwriter to cdrecording + +* Thu Jul 10 2003 Silvan Calarco 2.00.3-1qilnx +- first build for cdrtools