diff options
Diffstat (limited to 'ar.c')
-rw-r--r-- | ar.c | 33 |
1 files changed, 25 insertions, 8 deletions
@@ -68,25 +68,39 @@ ar_parse_name (const char *name, char **arname_p, char **memname_p) /* This function is called by 'ar_scan' to find which member to look at. */ +struct member_date_lookup +{ + const char *name; + time_t *member_date; +}; + /* ARGSUSED */ static long int ar_member_date_1 (int desc UNUSED, const char *mem, int truncated, long int hdrpos UNUSED, long int datapos UNUSED, long int size UNUSED, long int date, int uid UNUSED, int gid UNUSED, int mode UNUSED, - const void *name) + const void *data) { - return ar_name_equal (name, mem, truncated) ? date : 0; + const struct member_date_lookup *lookup_data = data; + if (ar_name_equal (lookup_data->name, mem, truncated)) + { + *lookup_data->member_date = date; + return 1; + } + return 0; } -/* Return the modtime of NAME. */ +/* Read the modtime of NAME in MEMBER_DATE. + Returns 1 if NAME exists, 0 otherwise. */ -time_t -ar_member_date (const char *name) +int +ar_member_date (const char *name, time_t *member_date) { char *arname; char *memname; - long int val; + int found; + struct member_date_lookup lookup_data; ar_parse_name (name, &arname, &memname); @@ -107,11 +121,14 @@ ar_member_date (const char *name) (void) f_mtime (arfile, 0); } - val = ar_scan (arname, ar_member_date_1, memname); + lookup_data.name = memname; + lookup_data.member_date = member_date; + found = ar_scan (arname, ar_member_date_1, &lookup_data); free (arname); - return (val <= 0 ? (time_t) -1 : (time_t) val); + /* return 0 (not found) if the archive does not exist or has invalid format. */ + return (found == 1) ? 1 : 0; } /* Set the archive-member NAME's modtime to now. */ |