Only in cdrtools-1.11-patch/cdrecord: OBJ
diff -u cdrtools-1.11/cdrecord/cdr_drv.c cdrtools-1.11-patch/cdrecord/cdr_drv.c
--- cdrtools-1.11/cdrecord/cdr_drv.c	Sun Oct  7 10:41:52 2001
+++ cdrtools-1.11-patch/cdrecord/cdr_drv.c	Fri Nov 16 07:45:04 2001
@@ -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;
 #ifdef	DRV_DVD
 extern	cdr_t	cdr_dvd;
@@ -83,6 +84,7 @@
 #endif
 	&cdr_cd_dvd,
 	&cdr_mmc,
+	&cdr_mdvd,
 	&cdr_mmc_sony,
 	&cdr_cd,
 	&cdr_oldcd,
diff -u cdrtools-1.11/cdrecord/cdrecord.c cdrtools-1.11-patch/cdrecord/cdrecord.c
--- cdrtools-1.11/cdrecord/cdrecord.c	Tue Nov 13 07:17:25 2001
+++ cdrtools-1.11-patch/cdrecord/cdrecord.c	Fri Nov 16 07:49:00 2001
@@ -431,7 +431,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,
@@ -742,6 +742,15 @@
 		trackno = 0;
 	}
 	scgp->silent--;
+	
+	/* If it is DVD, the information in TOC is fabricated :)
+	 The real information is from read disk info command*/
+	if((ds.ds_disktype&DT_DVD) && (ds.ds_trlast>0)){
+	    trackno=ds.ds_trlast-1;
+	    printf("trackno=%d\n",trackno);
+	}
+
+
 	for (i = 1; i <= tracks; i++) {
 		track[i].trackno = i + trackno;
 	}
@@ -2244,6 +2253,13 @@
 			if (bltype >= 0) {
 				*flagsp |= F_BLANK;
 				*blankp = bltype;
+			}
+			if(ispacket) {
+			        trackp[0].flags |= TI_PACKET;
+				/*XXX This break the packet support for all drivers but dvd.
+				  What else can I do if cdrecord assume that PACKET imply TAO which 
+				  is not true at all???? */
+				trackp[0].flags &= ~TI_TAO;
 			}
 			if (dao) {
 				*flagsp |= F_SAO;
diff -u cdrtools-1.11/cdrecord/cdrecord.h cdrtools-1.11-patch/cdrecord/cdrecord.h
--- cdrtools-1.11/cdrecord/cdrecord.h	Tue Nov 13 07:17:07 2001
+++ cdrtools-1.11-patch/cdrecord/cdrecord.h	Fri Nov 16 07:45:04 2001
@@ -398,6 +398,11 @@
 #define	DSF_ERA		0x0008	/* Disk is erasable			*/
 #define	DSF_DVD		0x0010	/* Disk is a DVD			*/
 
+/*
+ * Definitions for disktype flags
+ */
+#define DT_CD           0x001  /*is a CD                                */
+#define DT_DVD          0x002  /*is a DVD                               */
 
 typedef	struct disk_status	dstat_t;
 
diff -u cdrtools-1.11/cdrecord/drv_mmc.c cdrtools-1.11-patch/cdrecord/drv_mmc.c
--- cdrtools-1.11/cdrecord/drv_mmc.c	Tue Oct 30 15:17:30 2001
+++ cdrtools-1.11-patch/cdrecord/drv_mmc.c	Fri Nov 16 07:57:44 2001
@@ -65,21 +65,31 @@
 LOCAL	void	mmc_opthelp		__PR((cdr_t *dp, int excode));
 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));
+LOCAL	int	check_writemodes_mdvd	__PR((SCSI *scgp, cdr_t *dp));
 LOCAL	int	deflt_writemodes_mmc	__PR((SCSI *scgp));
+LOCAL	int	deflt_writemodes_mdvd	__PR((SCSI *scgp));
 LOCAL	int	get_diskinfo		__PR((SCSI *scgp, struct disk_info *dip));
 LOCAL	void	di_to_dstat		__PR((struct disk_info *dip, dstat_t *dsp));
 #ifdef	PRINT_ATIP
 LOCAL	int	get_pma			__PR((SCSI *scgp));
 #endif
 LOCAL	int	getdisktype_mmc		__PR((SCSI *scgp, cdr_t *dp, dstat_t *dsp));
