X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fnames.c;h=85049b12efb0c552d5f2d1d511d65202ac7ec531;hb=dd549cc257c7ec9e0780f649ac8ae384a84baba0;hp=94663d5bfe672ae785ce9bbd9e2a7bd37ad8b3a9;hpb=1fe0c83de46968700206536b626ef82d6e59076c;p=chaz%2Ftar diff --git a/src/names.c b/src/names.c index 94663d5..85049b1 100644 --- a/src/names.c +++ b/src/names.c @@ -225,7 +225,7 @@ struct name_elt /* A name_array element. */ int matching_flags;/* fnmatch options if type == NELT_FMASK */ struct /* File, if type == NELT_FILE */ { - const char *name;/* File name */ + const char *name;/* File name */ int term; /* File name terminator in the list */ FILE *fp; } file; @@ -340,29 +340,51 @@ struct file_id_list struct file_id_list *next; ino_t ino; dev_t dev; + const char *from_file; }; static struct file_id_list *file_id_list; +/* Return the name of the file from which the file names and options + are being read. +*/ +static const char * +file_list_name (void) +{ + struct name_elt *elt; + + for (elt = name_head; elt; elt = elt->next) + if (elt->type == NELT_FILE && elt->v.file.fp) + return elt->v.file.name; + return _("command line"); +} + static int add_file_id (const char *filename) { struct file_id_list *p; struct stat st; + const char *reading_from; if (stat (filename, &st)) stat_fatal (filename); + reading_from = file_list_name (); for (p = file_id_list; p; p = p->next) if (p->ino == st.st_ino && p->dev == st.st_dev) { - ERROR ((0, 0, _("%s: file list already read"), - quotearg_colon (filename))); + int oldc = set_char_quoting (NULL, ':', 1); + ERROR ((0, 0, + _("%s: file list requested from %s already read from %s"), + quotearg_n (0, filename), + reading_from, p->from_file)); + set_char_quoting (NULL, ':', oldc); return 1; } p = xmalloc (sizeof *p); p->next = file_id_list; p->ino = st.st_ino; p->dev = st.st_dev; + p->from_file = reading_from; file_id_list = p; return 0; } @@ -385,7 +407,7 @@ read_name_from_file (struct name_elt *ent) size_t counter = 0; FILE *fp = ent->v.file.fp; int term = ent->v.file.term; - + for (c = getc (fp); c != EOF && c != term; c = getc (fp)) { if (counter == name_buffer_length) @@ -414,7 +436,7 @@ handle_option (const char *str) { struct wordsplit ws; int i; - + while (*str && isspace (*str)) ; if (*str != '-') @@ -428,7 +450,7 @@ handle_option (const char *str) more_options (ws.ws_wordc+ws.ws_offs, ws.ws_wordv); for (i = 0; i < ws.ws_wordc+ws.ws_offs; i++) ws.ws_wordv[i] = NULL; - + wordsplit_free (&ws); return 0; } @@ -454,14 +476,14 @@ read_next_name (struct name_elt *ent, struct name_elt *ret) open_fatal (ent->v.file.name); } } - + while (1) { switch (read_name_from_file (ent)) { case file_list_skip: continue; - + case file_list_zero: WARNOPT (WARN_FILENAME_WITH_NULS, (0, 0, N_("%s: file name read contains nul character"), @@ -477,7 +499,7 @@ read_next_name (struct name_elt *ent, struct name_elt *ret) ret->type = NELT_NAME; ret->v.name = name_buffer; return 0; - + case file_list_end: if (strcmp (ent->v.file.name, "-")) fclose (ent->v.file.fp); @@ -486,7 +508,7 @@ read_next_name (struct name_elt *ent, struct name_elt *ret) return 1; } } -} +} static void copy_name (struct name_elt *ep) @@ -542,17 +564,17 @@ name_next_elt (int change_dirs) case NELT_NOOP: name_list_advance (); break; - + case NELT_FMASK: matching_flags = ep->v.matching_flags; name_list_advance (); continue; - + case NELT_FILE: if (read_next_name (ep, &entry) == 0) return &entry; continue; - + case NELT_CHDIR: if (change_dirs) {