X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fxheader.c;h=5eabdfb4318ecaae63b034cfb6138cc2b4868abf;hb=87240ee7c477ae4960cf81d3c38691ae93ceaee8;hp=84ae08bbc6e23d66a91f1273744c9435e4c7f970;hpb=705fab49ebb511fcaacf1f7e106e4402154c0fbc;p=chaz%2Ftar diff --git a/src/xheader.c b/src/xheader.c index 84ae08b..5eabdfb 100644 --- a/src/xheader.c +++ b/src/xheader.c @@ -96,9 +96,15 @@ static struct keyword_list *global_header_override_list; /* Template for the name field of an 'x' type header */ static char *exthdr_name; +static char *exthdr_mtime_option; +static time_t exthdr_mtime; + /* Template for the name field of a 'g' type header */ static char *globexthdr_name; +static char *globexthdr_mtime_option; +static time_t globexthdr_mtime; + bool xheader_keyword_deleted_p (const char *kw) { @@ -156,6 +162,21 @@ xheader_set_single_keyword (char *kw) USAGE_ERROR ((0, 0, _("Keyword %s is unknown or not yet implemented"), kw)); } +static void +assign_time_option (char **sval, time_t *tval, const char *input) +{ + uintmax_t u; + char *p; + time_t t = u = strtoumax (input, &p, 10); + if (t != u || *p || errno == ERANGE) + ERROR ((0, 0, _("Time stamp is out of allowed range"))); + else + { + *tval = t; + assign_string (sval, input); + } +} + static void xheader_set_keyword_equal (char *kw, char *eq) { @@ -186,6 +207,10 @@ xheader_set_keyword_equal (char *kw, char *eq) assign_string (&exthdr_name, p); else if (strcmp (kw, "globexthdr.name") == 0) assign_string (&globexthdr_name, p); + else if (strcmp (kw, "exthdr.mtime") == 0) + assign_time_option (&exthdr_mtime_option, &exthdr_mtime, p); + else if (strcmp (kw, "globexthdr.mtime") == 0) + assign_time_option (&globexthdr_mtime_option, &globexthdr_mtime, p); else { if (xheader_protected_keyword_p (kw)) @@ -364,14 +389,26 @@ xheader_ghdr_name (void) } void -xheader_write (char type, char *name, struct xheader *xhdr) +xheader_write (char type, char *name, time_t t, struct xheader *xhdr) { union block *header; size_t size; char *p; size = xhdr->size; - header = start_private_header (name, size); + switch (type) + { + case XGLTYPE: + if (globexthdr_mtime_option) + t = globexthdr_mtime; + break; + + case XHDTYPE: + if (exthdr_mtime_option) + t = exthdr_mtime; + break; + } + header = start_private_header (name, size, t); header->header.typeflag = type; simple_finish_header (header); @@ -413,7 +450,7 @@ xheader_write_global (struct xheader *xhdr) for (kp = keyword_global_override_list; kp; kp = kp->next) code_string (kp->value, kp->pattern, xhdr); xheader_finish (xhdr); - xheader_write (XGLTYPE, name = xheader_ghdr_name (), xhdr); + xheader_write (XGLTYPE, name = xheader_ghdr_name (), time (NULL), xhdr); free (name); } @@ -571,8 +608,9 @@ decx (void *data, char const *keyword, char const *value, size_t size) if (t) t->decoder (st, keyword, value, size); else - WARN((0, 0, _("Ignoring unknown extended header keyword `%s'"), - keyword)); + WARNOPT (WARN_UNKNOWN_KEYWORD, + (0, 0, _("Ignoring unknown extended header keyword `%s'"), + keyword)); } void