]> git.pld-linux.org Git - packages/cdrtools.git/blob - cdrtools-dvd-2.patch
- up to 2.01.01a03; added dvd support
[packages/cdrtools.git] / cdrtools-dvd-2.patch
1 --- cdrtools-2.01/cdrecord/drv_mmc.c.dvd        2004-05-25 00:36:01.000000000 +0200
2 +++ cdrtools-2.01/cdrecord/drv_mmc.c    2004-10-18 14:40:10.329455353 +0200
3 @@ -84,8 +84,11 @@
4  EXPORT char    *hasdrvopt              __PR((char *optstr, char *optname));
5  LOCAL  cdr_t   *identify_mmc           __PR((SCSI *scgp, cdr_t *, struct scsi_inquiry *));
6  LOCAL  int     attach_mmc              __PR((SCSI *scgp, cdr_t *));
7 +LOCAL   int     attach_mdvd             __PR((SCSI *scgp, cdr_t *));
8  EXPORT int     check_writemodes_mmc    __PR((SCSI *scgp, cdr_t *dp));
9 +LOCAL  int     check_writemodes_mdvd   __PR((SCSI *scgp, cdr_t *dp));
10  LOCAL  int     deflt_writemodes_mmc    __PR((SCSI *scgp, BOOL reset_dummy));
11 +LOCAL   int     deflt_writemodes_mdvd   __PR((SCSI *scgp, BOOL reset_dummy));
12  LOCAL  int     get_diskinfo            __PR((SCSI *scgp, struct disk_info *dip));
13  LOCAL  void    di_to_dstat             __PR((struct disk_info *dip, dstat_t *dsp));
14  LOCAL  int     get_atip                __PR((SCSI *scgp, struct atipinfo *atp));
15 @@ -94,18 +97,27 @@
16  #endif
17  LOCAL  int     init_mmc                __PR((SCSI *scgp, cdr_t *dp));
18  LOCAL  int     getdisktype_mmc         __PR((SCSI *scgp, cdr_t *dp));
19 +LOCAL   int     getdisktype_mdvd        __PR((SCSI *scgp, cdr_t *dp));
20  LOCAL  int     speed_select_mmc        __PR((SCSI *scgp, cdr_t *dp, int *speedp));
21 +LOCAL   int     speed_select_mdvd       __PR((SCSI *scgp, cdr_t *dp, int *speedp));
22  LOCAL  int     mmc_set_speed           __PR((SCSI *scgp, int readspeed, int writespeed, int rotctl));
23  LOCAL  int     next_wr_addr_mmc        __PR((SCSI *scgp, track_t *trackp, long *ap));
24 +LOCAL   int     next_wr_addr_mdvd       __PR((SCSI *scgp, track_t *trackp, long *ap));
25  LOCAL  int     write_leadin_mmc        __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
26  LOCAL  int     open_track_mmc          __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
27 +LOCAL   int     open_track_mdvd         __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
28  LOCAL  int     close_track_mmc         __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
29 +LOCAL   int     close_track_mdvd        __PR((SCSI *scgp, cdr_t *dp, track_t *trackp)); 
30  LOCAL  int     open_session_mmc        __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
31 +LOCAL   int     open_session_mdvd       __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
32  LOCAL  int     waitfix_mmc             __PR((SCSI *scgp, int secs));
33  LOCAL  int     fixate_mmc              __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
34 +LOCAL   int     fixate_mdvd             __PR((SCSI *scgp, cdr_t *dp, track_t *trackp));
35  LOCAL  int     blank_mmc               __PR((SCSI *scgp, cdr_t *dp, long addr, int blanktype));
36 +LOCAL  int     format_mdvd             __PR((SCSI *scgp, cdr_t *dp, int formattype));
37  LOCAL  int     send_opc_mmc            __PR((SCSI *scgp, caddr_t, int cnt, int doopc));
38  LOCAL  int     opt1_mmc                __PR((SCSI *scgp, cdr_t *dp));
39 +LOCAL  int     opt1_mdvd               __PR((SCSI *scgp, cdr_t *dp));
40  LOCAL  int     opt2_mmc                __PR((SCSI *scgp, cdr_t *dp));
41  LOCAL  int     scsi_sony_write         __PR((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast));
42  LOCAL  int     gen_cue_mmc             __PR((track_t *trackp, void *vcuep, BOOL needgap));
43 @@ -197,6 +209,47 @@
44         opt2_mmc,
45  };
46  
47 +cdr_t   cdr_mdvd = {
48 +         0, 0,
49 +         CDR_SWABAUDIO,
50 +        CDR_CDRW_ALL,
51 +        370,370,
52 +         "mmc_mdvd",
53 +         "generic SCSI-3/mmc DVD-R(W) driver",
54 +         0,
55 +        (dstat_t *)0,
56 +         identify_mmc,
57 +         attach_mdvd,
58 +        init_mmc,
59 +         getdisktype_mdvd,
60 +         scsi_load,
61 +         scsi_unload,
62 +         read_buff_cap,
63 +         cmd_dummy,                              /* recovery_needed      */
64 +         (int(*)__PR((SCSI *, int)))cmd_dummy,   /* recover              */
65 +         speed_select_mdvd,
66 +         select_secsize,
67 +         next_wr_addr_mdvd,
68 +         (int(*)__PR((SCSI *, Ulong)))cmd_ill,   /* reserve_track        */
69 +         scsi_cdr_write,
70 +         (int(*)__PR((SCSI *scgp, int, track_t *)))cmd_dummy, /* gen_cue */
71 +        (int(*)__PR((SCSI *scgp, cdr_t *, track_t *)))cmd_dummy, /* send_cue */
72 +        write_leadin_mmc,
73 +         open_track_mdvd,
74 +         close_track_mdvd,
75 +         open_session_mdvd,
76 +         cmd_dummy,
77 +        cmd_dummy,                                     /* abort        */
78 +         read_session_offset,
79 +         fixate_mdvd,
80 +        stats_mmc,
81 +         blank_mmc,
82 +        format_mdvd,
83 +         send_opc_mmc,
84 +        opt1_mdvd,
85 +        opt2_mmc,
86 +};
87 +
88  /*
89   * Sony MMC CD-writer
90   */
91 @@ -556,7 +608,21 @@
92         if (profile >= 0) {
93                 if (lverbose)
94                         print_profiles(scgp);
95 -               if (profile == 0 || profile == 0x12 || profile > 0x19) {
96 +               if (profile == 0 || profile >= 0x10 && profile <= 0x15 || profile > 0x19) {
97 +                   /*
98 +                    * 10h DVD-ROM
99 +                    * 11h DVD-R
100 +                    * 12h DVD-RAM
101 +                    * 13h DVD-RW (Restricted overwrite)
102 +                    * 14h DVD-RW (Sequential recording)
103 +                    * 1Ah DVD+RW
104 +                    * 1Bh DVD+R
105 +                    * 
106 +                    */
107 +                   if (profile == 0x11 || profile == 0x13 || profile == 0x14 || profile == 0x1A || profile == 0x1B) {
108 +                       is_dvd = TRUE;
109 +                       dp = &cdr_mdvd;
110 +                   } else {
111                         is_dvd = FALSE;
112                         dp = &cdr_cd;
113  
114 @@ -578,23 +644,8 @@
115                                 errmsgno(EX_BAD,
116                                 "Found unsupported DVD-RAM media.\n");
117                                 return (dp);
118 -                       } else {                        /* DVD+RW DVD+R */
119 -                               errmsgno(EX_BAD,
120 -                               "Found DVD+ media but DVD+R/DVD+RW support code is missing.\n");
121 -                               errmsgno(EX_BAD,
122 -                               "If you need DVD+R/DVD+RW support, ask the Author for cdrecord-ProDVD.\n");
123 -                               errmsgno(EX_BAD,
124 -                               "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n");
125 -                               return (dp);
126                         }
127 -               } else if (profile >= 0x10 && profile < 0x18) {
128 -                       errmsgno(EX_BAD,
129 -                       "Found DVD media but DVD-R/DVD-RW support code is missing.\n");
130 -                       errmsgno(EX_BAD,
131 -                       "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n");
132 -                       errmsgno(EX_BAD,
133 -                       "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n");
134 -                       return (dp);
135 +                   }
136                 }
137         } else {
138                 if (xdebug)
139 @@ -661,13 +712,12 @@
140  #endif
141         }
142         if (is_dvd) {
143 -               errmsgno(EX_BAD,
144 -               "Found DVD media but DVD-R/DVD-RW support code is missing.\n");
145 -               errmsgno(EX_BAD,
146 -               "If you need DVD-R/DVD-RW support, ask the Author for cdrecord-ProDVD.\n");
147 -               errmsgno(EX_BAD,
148 -               "Free test versions and free keys for personal use are at ftp://ftp.berlios.de/pub/cdrecord/ProDVD/\n");
149 +               errmsgno(EX_BAD, 
150 +                 "Found DVD media: using cdr_mdvd.\n");  
151 +                 dp = &cdr_mdvd; 
152         }
153 +       dp->profile = profile;
154 +       dp->is_dvd = is_dvd;
155         return (dp);
156  }
157  
158 @@ -856,6 +906,42 @@
159         return (0);
160  }
161  
162 +LOCAL int
163 +attach_mdvd(scgp, dp)
164 +        SCSI    *scgp;
165 +        cdr_t                   *dp;
166 +{
167 +        struct  cd_mode_page_2A *mp;
168 +       
169 +
170 +        allow_atapi(scgp, TRUE);/* Try to switch to 10 byte mode cmds */
171 +
172 +        scgp->silent++;
173 +        mp = mmc_cap(scgp, NULL);/* Get MMC capabilities in allocated mp */
174 +        scgp->silent--;
175 +        if (mp == NULL)
176 +                return (-1);    /* Pre SCSI-3/mmc drive         */
177 +
178 +        dp->cdr_cdcap = mp;     /* Store MMC cap pointer        */
179 +
180 +        if (mp->loading_type == LT_TRAY)
181 +                dp->cdr_flags |= CDR_TRAYLOAD;
182 +        else if (mp->loading_type == LT_CADDY)
183 +                dp->cdr_flags |= CDR_CADDYLOAD;
184 +
185 +        if (mp->BUF != 0)
186 +                dp->cdr_flags |= CDR_BURNFREE;
187 +
188 +        check_writemodes_mdvd(scgp, dp);
189 +
190 +        if (driveropts != NULL) {
191 +                if (strcmp(driveropts, "help") == 0) {
192 +                        mmc_opthelp(dp, 0);
193 +                }
194 +        }
195 +
196 +        return (0);
197 +}
198  
199  EXPORT int
200  check_writemodes_mmc(scgp, dp)
201 @@ -1007,6 +1093,77 @@
202  }
203  
204  LOCAL int
205 +check_writemodes_mdvd(scgp, dp)
206 +       SCSI    *scgp;
207 +       cdr_t   *dp;
208 +{
209 +       Uchar   mode[0x100];
210 +       int     len;
211 +       struct  cd_mode_page_05 *mp;
212 +
213 +       if (xdebug)
214 +               printf("Checking possible write modes: ");
215 +
216 +       deflt_writemodes_mdvd(scgp, FALSE);
217 +
218 +       fillbytes((caddr_t)mode, sizeof(mode), '\0');
219 +
220 +       scgp->silent++;
221 +       if (!get_mode_params(scgp, 0x05, "CD write parameter",
222 +                       mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) {
223 +               scgp->silent--;
224 +               return (-1);
225 +       }
226 +       if (len == 0) {
227 +               scgp->silent--;
228 +               return (-1);
229 +       }
230 +
231 +       mp = (struct cd_mode_page_05 *)
232 +               (mode + sizeof(struct scsi_mode_header) +
233 +               ((struct scsi_mode_header *)mode)->blockdesc_len);
234 +
235 +       mp->test_write = 0;
236 +
237 +       /*We only check for PACKET and SAO since these are the only supported modes for DVD */
238 +       /*XXX these checks are irrelevant because they are not medium sensitive. ie the device returns 
239 +         error only when it does not support a given mode for ALL mediums. It should check using 
240 +         GET CONFIGURATION command.*/
241 +
242 +       mp->write_type = WT_PACKET;
243 +       mp->fp = 0;
244 +       i_to_4_byte(mp->packet_size, 0);
245 +
246 +       if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) {
247 +               dp->cdr_flags |= CDR_PACKET;
248 +               if (xdebug)
249 +                 printf("PACKET ");
250 +       } else
251 +         dp->cdr_flags &= ~CDR_PACKET;
252 +       mp->fp = 0;
253 +       i_to_4_byte(mp->packet_size, 0);
254 +       mp->track_mode = TM_DATA; 
255 +
256 +
257 +       mp->write_type = WT_SAO;
258 +
259 +       if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) {
260 +               dp->cdr_flags |= CDR_SAO;
261 +               if (xdebug)
262 +                       printf("SAO ");
263 +       } else
264 +               dp->cdr_flags &= ~CDR_SAO;
265 +
266 +
267 +       if (xdebug)
268 +               printf("\n");
269 +
270 +       deflt_writemodes_mdvd(scgp, TRUE);
271 +       scgp->silent--;
272 +       return (0);
273 +}
274 +
275 +LOCAL int
276  deflt_writemodes_mmc(scgp, reset_dummy)
277         SCSI    *scgp;
278         BOOL    reset_dummy;
279 @@ -1080,6 +1237,61 @@
280         return (0);
281  }
282  
283 +LOCAL int
284 +deflt_writemodes_mdvd(scgp, reset_dummy)
285 +       SCSI    *scgp;
286 +       BOOL    reset_dummy;
287 +{
288 +       Uchar   mode[0x100];
289 +       int     len;
290 +       struct  cd_mode_page_05 *mp;
291 +
292 +       fillbytes((caddr_t)mode, sizeof(mode), '\0');
293 +
294 +       scgp->silent++;
295 +       if (!get_mode_params(scgp, 0x05, "DVD write parameter",
296 +                       mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) {
297 +               scgp->silent--;
298 +               return (-1);
299 +       }
300 +       if (len == 0) {
301 +               scgp->silent--;
302 +               return (-1);
303 +       }
304 +
305 +       mp = (struct cd_mode_page_05 *)
306 +               (mode + sizeof(struct scsi_mode_header) +
307 +               ((struct scsi_mode_header *)mode)->blockdesc_len);
308 +
309 +       mp->test_write = 0;
310 +       /*
311 +        * This is the only place where we reset mp->test_write (-dummy)
312 +        */
313 +       if (reset_dummy)
314 +               mp->test_write = 0;
315 +
316 +
317 +       /*
318 +        * Set default values:
319 +        * Write type = 02 (session at once)
320 +        *
321 +        * XXX Note:    the same code appears in check_writemodes_mmc() and
322 +        * XXX          in speed_select_mmc().
323 +        */
324 +       mp->write_type = WT_SAO;
325 +       mp->track_mode = TM_DATA; 
326 +       mp->dbtype = DB_ROM_MODE1;
327 +       mp->session_format = SES_DA_ROM;
328 +
329 +
330 +       if (set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1) < 0) {
331 +               scgp->silent--;
332 +               return (-1);
333 +       }
334 +       scgp->silent--;
335 +       return (0);
336 +}
337 +
338  #ifdef PRINT_ATIP
339  LOCAL  void    print_di                __PR((struct disk_info *dip));
340  LOCAL  void    atip_printspeed         __PR((char *fmt, int speedindex, char speedtab[]));
341 @@ -1149,6 +1361,9 @@
342  
343         if (dsp->ds_last_leadout == 0 && dsp->ds_maxblocks >= 0)
344                 dsp->ds_last_leadout = dsp->ds_maxblocks;
345 +       dsp->ds_trfirst=dip->first_track; 
346 +       dsp->ds_trlast=dip->last_track_ls;
347 +       dsp->ds_trfirst_ls=dip->first_track_ls;
348  }
349  
350  LOCAL int
351 @@ -1259,6 +1474,30 @@
352  }
353  
354  LOCAL int
355 +getdisktype_mdvd(scgp, dp)
356 +       SCSI    *scgp;
357 +       cdr_t   *dp;
358 +{
359 +       int ret=0;
360 +       dstat_t *dsp = dp->cdr_dstat;
361 +
362 +       struct track_info track_info;
363 +       if(getdisktype_mmc(scgp, dp)<0)
364 +        return -1;
365 +
366 +       /* read rzone info to get the space left on disk */
367 +       /*ds_trlast is the last rzone on disk, can be invisible */
368 +       if(read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info))>=0)
369 +         dsp->ds_maxblocks=a_to_u_4_byte(track_info.free_blocks)+a_to_4_byte(track_info.next_writable_addr);
370 +       
371 +       dsp->ds_disktype&= ~DT_CD;
372 +       dsp->ds_disktype|= DT_DVD;
373 +       
374 +       return (ret);
375 +  
376 +}
377 +
378 +LOCAL int
379  getdisktype_mmc(scgp, dp)
380         SCSI    *scgp;
381         cdr_t   *dp;
382 @@ -1688,6 +1927,7 @@
383          * But the standard is rounding the wrong way.
384          * Furtunately rounding down is guaranteed.
385          */
386 +       //val = curspeed*177;
387         val = curspeed*177;
388         if (val > 0xFFFF)
389                 val = 0xFFFF;
390 @@ -1700,6 +1940,7 @@
391  
392         if (scsi_get_speed(scgp, 0, &val) >= 0) {
393                 if (val > 0) {
394 +                       printf("Speed set to %d KB/s\n", val); 
395                         curspeed = val / 176;
396                         *speedp = curspeed;
397                 }
398 @@ -1762,6 +2003,68 @@
399  }
400  
401  LOCAL int
402 +speed_select_mdvd(scgp, dp, speedp)
403 +       SCSI    *scgp;
404 +       cdr_t   *dp;
405 +       int     *speedp;
406 +{
407 +  int retcode;
408 +  unsigned char perf_desc[28];
409 +  int write_speed = *speedp * 1385;
410 +  int val = 0, val2 = 0;
411 +  int i;
412 +   
413 +  /* For the moment we just divide the CD speed by 7*/
414 +
415 +  if(speedp!=NULL)
416 +     (*speedp)=(*speedp)*8;
417 +  
418 +  memset(perf_desc, 0, sizeof(perf_desc));
419 +
420 +  /* Write Rotation Control = ROTCTL_CLV 
421 +   * | Restore Logical Unit Defaults = 0 
422 +   * | Exact = 0 
423 +   * | Random Access = 0) 
424 +   */
425 +  perf_desc[0]= ROTCTL_CLV << 3 | 0 << 2 | 0 << 1 | 0; 
426 +  /* Start LBA to 0 */
427 +  perf_desc[4] = 0;
428 +  perf_desc[5] = 0;
429 +  perf_desc[6] = 0;
430 +  perf_desc[7] = 0;
431 +  /* End LBA set to 0 (setting to 0xffffffff failed on my LG burner
432 +   */
433 +  perf_desc[8] = 0;
434 +  perf_desc[9] = 0;
435 +  perf_desc[10] = 0;
436 +  perf_desc[11] = 0;
437 +  /* Read Speed = 0xFFFF */
438 +  perf_desc[12] = 0;
439 +  perf_desc[13] = 0;
440 +  perf_desc[14] = 0xFF;
441 +  perf_desc[15] = 0xFF;
442 +  /* Read Time = 1s */
443 +  perf_desc[18] = 1000 >> 8;
444 +  perf_desc[19] = 1000 & 0xFF;   
445 +  /* Write Speed */
446 +  perf_desc[20] = write_speed >> 24;
447 +  perf_desc[21] = write_speed >> 16 & 0xFF;
448 +  perf_desc[22] = write_speed >> 8 & 0xFF;
449 +  perf_desc[23] = write_speed & 0xFF;
450 +  /* Write Time = 1s */
451 +  perf_desc[26] = 1000 >> 8;
452 +  perf_desc[27] = 1000 & 0xFF;  
453 +  
454 +  //retcode = scsi_set_streaming(scgp, NULL, 0);
455 +  retcode = scsi_set_streaming(scgp, &perf_desc, sizeof(perf_desc));
456 +  if (retcode == -1) return retcode;
457 +  retcode = speed_select_mmc(scgp, dp, speedp);
458 +  if(speedp!=NULL)
459 +     (*speedp)=(*speedp)/7;
460 +   return retcode;
461 +}
462 +
463 +LOCAL int
464  next_wr_addr_mmc(scgp, trackp, ap)
465         SCSI    *scgp;
466         track_t *trackp;
467 @@ -1898,6 +2201,48 @@
468  };
469  
470  LOCAL int
471 +next_wr_addr_mdvd(scgp, trackp, ap)
472 +       SCSI    *scgp;
473 +       track_t *trackp;
474 +       long    *ap;
475 +{
476 +       int     track;
477 +       struct  track_info      track_info;
478 +       long    next_addr;
479 +       int     result = -1;
480 +       struct  disk_info disk_info;
481 +       if (trackp){
482 +           track = trackp->trackno;
483 +       }
484 +
485 +       if (trackp != 0 && track > 0 && is_packet(trackp)) {
486 +               scgp->silent++;
487 +               result = read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info));
488 +               scgp->silent--;
489 +               if (scsi_in_progress(scgp)){
490 +                 return -1;
491 +               }
492 +               
493 +       }
494 +
495 +       if (result < 0) {
496 +         /* Get the last rzone*/
497 +               if(read_disk_info(scgp,(caddr_t)&disk_info,8)<0)
498 +                 return (-1);
499 +            
500 +               if (read_rzone_info(scgp, (caddr_t)&track_info, sizeof(track_info)) < 0)
501 +               return (-1);
502 +       }
503 +       if (scgp->verbose)
504 +               scg_prbytes("track info:", (Uchar *)&track_info,
505 +                               sizeof(track_info)-scg_getresid(scgp));
506 +       next_addr = a_to_4_byte(track_info.next_writable_addr);
507 +       if (ap)
508 +               *ap = next_addr;
509 +       return (0);
510 +}
511 +
512 +LOCAL int
513  open_track_mmc(scgp, dp, trackp)
514         SCSI    *scgp;
515         cdr_t   *dp;
516 @@ -1978,6 +2323,45 @@
517  }
518  
519  LOCAL int
520 +open_track_mdvd(scgp, dp, trackp)
521 +       SCSI    *scgp;
522 +       cdr_t   *dp;
523 +       track_t *trackp;
524 +{
525 +       Uchar   mode[0x100];
526 +       int     len;
527 +       struct  cd_mode_page_05 *mp;
528 +
529 +       if (is_packet(trackp)) {
530 +              fillbytes((caddr_t)mode, sizeof(mode), '\0');
531 +         
532 +              if (!get_mode_params(scgp, 0x05, "DVD write parameter",
533 +                       mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len))
534 +                     return (-1);
535 +              if (len == 0)
536 +                     return (-1);
537 +
538 +               mp = (struct cd_mode_page_05 *)
539 +                     (mode + sizeof(struct scsi_mode_header) +
540 +                     ((struct scsi_mode_header *)mode)->blockdesc_len);
541 +
542 +               mp->write_type = WT_PACKET;
543 +               mp->LS_V = 1;
544 +               /*For now we set the link size to 0x10(32k) because Pioneer-A03 only support this */
545 +               mp->link_size=0x10;
546 +               mp->fp = 1;
547 +               i_to_4_byte(mp->packet_size, trackp->pktsize);
548 +       } else {
549 +            return 0;
550 +       }
551
552 +       if (!set_mode_params(scgp, "CD write parameter", mode, len, 0, trackp->secsize))
553 +               return (-1);
554 +
555 +       return (0);
556 +}
557 +
558 +LOCAL int
559  close_track_mmc(scgp, dp, trackp)
560         SCSI    *scgp;
561         cdr_t   *dp;
562 @@ -2003,6 +2387,30 @@
563         return (0);
564  }
565  
566 +LOCAL int
567 +close_track_mdvd(scgp, dp, trackp)
568 +       SCSI    *scgp;
569 +       cdr_t   *dp;
570 +       track_t *trackp;
571 +{
572 +       int     ret;
573 +       if (!is_packet(trackp))
574 +            return (0);
575 +
576 +       if (scsi_flush_cache(scgp, (dp->cdr_cmdflags&F_IMMED) != 0) < 0) {
577 +               printf("Trouble flushing the cache\n");
578 +               return -1;
579 +       }
580 +       wait_unit_ready(scgp, 300);             /* XXX Wait for ATAPI */
581 +       if (is_packet(trackp) && !is_noclose(trackp)) {
582 +                       /* close the incomplete track */
583 +               ret = scsi_close_tr_session(scgp, 1, 0xFF, (dp->cdr_cmdflags&F_IMMED) != 0);
584 +               wait_unit_ready(scgp, 300);     /* XXX Wait for ATAPI */
585 +               return (ret);
586 +       }
587 +       return (0);
588 +}
589 +
590  int    toc2sess[] = {
591         SES_DA_ROM,     /* CD-DA                 */
592         SES_DA_ROM,     /* CD-ROM                */
593 @@ -2086,6 +2494,82 @@
594  }
595  
596  LOCAL int
597 +open_session_mdvd(scgp, dp, trackp)
598 +       SCSI    *scgp;
599 +       cdr_t   *dp;
600 +       track_t *trackp;
601 +{
602 +       Uchar   mode[0x100];
603 +       int     tracks = trackp->tracks;
604 +
605 +       int     len;
606 +       struct  cd_mode_page_05 *mp;
607 +       Ulong totalsize;
608 +       int i;
609 +       struct  track_info      track_info;
610 +       int profile;
611 +
612 +       fillbytes((caddr_t)mode, sizeof(mode), '\0');
613 +
614 +       if (!get_mode_params(scgp, 0x05, "DVD write parameter",
615 +                       mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len))
616 +               return (-1);
617 +       if (len == 0)
618 +               return (-1);
619 +
620 +       mp = (struct cd_mode_page_05 *)
621 +               (mode + sizeof(struct scsi_mode_header) +
622 +               ((struct scsi_mode_header *)mode)->blockdesc_len);
623 +       if(is_packet(trackp)){
624 +         mp->write_type=WT_PACKET;
625 +         mp->multi_session = (track_base(trackp)->tracktype & TOCF_MULTI) ? MS_MULTI : MS_NONE;
626 +         mp->fp=0;
627 +         mp->BUFE=1;
628 +         mp->track_mode=1;
629 +       }else{
630 +         mp->write_type = WT_SAO; 
631 +       }
632 +
633 +       
634 +       if (lverbose && dp->cdr_cdcap->BUF != 0)
635 +               printf("BURN-Free is %s.\n", mp->BUFE?"ON":"OFF");
636 +       if (driveropts != NULL) {
637 +               if ((strcmp(driveropts, "burnproof") == 0 ||
638 +                   strcmp(driveropts, "burnfree") == 0) && dp->cdr_cdcap->BUF != 0) {
639 +                       errmsgno(EX_BAD, "Turning BURN-Free on\n");
640 +                       mp->BUFE = 1;
641 +               } else if ((strcmp(driveropts, "noburnproof") == 0 ||
642 +                          strcmp(driveropts, "noburnfree") == 0)) {
643 +                       errmsgno(EX_BAD, "Turning BURN-Free off\n");
644 +                       mp->BUFE = 0;
645 +               } else if (strcmp(driveropts, "help") == 0) {
646 +                       mmc_opthelp(dp, 0);
647 +               } else {
648 +                       errmsgno(EX_BAD, "Bad driver opts '%s'.\n", driveropts);
649 +                       mmc_opthelp(dp, EX_BAD);
650 +               }
651 +       }
652 +
653 +
654 +       if (!set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1))
655 +               return (-1);
656 +
657 +               
658 +       totalsize=0;
659 +       for(i=1;i<=tracks;i++) {
660 +         totalsize+=trackp[i].tracksecs;
661 +       }
662 +       
663 +       profile = get_curprofile(scgp);
664 +       if(!is_packet(trackp) && profile != 0x1A){
665 +         /* in DAO mode we need to reserve space for the track*/
666 +         if(reserve_track(scgp, totalsize)<0)
667 +           return (-1);
668 +         }
669 +       return (0);
670 +}
671 +
672 +LOCAL int
673  waitfix_mmc(scgp, secs)
674         SCSI    *scgp;
675         int     secs;
676 @@ -2215,6 +2699,25 @@
677         return (ret);
678  }
679  
680 +LOCAL int
681 +fixate_mdvd(scgp, dp, trackp)
682 +       SCSI    *scgp;
683 +       cdr_t   *dp;
684 +       track_t *trackp;
685 +{
686 +      /*set a really BIG timeout and call fixate_mmc
687 +        The BIG timeout is needed in case there was a very short rzone to write at the 
688 +        beginning of the disk, because lead-out needs to be at some distance.
689 +      */
690 +      scg_settimeout(scgp, 1000);
691 +      if(is_packet(trackp)){
692 +         scsi_close_tr_session(scgp, 2, 0, FALSE);
693 +      }
694 +      fixate_mmc(scgp, dp, trackp);
695 +      scg_settimeout(scgp, 200);
696 +      
697 +}
698 +
699  char   *blank_types[] = {
700         "entire disk",
701         "PMA, TOC, pregap",
702 @@ -2226,6 +2729,12 @@
703         "reserved blanking type",
704  };
705  
706 +char   *format_types[] = {
707 +       "full format",
708 +       "background format",
709 +       "forced format",
710 +};
711 +
712  LOCAL int
713  blank_mmc(scgp, dp, addr, blanktype)
714         SCSI    *scgp;
715 @@ -2238,11 +2747,17 @@
716         BOOL    cdrrw    = FALSE;       /* Read CD-RW   */
717         BOOL    cdwrw    = FALSE;       /* Write CD-RW  */
718         int     ret;
719 +       int     profile;
720  
721         mmc_check(scgp, &cdrr, &cdwr, &cdrrw, &cdwrw, NULL, NULL);
722         if (!cdwrw)
723                 return (blank_dummy(scgp, dp, addr, blanktype));
724  
725 +       profile = get_curprofile(scgp);
726 +       if (profile == 0x1A) {
727 +               printf("Error: this media does not support blanking, ignoring.\n");
728 +               return (blank_dummy(scgp, dp, addr, blanktype));
729 +       }
730         if (lverbose) {
731                 printf("Blanking %s\n", blank_types[blanktype & 0x07]);
732                 flush();
733 @@ -2258,6 +2773,80 @@
734  }
735  
736  LOCAL int
737 +format_mdvd(scgp, dp, formattype)
738 +       SCSI    *scgp;
739 +       cdr_t   *dp;
740 +       int     formattype;
741 +{
742 +extern char    *buf;
743 +       BOOL    dvdwr    = FALSE;       /* Write DVD    */
744 +       int     ret;
745 +       int     profile;
746 +       char    addr[12];
747 +       struct disk_info *dip;
748 +
749 +       printf("format_mdvd\n");
750 +       mmc_check(scgp, NULL, NULL, NULL, NULL, NULL, &dvdwr);
751 +       if (!dvdwr)
752 +               return (format_dummy(scgp, dp, formattype));
753 +
754 +       printf("format_mdvd: drive is a dvd burner.\n");
755 +       profile = get_curprofile(scgp);
756 +       if (profile != 0x1A) {
757 +               printf("Error: only support DVD+RW formating, ignoring.\n");
758 +               return (format_dummy(scgp, dp, formattype));
759 +       }
760 +       printf("format_mdvd: media is a DVD+RW.\n");
761 +       dip = (struct disk_info *)buf;
762 +       if (get_diskinfo(scgp, dip) < 0)
763 +               return ret;
764 +       
765 +       if (dip->disk_status & 3 && formattype != FORCE_FORMAT) {
766 +               printf("Error: disk already formated, ignoring.\n");
767 +               return ret;
768 +        }
769 +       addr[0] = 0;           // "Reserved"
770 +       addr[1] = 2;           // "IMMED" flag
771 +       addr[2] = 0;           // "Descriptor Length" (MSB)
772 +       addr[3] = 8;           // "Descriptor Length" (LSB)
773 +       addr[4+0] = 0xff;
774 +       addr[4+1] = 0xff;
775 +       addr[4+2] = 0xff;
776 +       addr[4+3] = 0xff;
777 +       addr[4+4] = 0x26<<2;
778 +       addr[4+5] = 0;
779 +       addr[4+6] = 0;
780 +       addr[4+7] = 0;
781 +       if (formattype == FORCE_FORMAT) {
782 +           printf("format_mdvd: forcing reformat.\n"); 
783 +           formattype = FULL_FORMAT;
784 +           addr[4+0] = 0;
785 +           addr[4+1] = 0;
786 +           addr[4+2] = 0;
787 +           addr[4+3] = 0;
788 +           addr[4+7] = 1;
789 +       } else {
790 +           printf("format_mdvd: media is unformated.\n"); 
791 +       }
792 +
793 +       if (lverbose) {
794 +               printf("Formating %s\n", format_types[formattype & 0x07]);
795 +               flush();
796 +       }
797 +       if (formattype == FULL_FORMAT) {
798 +           ret = scsi_format(scgp, &addr, sizeof(addr), FALSE);
799 +       } else {
800 +           ret = scsi_format(scgp, &addr, sizeof(addr), TRUE);
801 +       }
802 +       if (ret < 0)
803 +               return (ret);
804 +
805 +       wait_unit_ready(scgp, 90*60/curspeed);  /* XXX Wait for ATAPI */
806 +       waitfix_mmc(scgp, 90*60/curspeed);      /* XXX Wait for ATAPI */
807 +       return (ret);
808 +}
809 +
810 +LOCAL int
811  send_opc_mmc(scgp, bp, cnt, doopc)
812         SCSI    *scgp;
813         caddr_t bp;
814 @@ -2453,6 +3042,42 @@
815  }
816  
817  LOCAL int
818 +opt1_mdvd(scgp, dp)
819 +       SCSI    *scgp;
820 +       cdr_t   *dp;
821 +{
822 +       int     oflags = dp->cdr_dstat->ds_cdrflags;
823 +
824 +       if ((dp->cdr_dstat->ds_cdrflags & RF_AUDIOMASTER) != 0) {
825 +               printf("Turning Audio Master Q. R. on\n");
826 +               if (set_audiomaster_yamaha(scgp, dp, TRUE) < 0)
827 +                       return (-1);
828 +               if (!debug && lverbose <= 1)
829 +                       dp->cdr_dstat->ds_cdrflags &= ~RF_PRATIP;
830 +               if (getdisktype_mdvd(scgp, dp) < 0) {
831 +                       dp->cdr_dstat->ds_cdrflags = oflags;
832 +                       return (-1);
833 +               }
834 +               dp->cdr_dstat->ds_cdrflags = oflags;
835 +               if (oflags & RF_PRATIP) {
836 +                       msf_t   msf;
837 +                       lba_to_msf(dp->cdr_dstat->ds_first_leadin, &msf);
838 +                       printf("New start of lead in: %ld (%02d:%02d/%02d)\n",
839 +                               (long)dp->cdr_dstat->ds_first_leadin,
840 +                               msf.msf_min,
841 +                               msf.msf_sec,
842 +                               msf.msf_frame);
843 +                       lba_to_msf(dp->cdr_dstat->ds_maxblocks, &msf);
844 +                       printf("New start of lead out: %ld (%02d:%02d/%02d)\n",
845 +                               (long)dp->cdr_dstat->ds_maxblocks,
846 +                               msf.msf_min,
847 +                               msf.msf_sec,
848 +                               msf.msf_frame);
849 +               }
850 +       }
851 +       return (0);
852 +}
853 +LOCAL int
854  scsi_sony_write(scgp, bp, sectaddr, size, blocks, islast)
855         SCSI    *scgp;
856         caddr_t bp;             /* address of buffer */
857 --- cdrtools-2.01/cdrecord/cdr_drv.c.dvd        2004-03-02 02:06:26.000000000 +0100
858 +++ cdrtools-2.01/cdrecord/cdr_drv.c    2004-10-18 14:37:32.427251472 +0200
859 @@ -42,6 +42,7 @@
860  extern cdr_t   cdr_oldcd;
861  extern cdr_t   cdr_cd;
862  extern cdr_t   cdr_mmc;
863 +extern  cdr_t   cdr_mdvd;
864  extern cdr_t   cdr_mmc_sony;
865  extern cdr_t   cdr_cd_dvd;
866  extern cdr_t   cdr_philips_cdd521O;
867 @@ -80,6 +81,7 @@
868  cdr_t  *drivers[] = {
869         &cdr_cd_dvd,
870         &cdr_mmc,
871 +        &cdr_mdvd,
872         &cdr_mmc_sony,
873         &cdr_cd,
874         &cdr_oldcd,
875 --- cdrtools-2.01/cdrecord/cdrecord.h.dvd       2004-05-25 00:36:01.000000000 +0200
876 +++ cdrtools-2.01/cdrecord/cdrecord.h   2004-10-18 14:37:32.428251328 +0200
877 @@ -460,6 +460,13 @@
878  #define        BLANK_SESSION   0x06    /* Erase the last session                 */
879  
880  /*
881 + * Defines for formating DVD (custom values)
882 + */
883 +#define        FULL_FORMAT       0x00    /* Interactive format  */
884 +#define        BACKGROUND_FORMAT 0x01    /* Background format   */
885 +#define        FORCE_FORMAT      0x02    /* Force reformat      */
886 +
887 +/*
888   * Useful definitions for audio tracks
889   */
890  #define        msample         (44100 * 2)             /* one 16bit audio sample */
891 @@ -570,6 +577,12 @@
892  #define        DSF_NEED_FORMAT 0x0800  /* Disk needs to be formatted           */
893  
894  /*
895 + * Definitions for disktype flags
896 + */
897 +#define DT_CD           0x001  /*is a CD                                */
898 +#define DT_DVD          0x002  /*is a DVD                               */
899 +
900 +/*
901   * Definitions for disk_status disk type
902   * used in "ds_type".
903   */
904 @@ -709,6 +722,8 @@
905         int     (*cdr_opc)              __PR((SCSI *scgp, caddr_t bp, int cnt, int doopc));     /* Do OPC */
906         int     (*cdr_opt1)             __PR((SCSI *scgp, cdr_t *));                    /* do early option processing*/
907         int     (*cdr_opt2)             __PR((SCSI *scgp, cdr_t *));                    /* do late option processing */
908 +       int     profile;
909 +       BOOL    is_dvd;
910  };
911  #endif
912  
913 --- cdrtools-2.01/cdrecord/cdrecord.c.dvd       2004-09-08 19:26:35.000000000 +0200
914 +++ cdrtools-2.01/cdrecord/cdrecord.c   2004-10-18 14:37:32.436250174 +0200
915 @@ -180,6 +180,7 @@
916  LOCAL  void    susage          __PR((int));
917  LOCAL  void    usage           __PR((int));
918  LOCAL  void    blusage         __PR((int));
919 +LOCAL  void    formattypeusage __PR((int));
920  LOCAL  void    intr            __PR((int sig));
921  LOCAL  void    catchsig        __PR((int sig));
922  LOCAL  int     scsi_cb         __PR((void *arg));
923 @@ -216,9 +217,9 @@
924  LOCAL  BOOL    checkdsize      __PR((SCSI *scgp, cdr_t *dp,
925                                         long tsize, int flags));
926  LOCAL  void    raise_fdlim     __PR((void));
927 -LOCAL  void    gargs           __PR((int, char **, int *, track_t *, char **,
928 +LOCAL  int     gargs           __PR((int, char **, int *, track_t *, char **,
929                                         int *, cdr_t **,
930 -                                       int *, long *, int *));
931 +                                       int *, long *, int *, int *));
932  LOCAL  void    set_trsizes     __PR((cdr_t *, int, track_t *));
933  EXPORT void    load_media      __PR((SCSI *scgp, cdr_t *, BOOL));
934  EXPORT void    unload_media    __PR((SCSI *scgp, cdr_t *, int));
935 @@ -238,6 +239,7 @@
936  LOCAL  void    wait_input      __PR((void));
937  LOCAL  void    checkgui        __PR((void));
938  LOCAL  int     getbltype       __PR((char *optstr, long *typep));
939 +LOCAL  int     getformattype   __PR((char *optstr, long *typep));
940  LOCAL  void    print_drflags   __PR((cdr_t *dp));
941  LOCAL  void    print_wrmodes   __PR((cdr_t *dp));
942  LOCAL  BOOL    check_wrmode    __PR((cdr_t *dp, int wmode, int tflags));
943 @@ -262,6 +264,7 @@
944         int     speed = -1;
945         long    flags = 0L;
946         int     blanktype = 0;
947 +       int     formattype = 0;
948         int     i;
949         int     tracks = 0;
950         int     trackno;
951 @@ -273,6 +276,9 @@
952         SCSI    *scgp = NULL;
953         char    errstr[80];
954         BOOL    gracedone = FALSE;
955 +       int     ispacket;
956 +       BOOL    is_cdwr = FALSE;
957 +       BOOL    is_dvdwr = FALSE;
958  
959  #ifdef __EMX__
960         /* This gives wildcard expansion with Non-Posix shells with EMX */
961 @@ -287,8 +293,8 @@
962                 track[i].track = track[i].trackno = i;
963         track[0].tracktype = TOC_MASK;
964         raise_fdlim();
965 -       gargs(ac, av, &tracks, track, &dev, &timeout, &dp, &speed, &flags,
966 -                                                       &blanktype);
967 +       ispacket = gargs(ac, av, &tracks, track, &dev, &timeout, &dp, &speed, &flags,
968 +                                                       &blanktype, &formattype);
969         if ((track[0].tracktype & TOC_MASK) == TOC_MASK)
970                 comerrno(EX_BAD, "Internal error: Bad TOC type.\n");
971  
972 @@ -349,11 +355,15 @@
973  #      define  CLONE_TITLE     ""
974  #endif
975         if ((flags & F_MSINFO) == 0 || lverbose || flags & F_VERSION) {
976 -               printf("Cdrecord%s%s %s (%s-%s-%s) Copyright (C) 1995-2005 Jörg Schilling\n",
977 +               printf("Cdrecord%s%s %s-dvd (%s-%s-%s) Copyright (C) 1995-2005 Jörg Schilling\n",
978                                                                 PRODVD_TITLE,
979                                                                 CLONE_TITLE,
980                                                                 cdr_version,
981                                                                 HOST_CPU, HOST_VENDOR, HOST_OS);
982 +               printf("Note: This version is an unofficial (modified) version with DVD support\n");
983 +                printf("Note: and therefore may have bugs that are not present in the original.\n");
984 +                printf("Note: Please send bug reports or support requests to <warly@mandrakesoft.com>.\n");           
985 +                printf("Note: The author of cdrecord should not be bothered with problems in this version.\n");
986  
987  #if    defined(SOURCE_MODIFIED) || !defined(IS_SCHILY_XCONFIG)
988  #define        INSERT_YOUR_EMAIL_ADDRESS_HERE
989 @@ -483,11 +493,16 @@
990          */
991         if ((scgp = scg_open(dev, errstr, sizeof (errstr),
992                                 debug, (flags & F_MSINFO) == 0 || lverbose)) == (SCSI *)0) {
993 +               if (dev != NULL || (flags & F_SCANBUS) == 0 || (scgp = scg_open("ATA", errstr, sizeof (errstr),
994 +                               debug, (flags & F_MSINFO) == 0 || lverbose)) == (SCSI *)0) {
995                         errmsg("%s%sCannot open SCSI driver.\n", errstr, errstr[0]?". ":"");
996                         errmsgno(EX_BAD, "For possible targets try 'cdrecord -scanbus'.%s\n",
997                                                 geteuid() ? " Make sure you are root.":"");
998                         errmsgno(EX_BAD, "For possible transport specifiers try 'cdrecord dev=help'.\n");
999                         exit(EX_BAD);
1000 +               } else {
1001 +                       dev = "ATA";
1002 +               }
1003         }
1004         /*
1005          * XXX Below this point we do not need root privilleges anymore.
1006 @@ -619,6 +634,17 @@
1007         } else if (!is_unknown_dev(scgp) && dp != get_cdrcmds(scgp)) {
1008                 errmsgno(EX_BAD, "WARNING: Trying to use other driver on known device.\n");
1009         }
1010 +        is_mmc(scgp, &is_cdwr, &is_dvdwr);
1011 +        if (ispacket) {
1012 +           if (is_dvdwr) {
1013 +               track[0].flags |= TI_PACKET; 
1014 +               /*XXX put here to only affect DVD writing, should be in gargs.
1015 +                * however if set in args for all mode, packet writing is then
1016 +                * broken for all disc as cdrecord assume that PACKET imply TAO which  
1017 +                * is not true at all???? */ 
1018 +               track[0].flags &= ~TI_TAO;
1019 +           }
1020 +       }
1021  
1022         if (!is_cddrive(scgp))
1023                 comerrno(EX_BAD, "Sorry, no CD/DVD-Drive found on this target.\n");
1024 @@ -649,8 +675,6 @@
1025             tracks > 0 ||
1026             cuefilename != NULL) {
1027  
1028 -               BOOL    is_cdwr = FALSE;
1029 -               BOOL    is_dvdwr = FALSE;
1030  
1031                 if ((dp->cdr_flags & CDR_ISREADER) != 0) {
1032                         errmsgno(EX_BAD,
1033 @@ -660,7 +684,7 @@
1034                 if (!is_mmc(scgp, &is_cdwr, &is_dvdwr))
1035                         is_cdwr = TRUE;                 /* If it is not MMC, it must be a CD writer */
1036  
1037 -               if (is_dvdwr && !set_cdrcmds("mmc_dvd", (cdr_t **)NULL)) {
1038 +               if (is_dvdwr && !set_cdrcmds("mmc_mdvd", (cdr_t **)NULL)) {
1039                         errmsgno(EX_BAD,
1040                         "This version of cdrecord does not include DVD-R/DVD-RW support code.\n");
1041                         errmsgno(EX_BAD,
1042 @@ -965,11 +989,6 @@
1043                 print_toc(scgp, dp);
1044                 comexit(0);
1045         }
1046 -       if ((flags & F_FORMAT) != 0) {
1047 -               errmsgno(EX_BAD, "Format option not implemented in this version.\n");
1048 -               comexit(EX_BAD);
1049 -       }
1050 -
1051  #ifdef XXX
1052         if ((*dp->cdr_check_session)() < 0) {
1053                 comexit(EX_BAD);
1054 @@ -1181,7 +1200,39 @@
1055         if (gettimeofday(&starttime, (struct timezone *)0) < 0)
1056                 errmsg("Cannot get start time\n");
1057  
1058 -       /*
1059 +       if (flags & F_FORMAT) {
1060 +               printf("cdrecord: media format asked\n");
1061 +               /*
1062 +                * Do not abort if OPC failes. Just give it a chance
1063 +                * for better laser power calibration than without OPC.
1064 +                *
1065 +                * Ricoh drives return with a vendor unique sense code.
1066 +                * This is most likely because they refuse to do OPC
1067 +                * on a non blank media.
1068 +                */
1069 +               scgp->silent++;
1070 +               do_opc(scgp, dp, flags);
1071 +               scgp->silent--;
1072 +               wait_unit_ready(scgp, 120);
1073 +               if (gettimeofday(&starttime, (struct timezone *)0) < 0)
1074 +                       errmsg("Cannot get start time\n");
1075 +
1076 +               if ((*dp->cdr_format)(scgp, dp, formattype) < 0) {
1077 +                       errmsgno(EX_BAD, "Cannot format disk, aborting.\n");
1078 +                       comexit(EX_BAD);
1079 +               }
1080 +               if (gettimeofday(&fixtime, (struct timezone *)0) < 0)
1081 +                       errmsg("Cannot get format time\n");
1082 +               if (lverbose)
1083 +                       prtimediff("Formatting time: ", &starttime, &fixtime);
1084 +
1085 +               if (!wait_unit_ready(scgp, 240) || tracks == 0) {
1086 +                       comexit(0);
1087 +               }
1088 +               if (gettimeofday(&starttime, (struct timezone *)0) < 0)
1089 +                       errmsg("Cannot get start time\n");
1090 +       }       
1091 +        /*
1092          * Blank the media if we were requested to do so
1093          */
1094         if (flags & F_BLANK) {
1095 @@ -1238,6 +1289,14 @@
1096                 trackno = 0;
1097         }
1098         scgp->silent--;
1099 +       
1100 +       /* If it is DVD, the information in TOC is fabricated :)
1101 +        The real information is from read disk info command*/
1102 +       if((dp->cdr_dstat->ds_disktype&DT_DVD) && (dp->cdr_dstat->ds_trlast>0)){
1103 +           trackno=dp->cdr_dstat->ds_trlast-1;
1104 +           printf("trackno=%d\n",trackno);
1105 +       }
1106 +
1107         if ((tracks + trackno) > MAX_TRACK) {
1108                 /*
1109                  * XXX How many tracks are allowed on a DVD?
1110 @@ -1422,8 +1481,8 @@
1111         if (gracetime > 999)
1112                 gracetime = 999;
1113  
1114 -       printf("Starting to write CD/DVD at speed %d in %s%s %s mode for %s session.\n",
1115 -               (int)dp->cdr_dstat->ds_wspeed,
1116 +       printf("Starting to write CD/DVD at speed %5.1f in %s%s %s mode for %s session.\n",
1117 +               (float)dp->cdr_dstat->ds_wspeed,
1118                 (dp->cdr_cmdflags & F_DUMMY) ? "dummy" : "real",
1119                 (dp->cdr_cmdflags & F_FORCE) ? " force" : "",
1120                 wm2name[dp->cdr_dstat->ds_wrmode],
1121 @@ -1539,6 +1598,7 @@
1122                         (tlast.tv_sec * 1.0 + tlast.tv_usec * 0.000001);
1123                 if (fspeed > 999.0)
1124                         fspeed = 999.0;
1125 +               if (dp->is_dvd) fspeed /= 9;
1126                 printf("Average write speed %5.1fx.\n", fspeed);
1127         }
1128  
1129 @@ -1593,7 +1653,7 @@
1130         error("\t-checkdrive    check if a driver for the drive is present\n");
1131         error("\t-prcap         print drive capabilities for MMC compliant drives\n");
1132         error("\t-inq           do an inquiry for the drive and exit\n");
1133 -       error("\t-scanbus       scan the SCSI bus and exit\n");
1134 +       error("\t-scanbus       scan the SCSI and IDE buses and exit\n");
1135         error("\t-reset         reset the SCSI bus with the cdrecorder (if possible)\n");
1136         error("\t-abort         send an abort sequence to the drive (may help if hung)\n");
1137         error("\t-overburn      allow to write more than the official size of a medium\n");
1138 @@ -1601,7 +1661,8 @@
1139         error("\t-useinfo       use *.inf files to overwrite audio options.\n");
1140         error("\tspeed=#                set speed of drive\n");
1141         error("\tblank=type     blank a CD-RW disc (see blank=help)\n");
1142 -       error("\t-format                format a CD-RW/DVD-RW/DVD+RW disc\n");
1143 +       error("\tformat         format a CD-RW/DVD-RW/DVD+RW disc\n");
1144 +       error("\tformattype=#   select the format method for DVD+RW disc\n");
1145  #ifdef FIFO
1146         error("\tfs=#           Set fifo size to # (0 to disable, default is %ld MB)\n",
1147                                                         DEFAULT_FIFOSIZE/(1024L*1024L));
1148 @@ -1687,6 +1748,18 @@
1149         /* NOTREACHED */
1150  }
1151  
1152 +LOCAL void
1153 +formattypeusage(ret)
1154 +       int     ret;
1155 +{
1156 +       error("Formating options:\n");
1157 +       error("\tfull\t\tstandard formating\n");
1158 +       error("\tbackground\t\tbackground formating\n");
1159 +       error("\tforce\t\tforce reformat\n");
1160 +
1161 +       exit(ret);
1162 +       /* NOTREACHED */
1163 +}
1164  /* ARGSUSED */
1165  LOCAL void
1166  intr(sig)
1167 @@ -2156,6 +2229,7 @@
1168                                         usleep(wt*1000);
1169                         }
1170  #endif
1171 +                       if (dp->is_dvd) fspeed /= 9;
1172                         printf(" %5.1fx", fspeed);
1173                         printf(".");
1174                         savbytes = (bytes >> 20) << 20;
1175 @@ -2969,10 +3043,13 @@
1176                 /*
1177                  * dsp->ds_maxblocks == 0 (disk capacity is unknown).
1178                  */
1179 -               if (endsec >= (405000-300)) {                   /*<90 min disk*/
1180 -                       errmsgno(EX_BAD,
1181 -                               "Data will not fit on any disk.\n");
1182 -                       goto toolarge;
1183 +               if (endsec >= (2300000)) {
1184 +                       errmsgno(EX_BAD,
1185 +                       "ERROR: Could not manage to find medium size, and more than 4.3 GB of data.\n");
1186 +                       goto toolarge;  
1187 +               } else if (endsec >= (405000-300)) {            /*<90 min disk or DVD*/
1188 +                       errmsgno(EX_BAD,
1189 +                       "WARNING: Could not manage to find medium size, and more than 90 mins of data.\n");
1190                 } else if (endsec >= (333000-150)) {            /* 74 min disk*/
1191                         errmsgno(EX_BAD,
1192                         "WARNING: Data may not fit on standard 74min disk.\n");
1193 @@ -3046,7 +3123,7 @@
1194  }
1195  
1196  char   *opts =
1197 -"help,version,checkdrive,prcap,inq,scanbus,reset,abort,overburn,ignsize,useinfo,dev*,timeout#,driver*,driveropts*,setdropts,tsize&,padsize&,pregap&,defpregap&,speed#,load,lock,eject,dummy,msinfo,toc,atip,multi,fix,nofix,waiti,immed,debug#,d+,kdebug#,kd#,verbose+,v+,Verbose+,V+,x+,xd#,silent,s,audio,data,mode2,xa,xa1,xa2,xamix,cdi,isosize,nopreemp,preemp,nocopy,copy,nopad,pad,swab,fs&,ts&,blank&,format,pktsize#,packet,noclose,force,tao,dao,sao,raw,raw96r,raw96p,raw16,clone,scms,isrc*,mcn*,index*,cuefile*,textfile*,text,shorttrack,noshorttrack,gracetime#,minbuf#";
1198 +"help,version,checkdrive,prcap,inq,scanbus,reset,abort,overburn,ignsize,useinfo,dev*,timeout#,driver*,driveropts*,setdropts,tsize&,padsize&,pregap&,defpregap&,speed#,load,lock,eject,dummy,msinfo,toc,atip,multi,fix,nofix,waiti,immed,debug#,d+,kdebug#,kd#,verbose+,v+,Verbose+,V+,x+,xd#,silent,s,audio,data,mode2,xa,xa1,xa2,xamix,cdi,isosize,nopreemp,preemp,nocopy,copy,nopad,pad,swab,fs&,ts&,blank&,format,formattype&,pktsize#,packet,noclose,force,tao,dao,sao,raw,raw96r,raw96p,raw16,clone,scms,isrc*,mcn*,index*,cuefile*,textfile*,text,shorttrack,noshorttrack,gracetime#,minbuf#";
1199  
1200  /*
1201   * Defines used to find whether a write mode has been specified.
1202 @@ -3056,8 +3133,8 @@
1203  #define        M_RAW           4       /* Raw mode */
1204  #define        M_PACKET        8       /* Packed mode */
1205  
1206 -LOCAL void
1207 -gargs(ac, av, tracksp, trackp, devp, timeoutp, dpp, speedp, flagsp, blankp)
1208 +LOCAL int
1209 +gargs(ac, av, tracksp, trackp, devp, timeoutp, dpp, speedp, flagsp, blankp, formatp)
1210         int     ac;
1211         char    **av;
1212         int     *tracksp;
1213 @@ -3068,6 +3145,7 @@
1214         int     *speedp;
1215         long    *flagsp;
1216         int     *blankp;
1217 +       int     *formatp;
1218  {
1219         int     cac;
1220         char    * const*cav;
1221 @@ -3080,6 +3158,7 @@
1222         char    *textfile = NULL;
1223         long    bltype = -1;
1224         int     doformat = 0;
1225 +       int     formattype = -1;
1226         Llong   tracksize;
1227         Llong   padsize;
1228         long    pregapsize;
1229 @@ -3195,7 +3274,7 @@
1230                                 &nopreemp, &preemp,
1231                                 &nocopy, &copy,
1232                                 &nopad, &pad, &bswab, getnum, &fs, getnum, &bufsize,
1233 -                               getbltype, &bltype, &doformat, &pktsize,
1234 +                               getbltype, &bltype, &doformat, getformattype, &formattype, &pktsize,
1235                                 &ispacket, &noclose, &force,
1236                                 &tao, &dao, &dao, &raw, &raw96r, &raw96p, &raw16,
1237                                 &clone,
1238 @@ -3276,8 +3355,14 @@
1239                                 *flagsp |= F_BLANK;
1240                                 *blankp = bltype;
1241                         }
1242 -                       if (doformat)
1243 -                               *flagsp |= F_FORMAT;
1244 +                       if (doformat > 0) {
1245 +                               *flagsp |= F_FORMAT;
1246 +                               *formatp |= FULL_FORMAT;
1247 +                       }
1248 +                       if (formattype >= 0) {
1249 +                               *flagsp |= F_FORMAT;
1250 +                               *formatp |= formattype;
1251 +                       }
1252                         if (ispacket)
1253                                 wm |= M_PACKET;
1254                         if (tao)
1255 @@ -3724,14 +3809,14 @@
1256             ((strncmp(*devp, "HELP", 4) == 0) ||
1257             (strncmp(*devp, "help", 4) == 0))) {
1258                 *flagsp |= F_CHECKDRIVE; /* Set this for not calling mlockall() */
1259 -               return;
1260 +               return ispacket;
1261         }
1262         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)) {
1263                 if (tracks != 0) {
1264                         errmsgno(EX_BAD, "No tracks allowed with this option\n");
1265                         susage(EX_BAD);
1266                 }
1267 -               return;
1268 +               return ispacket;
1269         }
1270         *tracksp = tracks;
1271         if (*flagsp & F_SAO) {
1272 @@ -3760,12 +3845,13 @@
1273                         susage(EX_BAD);
1274                 }
1275                 cuefilename = cuefile;
1276 -               return;
1277 +               return ispacket;
1278         }
1279         if (tracks == 0 && (*flagsp & (F_LOAD|F_DLCK|F_EJECT|F_BLANK|F_FORMAT)) == 0) {
1280                 errmsgno(EX_BAD, "No tracks specified. Need at least one.\n");
1281                 susage(EX_BAD);
1282         }
1283 +       return ispacket;
1284  }
1285  
1286  LOCAL void
1287 @@ -4437,6 +4523,26 @@
1288         return (TRUE);
1289  }
1290  
1291 +LOCAL int
1292 +getformattype(optstr, typep)
1293 +       char    *optstr;
1294 +       long    *typep;
1295 +{
1296 +       if (streql(optstr, "full")) {
1297 +               *typep = FULL_FORMAT;
1298 +       } else if (streql(optstr, "background")) {
1299 +               *typep = BACKGROUND_FORMAT;
1300 +       } else if (streql(optstr, "force")) {
1301 +               *typep = FORCE_FORMAT;
1302 +       } else if (streql(optstr, "help")) {
1303 +               formattypeusage(0);
1304 +       } else {
1305 +               error("Illegal blanking type '%s'.\n", optstr);
1306 +               formattypeusage(EX_BAD);
1307 +               return (-1);
1308 +       }
1309 +       return (TRUE);
1310 +}
1311  LOCAL void
1312  print_drflags(dp)
1313         cdr_t   *dp;
1314 --- cdrtools-2.01/cdrecord/scsi_cdr.c.dvd       2004-05-25 00:36:01.000000000 +0200
1315 +++ cdrtools-2.01/cdrecord/scsi_cdr.c   2004-10-18 14:37:32.439249741 +0200
1316 @@ -107,6 +107,8 @@
1317  EXPORT int     send_cue_sheet  __PR((SCSI *scgp, caddr_t bp, long size));
1318  EXPORT int     read_buff_cap   __PR((SCSI *scgp, long *, long *));
1319  EXPORT int     scsi_blank      __PR((SCSI *scgp, long addr, int blanktype, BOOL immed));
1320 +EXPORT int     scsi_format     __PR((SCSI *scgp, caddr_t addr, int size, BOOL background));
1321 +EXPORT int     scsi_set_streaming      __PR((SCSI *scgp, caddr_t addr, int size));
1322  EXPORT BOOL    allow_atapi     __PR((SCSI *scgp, BOOL new));
1323  EXPORT int     mode_select     __PR((SCSI *scgp, Uchar *, int, int, int));
1324  EXPORT int     mode_sense      __PR((SCSI *scgp, Uchar *dp, int cnt, int page, int pcf));
1325 @@ -519,6 +521,32 @@
1326  }
1327  
1328  EXPORT int
1329 +scsi_set_streaming(scgp, perf_desc, size)
1330 +       SCSI    *scgp;
1331 +       caddr_t perf_desc;
1332 +       int     size;
1333 +{
1334 +       register struct scg_cmd *scmd = scgp->scmd;
1335 +
1336 +       fillbytes((caddr_t)scmd, sizeof (*scmd), '\0');
1337 +       scmd->addr = perf_desc;
1338 +       scmd->size = size;
1339 +       scmd->flags = SCG_DISRE_ENA;
1340 +       scmd->cdb_len = SC_G5_CDBLEN;
1341 +       scmd->sense_len = CCS_SENSE_LEN;
1342 +       scmd->cdb.g5_cdb.cmd = 0xB6;
1343 +       scmd->cdb.cmd_cdb[11] = 0;
1344 +       scmd->cdb.cmd_cdb[10] = size;
1345 +
1346 +       scgp->cmdname = "set streaming";
1347 +
1348 +       printf("scsi_set_streaming\n");
1349 +       if (scg_cmd(scgp) < 0)
1350 +               return (-1);
1351 +       return (0);
1352 +}
1353 +    
1354 +EXPORT int
1355  scsi_set_speed(scgp, readspeed, writespeed, rotctl)
1356         SCSI    *scgp;
1357         int     readspeed;
1358 @@ -1042,6 +1070,32 @@
1359         return (0);
1360  }
1361  
1362 +
1363 +EXPORT int
1364 +reserve_track(scgp, size)
1365 +       SCSI    *scgp;
1366 +       Ulong   size;
1367 +
1368 +{
1369 +       register struct scg_cmd *scmd = scgp->scmd;
1370 +
1371 +       fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');
1372 +       scmd->flags = SCG_DISRE_ENA;
1373 +       scmd->cdb_len = SC_G1_CDBLEN;
1374 +       scmd->sense_len = CCS_SENSE_LEN;
1375 +       scmd->cdb.g1_cdb.cmd = 0x53;
1376 +       scmd->cdb.g1_cdb.lun = scg_lun(scgp);
1377 +       i_to_4_byte(&scmd->cdb.g1_cdb.addr[3], size);
1378 +
1379 +       scgp->cmdname = "reserve track";
1380 +
1381 +       if (scg_cmd(scgp) < 0) 
1382 +               return (-1);
1383 +
1384 +       return (0);
1385 +
1386 +}
1387 +
1388  EXPORT int
1389  read_rzone_info(scgp, bp, cnt)
1390         SCSI    *scgp;
1391 @@ -1323,6 +1377,69 @@
1392         return (scg_cmd(scgp));
1393  }
1394  
1395 +EXPORT int
1396 +scsi_format(scgp, addr, size, background)
1397 +       SCSI    *scgp;
1398 +       caddr_t addr;
1399 +       int     size;
1400 +       BOOL    background;
1401 +{
1402 +       register struct scg_cmd *scmd = scgp->scmd;
1403 +       int progress=0, ret=-1, pid=-1;
1404 +       unsigned char sense_table[18];
1405 +       int i;
1406 +       
1407 +       printf("scsi_format: preparing\n");
1408 +
1409 +       fillbytes((caddr_t)scmd, sizeof(*scmd), '\0');
1410 +       scmd->addr = addr;
1411 +       scmd->size = size;
1412 +       scmd->flags = SCG_DISRE_ENA;
1413 +       scmd->cdb_len = SC_G5_CDBLEN;
1414 +       scmd->sense_len = CCS_SENSE_LEN;
1415 +       scmd->timeout = 160 * 60;     /* Do not know what to set */
1416 +       scmd->cdb.g5_cdb.cmd = 0x04;   /* Format Unit */
1417 +       scmd->cdb.cmd_cdb[1] = 0x11;  /* "FmtData" and "Format Code" */
1418 +       scmd->cdb.cmd_cdb[5] = 0;
1419 +
1420 +       scgp->cmdname = "format unit";
1421 +
1422 +       printf("scsi_format: running\n");
1423 +       ret = (scg_cmd(scgp));
1424 +       printf("scsi_format: post processing %d\n", ret);
1425 +       if (ret == -1) return ret;
1426 +       if (background) {
1427 +               if ((pid=fork()) == (pid_t)-1)
1428 +                       perror ("- [unable to fork()]");
1429 +               else {
1430 +                       if (!pid) {
1431 +                           while (1) {
1432 +                               if (test_unit_ready(scgp) >= 0)
1433 +                                   break;
1434 +                               sleep(1);
1435 +                           }
1436 +                           return ret;
1437 +                       }
1438 +               }
1439 +       }
1440 +       printf("Formating in progress: 0.00 %% done.");
1441 +       sleep(20);
1442 +       while (progress < 0xfff0) {
1443 +               test_unit_ready(scgp);
1444 +               request_sense_b(scgp, (caddr_t)sense_table, 18);
1445 +               progress = sense_table[16]<<8|sense_table[17];
1446 +               printf("\rFormating in progress: %.2f %% done [%d].                           ", (float)(progress*100)/0x10000,progress);
1447 +               usleep(10000);
1448 +               /*for (i=0; i < 18; i++) {
1449 +                   printf("%d ", sense_table[i]);
1450 +               }*/
1451 +       }
1452 +       sleep(10);
1453 +       printf("\rFormating in progress: 100.00 %% done.        \n");
1454 +       if (pid) exit (0);
1455 +       return ret;
1456 +}
1457 +
1458  /*
1459   * XXX First try to handle ATAPI:
1460   * XXX ATAPI cannot handle SCSI 6 byte commands.
1461 --- cdrtools-2.01/libscg/scsitransp.c.dvd       2004-06-17 22:20:27.000000000 +0200
1462 +++ cdrtools-2.01/libscg/scsitransp.c   2004-10-18 14:37:32.424251905 +0200
1463 @@ -108,6 +108,7 @@
1464  EXPORT int     scg_sense_key   __PR((SCSI *scgp));
1465  EXPORT int     scg_sense_code  __PR((SCSI *scgp));
1466  EXPORT int     scg_sense_qual  __PR((SCSI *scgp));
1467 +EXPORT unsigned char *scg_sense_table  __PR((SCSI *scgp));
1468  EXPORT void    scg_fprintdev   __PR((FILE *, struct scsi_inquiry *));
1469  EXPORT void    scg_printdev    __PR((struct scsi_inquiry *));
1470  EXPORT int     scg_printf      __PR((SCSI *scgp, const char *form, ...));
1471 @@ -1240,6 +1241,23 @@
1472  }
1473  
1474  /*
1475 + * Return all the SCSI sense table last command.
1476 + */
1477 +EXPORT unsigned char *
1478 +scg_sense_table(scgp)
1479 +       SCSI    *scgp;
1480 +{
1481 +       register struct scg_cmd *cp = scgp->scmd;
1482 +
1483 +       if(!scg_cmd_err(scgp))
1484 +               return (0);
1485 +
1486 +       if (cp->sense.code >= 0x70)
1487 +               return &(cp->sense);
1488 +       return (0);
1489 +}
1490 +
1491 +/*
1492   * Return the SCSI sense code for last command.
1493   */
1494  EXPORT int
This page took 0.828305 seconds and 3 git commands to generate.