/* Extract files from a tar archive.
- Copyright (C) 1988, 92,93,94,96,97,98, 1999 Free Software Foundation, Inc.
+ Copyright 1988, 92,93,94,96,97,98, 1999 Free Software Foundation, Inc.
Written by John Gilmore, on 1985-11-19.
This program is free software; you can redistribute it and/or modify it
#include "system.h"
#include <time.h>
+#ifndef time
time_t time ();
+#endif
#if HAVE_UTIME_H
# include <utime.h>
void
extr_init (void)
{
- now = time ((time_t *) 0);
+ now = time (0);
we_are_root = geteuid () == 0;
/* Option -p clears the kernel umask, so it does not affect proper
if (status == 0)
{
- /* Fix ownership. */
-
- if (we_are_root)
- if (chown (file_name, current_stat.st_uid, current_stat.st_gid) < 0)
- ERROR ((0, errno,
- _("%s: Cannot change owner to uid %lu, gid %lu"),
- file_name,
- (unsigned long) current_stat.st_uid,
- (unsigned long) current_stat.st_gid));
-
print_for_mkdir (file_name, cursor - file_name,
~newdir_umask & MODE_RWX);
did_something = 1;
*sizeleft -= count;
set_next_block_after (data_block);
data_block = find_next_block ();
+ if (! data_block)
+ {
+ ERROR ((0, 0, _("Unexpected EOF on archive file")));
+ return;
+ }
}
count = full_write (fd, data_block->buffer, written);
skipcrud = 0;
while (!absolute_names_option && CURRENT_FILE_NAME[0] == '/')
{
- static int warned_once = 0;
+ static int warned_once;
- skipcrud++; /* force relative path */
if (!warned_once)
{
warned_once = 1;
- WARN ((0, 0, _("\
-Removing leading `/' from absolute path names in the archive")));
+ WARN ((0, 0, _("Removing leading `/' from archive names")));
}
+ skipcrud++; /* force relative path */
}
/* Take a safety backup of a previously existing file. */
while (1)
{
exhdr = find_next_block ();
+ if (! exhdr)
+ {
+ ERROR ((0, 0, _("Unexpected EOF on archive file")));
+ return;
+ }
for (counter = 0; counter < SPARSES_IN_SPARSE_HEADER; counter++)
{
if (counter + ind > sp_array_size - 1)
xrealloc (sparsearray,
sp_array_size * (sizeof (struct sp_array)));
}
- /* Compare to 0, or use !(int)..., for Pyramid's dumb
- compiler. */
- if (exhdr->sparse_header.sp[counter].numbytes == 0)
+ if (exhdr->sparse_header.sp[counter].numbytes[0] == 0)
break;
sparsearray[counter + ind].offset =
OFF_FROM_CHARS (exhdr->sparse_header.sp[counter].offset);
if (!warned_once)
{
warned_once = 1;
- WARN ((0, 0, _("\
-Attempting extraction of symbolic links as hard links")));
+ WARN ((0, 0,
+ _("Attempting extraction of symbolic links as hard links")));
}
}
/* Fall through. */
break;
case GNUTYPE_MULTIVOL:
- ERROR ((0, 0, _("\
-Cannot extract `%s' -- file is continued from another volume"),
+ ERROR ((0, 0,
+ _("Cannot extract `%s' -- file is continued from another volume"),
current_file_name));
skip_file (current_stat.st_size);
if (backup_option)