/* Update a tar archive.
- Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003
- Free Software Foundation, Inc.
+ Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
+ 2004 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
of the archive. No attempt is made to record the reads from the args; if
they're on raw tape or something like that, it'll probably lose... */
-#include "system.h"
+#include <system.h>
#include <quotearg.h>
#include "common.h"
/* We've hit the end of the old stuff, and its time to start writing new
stuff to the tape. This involves seeking back one record and
re-writing the current record (which has been changed).
- FIXME: Either eliminate it or move it to common.h.
+ FIXME: Either eliminate it or move it to common.h.
*/
bool time_to_start_writing;
first part of the record. */
char *output_start;
-/* Catenate file PATH to the archive without creating a header for it.
+/* Catenate file FILE_NAME to the archive without creating a header for it.
It had better be a tar file or the archive is screwed. */
static void
-append_file (char *path)
+append_file (char *file_name)
{
- int handle = open (path, O_RDONLY | O_BINARY);
+ int handle = open (file_name, O_RDONLY | O_BINARY);
struct stat stat_data;
if (handle < 0)
{
- open_error (path);
+ open_error (file_name);
return;
}
if (fstat (handle, &stat_data) != 0)
- stat_error (path);
+ stat_error (file_name);
else
{
off_t bytes_left = stat_data.st_size;
{
union block *start = find_next_block ();
size_t buffer_size = available_space_after (start);
- ssize_t status;
+ size_t status;
char buf[UINTMAX_STRSIZE_BOUND];
if (bytes_left < buffer_size)
}
status = safe_read (handle, start->buffer, buffer_size);
- if (status < 0)
- read_fatal_details (path, stat_data.st_size - bytes_left,
+ if (status == SAFE_READ_ERROR)
+ read_fatal_details (file_name, stat_data.st_size - bytes_left,
buffer_size);
if (status == 0)
FATAL_ERROR ((0, 0,
ngettext ("%s: File shrank by %s byte",
"%s: File shrank by %s bytes",
bytes_left),
- quotearg_colon (path),
+ quotearg_colon (file_name),
STRINGIFY_BIGINT (bytes_left, buf)));
bytes_left -= status;
}
if (close (handle) != 0)
- close_error (path);
+ close_error (file_name);
}
/* Implement the 'r' (add files to end of archive), and 'u' (add files
update_archive (void)
{
enum read_header previous_status = HEADER_STILL_UNREAD;
- int found_end = 0;
+ bool found_end = false;
name_gather ();
open_archive (ACCESS_UPDATE);
+ xheader_write_global ();
while (!found_end)
{
{
struct name *name;
+ decode_header (current_header, ¤t_stat_info,
+ ¤t_format, 0);
+ archive_format = current_format;
+
if (subcommand_option == UPDATE_SUBCOMMAND
- && (name = name_scan (current_stat_info.file_name), name))
+ && (name = name_scan (current_stat_info.file_name)) != NULL)
{
struct stat s;
- enum archive_format unused;
- decode_header (current_header, ¤t_stat_info, &unused, 0);
chdir_do (name->change_dir);
- if (deref_stat (dereference_option, current_stat_info.file_name, &s) == 0
+ if (deref_stat (dereference_option,
+ current_stat_info.file_name, &s) == 0
&& s.st_mtime <= current_stat_info.stat.st_mtime)
add_avoided_name (current_stat_info.file_name);
}
+
skip_member ();
break;
}
case HEADER_ZERO_BLOCK:
current_block = current_header;
- found_end = 1;
+ found_end = true;
break;
case HEADER_END_OF_FILE:
- found_end = 1;
+ found_end = true;
break;
case HEADER_FAILURE:
break;
}
+ tar_stat_destroy (¤t_stat_info);
+ xheader_destroy (&extended_header);
previous_status = status;
}
output_start = current_block->buffer;
{
- char *path;
+ char *file_name;
- while (path = name_from_list (), path)
+ while ((file_name = name_from_list ()) != NULL)
{
- if (excluded_name (path))
+ if (excluded_name (file_name))
continue;
- if (interactive_option && !confirm ("add", path))
+ if (interactive_option && !confirm ("add", file_name))
continue;
if (subcommand_option == CAT_SUBCOMMAND)
- append_file (path);
+ append_file (file_name);
else
- dump_file (path, 1, (dev_t) 0);
+ dump_file (file_name, 1, (dev_t) 0);
}
}