+LOCAL	int	getdisktype_mdvd	__PR((SCSI *scgp, cdr_t *dp, dstat_t *dsp));
 LOCAL	int	speed_select_mmc	__PR((SCSI *scgp, int *speedp, int dummy));
+LOCAL	int	speed_select_mdvd	__PR((SCSI *scgp, int *speedp, int dummy));
 LOCAL	int	next_wr_addr_mmc	__PR((SCSI *scgp, int track, track_t *trackp, long *ap));
+LOCAL	int	next_wr_addr_mdvd	__PR((SCSI *scgp, int track, track_t *trackp, long *ap));
 LOCAL	int	open_track_mmc		__PR((SCSI *scgp, cdr_t *dp, int track, track_t *trackp));
+LOCAL	int	open_track_mdvd		__PR((SCSI *scgp, cdr_t *dp, int track, track_t *trackp));
 LOCAL	int	close_track_mmc		__PR((SCSI *scgp, int track, track_t *trackp));
+LOCAL	int	close_track_mdvd		__PR((SCSI *scgp, int track, track_t *trackp));
 LOCAL	int	open_session_mmc	__PR((SCSI *scgp, cdr_t *dp, int tracks, track_t *trackp, int toctype, int multi));
+LOCAL	int	open_session_mdvd	__PR((SCSI *scgp, cdr_t *dp, int tracks, track_t *trackp, int toctype, int multi));
 LOCAL	int	waitfix_mmc		__PR((SCSI *scgp, int secs));
 LOCAL	int	fixate_mmc		__PR((SCSI *scgp, int onp, int dummy, int toctype, int tracks, track_t *trackp));
+LOCAL	int	fixate_mdvd		__PR((SCSI *scgp, int onp, int dummy, int toctype, int tracks, track_t *trackp));
 LOCAL	int	blank_mmc		__PR((SCSI *scgp, long addr, int blanktype));
 LOCAL	int	send_opc_mmc		__PR((SCSI *scgp, caddr_t, int cnt, int doopc));
 LOCAL	int	scsi_sony_write		__PR((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast));
@@ -132,6 +142,38 @@
 	send_opc_mmc,
 };
 
+cdr_t   cdr_mdvd = {
+        0, 0,
+        CDR_SWABAUDIO,
+        "mmc_mdvd",
+        "generic SCSI-3/mmc DVD-R(W) driver",
+        0,
+        identify_mmc,
+        attach_mdvd,
+        getdisktype_mdvd,
+        scsi_load,
+/*      mmc_load,*/
+        scsi_unload,
+        read_buff_cap,
+        (int(*)__PR((SCSI *)))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, /* send_cue */
+        open_track_mdvd,
+        close_track_mdvd,
+        open_session_mdvd,
+        cmd_dummy,
+        read_session_offset,
+        fixate_mdvd,
+        blank_mmc,
+        send_opc_mmc,
+};
+
+
 cdr_t	cdr_mmc_sony = {
 	0, 0,
 /*	CDR_TAO|CDR_SAO|CDR_PACKET|CDR_SWABAUDIO,*/
@@ -389,8 +431,9 @@
 	}
 #else
 	if (is_dvd) {
-		errmsgno(EX_BAD,
-		"Found DVD media but DVD-R/DVD-RW support code is missing.\n");
+	  /*	errmsgno(EX_BAD,
+		"Found DVD media but DVD-R/DVD-RW support code is missing.\n"); */
+	  dp = &cdr_mdvd;
 	}
 #endif
 	return (dp);
@@ -403,6 +446,9 @@
 {
 	struct	cd_mode_page_2A *mp;
 
+	Uchar fd[0x100];
+	get_configuration(scgp, fd, 0x100, 0x21);
+
 	allow_atapi(scgp, TRUE);/* Try to switch to 10 byte mode cmds */
 
 	scgp->silent++;
@@ -432,6 +478,43 @@
 	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)
