]> Dogcows Code - chaz/tar/blobdiff - src/create.c
tar: remove unused macros
[chaz/tar] / src / create.c
index f526b33053c0837d51d1efc12f8c6cf83577ae54..9a4a282b7f09b94180702ee0c044f0447e7d28c2 100644 (file)
@@ -30,7 +30,7 @@ struct link
   {
     dev_t dev;
     ino_t ino;
-    size_t nlink;
+    nlink_t nlink;
     char name[1];
   };
 
@@ -71,7 +71,7 @@ exclusion_tag_warning (const char *dirname, const char *tagname,
              message));
 }
 
-enum exclusion_tag_type 
+enum exclusion_tag_type
 check_exclusion_tags (const char *dirname, const char **tag_file_name)
 {
   static char *tagname;
@@ -80,7 +80,7 @@ check_exclusion_tags (const char *dirname, const char **tag_file_name)
   size_t dlen = strlen (dirname);
   int addslash = !ISSLASH (dirname[dlen-1]);
   size_t noff = 0;
-  
+
   for (tag = exclusion_tags; tag; tag = tag->next)
     {
       size_t size = dlen + addslash + tag->length + 1;
@@ -214,6 +214,14 @@ to_base256 (int negative, uintmax_t value, char *where, size_t size)
   while (i);
 }
 
+#define GID_TO_CHARS(val, where) gid_to_chars (val, where, sizeof (where))
+#define MAJOR_TO_CHARS(val, where) major_to_chars (val, where, sizeof (where))
+#define MINOR_TO_CHARS(val, where) minor_to_chars (val, where, sizeof (where))
+#define MODE_TO_CHARS(val, where) mode_to_chars (val, where, sizeof (where))
+#define UID_TO_CHARS(val, where) uid_to_chars (val, where, sizeof (where))
+
+#define UNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
+#define GNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
 
 static bool
 to_chars (int negative, uintmax_t value, size_t valsize,
@@ -263,7 +271,7 @@ to_chars_subst (int negative, int gnu_format, uintmax_t value, size_t valsize,
 
         1. In OLDGNU_FORMAT all strings in a tar header end in \0
         2. Incremental archives use oldgnu_header.
-        
+
         Apart from this they are completely identical. */
       uintmax_t s = (negsub &= archive_format == GNU_FORMAT) ? - sub : sub;
       char subbuf[UINTMAX_STRSIZE_BOUND + 1];
@@ -368,25 +376,25 @@ gid_substitute (int *negative)
   return r;
 }
 
-bool
+static bool
 gid_to_chars (gid_t v, char *p, size_t s)
 {
   return to_chars (v < 0, (uintmax_t) v, sizeof v, gid_substitute, p, s, "gid_t");
 }
 
-bool
+static bool
 major_to_chars (major_t v, char *p, size_t s)
 {
   return to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "major_t");
 }
 
-bool
+static bool
 minor_to_chars (minor_t v, char *p, size_t s)
 {
   return to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "minor_t");
 }
 
