X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fxheader.c;h=5eabdfb4318ecaae63b034cfb6138cc2b4868abf;hb=87240ee7c477ae4960cf81d3c38691ae93ceaee8;hp=919ecd393b21a69f3572aee138ce3c95d0b3c06c;hpb=cd39b5a1b72d9e0e0fcc6157bbc0e58662b445fb;p=chaz%2Ftar diff --git a/src/xheader.c b/src/xheader.c index 919ecd3..5eabdfb 100644 --- a/src/xheader.c +++ b/src/xheader.c @@ -1,6 +1,6 @@ /* POSIX extended headers for tar. - Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -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) { @@ -168,12 +189,12 @@ xheader_set_keyword_equal (char *kw, char *eq) global = false; } - while (p > kw && isspace (*p)) + while (p > kw && isspace ((unsigned char) *p)) p--; *p = 0; - for (p = eq + 1; *p && isspace (*p); p++) + for (p = eq + 1; *p && isspace ((unsigned char) *p); p++) ; if (strcmp (kw, "delete") == 0) @@ -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