X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fincremen.c;h=4400008a87787eb172c958e35abcb6ecd411d563;hb=5416153391152c1d894fbae391ba1ccd6f9d1e0e;hp=7f04f80b457eff53cbbdd2d6bda67a60920fa0e2;hpb=05805868f26533141b8b02d5a6449965652ef187;p=chaz%2Ftar diff --git a/src/incremen.c b/src/incremen.c index 7f04f80..4400008 100644 --- a/src/incremen.c +++ b/src/incremen.c @@ -1,11 +1,11 @@ /* GNU dump extensions to tar. Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, - 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any later + Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but @@ -378,7 +378,9 @@ dumpdir_size (const char *p) static int compare_dirnames (const void *first, const void *second) { - return strcmp (*(const char**)first, *(const char**)second); + char const *const *name1 = first; + char const *const *name2 = second; + return strcmp (*name1, *name2); } /* Compare dumpdir array from DIRECTORY with directory listing DIR and @@ -575,7 +577,7 @@ rename_handler (void *data, void *proc_data) { struct directory *prev, *p; - /* Detect eventual cycles and clear DIRF_RENAMED flag, so this entries + /* Detect eventual cycles and clear DIRF_RENAMED flag, so these entries are ignored when hit by this function next time. If the chain forms a cycle, prev points to the entry DIR is renamed from. In this case it still retains DIRF_RENAMED flag, which will be @@ -1381,22 +1383,23 @@ try_purge_directory (char const *directory_name) free (p); p = new_name (directory_name, cur); - if (!(entry = dumpdir_locate (current_stat_info.dumpdir, cur)) - || (*entry == 'D' && S_ISDIR (st.st_mode)) - || (*entry == 'Y' && !S_ISDIR (st.st_mode))) + if (deref_stat (false, p, &st)) { - if (deref_stat (false, p, &st)) + if (errno != ENOENT) /* FIXME: Maybe keep a list of renamed + dirs and check it here? */ { - if (errno != ENOENT) /* FIXME: Maybe keep a list of renamed - dirs and check it here? */ - { - stat_diag (p); - WARN ((0, 0, _("%s: Not purging directory: unable to stat"), - quotearg_colon (p))); - } - continue; + stat_diag (p); + WARN ((0, 0, _("%s: Not purging directory: unable to stat"), + quotearg_colon (p))); } - else if (one_file_system_option && st.st_dev != root_device) + continue; + } + + if (!(entry = dumpdir_locate (current_stat_info.dumpdir, cur)) + || (*entry == 'D' && !S_ISDIR (st.st_mode)) + || (*entry == 'Y' && S_ISDIR (st.st_mode))) + { + if (one_file_system_option && st.st_dev != root_device) { WARN ((0, 0, _("%s: directory is on a different device: not purging"), @@ -1433,6 +1436,7 @@ purge_directory (char const *directory_name) void list_dumpdir (char *buffer, size_t size) { + int state = 0; while (size) { switch (*buffer) @@ -1443,7 +1447,12 @@ list_dumpdir (char *buffer, size_t size) case 'R': case 'T': case 'X': - fprintf (stdlis, "%c ", *buffer); + fprintf (stdlis, "%c", *buffer); + if (state == 0) + { + fprintf (stdlis, " "); + state = 1; + } buffer++; size--; break; @@ -1452,6 +1461,7 @@ list_dumpdir (char *buffer, size_t size) fputc ('\n', stdlis); buffer++; size--; + state = 0; break; default: