X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcreate.c;h=e33122a4ce07ee34a199255a55a4d5a26e74bcb7;hb=51aee274e892923a3f8fdb774e4f6b90bce47437;hp=3a0520c31a77eee127f12169e57281ec48d9afbb;hpb=2b1bffbad66faab91c3b080b63788d910f68632d;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index 3a0520c..e33122a 100644 --- a/src/create.c +++ b/src/create.c @@ -1092,7 +1092,7 @@ dump_regular_file (int fd, struct tar_stat_info *st) static void dump_dir0 (char *directory, - struct tar_stat_info *st, int top_level, dev_t parent_device) + struct tar_stat_info *st, bool top_level, dev_t parent_device) { dev_t our_device = st->stat.st_dev; const char *tag_file_name; @@ -1210,7 +1210,7 @@ dump_dir0 (char *directory, } strcpy (name_buf + name_len, entry); if (!excluded_name (name_buf)) - dump_file (name_buf, 0, our_device); + dump_file (name_buf, false, our_device); } free (name_buf); @@ -1224,7 +1224,7 @@ dump_dir0 (char *directory, name_buf = xmalloc (name_size); strcpy (name_buf, st->orig_file_name); strcat (name_buf, tag_file_name); - dump_file (name_buf, 0, our_device); + dump_file (name_buf, false, our_device); free (name_buf); break; @@ -1250,7 +1250,8 @@ ensure_slash (char **pstr) } static bool -dump_dir (int fd, struct tar_stat_info *st, int top_level, dev_t parent_device) +dump_dir (int fd, struct tar_stat_info *st, bool top_level, + dev_t parent_device) { char *directory = fdsavedir (fd); if (!directory) @@ -1271,7 +1272,7 @@ dump_dir (int fd, struct tar_stat_info *st, int top_level, dev_t parent_device) void create_archive (void) { - const char *p; + struct name const *p; open_archive (ACCESS_WRITE); buffer_write_global_xheader (); @@ -1285,21 +1286,21 @@ create_archive (void) collect_and_sort_names (); while ((p = name_from_list ()) != NULL) - if (!excluded_name (p)) - dump_file (p, -1, (dev_t) 0); + if (!excluded_name (p->name)) + dump_file (p->name, p->cmdline, (dev_t) 0); blank_name_list (); while ((p = name_from_list ()) != NULL) - if (!excluded_name (p)) + if (!excluded_name (p->name)) { - size_t plen = strlen (p); + size_t plen = strlen (p->name); if (buffer_size <= plen) { while ((buffer_size *= 2) <= plen) continue; buffer = xrealloc (buffer, buffer_size); } - memcpy (buffer, p, plen); + memcpy (buffer, p->name, plen); if (! ISSLASH (buffer[plen - 1])) buffer[plen++] = DIRECTORY_SEPARATOR; q = directory_contents (gnu_list_name->directory); @@ -1316,7 +1317,7 @@ create_archive (void) buffer = xrealloc (buffer, buffer_size); } strcpy (buffer + plen, q + 1); - dump_file (buffer, -1, (dev_t) 0); + dump_file (buffer, false, (dev_t) 0); } q += qlen + 1; } @@ -1325,9 +1326,10 @@ create_archive (void) } else { - while ((p = name_next (1)) != NULL) - if (!excluded_name (p)) - dump_file (p, 1, (dev_t) 0); + const char *name; + while ((name = name_next (1)) != NULL) + if (!excluded_name (name)) + dump_file (name, true, (dev_t) 0); } write_eot (); @@ -1475,7 +1477,6 @@ check_links (void) } } - /* Dump a single file, recursing on directories. P is the file name to dump. TOP_LEVEL tells whether this is a top-level call; zero means no, positive means yes, and negative means the top level @@ -1487,7 +1488,7 @@ check_links (void) static void dump_file0 (struct tar_stat_info *st, const char *p, - int top_level, dev_t parent_device) + bool top_level, dev_t parent_device) { union block *header; char type; @@ -1508,7 +1509,7 @@ dump_file0 (struct tar_stat_info *st, const char *p, if (deref_stat (dereference_option, p, &st->stat) != 0) { - stat_diag (p); + file_removed_diag (p, top_level, stat_diag); return; } st->archive_file_size = original_size = st->stat.st_size; @@ -1580,12 +1581,7 @@ dump_file0 (struct tar_stat_info *st, const char *p, : 0))); if (fd < 0) { - if (!top_level && errno == ENOENT) - WARNOPT (WARN_FILE_REMOVED, - (0, 0, _("%s: File removed before we read it"), - quotearg_colon (p))); - else - open_diag (p); + file_removed_diag (p, top_level, open_diag); return; } } @@ -1655,7 +1651,7 @@ dump_file0 (struct tar_stat_info *st, const char *p, : fstat (fd, &final_stat)) != 0) { - stat_diag (p); + file_removed_diag (p, top_level, stat_diag); ok = false; } } @@ -1713,7 +1709,7 @@ dump_file0 (struct tar_stat_info *st, const char *p, size = readlink (p, buffer, linklen + 1); if (size < 0) { - readlink_diag (p); + file_removed_diag (p, top_level, readlink_diag); return; } buffer[size] = '\0'; @@ -1795,7 +1791,7 @@ dump_file0 (struct tar_stat_info *st, const char *p, } void -dump_file (const char *p, int top_level, dev_t parent_device) +dump_file (const char *p, bool top_level, dev_t parent_device) { struct tar_stat_info st; tar_stat_init (&st);