diff --git a/demo/iso.c b/demo/iso.c index cee6b3d..2e3967e 100644 --- a/demo/iso.c +++ b/demo/iso.c @@ -72,6 +72,8 @@ int main(int argc, char **argv) 0, /* file_mode */ 0, /* uid */ 0, /* gid */ + 0, /* replace_timestamps */ + 0, /* timestamp */ NULL, /* output charset */ 0, /* appendable */ 0, /* ms_block */ diff --git a/demo/iso_grow.c b/demo/iso_grow.c index 184f2f2..a6b147c 100644 --- a/demo/iso_grow.c +++ b/demo/iso_grow.c @@ -54,6 +54,8 @@ int main(int argc, char **argv) 0, /* file_mode */ 0, /* uid */ 0, /* gid */ + 0, /* replace_timestamps */ + 0, /* timestamp */ NULL, /* output charset */ 0, /* appendable */ 0, /* ms_block */ diff --git a/demo/iso_modify.c b/demo/iso_modify.c index 5333c21..47c72e0 100644 --- a/demo/iso_modify.c +++ b/demo/iso_modify.c @@ -49,6 +49,8 @@ int main(int argc, char **argv) 0, /* file_mode */ 0, /* uid */ 0, /* gid */ + 0, /* replace_timestamps */ + 0, /* timestamp */ NULL, /* output charset */ 0, /* appendable */ 0, /* ms_block */ diff --git a/demo/iso_ms.c b/demo/iso_ms.c index 760a8f7..5d88498 100644 --- a/demo/iso_ms.c +++ b/demo/iso_ms.c @@ -49,6 +49,8 @@ int main(int argc, char **argv) 0, /* file_mode */ 0, /* uid */ 0, /* gid */ + 0, /* replace_timestamps */ + 0, /* timestamp */ NULL, /* output charset */ 0, /* appendable */ 0, /* ms_block */ diff --git a/src/ecma119.c b/src/ecma119.c index 8a42b83..7c6f3aa 100644 --- a/src/ecma119.c +++ b/src/ecma119.c @@ -848,7 +848,11 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts, Ecma119Image **img) target->now = time(NULL); target->ms_block = opts->ms_block; target->appendable = opts->appendable; - + + target->replace_timestamps = opts->replace_timestamps ? 1 : 0; + target->timestamp = opts->replace_timestamps == 2 ? + opts->timestamp : target->now; + /* el-torito? */ target->eltorito = (src->bootcat == NULL ? 0 : 1); target->catalog = src->bootcat; diff --git a/src/ecma119.h b/src/ecma119.h index 8a6d480..d8abc73 100644 --- a/src/ecma119.h +++ b/src/ecma119.h @@ -58,11 +58,13 @@ struct ecma119_image unsigned int replace_gid :1; unsigned int replace_file_mode :1; unsigned int replace_dir_mode :1; + unsigned int replace_timestamps :1; uid_t uid; gid_t gid; mode_t file_mode; mode_t dir_mode; + time_t timestamp; /** * if sort files or not. Sorting is based of the weight of each file diff --git a/src/libisofs.h b/src/libisofs.h index efaf0c4..306e961 100644 --- a/src/libisofs.h +++ b/src/libisofs.h @@ -184,6 +184,14 @@ struct ecma119_write_opts { uid_t uid; /** uid to use when replace_uid == 2. */ gid_t gid; /** gid to use when replace_gid == 2. */ + /** + * 0 to use IsoNode timestamps, 1 to use recording time, 2 to use + * values from timestamp field. This has only meaning if RR extensions + * are enabled. + */ + unsigned int replace_timestamps :2; + time_t timestamp; + /** * Charset for the RR filenames that will be created. * NULL to use default charset, the locale one. diff --git a/src/rockridge.c b/src/rockridge.c index 1a6f9aa..3b12c63 100644 --- a/src/rockridge.c +++ b/src/rockridge.c @@ -113,6 +113,7 @@ int rrip_add_PX(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp) static int rrip_add_TF(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp) { + IsoNode *iso; uint8_t *TF = malloc(5 + 3 * 7); if (TF == NULL) { return ISO_OUT_OF_MEM; @@ -123,9 +124,11 @@ int rrip_add_TF(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp) TF[2] = 5 + 3 * 7; TF[3] = 1; TF[4] = (1 << 1) | (1 << 2) | (1 << 3); - iso_datetime_7(&TF[5], n->node->mtime); - iso_datetime_7(&TF[12], n->node->atime); - iso_datetime_7(&TF[19], n->node->ctime); + + iso = n->node; + iso_datetime_7(&TF[5], t->replace_timestamps ? t->timestamp : iso->mtime); + iso_datetime_7(&TF[12], t->replace_timestamps ? t->timestamp : iso->atime); + iso_datetime_7(&TF[19], t->replace_timestamps ? t->timestamp : iso->ctime); return susp_append(t, susp, TF); }