workaround cdrecords layerbreak oddity trunk
authornathan
Sun, 01 Dec 2013 13:30:48 +0100
branchtrunk
changeset 174879fdaac574
parent 16 18ea63fb7935
child 18 b00641305fed
workaround cdrecords layerbreak oddity
cdbackup.c
     1.1 --- a/cdbackup.c	Thu Oct 04 12:50:58 2012 +0200
     1.2 +++ b/cdbackup.c	Sun Dec 01 13:30:48 2013 +0100
     1.3 @@ -75,6 +75,7 @@
     1.4  long long totalSize=0;
     1.5  int disknum=1;
     1.6  int secs;
     1.7 +long layerbreak=0;
     1.8  struct tm curtime;  /* global, so multi-disks get all the same time */
     1.9  int auto_size=0;
    1.10  
    1.11 @@ -106,6 +107,10 @@
    1.12    if(virt_dump || dvd) {
    1.13      *p++="-dao";
    1.14      *p++=make_arg("tsize=%ds",secs);
    1.15 +    /* work around the oddidity that cdrecord refuses to burn the disk, if
    1.16 +       the tracksize is less than the first layer size on dual-layer disks */
    1.17 +    if(layerbreak>0 && secs<layerbreak)
    1.18 +      *p++=make_arg("driveropts=layerbreak=%ld",layerbreak);
    1.19      }
    1.20    else {
    1.21      *p++="-multi";
    1.22 @@ -150,6 +155,8 @@
    1.23      char buff[256];
    1.24      while(fgets(buff,sizeof(buff),p)) {
    1.25        if(dvd) {
    1.26 +         /* get layerbreak position */
    1.27 +         if(!strncmp(buff,"layer break at:",15)) layerbreak=strtol(&buff[15],NULL,10);
    1.28           /* DVD-R */
    1.29  	 if(!strncmp(buff,"rzone size:",11)) size=strtol(&buff[11],NULL,10);
    1.30  	 /* DVD+R */
    1.31 @@ -162,7 +169,7 @@
    1.32    free(cmd);
    1.33    if(size>0 && verbose) {
    1.34      char buff[16];
    1.35 -    fprintf(stderr,"%s: auto-detected media size %s (%ld blocks)\n",prg_name,FlexSize(buff,(long long)size*CD_FRAMESIZE),size);
    1.36 +    fprintf(stderr,"%s: auto-detected media size %s (%ld blocks, layerbreak at %ld)\n",prg_name,FlexSize(buff,(long long)size*CD_FRAMESIZE),size,layerbreak);
    1.37      }
    1.38    return size;
    1.39  }