]> Dogcows Code - chaz/tar/blobdiff - src/buffer.c
(dump_file,dump_file0): First argument is const char*. All callers updated.
[chaz/tar] / src / buffer.c
index 0e7d47beb082c20c56134139e3ae18ad3541972f..cd70c732aa1493c0be8a959bf5fe0fc50ce713bf 100644 (file)
@@ -874,8 +874,9 @@ change_tape_menu (FILE *read_file)
 {
   char *input_buffer = NULL;
   size_t size = 0;
-
-  while (1)
+  bool stop = false;
+  
+  while (!stop)
     {
       fputc ('\007', stderr);
       fprintf (stderr,
@@ -905,7 +906,7 @@ change_tape_menu (FILE *read_file)
        case '?':
          {
            fprintf (stderr, _("\
- n [name]      Give a new file name for the next (and subsequent) volume(s)\n\
+ n name        Give a new file name for the next (and subsequent) volume(s)\n\
  q             Abort tar\n\
  y or newline  Continue operation\n"));
             if (!restrict_option)
@@ -942,8 +943,15 @@ change_tape_menu (FILE *read_file)
              ;
            *cursor = '\0';
 
-           /* FIXME: the following allocation is never reclaimed.  */
-           *archive_name_cursor = xstrdup (name);
+           if (name[0])
+             {
+               /* FIXME: the following allocation is never reclaimed.  */
+               *archive_name_cursor = xstrdup (name);
+               stop = true;
+             }
+           else
+             fprintf (stderr, "%s",
+                      _("File name not specified. Try again.\n"));
          }
          break;
 
@@ -1057,10 +1065,12 @@ new_volume (enum access_mode mode)
 }
 
 static bool
-read_header0 ()
+read_header0 (struct tar_stat_info *info)
 {
-  enum read_header rc = read_header (false);
+  enum read_header rc;
 
+  tar_stat_init (info);
+  rc = read_header_primitive (false, info);
   if (rc == HEADER_SUCCESS)
     {
       set_next_block_after (current_header);
@@ -1075,7 +1085,8 @@ try_new_volume ()
 {
   size_t status;
   union block *header;
-
+  struct tar_stat_info dummy;
+       
   switch (subcommand_option)
     {
     case APPEND_SUBCOMMAND:
@@ -1101,14 +1112,13 @@ try_new_volume ()
   header = find_next_block ();
   if (!header)
     return false;
+
   switch (header->header.typeflag)
     {
     case XGLTYPE:
       {
-       struct tar_stat_info dummy;
-       if (!read_header0 ())
+       if (!read_header0 (&dummy))
          return false;
-       tar_stat_init (&dummy);
        xheader_decode (&dummy); /* decodes values from the global header */
        tar_stat_destroy (&dummy);
        if (!real_s_name)
@@ -1122,8 +1132,9 @@ try_new_volume ()
       }
 
     case GNUTYPE_VOLHDR:
-      if (!read_header0 ())
+      if (!read_header0 (&dummy))
        return false;
+      tar_stat_destroy (&dummy);
       assign_string (&volume_label, current_header->header.name);
       set_next_block_after (header);
       header = find_next_block ();
@@ -1132,8 +1143,9 @@ try_new_volume ()
       /* FALL THROUGH */
 
     case GNUTYPE_MULTIVOL:
-      if (!read_header0 ())
+      if (!read_header0 (&dummy))
        return false;
+      tar_stat_destroy (&dummy);
       assign_string (&continued_file_name, current_header->header.name);
       continued_file_size =
        UINTMAX_FROM_HEADER (current_header->header.size);
@@ -1151,9 +1163,19 @@ try_new_volume ()
       if (!continued_file_name
          || strcmp (continued_file_name, real_s_name))
        {
-         WARN ((0, 0, _("%s is not continued on this volume"),
-                quote (real_s_name)));
-         return false;
+         if ((archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
+             && strlen (real_s_name) >= NAME_FIELD_SIZE
+             && strncmp (continued_file_name, real_s_name,
+                         NAME_FIELD_SIZE) == 0)
+           WARN ((0, 0,
+ _("%s is possibly continued on this volume: header contains truncated name"),
+                  quote (real_s_name)));
+         else
+           {
+             WARN ((0, 0, _("%s is not continued on this volume"),
+                    quote (real_s_name)));
+             return false;
+           }
        }
 
       s = continued_file_size + continued_file_offset;
This page took 0.024242 seconds and 4 git commands to generate.