/* Extract files from a tar archive.
Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
- 2001, 2003 Free Software Foundation, Inc.
+ 2001, 2003, 2004 Free Software Foundation, Inc.
Written by John Gilmore, on 1985-11-19.
}
/* Update the delayed_set_stat info for an intermediate directory
- created on the path to DIR_NAME. The intermediate directory turned
+ created on the path to DIR. The intermediate directory turned
out to be the same as this directory, e.g. due to ".." or symbolic
links. *DIR_STAT_INFO is the status of the directory. */
static void
-repair_delayed_set_stat (char const *dir_name,
+repair_delayed_set_stat (char const *dir,
struct stat const *dir_stat_info)
{
struct delayed_set_stat *data;
}
ERROR ((0, 0, _("%s: Unexpected inconsistency when making directory"),
- quotearg_colon (dir_name)));
+ quotearg_colon (dir)));
}
/* After a file/link/symlink/directory creation has failed, see if
int invert_permissions;
int status;
-
+
for (cursor = cursor0; *cursor; cursor++)
{
if (! ISSLASH (*cursor))
file_newer_p (const char *file_name, struct tar_stat_info *tar_stat)
{
struct stat st;
-
+
if (stat (file_name, &st))
{
stat_warn (file_name);
return true; /* Be on the safe side */
}
if (!S_ISDIR (st.st_mode)
- && st.st_mtime >= current_stat_info.stat.st_mtime)
+ && st.st_mtime >= tar_stat->stat.st_mtime)
{
return true;
}
return false;
-}
+}
/* Prepare to extract a file.
Return zero if extraction should not proceed. */
static int
-prepare_to_extract (char const *file_name, bool directory)
+prepare_to_extract (char const *file_name)
{
if (to_stdout_option)
return 0;
case KEEP_NEWER_FILES:
if (file_newer_p (file_name, ¤t_stat_info))
{
- WARN ((0, 0, _("Current `%s' is newer"), file_name));
+ WARN ((0, 0, _("Current `%s' is newer"), file_name));
return 0;
}
break;
maybe_recoverable (char *file_name, int *interdir_made)
{
int e = errno;
-
+
if (*interdir_made)
return 0;
return 0;
}
/* FALL THROUGH */
-
+
case DEFAULT_OLD_FILES:
case NO_OVERWRITE_DIR_OLD_FILES:
case OVERWRITE_OLD_FILES:
}
file_name += prefix_len;
}
-
+
apply_nonancestor_delayed_set_stat (file_name, 0);
/* Take a safety backup of a previously existing file. */
/* KLUDGE */
typeflag = sparse_member_p (¤t_stat_info) ?
GNUTYPE_SPARSE : current_header->header.typeflag;
-
+
switch (typeflag)
{
case GNUTYPE_SPARSE:
goto extract_file;
}
- if (! prepare_to_extract (file_name, 0))
+ if (! prepare_to_extract (file_name))
{
skip_member ();
if (backup_option)
case SYMTYPE:
#ifdef HAVE_SYMLINK
- if (! prepare_to_extract (file_name, 0))
+ if (! prepare_to_extract (file_name))
break;
if (absolute_names_option
status = 0;
}
}
-
+
if (status != 0 && backup_option)
undo_last_backup ();
break;
#endif
case LNKTYPE:
- if (! prepare_to_extract (file_name, 0))
+ if (! prepare_to_extract (file_name))
break;
again_link:
&& ds->ino == st1.st_ino
&& ds->mtime == st1.st_mtime)
{
- struct string_list *p =
+ struct string_list *p =
xmalloc (offsetof (struct string_list, string)
+ strlen (file_name) + 1);
strcpy (p->string, file_name);
#if S_IFCHR || S_IFBLK
make_node:
- if (! prepare_to_extract (file_name, 0))
+ if (! prepare_to_extract (file_name))
break;
status = mknod (file_name, current_stat_info.stat.st_mode,
#if HAVE_MKFIFO || defined mkfifo
case FIFOTYPE:
- if (! prepare_to_extract (file_name, 0))
+ if (! prepare_to_extract (file_name))
break;
while (status = mkfifo (file_name, current_stat_info.stat.st_mode),
| (we_are_root ? 0 : MODE_WXUSR))
& MODE_RWX);
- status = prepare_to_extract (file_name, 1);
+ status = prepare_to_extract (file_name);
if (status == 0)
break;
if (status < 0)
}
errno = EEXIST;
}
-
+
if (maybe_recoverable (file_name, &interdir_made))
goto again_dir;