@@ -573,6 +656,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);
+
+	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);
+	scgp->silent--;
+	return (0);
+}
+
+LOCAL int
 deflt_writemodes_mmc(scgp)
 	SCSI	*scgp;
 {
@@ -629,6 +783,54 @@
 	return (0);
 }
 
+LOCAL int
+deflt_writemodes_mdvd(scgp)
+	SCSI	*scgp;
+{
+	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;
+
+	/*
+	 * 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	int	get_atip		__PR((SCSI *scgp, struct atipinfo *atp));
 	void	print_di		__PR((struct disk_info *dip));
@@ -693,6 +895,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;
 }
 
 #ifdef	PRINT_ATIP
@@ -795,6 +1000,30 @@
 #endif	/* PRINT_ATIP */
 
 LOCAL int
+getdisktype_mdvd(scgp, dp, dsp)
+	SCSI	*scgp;
+	cdr_t	*dp;
+	dstat_t	*dsp;
+{
+       int ret;
+
+       struct track_info track_info;
+       if(getdisktype_mmc(scgp, dp, dsp)<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, dsp->ds_trlast, 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, dsp)
 	SCSI	*scgp;
 	cdr_t	*dp;
@@ -1097,6 +1326,26 @@
 }
 
 LOCAL int
+speed_select_mdvd(scgp, speedp, dummy)
+	SCSI	*scgp;
+	int	*speedp;
+	int	dummy;
+{
+  int retcode;
+  /* For the moment we just divide the CD speed by 7*/
+
+  if(speedp!=NULL)
+     (*speedp)=(*speedp)*8;
+  
+  retcode=speed_select_mmc(scgp,speedp,dummy);
+
+  if(speedp!=NULL)
+     (*speedp)=(*speedp)/7;
+   return retcode;
+ 
+}
+
+LOCAL int
 next_wr_addr_mmc(scgp, track, trackp, ap)
 	SCSI	*scgp;
 	int	track;
@@ -1147,6 +1396,46 @@
 };
 
 LOCAL int
+next_wr_addr_mdvd(scgp, track, trackp, ap)
+	SCSI	*scgp;
+	int	track;
+	track_t	*trackp;
+	long	*ap;
+{
+	struct	track_info	track_info;
+	long	next_addr;
+	int	result = -1;
+	struct  disk_info disk_info;
+
+	if (track > 0 && is_packet(trackp)) {
+		scgp->silent++;
+		result = read_rzone_info(scgp, (caddr_t)&track_info, track,
+							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, disk_info.last_track_ls, 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, track, trackp)
 	SCSI	*scgp;
 	cdr_t	*dp;
@@ -1225,6 +1514,47 @@
 }
 
 LOCAL int
+open_track_mdvd(scgp, dp, track, trackp)
+	SCSI	*scgp;
+	cdr_t	*dp;
+	int	track;
+	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, track, trackp)
 	SCSI	*scgp;
 	int	track;
@@ -1249,6 +1579,29 @@
 	return (0);
 }
 
+LOCAL int
+close_track_mdvd(scgp, track, trackp)
+	SCSI	*scgp;
+	int	track;
+	track_t	*trackp;
+{
+	int	ret;
+	if (!is_packet(trackp))
+	     return (0);
+
+	if (scsi_flush_cache(scgp) < 0) {
+	         printf("Trouble flushing the cache\n");
+	         return -1;
+	}
+	if (!is_noclose(trackp)) {
+	        ret = scsi_close_tr_session(scgp, 1, track, FALSE);
+		wait_unit_ready(scgp, 300);
+		return (ret);
+	}
+	
+ 
+}
+
 int	toc2sess[] = {
 	SES_DA_ROM,	/* CD-DA		 */
 	SES_DA_ROM,	/* CD-ROM		 */
@@ -1351,6 +1704,82 @@
 }
 
 LOCAL int
+open_session_mdvd(scgp, dp, tracks, trackp, toctype, multi)
+	SCSI	*scgp;
+	cdr_t	*dp;
+	int	tracks;
+	track_t	*trackp;
+	int	toctype;
+	int	multi;
+{
+	Uchar	mode[0x100];
+
+	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 = (multi != 0) ? 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;
@@ -1376,6 +1805,28 @@
 #undef	W_SLEEP
 }
 
