X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fcreate.c;h=3a0520c31a77eee127f12169e57281ec48d9afbb;hb=2b1bffbad66faab91c3b080b63788d910f68632d;hp=245b6c3a88254d7c265b4e26d8f77b922623b4ce;hpb=f74cab3a936190a65d57c82fea5b1a05affee60a;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index 245b6c3..3a0520c 100644 --- a/src/create.c +++ b/src/create.c @@ -1,7 +1,7 @@ /* Create a tar archive. Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, - 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. Written by John Gilmore, on 1985-08-25. @@ -63,21 +63,22 @@ exclusion_tag_warning (const char *dirname, const char *tagname, const char *message) { if (verbose_option) - WARN ((0, 0, - _("%s: contains a cache directory tag %s; %s"), - quotearg_colon (dirname), - quotearg_n (1, tagname), - message)); + WARNOPT (WARN_CACHEDIR, + (0, 0, + _("%s: contains a cache directory tag %s; %s"), + quotearg_colon (dirname), + quotearg_n (1, tagname), + message)); } enum exclusion_tag_type -check_exclusion_tags (char *dirname, const char **tag_file_name) +check_exclusion_tags (const char *dirname, const char **tag_file_name) { static char *tagname; static size_t tagsize; struct exclusion_tag *tag; size_t dlen = strlen (dirname); - int addslash = dirname[dlen-1] != '/'; + int addslash = !ISSLASH (dirname[dlen-1]); char *nptr = NULL; for (tag = exclusion_tags; tag; tag = tag->next) @@ -1072,12 +1073,13 @@ dump_regular_file (int fd, struct tar_stat_info *st) { char buf[UINTMAX_STRSIZE_BOUND]; memset (blk->buffer + count, 0, bufsize - count); - WARN ((0, 0, - ngettext ("%s: File shrank by %s byte; padding with zeros", - "%s: File shrank by %s bytes; padding with zeros", - size_left), - quotearg_colon (st->orig_file_name), - STRINGIFY_BIGINT (size_left, buf))); + WARNOPT (WARN_FILE_SHRANK, + (0, 0, + ngettext ("%s: File shrank by %s byte; padding with zeros", + "%s: File shrank by %s bytes; padding with zeros", + size_left), + quotearg_colon (st->orig_file_name), + STRINGIFY_BIGINT (size_left, buf))); if (! ignore_failed_read_option) exit_status = TAREXIT_DIFFERS; pad_archive (size_left - (bufsize - count)); @@ -1114,11 +1116,12 @@ dump_dir0 (char *directory, if (!incremental_option) finish_header (st, blk, block_ordinal); - else if (gnu_list_name->dir_contents) + else if (gnu_list_name->directory) { if (archive_format == POSIX_FORMAT) { - xheader_store ("GNU.dumpdir", st, gnu_list_name->dir_contents); + xheader_store ("GNU.dumpdir", st, + safe_directory_contents (gnu_list_name->directory)); finish_header (st, blk, block_ordinal); } else @@ -1130,11 +1133,8 @@ dump_dir0 (char *directory, const char *buffer, *p_buffer; block_ordinal = current_block_ordinal (); - buffer = gnu_list_name->dir_contents; - if (buffer) - totsize = dumpdir_size (buffer); - else - totsize = 0; + buffer = safe_directory_contents (gnu_list_name->directory); + totsize = dumpdir_size (buffer); OFF_TO_CHARS (totsize, blk->header.size); finish_header (st, blk, block_ordinal); p_buffer = buffer; @@ -1173,9 +1173,10 @@ dump_dir0 (char *directory, && parent_device != st->stat.st_dev) { if (verbose_option) - WARN ((0, 0, - _("%s: file is on a different filesystem; not dumped"), - quotearg_colon (st->orig_file_name))); + WARNOPT (WARN_XDEV, + (0, 0, + _("%s: file is on a different filesystem; not dumped"), + quotearg_colon (st->orig_file_name))); } else { @@ -1300,8 +1301,8 @@ create_archive (void) } memcpy (buffer, p, plen); if (! ISSLASH (buffer[plen - 1])) - buffer[plen++] = '/'; - q = gnu_list_name->dir_contents; + buffer[plen++] = DIRECTORY_SEPARATOR; + q = directory_contents (gnu_list_name->directory); if (q) while (*q) { @@ -1358,8 +1359,9 @@ compare_links (void const *entry1, void const *entry2) static void unknown_file_error (char const *p) { - WARN ((0, 0, _("%s: Unknown file type; file ignored"), - quotearg_colon (p))); + WARNOPT (WARN_FILE_IGNORED, + (0, 0, _("%s: Unknown file type; file ignored"), + quotearg_colon (p))); if (!ignore_failed_read_option) exit_status = TAREXIT_FAILURE; } @@ -1377,7 +1379,7 @@ static Hash_table *link_table; static bool dump_hard_link (struct tar_stat_info *st) { - if (link_table && st->stat.st_nlink > 1) + if (link_table && (st->stat.st_nlink > 1 || remove_files_option)) { struct link lp; struct link *duplicate; @@ -1468,7 +1470,7 @@ check_links (void) { if (lp->nlink) { - WARN ((0, 0, _("Missing links to %s.\n"), quote (lp->name))); + WARN ((0, 0, _("Missing links to %s."), quote (lp->name))); } } } @@ -1529,26 +1531,28 @@ dump_file0 (struct tar_stat_info *st, const char *p, /* See if we want only new files, and check if this one is too old to put in the archive. - + This check is omitted if incremental_option is set *and* the requested file is not explicitely listed in the command line. */ - + if (!(incremental_option && !is_individual_file (p)) && !S_ISDIR (st->stat.st_mode) && OLDER_TAR_STAT_TIME (*st, m) && (!after_date_option || OLDER_TAR_STAT_TIME (*st, c))) { if (!incremental_option && verbose_option) - WARN ((0, 0, _("%s: file is unchanged; not dumped"), - quotearg_colon (p))); + WARNOPT (WARN_FILE_UNCHANGED, + (0, 0, _("%s: file is unchanged; not dumped"), + quotearg_colon (p))); return; } /* See if we are trying to dump the archive. */ if (sys_file_is_archive (st)) { - WARN ((0, 0, _("%s: file is the archive; not dumped"), - quotearg_colon (p))); + WARNOPT (WARN_IGNORE_ARCHIVE, + (0, 0, _("%s: file is the archive; not dumped"), + quotearg_colon (p))); return; } @@ -1577,8 +1581,9 @@ dump_file0 (struct tar_stat_info *st, const char *p, if (fd < 0) { if (!top_level && errno == ENOENT) - WARN ((0, 0, _("%s: File removed before we read it"), - quotearg_colon (p))); + WARNOPT (WARN_FILE_REMOVED, + (0, 0, _("%s: File removed before we read it"), + quotearg_colon (p))); else open_diag (p); return; @@ -1663,8 +1668,9 @@ dump_file0 (struct tar_stat_info *st, const char *p, && !(remove_files_option && is_dir)) || original_size < final_stat.st_size) { - WARN ((0, 0, _("%s: file changed as we read it"), - quotearg_colon (p))); + WARNOPT (WARN_FILE_CHANGED, + (0, 0, _("%s: file changed as we read it"), + quotearg_colon (p))); if (exit_status == TAREXIT_SUCCESS) exit_status = TAREXIT_DIFFERS; } @@ -1743,12 +1749,14 @@ dump_file0 (struct tar_stat_info *st, const char *p, type = FIFOTYPE; else if (S_ISSOCK (st->stat.st_mode)) { - WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p))); + WARNOPT (WARN_FILE_IGNORED, + (0, 0, _("%s: socket ignored"), quotearg_colon (p))); return; } else if (S_ISDOOR (st->stat.st_mode)) { - WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p))); + WARNOPT (WARN_FILE_IGNORED, + (0, 0, _("%s: door ignored"), quotearg_colon (p))); return; } else