515 lines
14 KiB
Diff
515 lines
14 KiB
Diff
Patch for version 3.01, taken from upstream at
|
|
https://sourceforge.net/projects/cdrtools/files/cdrtools-3.01-fix-20151126-mkisofs-isoinfo.patch
|
|
|
|
--- 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";
|