notation.
*/
static int
-fd_chmod(int fd, char const *file_name, int mode, int atflag, int typeflag)
+fd_chmod (int fd, char const *file_name, int mode, int atflag, char typeflag)
{
- int chmod_errno = fd_i_chmod (fd, file_name, mode, atflag) == 0 ? 0 : errno;
+ int chmod_errno = fd_i_chmod (fd, file_name, mode, atflag) < 0 ? errno : 0;
/* On Solaris, chmod may fail if we don't have PRIV_ALL, because
setuid-root files would otherwise be a backdoor. See
if (chmod_errno == EPERM && (mode & S_ISUID)
&& priv_set_restore_linkdir () == 0)
{
- chmod_errno = fd_i_chmod (fd, file_name, mode, atflag) == 0 ? 0 : errno;
+ chmod_errno = fd_i_chmod (fd, file_name, mode, atflag) < 0 ? errno : 0;
priv_set_remove_linkdir ();
}
supported and if the file is not a symlink. This
introduces a race, alas. */
if (atflag && typeflag != SYMTYPE && ! implemented (chmod_errno))
- chmod_errno = fd_i_chmod (fd, file_name, mode, 0) == 0 ? 0 : errno;
+ chmod_errno = fd_i_chmod (fd, file_name, mode, 0) < 0 ? errno : 0;
if (chmod_errno && (typeflag != SYMTYPE || implemented (chmod_errno)))
{
/* Extractor functions for various member types */
-static int
-extract_dir (char *file_name, int typeflag)
+static bool
+extract_dir (char *file_name, char typeflag)
{
int status;
mode_t mode;
if (keep_directory_symlink_option
&& is_directory_link (file_name, &st))
- return 0;
+ return true;
if ((st.st_mode != 0 && fstatat_flags == 0)
|| deref_stat (file_name, &st) == 0)
if (interdir_made)
{
repair_delayed_set_stat (file_name, &st);
- return 0;
+ return true;
}
else if (old_files_option == NO_OVERWRITE_DIR_OLD_FILES)
{
if (errno != EEXIST)
{
mkdir_error (file_name);
- return 1;
+ return false;
}
break;
}
delay_set_stat (file_name, ¤t_stat_info,
current_mode, current_mode_mask,
current_stat_info.stat.st_mode, atflag);
- return status;
+ return status == 0;
}
static int
-open_output_file (char const *file_name, int typeflag, mode_t mode,
+open_output_file (char const *file_name, char typeflag, mode_t mode,
int file_created, mode_t *current_mode,
mode_t *current_mode_mask)
{
if (typeflag == CONTTYPE)
{
- static int conttype_diagnosed;
+ static bool conttype_diagnosed;
if (!conttype_diagnosed)
{
- conttype_diagnosed = 1;
+ conttype_diagnosed = true;
warnopt (WARN_CONTIGUOUS_CAST, 0,
_("Extracting contiguous files as regular files"));
}
return fd;
}
-static int
-extract_file (char *file_name, int typeflag)
+static bool
+extract_file (char *file_name, char typeflag)
{
int fd;
off_t size;
if (fd < 0)
{
skip_member ();
- return 0;
+ return true;
}
}
else
{
skip_member ();
if (recover == RECOVER_SKIP)
- return 0;
+ return true;
open_error (file_name);
- return 1;
+ return false;
}
}
}
it doesn't exist, or we don't want to touch it anyway. */
if (to_stdout_option)
- return 0;
+ return true;
if (! to_command_option)
set_stat (file_name, ¤t_stat_info, fd,
if (to_command_option)
sys_wait_command ();
- return status;
+ return status == 0;
}
/* Return true if NAME is a delayed link. This can happen only if the link
process.
*/
-static int
+static bool
create_placeholder_file (char *file_name, bool is_symlink, bool *interdir_made)
{
int fd;
that the link being extracted is a duplicate of an already
processed one. Skip it.
*/
- return 0;
+ return true;
}
switch (maybe_recoverable (file_name, false, interdir_made))
continue;
case RECOVER_SKIP:
- return 0;
+ return true;
case RECOVER_NO:
open_error (file_name);
- return -1;
+ return false;
}
}
if ((h = find_direct_ancestor (file_name)) != NULL)
mark_after_links (h);
- return 0;
+ return true;
}
- return -1;
+ return false;
}
-static int
-extract_link (char *file_name, MAYBE_UNUSED int typeflag)
+static bool
+extract_link (char *file_name, MAYBE_UNUSED char typeflag)
{
bool interdir_made = false;
char const *link_name;
}
}
- return 0;
+ return true;
}
else if ((e == EEXIST && strcmp (link_name, file_name) == 0)
|| ((fstatat (chdir_fd, link_name, &st1, AT_SYMLINK_NOFOLLOW)
== 0)
&& st1.st_dev == st2.st_dev
&& st1.st_ino == st2.st_ino))
- return 0;
+ return true;
errno = e;
}
== RECOVER_OK);
if (rc == RECOVER_SKIP)
- return 0;
+ return true;
if (!(incremental_option && errno == EEXIST))
{
link_error (link_name, file_name);
- return 1;
+ return false;
}
- return 0;
+ return true;
}
-static int
-extract_symlink (char *file_name, MAYBE_UNUSED int typeflag)
+static bool
+extract_symlink (char *file_name, MAYBE_UNUSED char typeflag)
{
bool interdir_made = false;
continue;
case RECOVER_SKIP:
- return 0;
+ return true;
case RECOVER_NO:
if (!implemented (errno))
return extract_link (file_name, typeflag);
}
symlink_error (current_stat_info.link_name, file_name);
- return -1;
+ return false;
}
set_stat (file_name, ¤t_stat_info, -1, 0, 0,
SYMTYPE, false, AT_SYMLINK_NOFOLLOW);
- return 0;
+ return true;
}
#if S_IFCHR || S_IFBLK
-static int
-extract_node (char *file_name, int typeflag)
+static bool
+extract_node (char *file_name, char typeflag)
{
bool interdir_made = false;
mode_t mode = (current_stat_info.stat.st_mode & (MODE_RWX | S_IFBLK | S_IFCHR)
continue;
case RECOVER_SKIP:
- return 0;
+ return true;
case RECOVER_NO:
mknod_error (file_name);
- return -1;
+ return false;
}
set_stat (file_name, ¤t_stat_info, -1,
mode & ~ current_umask, MODE_RWX,
typeflag, false, AT_SYMLINK_NOFOLLOW);
- return 0;
+ return true;
}
#endif
#if HAVE_MKFIFO || defined mkfifo
-static int
-extract_fifo (char *file_name, int typeflag)
+static bool
+extract_fifo (char *file_name, char typeflag)
{
bool interdir_made = false;
mode_t mode = (current_stat_info.stat.st_mode & MODE_RWX
continue;
case RECOVER_SKIP:
- return 0;
+ return true;
case RECOVER_NO:
mkfifo_error (file_name);
- return -1;
+ return false;
}
set_stat (file_name, ¤t_stat_info, -1,
mode & ~ current_umask, MODE_RWX,
typeflag, false, AT_SYMLINK_NOFOLLOW);
- return 0;
+ return true;
}
#endif
-typedef int (*tar_extractor_t) (char *file_name, int typeflag);
+typedef bool (*tar_extractor_t) (char *file_name, char typeflag);
\f
/* Prepare to extract a file. Find extractor function.
- Return true to proceed with the extraction, false to skip the current
- member. */
+ Return an extractor to proceed with the extraction,
+ a null pointer to skip the current member. */
-static bool
-prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
+static tar_extractor_t
+prepare_to_extract (char const *file_name, char typeflag)
{
- tar_extractor_t extractor = NULL;
+ tar_extractor_t extractor;
/* Select the extractor */
switch (typeflag)
case CONTTYPE:
/* Appears to be a file. But BSD tar uses the convention that a slash
suffix means a directory. */
- if (current_stat_info.had_trailing_slash)
- extractor = extract_dir;
- else
- extractor = extract_file;
+ extractor = (current_stat_info.had_trailing_slash
+ ? extract_dir : extract_file);
break;
case SYMTYPE:
break;
case GNUTYPE_VOLHDR:
- return false;
+ return NULL;
case GNUTYPE_MULTIVOL:
paxerror (0, _("%s: Cannot extract -- file is continued from another volume"),
quotearg_colon (current_stat_info.file_name));
- return false;
+ return NULL;
case GNUTYPE_LONGNAME:
case GNUTYPE_LONGLINK:
paxerror (0, _("Unexpected long name header"));
- return false;
+ return NULL;
default:
warnopt (WARN_UNKNOWN_CAST, 0,
if (to_stdout_option || to_command_option)
{
if (extractor != extract_file)
- return false;
+ return NULL;
}
else
{
&& errno && errno != ENOENT)
{
unlink_error (file_name);
- return false;
+ return NULL;
}
break;
{
warnopt (WARN_IGNORE_NEWER, 0, _("Current %s is newer or same age"),
quote (file_name));
- return false;
+ return NULL;
}
break;
break;
}
}
- *fun = extractor;
-
- return true;
+ return extractor;
}
/* Extract a file from the archive. */
extract_archive (void)
{
char typeflag;
- tar_extractor_t fun;
bool skip_dotdot_name;
fatal_exit_hook = extract_finish;
/* Extract the archive entry according to its type. */
/* KLUDGE */
- typeflag = sparse_member_p (¤t_stat_info) ?
- GNUTYPE_SPARSE : current_header->header.typeflag;
+ typeflag = (sparse_member_p (¤t_stat_info)
+ ? GNUTYPE_SPARSE : current_header->header.typeflag);
- if (prepare_to_extract (current_stat_info.file_name, typeflag, &fun))
+ tar_extractor_t fun = prepare_to_extract (current_stat_info.file_name,
+ typeflag);
+ if (fun)
{
- if (fun (current_stat_info.file_name, typeflag) == 0)
+ if (fun (current_stat_info.file_name, typeflag))
return;
}
else