/* Update a tar archive.
- Copyright (C) 1988, 1992, 1994, 1996, 1997 Free Software Foundation, Inc.
+
+ Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003
+ 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
they're on raw tape or something like that, it'll probably lose... */
#include "system.h"
+#include <quotearg.h>
#include "common.h"
/* FIXME: This module should not directly handle the following variable,
first part of the record. */
char *output_start;
-/*------------------------------------------------------------------------.
-| Catenate file PATH to the archive without creating a header for it. It |
-| had better be a tar file or the archive is screwed. |
-`------------------------------------------------------------------------*/
-
+/* Catenate file PATH 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)
{
if (handle < 0)
{
- ERROR ((0, errno, _("Cannot open file %s"), path));
+ open_error (path);
return;
}
if (fstat (handle, &stat_data) != 0)
- ERROR ((0, errno, "%s", path));
+ stat_error (path);
else
{
off_t bytes_left = stat_data.st_size;
status = safe_read (handle, start->buffer, buffer_size);
if (status < 0)
- FATAL_ERROR ((0, errno,
- _("Read error at byte %s reading %lu bytes in file %s"),
- STRINGIFY_BIGINT (stat_data.st_size - bytes_left,
- buf),
- (unsigned long) buffer_size, path));
+ read_fatal_details (path, stat_data.st_size - bytes_left,
+ buffer_size);
if (status == 0)
- FATAL_ERROR ((0, 0, _("%s: File shrunk by %s bytes, (yark!)"),
- path, STRINGIFY_BIGINT (bytes_left, buf)));
+ FATAL_ERROR ((0, 0, _("%s: File shrank by %s bytes"),
+ quotearg_colon (path),
+ STRINGIFY_BIGINT (bytes_left, buf)));
bytes_left -= status;
}
}
- close (handle);
+ if (close (handle) != 0)
+ close_error (path);
}
-/*-----------------------------------------------------------------------.
-| Implement the 'r' (add files to end of archive), and 'u' (add files to |
-| end of archive if they arent there, or are more up to date than the |
-| version in the archive.) commands. |
-`-----------------------------------------------------------------------*/
-
+/* Implement the 'r' (add files to end of archive), and 'u' (add files
+ to end of archive if they aren't there, or are more up to date than
+ the version in the archive) commands. */
void
update_archive (void)
{
int found_end = 0;
name_gather ();
- if (subcommand_option == UPDATE_SUBCOMMAND)
- name_expand ();
open_archive (ACCESS_UPDATE);
while (!found_end)
{
- enum read_header status = read_header ();
+ enum read_header status = read_header (false);
switch (status)
{
case HEADER_STILL_UNREAD:
+ case HEADER_SUCCESS_EXTENDED:
abort ();
case HEADER_SUCCESS:
struct name *name;
if (subcommand_option == UPDATE_SUBCOMMAND
- && (name = name_scan (current_file_name), name))
+ && (name = name_scan (current_stat_info.file_name), name))
{
- struct stat stat_data;
+ struct stat s;
enum archive_format unused;
- decode_header (current_header, ¤t_stat, &unused, 0);
- if (stat (current_file_name, &stat_data) < 0)
- ERROR ((0, errno, _("Cannot stat %s"), current_file_name));
- else if (current_stat.st_mtime >= stat_data.st_mtime)
- name->found = 1;
+ 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
+ && s.st_mtime <= current_stat_info.stat.st_mtime)
+ add_avoided_name (current_stat_info.file_name);
}
- set_next_block_after (current_header);
- if (current_header->oldgnu_header.isextended)
- skip_extended_headers ();
- skip_file (current_stat.st_size);
+ skip_member ();
break;
}
break;
case HEADER_END_OF_FILE:
+ case HEADER_SUCCESS_EXTENDED:
abort ();
}
break;
if (subcommand_option == CAT_SUBCOMMAND)
append_file (path);
else
- dump_file (path, (dev_t) -1, 1);
+ dump_file (path, 1, (dev_t) 0);
}
}