-bool
+static bool
 mode_to_chars (mode_t v, char *p, size_t s)
 {
   /* In the common case where the internal and external mode bits are the same,
@@ -432,12 +440,6 @@ off_to_chars (off_t v, char *p, size_t s)
   return to_chars (v < 0, (uintmax_t) v, sizeof v, 0, p, s, "off_t");
 }
 
-bool
-size_to_chars (size_t v, char *p, size_t s)
-{
-  return to_chars (0, (uintmax_t) v, sizeof v, 0, p, s, "size_t");
-}
-
 bool
 time_to_chars (time_t v, char *p, size_t s)
 {
@@ -460,19 +462,19 @@ uid_substitute (int *negative)
   return r;
 }
 
-bool
+static bool
 uid_to_chars (uid_t v, char *p, size_t s)
 {
   return to_chars (v < 0, (uintmax_t) v, sizeof v, uid_substitute, p, s, "uid_t");
 }
 
-bool
+static bool
 uintmax_to_chars (uintmax_t v, char *p, size_t s)
 {
   return to_chars (0, v, sizeof v, 0, p, s, "uintmax_t");
 }
 
-void
+static void
 string_to_chars (char const *str, char *p, size_t s)
 {
   tar_copy_str (p, str, s);
@@ -487,7 +489,7 @@ string_to_chars (char const *str, char *p, size_t s)
    a) it is empty *and* world-readable, or
    b) current archive is /dev/null */
 
-bool
+static bool
 file_dumpable_p (struct tar_stat_info *st)
 {
   if (dev_null_output)
@@ -618,7 +620,7 @@ write_ustar_long_name (const char *name)
   size_t length = strlen (name);
   size_t i, nlen;
   union block *header;
-  
+
   if (length > PREFIX_FIELD_SIZE + NAME_FIELD_SIZE + 1)
     {
       ERROR ((0, 0, _("%s: file name is too long (max %d); not dumped"),
@@ -713,7 +715,7 @@ write_extended (bool global, struct tar_stat_info *st, union block *old_header)
   char *p;
   int type;
   time_t t;
-  
+
   if (st->xhdr.buffer || st->xhdr.stk == NULL)
     return old_header;
 
@@ -1041,7 +1043,7 @@ dump_regular_file (int fd, struct tar_stat_info *st)
   while (size_left > 0)
     {
       size_t bufsize, count;
-      
+
       blk = find_next_block ();
 
       bufsize = available_space_after (blk);
@@ -1077,7 +1079,7 @@ dump_regular_file (int fd, struct tar_stat_info *st)
                              size_left),
                    quotearg_colon (st->orig_file_name),
                    STRINGIFY_BIGINT (size_left, buf)));
-         if (! ignore_failed_read_option) 
+         if (! ignore_failed_read_option)
            set_exit_status (TAREXIT_DIFFERS);
          pad_archive (size_left - (bufsize - count));
          return dump_status_short;
@@ -1126,7 +1128,7 @@ dump_dir0 (char *directory,
          size_t bufsize;
          ssize_t count;
          const char *buffer, *p_buffer;
-         
+
          block_ordinal = current_block_ordinal ();
          buffer = safe_directory_contents (gnu_list_name->directory);
          totsize = dumpdir_size (buffer);
@@ -1134,7 +1136,7 @@ dump_dir0 (char *directory,
          finish_header (st, blk, block_ordinal);
          p_buffer = buffer;
          size_left = totsize;
-         
+
          mv_begin_write (st->file_name, totsize, totsize);
          while (size_left > 0)
            {
@@ -1173,13 +1175,13 @@ dump_dir0 (char *directory,
     {
       char *name_buf;
       size_t name_size;
-      
+
       switch (check_exclusion_tags (st->orig_file_name, &tag_file_name))
        {
        case exclusion_tag_all:
          /* Handled in dump_file0 */
          break;
-         
+
        case exclusion_tag_none:
          {
            char const *entry;
@@ -1203,7 +1205,7 @@ dump_dir0 (char *directory,
                if (!excluded_name (name_buf))
                  dump_file (name_buf, false, our_device);
              }
-           
+
            free (name_buf);
          }
          break;
@@ -1218,7 +1220,7 @@ dump_dir0 (char *directory,
          dump_file (name_buf, false, our_device);
          free (name_buf);
          break;
-      
+
        case exclusion_tag_under:
          exclusion_tag_warning (st->orig_file_name, tag_file_name,
                                 _("contents not dumped"));
@@ -1257,6 +1259,12 @@ dump_dir (int fd, struct tar_stat_info *st, bool top_level,
   return true;
 }
 
+\f
+/* Number of links a file can have without having to be entered into
+   the link table.  Typically this is 1, but in trickier circumstances
+   it is 0.  */
+static nlink_t trivial_link_count;
+
 \f
 /* Main functions of this module.  */
 
@@ -1265,6 +1273,8 @@ create_archive (void)
 {
   struct name const *p;
 
+  trivial_link_count = name_count <= 1 && ! dereference_option;
+
   open_archive (ACCESS_WRITE);
   buffer_write_global_xheader ();
 
@@ -1372,7 +1382,8 @@ static Hash_table *link_table;
 static bool
 dump_hard_link (struct tar_stat_info *st)
 {
-  if (link_table && (st->stat.st_nlink > 1 || remove_files_option))
+  if (link_table
+      && (trivial_link_count < st->stat.st_nlink || remove_files_option))
     {
       struct link lp;
       struct link *duplicate;
@@ -1419,7 +1430,7 @@ file_count_links (struct tar_stat_info *st)
 {
   if (hard_dereference_option)
     return;
-  if (st->stat.st_nlink > 1)
+  if (trivial_link_count < st->stat.st_nlink)
     {
       struct link *duplicate;
       char *linkname = NULL;
@@ -1427,7 +1438,7 @@ file_count_links (struct tar_stat_info *st)
 
       assign_string (&linkname, st->orig_file_name);
       transform_name (&linkname, XFORM_LINK);
-      
+
       lp = xmalloc (offsetof (struct link, name)
                                 + strlen (linkname) + 1);
       lp->ino = st->stat.st_ino;
@@ -1435,13 +1446,13 @@ file_count_links (struct tar_stat_info *st)
       lp->nlink = st->stat.st_nlink;
       strcpy (lp->name, linkname);
       free (linkname);
-      
+
       if (! ((link_table
              || (link_table = hash_initialize (0, 0, hash_link,
                                                compare_links, 0)))
             && (duplicate = hash_insert (link_table, lp))))
        xalloc_die ();
-      
+
       if (duplicate != lp)
        abort ();
       lp->nlink--;
@@ -1523,10 +1534,10 @@ 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)
@@ -1589,7 +1600,7 @@ dump_file0 (struct tar_stat_info *st, const char *p,
                close (fd);
              return;
            }
-         
+
          ok = dump_dir (fd, st, top_level, parent_device);
 
          /* dump_dir consumes FD if successful.  */
This page took 0.032333 seconds and 4 git commands to generate.