+LOCAL int
+fixate_mdvd(scgp, onp, dummy, toctype, tracks, trackp)
+	SCSI	*scgp;
+	int	onp;
+	int	dummy;
+	int	toctype;
+	int	tracks;
+	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, onp, dummy, toctype, tracks, trackp);
+      scg_settimeout(scgp, 200);
+      
+}
+  
 LOCAL int
 fixate_mmc(scgp, onp, dummy, toctype, tracks, trackp)
 	SCSI	*scgp;
diff -u cdrtools-1.11/cdrecord/scsi_cdr.c cdrtools-1.11-patch/cdrecord/scsi_cdr.c
--- cdrtools-1.11/cdrecord/scsi_cdr.c	Wed Oct 31 10:29:38 2001
+++ cdrtools-1.11-patch/cdrecord/scsi_cdr.c	Fri Nov 16 07:45:04 2001
@@ -82,6 +82,7 @@
 EXPORT	int	write_xg5	__PR((SCSI *scgp, caddr_t, long, long, int));
 EXPORT	int	scsi_flush_cache __PR((SCSI *scgp));
 EXPORT	int	read_buffer	__PR((SCSI *scgp, caddr_t bp, int cnt, int mode));
+EXPORT	int	get_configuration __PR((SCSI *scgp, caddr_t bp, int cnt, int mode));
 EXPORT	int	read_subchannel	__PR((SCSI *scgp, caddr_t bp, int track,
 					int cnt,int msf, int subq, int fmt));
 EXPORT	int	read_toc	__PR((SCSI *scgp, caddr_t, int, int, int, int));
@@ -652,6 +653,32 @@
 }
 
 EXPORT int
+get_configuration(scgp, bp, cnt, sfn)
+	SCSI	*scgp;
+	caddr_t	bp;
+	int	cnt;
+	int	sfn;
+{
+	register struct	scg_cmd	*scmd = scgp->scmd;
+
+	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');
+	scmd->addr = bp;
+	scmd->size = cnt;
+	scmd->dma_read = 1;
+	scmd->cdb_len = SC_G1_CDBLEN;
+	scmd->sense_len = CCS_SENSE_LEN;
+	scmd->cdb.g1_cdb.cmd = 0x46;	/* get configuration */
+	scmd->cdb.g1_cdb.lun = scg_lun(scgp);
+	i_to_2_byte(scmd->cdb.g1_cdb.addr,sfn);
+	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
+	
+	scgp->cmdname = "get configuration";
+
+	return (scg_cmd(scgp));
+}
+
+
+EXPORT int
 read_subchannel(scgp, bp, track, cnt, msf, subq, fmt)
 	SCSI	*scgp;
 	caddr_t	bp;
@@ -844,6 +871,61 @@
 		return (-1);
 	return (0);
 }
+
+read_rzone_info(scgp, bp, track, cnt)
+	SCSI	*scgp;
+	caddr_t	bp;
+	int	track;
+	int	cnt;
+
+{
+	register struct	scg_cmd	*scmd = scgp->scmd;
+
+	fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');
+	scmd->addr = bp;
+	scmd->size = cnt;
+	scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
+	scmd->cdb_len = SC_G1_CDBLEN;
+	scmd->sense_len = CCS_SENSE_LEN;
+	scmd->timeout = 4 * 60;		/* Needs up to 2 minutes */
+	scmd->cdb.g1_cdb.cmd = 0x52;
+	scmd->cdb.g1_cdb.lun = scg_lun(scgp);
+	scmd->cdb.g1_cdb.reladr = 1;	
+	g1_cdbaddr(&scmd->cdb.g1_cdb, track);
+	g1_cdblen(&scmd->cdb.g1_cdb, cnt);
+
+	scgp->cmdname = "read rzone info";
+
+	if (scg_cmd(scgp) < 0)
+		return (-1);
+	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_dvd_structure(scgp, bp, cnt, fmt)
