Browse Source

Accept Rock Ridge Creation time as ctime if no Attributes time is present.

release-1.5.4.branch
Thomas Schmitt 6 years ago
parent
commit
01c7a0d5ec
  1. 5
      libisofs/fs_image.c
  2. 10
      libisofs/libisofs.h
  3. 32
      libisofs/rockridge_read.c

5
libisofs/fs_image.c

@ -1465,9 +1465,6 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
memset(&atts, 0, sizeof(struct stat));
atts.st_nlink = 1;
#ifdef Libisofs_for_bsd_inst_isoS
/* >>> ??? see read_rr_TF : shall libisofs follow a Linux inconsistency ? */
/* Set preliminary file type */
if (record->flags[0] & 0x02) {
atts.st_mode = S_IFDIR;
@ -1475,8 +1472,6 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
atts.st_mode = S_IFREG;
}
#endif /* Libisofs_for_bsd_inst_isoS */
/*
* First of all, check for unsupported ECMA-119 features
*/

10
libisofs/libisofs.h

@ -8908,14 +8908,4 @@ struct burn_source {
#define Libisofs_with_rrip_rR yes
*/
/* Experiment : bring representation of BSD installation ISOs near to
their representation by the Linux kernel.
Rock Ridge TF has ctime in CREATE rather than ATTRIBUTES.
Linux accepts this, but not for directories.
Some files only have ECMA-119 names, which Linux maps
to lowercase.
#define Libisofs_for_bsd_inst_isoS yes
*/
#endif /*LIBISO_LIBISOFS_H_*/

32
libisofs/rockridge_read.c

@ -211,29 +211,19 @@ int read_rr_TF(struct susp_sys_user_entry *tf, struct stat *st)
/* 1. Creation time */
if (tf->data.TF.flags[0] & (1 << 0)) {
#ifdef Libisofs_for_bsd_inst_isoS
/* FreeBSD installation ISOs represent ctime by Creation time rather
* than by Attributes time. If both are given, then Attribute time
* will win. Linux 3.16 does not do this for directories.
/* Linux accepts ctime by Creation time and by Attributes time.
* If both are given, then Attribute time will win.
*/
/* >>> ??? shall libisofs follow a Linux inconsistency ? */
if ((st->st_mode & S_IFMT) != S_IFDIR) {
if (tf->len_sue[0] < 5 + (nts+1) * s) {
/* RR TF entry too short. */
return ISO_WRONG_RR;
}
if (s == 7) {
time = iso_datetime_read_7(&tf->data.TF.t_stamps[nts*7]);
} else {
time = iso_datetime_read_17(&tf->data.TF.t_stamps[nts*17]);
}
st->st_ctime = time;
if (tf->len_sue[0] < 5 + (nts+1) * s) {
/* RR TF entry too short. */
return ISO_WRONG_RR;
}
#endif /* Libisofs_for_bsd_inst_isoS */
if (s == 7) {
time = iso_datetime_read_7(&tf->data.TF.t_stamps[nts*7]);
} else {
time = iso_datetime_read_17(&tf->data.TF.t_stamps[nts*17]);
}
st->st_ctime = time;
++nts;
}

Loading…
Cancel
Save