summaryrefslogtreecommitdiff
path: root/ar.c
diff options
context:
space:
mode:
Diffstat (limited to 'ar.c')
-rw-r--r--ar.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/ar.c b/ar.c
index 675572a1..d10a8dfa 100644
--- a/ar.c
+++ b/ar.c
@@ -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. */