]> Dogcows Code - chaz/tar/blobdiff - src/create.c
New actions: bell and ttyout
[chaz/tar] / src / create.c
index 1b31a3d319cdf92587970ec6c12b1bab9fb0d558..de81639e2244f7c89afd0d6e597f77c4624adcc2 100644 (file)
@@ -7,7 +7,7 @@
 
    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
 
    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
    version.
 
    This program is distributed in the hope that it will be useful, but
@@ -58,7 +58,7 @@ add_exclusion_tag (const char *name, enum exclusion_tag_type type,
   exclusion_tags = tag;
 }
 
   exclusion_tags = tag;
 }
 
-static void
+void
 exclusion_tag_warning (const char *dirname, const char *tagname,
                       const char *message)
 {
 exclusion_tag_warning (const char *dirname, const char *tagname,
                       const char *message)
 {
@@ -70,19 +70,19 @@ exclusion_tag_warning (const char *dirname, const char *tagname,
           message));
 }
 
           message));
 }
 
-static enum exclusion_tag_type 
+enum exclusion_tag_type 
 check_exclusion_tags (char *dirname, const char **tag_file_name)
 {
   static char *tagname;
   static size_t tagsize;
   struct exclusion_tag *tag;
   size_t dlen = strlen (dirname);
 check_exclusion_tags (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] != '/';
   char *nptr = NULL;
   char *nptr = NULL;
-  char *ret = NULL;
   
   for (tag = exclusion_tags; tag; tag = tag->next)
     {
   
   for (tag = exclusion_tags; tag; tag = tag->next)
     {
-      size_t size = dlen + tag->length + 1;
+      size_t size = dlen + addslash + tag->length + 1;
       if (size > tagsize)
        {
          tagsize = size;
       if (size > tagsize)
        {
          tagsize = size;
@@ -93,6 +93,8 @@ check_exclusion_tags (char *dirname, const char **tag_file_name)
        {
          strcpy (tagname, dirname);
          nptr = tagname + dlen;
        {
          strcpy (tagname, dirname);
          nptr = tagname + dlen;
+         if (addslash)
+           *nptr++ = '/';
        }
       strcpy (nptr, tag->name);
       if (access (tagname, F_OK) == 0
        }
       strcpy (nptr, tag->name);
       if (access (tagname, F_OK) == 0
@@ -1064,8 +1066,7 @@ dump_regular_file (int fd, struct tar_stat_info *st)
          return dump_status_short;
        }
       size_left -= count;
          return dump_status_short;
        }
       size_left -= count;
-      if (count)
-       set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE);
+      set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE);
 
       if (count != bufsize)
        {
 
       if (count != bufsize)
        {
@@ -1079,7 +1080,7 @@ dump_regular_file (int fd, struct tar_stat_info *st)
                 STRINGIFY_BIGINT (size_left, buf)));
          if (! ignore_failed_read_option) 
            exit_status = TAREXIT_DIFFERS;
                 STRINGIFY_BIGINT (size_left, buf)));
          if (! ignore_failed_read_option) 
            exit_status = TAREXIT_DIFFERS;
-         pad_archive (size_left - (bufsize-count));
+         pad_archive (size_left - (bufsize - count));
          return dump_status_short;
        }
     }
          return dump_status_short;
        }
     }
@@ -1183,8 +1184,11 @@ dump_dir0 (char *directory,
       
       switch (check_exclusion_tags (st->orig_file_name, &tag_file_name))
        {
       
       switch (check_exclusion_tags (st->orig_file_name, &tag_file_name))
        {
-       case exclusion_tag_none:
        case exclusion_tag_all:
        case exclusion_tag_all:
+         /* Handled in dump_file0 */
+         break;
+         
+       case exclusion_tag_none:
          {
            char const *entry;
            size_t entry_len;
          {
            char const *entry;
            size_t entry_len;
@@ -1418,6 +1422,8 @@ dump_hard_link (struct tar_stat_info *st)
 static void
 file_count_links (struct tar_stat_info *st)
 {
 static void
 file_count_links (struct tar_stat_info *st)
 {
+  if (hard_dereference_option)
+    return;
   if (st->stat.st_nlink > 1)
     {
       struct link *duplicate;
   if (st->stat.st_nlink > 1)
     {
       struct link *duplicate;
This page took 0.022287 seconds and 4 git commands to generate.