1032 lines
29 KiB
Diff
1032 lines
29 KiB
Diff
|
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 <assert.h>
|
||
|
#include <schily.h>
|
||
|
#include <device.h>
|
||
|
+#include <utypes.h>
|
||
|
|
||
|
#include <sys/ioctl.h>
|
||
|
#include <statdefs.h>
|
||
|
@@ -79,7 +80,6 @@
|
||
|
#include "exitcodes.h"
|
||
|
#include "scsi_cmds.h"
|
||
|
|
||
|
-#include <utypes.h>
|
||
|
#include <cdrecord.h>
|
||
|
#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 <statdefs.h>
|
||
|
#include <schily.h>
|
||
|
#include <device.h>
|
||
|
+#include <utypes.h>
|
||
|
|
||
|
#include <scg/scsitransp.h>
|
||
|
|
||
|
@@ -55,7 +56,6 @@
|
||
|
#include "global.h"
|
||
|
#include "exitcodes.h"
|
||
|
|
||
|
-#include <utypes.h>
|
||
|
#include <cdrecord.h>
|
||
|
|
||
|
#if defined (HAVE_IOCTL_INTERFACE)
|