]> git.pld-linux.org Git - packages/cdrtools.git/commitdiff
- added official mkisofs fix release for 3.01 master
authorMarcin Krol <hawk@tld-linux.org>
Tue, 30 Apr 2024 15:35:37 +0000 (17:35 +0200)
committerMarcin Krol <hawk@tld-linux.org>
Tue, 30 Apr 2024 15:35:37 +0000 (17:35 +0200)
cdrtools-mkisofs-fix.patch [new file with mode: 0644]
cdrtools.spec

diff --git a/cdrtools-mkisofs-fix.patch b/cdrtools-mkisofs-fix.patch
new file mode 100644 (file)
index 0000000..0523fdd
--- /dev/null
@@ -0,0 +1,511 @@
+--- cdrtools-3.01.orig/mkisofs/diag/isoinfo.c  2015-07-22 20:36:45.000000000 +0000
++++ cdrtools-3.01/mkisofs/diag/isoinfo.c       2015-11-17 19:35:40.000000000 +0000
+@@ -1,8 +1,8 @@
+-/* @(#)isoinfo.c      1.95 15/07/22 joerg */
++/* @(#)isoinfo.c      1.100 15/11/17 joerg */
+ #include <schily/mconfig.h>
+ #ifndef       lint
+ static        UConst char sccsid[] =
+-      "@(#)isoinfo.c  1.95 15/07/22 joerg";
++      "@(#)isoinfo.c  1.100 15/11/17 joerg";
+ #endif
+ /*
+  * File isodump.c - dump iso9660 directory information.
+@@ -148,8 +148,10 @@ LOCAL char        er_id[256];
+ LOCAL int     su_version = 0;
+ LOCAL int     rr_version = 0;
+ LOCAL int     aa_version = 0;
++LOCAL int     cl_extent = 0;
+ LOCAL int     ucs_level = 0;
+ LOCAL BOOL    iso9660_inodes = FALSE;
++LOCAL uid_t   myuid;
+ #ifdef        USE_FIND
+ LOCAL findn_t *find_node;             /* syntaxtree from find_parse() */
+@@ -208,6 +210,9 @@ LOCAL      void    extract         __PR((char *rootname
+ LOCAL void    extract_file    __PR((int f,
+                                       struct iso_directory_record * idr,
+                                       char *fname));
++LOCAL void    parse_cl_dir    __PR((struct iso_directory_record *idr,
++                                      int extent));
++LOCAL BOOL    parse_de        __PR((struct iso_directory_record *idr));
+ LOCAL void    parse_dir       __PR((char * rootname, int extent, int len));
+ LOCAL void    usage           __PR((int excode));
+ EXPORT        int     main            __PR((int argc, char *argv[]));
+@@ -459,7 +464,6 @@ parse_rr(pnt, len, cont_flag)
+       int slen;
+       int xlen;
+       int ncount;
+-      int cl_extent;
+       int pl_extent;
+       int cont_extent, cont_offset, cont_size;
+       int flag1, flag2;
+@@ -469,7 +473,7 @@ parse_rr(pnt, len, cont_flag)
+       symlinkname[0] = 0;
+-      cont_extent = cont_offset = cont_size = 0;
++      cl_extent = cont_extent = cont_offset = cont_size = 0;
+       ncount = 0;
+       flag1 = -1;
+@@ -714,6 +718,7 @@ struct todo
+ };
+ LOCAL struct todo     *todo_idr = NULL;
++LOCAL struct todo     **todo_pp = &todo_idr;
+ LOCAL char            *months[12] = {"Jan", "Feb", "Mar", "Apr",
+                               "May", "Jun", "Jul",
+@@ -962,8 +967,14 @@ static    BOOL            isfirst = TRUE;
+       close(f);
+       return;
+ setmode:
+-      fchmodat(AT_FDCWD, fname, fstat_buf.st_mode, AT_SYMLINK_NOFOLLOW);
+       fchownat(AT_FDCWD, fname, fstat_buf.st_uid, fstat_buf.st_gid, AT_SYMLINK_NOFOLLOW);
++      if (myuid != 0 && S_ISDIR(fstat_buf.st_mode)) {
++              /*
++               * Temporary hack until we have a dirstack like star.
++               */
++              fstat_buf.st_mode |= S_IWUSR;
++      }
++      fchmodat(AT_FDCWD, fname, fstat_buf.st_mode, AT_SYMLINK_NOFOLLOW);
+       times[0].tv_sec = fstat_buf.st_atime;
+       times[0].tv_nsec = stat_ansecs(&fstat_buf);
+       times[1].tv_sec = fstat_buf.st_mtime;
+@@ -1001,6 +1012,143 @@ extract_file(f, idr, fname)
+       }
+ }
++
++LOCAL void
++parse_cl_dir(idr, extent)
++      struct iso_directory_record     *idr;
++      int                             extent;
++{
++      char                            cl_name_buf[256*3];
++
++      strlcpy(cl_name_buf, name_buf, sizeof (cl_name_buf));
++#ifdef        USE_SCG
++      readsecs(extent - sector_offset, idr, 1);
++#else
++      lseek(fileno(infile), ((off_t)(extent - sector_offset)) << 11, SEEK_SET);
++      read(fileno(infile), idr, 2048);
++#endif
++
++      if (parse_de(idr) && use_rock)
++              dump_rr(idr);
++      strlcpy(name_buf, cl_name_buf, sizeof (name_buf));
++}
++
++LOCAL BOOL
++parse_de(idr)
++      struct iso_directory_record     *idr;
++{
++      unsigned char   uc;
++
++      if (idr->length[0] == 0)
++              return (FALSE);
++      memset(&fstat_buf, 0, sizeof (fstat_buf));
++      found_rr = 0;
++      name_buf[0] = xname[0] = 0;
++      fstat_buf.st_size = (off_t)(unsigned)isonum_733((unsigned char *)idr->size);
++      if (idr->flags[0] & 2)
++              fstat_buf.st_mode |= S_IFDIR;
++      else
++              fstat_buf.st_mode |= S_IFREG;
++      if (idr->name_len[0] == 1 && idr->name[0] == 0)
++              strcpy(name_buf, ".");
++      else if (idr->name_len[0] == 1 && idr->name[0] == 1)
++              strcpy(name_buf, "..");
++      else {
++              switch (ucs_level) {
++              case 3:
++              case 2:
++              case 1:
++                      /*
++                       * Unicode name.  Convert as best we can.
++                       */
++                      {
++                      int     j;
++                              name_buf[0] = '\0';
++#ifdef        USE_ICONV
++                      if (use_iconv(unls)) {
++                              int     u;
++                              char    *to = name_buf;
++
++                              for (j = 0, u = 0; j < (int)idr->name_len[0] / 2; j++) {
++                                      char    *ibuf = (char *)&idr->name[j*2];
++                                      size_t  isize = 2;              /* UCS-2 character size */
++                                      size_t  osize = 4;
++
++                                      if (iconv(unls->sic_uni2cd, (__IC_CONST char **)&ibuf, &isize,
++                                                      (char **)&to, &osize) == -1) {
++                                              int     err = geterrno();
++
++                                              if ((err == EINVAL || err == EILSEQ) &&
++                                                  osize == 4) {
++                                                      *to = '_';
++                                                      u += 1;
++                                                      to++;
++                                              }
++                                      } else {
++                                              u += 4 - osize;
++                                              to = &name_buf[u];
++                                      }
++                              }
++                              j = u;
++                      } else
++#endif
++                      for (j = 0; j < (int)idr->name_len[0] / 2; j++) {
++                              UInt16_t        unichar;
++
++                              unichar = (idr->name[j*2] & 0xFF) * 256 +
++                                          (idr->name[j*2+1] & 0xFF);
++
++                              /*
++                               * Get the backconverted char
++                               */
++                              if (unls)
++                                      uc = sic_uni2c(unls, unichar);
++                              else
++                                      uc = unichar > 255 ? '_' : unichar;
++
++                              name_buf[j] = uc ? uc : '_';
++                      }
++                      name_buf[j] = '\0';
++                      }
++                      break;
++              case 0:
++                      /*
++                       * Normal non-Unicode name.
++                       */
++                      strncpy(name_buf, idr->name, idr->name_len[0]);
++                      name_buf[idr->name_len[0]] = 0;
++                      break;
++              default:
++                      /*
++                       * Don't know how to do these yet.  Maybe they are the same
++                       * as one of the above.
++                       */
++                      exit(1);
++              }
++      }
++      memcpy(date_buf, idr->date, 9);
++      /*
++       * Always first set up time stamps and file modes from
++       * ISO-9660. This is used as a fallback in case that
++       * there is no related Rock Ridge based data.
++       */
++      fstat_buf.st_atime =
++      fstat_buf.st_mtime =
++      fstat_buf.st_ctime = iso9660_time(date_buf, NULL, FALSE);
++      fstat_buf.st_mode |= S_IRUSR|S_IXUSR |
++                  S_IRGRP|S_IXGRP |
++                  S_IROTH|S_IXOTH;
++      fstat_buf.st_nlink = 1;
++      fstat_buf.st_ino = 0;
++      fstat_buf.st_uid = 0;
++      fstat_buf.st_gid = 0;
++      if (iso9660_inodes) {
++              fstat_buf.st_ino = (unsigned long)
++                  isonum_733((unsigned char *)idr->extent);
++      }
++      return (TRUE);
++}
++
+ LOCAL void
+ parse_dir(rootname, extent, len)
+       char    *rootname;
+@@ -1012,12 +1160,13 @@ parse_dir(rootname, extent, len)
+       struct iso_directory_record * idr;
+       struct iso_directory_record     didr;
+       struct stat                     dstat;
+-      unsigned char   uc;
++      unsigned char   cl_buffer[2048];
+       unsigned char   flags = 0;
+       Llong           size = 0;
+       int             sextent = 0;
+       int     rlen;
+       int     blen;
++      int     rr_flags = 0;
+ static        char    *n = 0;
+ static        int     nlen = 0;
+@@ -1039,115 +1188,23 @@ static        int     nlen = 0;
+               i = 0;
+               while (1 == 1) {
+                       idr = (struct iso_directory_record *) &buffer[i];
+-                      if (idr->length[0] == 0) break;
+-                      memset(&fstat_buf, 0, sizeof (fstat_buf));
+-                      found_rr = 0;
+-                      name_buf[0] = xname[0] = 0;
+-                      fstat_buf.st_size = (off_t)(unsigned)isonum_733((unsigned char *)idr->size);
+-                      if (idr->flags[0] & 2)
+-                              fstat_buf.st_mode |= S_IFDIR;
+-                      else
+-                              fstat_buf.st_mode |= S_IFREG;
+-                      if (idr->name_len[0] == 1 && idr->name[0] == 0)
+-                              strcpy(name_buf, ".");
+-                      else if (idr->name_len[0] == 1 && idr->name[0] == 1)
+-                              strcpy(name_buf, "..");
+-                      else {
+-                              switch (ucs_level) {
+-                              case 3:
+-                              case 2:
+-                              case 1:
+-                                      /*
+-                                       * Unicode name.  Convert as best we can.
+-                                       */
+-                                      {
+-                                      int     j;
+-
+-                                      name_buf[0] = '\0';
+-#ifdef        USE_ICONV
+-                                      if (use_iconv(unls)) {
+-                                              int     u;
+-                                              char    *to = name_buf;
+-
+-                                              for (j = 0, u = 0; j < (int)idr->name_len[0] / 2; j++) {
+-                                                      char    *ibuf = (char *)&idr->name[j*2];
+-                                                      size_t  isize = 2;              /* UCS-2 character size */
+-                                                      size_t  osize = 4;
+-
+-                                                      if (iconv(unls->sic_uni2cd, (__IC_CONST char **)&ibuf, &isize,
+-                                                                      (char **)&to, &osize) == -1) {
+-                                                              int     err = geterrno();
+-
+-                                                              if ((err == EINVAL || err == EILSEQ) &&
+-                                                                  osize == 4) {
+-                                                                      *to = '_';
+-                                                                      u += 1;
+-                                                                      to++;
+-                                                              }
+-                                                      } else {
+-                                                              u += 4 - osize;
+-                                                              to = &name_buf[u];
+-                                                      }
+-                                              }
+-                                              j = u;
+-                                      } else
+-#endif
+-                                      for (j = 0; j < (int)idr->name_len[0] / 2; j++) {
+-                                              UInt16_t        unichar;
+-
+-                                              unichar = (idr->name[j*2] & 0xFF) * 256 +
+-                                                          (idr->name[j*2+1] & 0xFF);
+-
+-                                              /*
+-                                               * Get the backconverted char
+-                                               */
+-                                              if (unls)
+-                                                      uc = sic_uni2c(unls, unichar);
+-                                              else
+-                                                      uc = unichar > 255 ? '_' : unichar;
++                      if (idr->length[0] == 0)
++                              break;
++                      parse_de(idr);
++                      if (use_rock) {
++                              rr_flags = dump_rr(idr);
+-                                              name_buf[j] = uc ? uc : '_';
+-                                      }
+-                                      name_buf[j] = '\0';
+-                                      }
+-                                      break;
+-                              case 0:
++                              if (rr_flags & RR_FLAG_CL) {
+                                       /*
+-                                       * Normal non-Unicode name.
++                                       * Need to reparse the child link
++                                       * but note that we parse "CL/."
++                                       * so we get no usable file name.
+                                        */
+-                                      strncpy(name_buf, idr->name, idr->name_len[0]);
+-                                      name_buf[idr->name_len[0]] = 0;
+-                                      break;
+-                              default:
+-                                      /*
+-                                       * Don't know how to do these yet.  Maybe they are the same
+-                                       * as one of the above.
+-                                       */
+-                                      exit(1);
+-                              }
++                                      idr = (struct iso_directory_record *) cl_buffer;
++                                      parse_cl_dir(idr, cl_extent);
++                              } else if (rr_flags & RR_FLAG_RE)
++                                      goto cont;      /* skip rr_moved */
+                       }
+-                      memcpy(date_buf, idr->date, 9);
+-                      /*
+-                       * Always first set up time stamps and file modes from
+-                       * ISO-9660. This is used as a fallback in case that
+-                       * there is no related Rock Ridge based data.
+-                       */
+-                      fstat_buf.st_atime =
+-                      fstat_buf.st_mtime =
+-                      fstat_buf.st_ctime = iso9660_time(date_buf, NULL, FALSE);
+-                      fstat_buf.st_mode |= S_IRUSR|S_IXUSR |
+-                                  S_IRGRP|S_IXGRP |
+-                                  S_IROTH|S_IXOTH;
+-                      fstat_buf.st_nlink = 1;
+-                      fstat_buf.st_ino = 0;
+-                      fstat_buf.st_uid = 0;
+-                      fstat_buf.st_gid = 0;
+-                      if (iso9660_inodes) {
+-                              fstat_buf.st_ino = (unsigned long)
+-                                  isonum_733((unsigned char *)idr->extent);
+-                      }
+-                      if (use_rock)
+-                              dump_rr(idr);
+                       if (Xtract &&
+                           (idr->flags[0] & 2) != 0 &&
+                           idr->name_len[0] == 1 &&
+@@ -1170,30 +1227,30 @@ static int     nlen = 0;
+                               n[rlen] = '\0';
+                       if ((idr->flags[0] & 2) != 0 &&
+-                          (idr->name_len[0] != 1 ||
++                          ((rr_flags & RR_FLAG_CL) ||
++                          idr->name_len[0] != 1 ||
+                           (idr->name[0] != 0 && idr->name[0] != 1))) {
+                               /*
+                                * This is a plain directory (neither "xxx/."
+                                * nor "xxx/..").
+                                * Add this directory to the todo list.
+                                */
+-                              td = todo_idr;
+-                              if (td != NULL) {
+-                                      while (td->next != NULL)
+-                                              td = td->next;
+-                                      td->next = (struct todo *) malloc(sizeof (*td));
+-                                      td = td->next;
+-                              } else {
+-                                      todo_idr = td = (struct todo *) malloc(sizeof (*td));
+-                              }
++                              td = (struct todo *) malloc(sizeof (*td));
++                              if (td == NULL)
++                                      comerr(_("No memory.\n"));
+                               td->next = NULL;
+                               td->extent = isonum_733((unsigned char *)idr->extent);
+                               td->length = isonum_733((unsigned char *)idr->size);
+                               td->name = (char *) malloc(strlen(rootname)
+                                                               + strlen(name_buf) + 2);
++                              if (td->name == NULL)
++                                      comerr(_("No memory.\n"));
+                               strcpy(td->name, rootname);
+                               strcat(td->name, name_buf);
+                               strcat(td->name, "/");
++
++                              *todo_pp = td;
++                              todo_pp = &td->next;
+                       } else {
+                               if (xtract && strcmp(xtract, n) == 0) {
+                                       extract_file(STDOUT_FILENO, idr, "stdout");
+@@ -1253,6 +1310,7 @@ static   int     nlen = 0;
+                               if ((idr->flags[0] & ISO_MULTIEXTENT) == 0)
+                                       size = 0;
+                       }
++              cont:
+                       i += buffer[i];
+                       if (i > 2048 - offsetof(struct iso_directory_record, name[0])) break;
+               }
+@@ -1381,12 +1439,13 @@ main(argc, argv)
+               usage(0);
+       if (prvers) {
+               printf(_("isoinfo %s (%s-%s-%s) Copyright (C) 1993-1999 %s (C) 1999-2015 %s\n"),
+-                                      VERSION,
++                                      "3.02a02",
+                                       HOST_CPU, HOST_VENDOR, HOST_OS,
+                                       _("Eric Youngdale"),
+                                       _("Joerg Schilling"));
+               exit(0);
+       }
++      myuid = getuid();
+ #ifdef        USE_FIND
+       if (do_find) {
+               finda_t fa;
+--- cdrtools-3.01.orig/mkisofs/udf.c   2013-04-24 20:45:18.000000000 +0000
++++ cdrtools-3.01/mkisofs/udf.c        2015-11-25 22:07:30.000000000 +0000
+@@ -1,15 +1,15 @@
+-/* @(#)udf.c  1.42 13/04/24 Copyright 2001-2013 J. Schilling */
++/* @(#)udf.c  1.43 15/11/25 Copyright 2001-2015 J. Schilling */
+ #include <schily/mconfig.h>
+ #ifndef lint
+ static        UConst char sccsid[] =
+-      "@(#)udf.c      1.42 13/04/24 Copyright 2001-2013 J. Schilling";
++      "@(#)udf.c      1.43 15/11/25 Copyright 2001-2015 J. Schilling";
+ #endif
+ /*
+  * udf.c - UDF support for mkisofs
+  *
+  * Written by Ben Rudiak-Gould (2001).
+  *
+- * Copyright 2001-2013 J. Schilling.
++ * Copyright 2001-2015 J. Schilling.
+  */
+ /*
+  * This program is free software; you can redistribute it and/or modify
+@@ -98,7 +98,7 @@ static       UConst char sccsid[] =
+ extern        int     use_sparcboot;
+ extern struct directory *root;
+-extern time_t         begun;
++extern struct timeval tv_begun;
+ static unsigned lba_main_seq;
+ static unsigned lba_main_seq_copy;
+@@ -110,7 +110,7 @@ static unsigned lba_end_anchor_vol_desc;
+ static unsigned num_udf_files;
+ static unsigned num_udf_directories;
+-static unsigned volume_set_id[2];
++static unsigned volume_set_id[2] = { 0, 0 };
+ #define       UDF_MAIN_SEQ_LENGTH (16)
+ #define       UDF_INTEG_SEQ_LENGTH (2)
+@@ -723,7 +723,7 @@ set_primary_vol_desc(buf, lba)
+       /*pvd->volume_abstract;*/
+       /*pvd->volume_copyright_notice;*/
+       /*pvd->application_ident;*/
+-      set_timestamp_from_time_t(&pvd->recording_date_and_time, begun);
++      set_timestamp_from_time_t(&pvd->recording_date_and_time, tv_begun.tv_sec);
+       set_impl_ident(&pvd->impl_ident);
+       set_tag(&pvd->desc_tag, UDF_TAGID_PRIMARY_VOLUME_DESC, lba, 512);
+ }
+@@ -831,7 +831,7 @@ set_logical_vol_integrity_desc(buf, lba)
+       udf_logical_volume_integrity_desc *lvid =
+                               (udf_logical_volume_integrity_desc *)buf;
+-      set_timestamp_from_time_t(&lvid->recording_date, begun);
++      set_timestamp_from_time_t(&lvid->recording_date, tv_begun.tv_sec);
+       set32(&lvid->integrity_type, UDF_INTEGRITY_TYPE_CLOSE);
+       /*lvid->next_integrity_extent;*/
+       set64(&lvid->logical_volume_contents_use.unique_id,
+@@ -859,7 +859,7 @@ set_file_set_desc(buf, rba)
+ {
+       udf_file_set_desc *fsd = (udf_file_set_desc *)buf;
+-      set_timestamp_from_time_t(&fsd->recording_date_and_time, begun);
++      set_timestamp_from_time_t(&fsd->recording_date_and_time, tv_begun.tv_sec);
+       set16(&fsd->interchange_level, 3);
+       set16(&fsd->maximum_interchange_level, 3);
+       set32(&fsd->character_set_list, 1);
+@@ -1986,8 +1986,10 @@ udf_main_seq_write(out)
+        * volume_set_id needs to be set to a (64-bit) "unique" number.
+        * This will have to do for now.
+        */
+-      volume_set_id[0] = begun;
+-      volume_set_id[1] = (unsigned)clock();   /* XXX Maybe non-portable */
++      if (volume_set_id[0] == 0) {
++              volume_set_id[0] = tv_begun.tv_sec;
++              volume_set_id[1] = (unsigned)tv_begun.tv_usec;
++      }
+       memset(buf, 0, sizeof (buf));
+       set_primary_vol_desc(buf, last_extent_written++);
+--- cdrtools-3.01.orig/mkisofs/mkisofs.c       2015-01-01 14:19:51.000000000 +0000
++++ cdrtools-3.01/mkisofs/mkisofs.c
+@@ -69 +69 @@ int              path_ind;
+-char  version_string[] = VERSION;
++char  version_string[] = "3.01-fix-20151126";
index 69db834c372473505419ee518b62f0890b70b3c7..7910edb86c58c732c7263da50e528341ee0beb16 100644 (file)
@@ -6,7 +6,7 @@ Summary(ru.UTF-8):      Программа для записи CD/DVD/BluRay, зап
 Summary(uk.UTF-8):     Програма для запису CD/DVD/BluRay, яка запускається з командної стрічки
 Name:          cdrtools
 Version:       3.01
-Release:       2
+Release:       3
 Epoch:         5
 License:       GPL v2 (mkisofs), CDDL v1.0 (the rest)
 Group:         Applications/System
@@ -17,6 +17,7 @@ Patch2:               %{name}-man.patch
 Patch3:                %{name}-make.patch
 Patch4:                %{name}-linking.patch
 Patch5:                %{name}-revert_sg_io_eperm_failure.patch
+Patch6:                %{name}-mkisofs-fix.patch
 URL:           http://cdrtools.sourceforge.net/
 BuildRequires: acl-devel
 BuildRequires: autoconf
@@ -247,6 +248,7 @@ chmod -R u+rw -R .
 %patch3 -p1
 %patch4 -p1
 %patch5 -p1
+%patch6 -p1
 
 # Remove profiled make files
 %{__rm} -v $(find . -name '*_p.mk')
@@ -282,6 +284,7 @@ sed -n -e '/CONFIG_RMTCALL/,/^])/p' m4/acspecific.m4 >> acinclude.m4
 
 %build
 cd autoconf
+cp /usr/share/automake/config.sub .
 %{__aclocal} -I .
 %{__autoconf}
 cd ../cdda2wav
This page took 0.113131 seconds and 4 git commands to generate.