/* Common declarations for the tar program.
Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
- 2003 Free Software Foundation, Inc.
+ 2003, 2004, 2005 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
/* The checksum field is filled with this while the checksum is computed. */
#define CHKBLANKS " " /* 8 blanks, no null */
+/* Old GNU stores zero-terminated file name */
+#define OLDGNU_NAME_FIELD_SIZE 99
+
/* Some constants from POSIX are given names. */
#define NAME_FIELD_SIZE 100
#define PREFIX_FIELD_SIZE 155
/* Some various global definitions. */
/* Name of file to use for interacting with user. */
-#if MSDOS
-# define TTY_NAME "con"
-#else
-# define TTY_NAME "/dev/tty"
-#endif
/* GLOBAL is defined to empty in tar.c only, and left alone in other *.c
modules. Here, we merely set it to "extern" if it is not already set.
#include <modechange.h>
#include <quote.h>
#include <safe-read.h>
+#include <timespec.h>
+#define obstack_chunk_alloc xmalloc
+#define obstack_chunk_free free
+#include <obstack.h>
/* Log base 2 of common values. */
#define LG_8 3
GLOBAL bool absolute_names_option;
+/* Display file times in UTC */
+GLOBAL bool utc_option;
+
/* This variable tells how to interpret newer_mtime_option, below. If zero,
files get archived if their mtime is not less than newer_mtime_option.
If nonzero, files get archived if *either* their ctime or mtime is not less
/* Patterns that match file names to be excluded. */
GLOBAL struct exclude *excluded;
-/* Specified file containing names to work on. */
-GLOBAL const char *files_from_option;
-
-GLOBAL bool force_local_option;
+/* Exclude directories containing a cache directory tag. */
+GLOBAL bool exclude_caches_option;
/* Specified value to be put into tar file in place of stat () results, or
just -1 if such an override should not take place. */
enum old_files
{
- DEFAULT_OLD_FILES, /* default */
+ DEFAULT_OLD_FILES, /* default */
NO_OVERWRITE_DIR_OLD_FILES, /* --no-overwrite-dir */
- OVERWRITE_OLD_FILES, /* --overwrite */
- UNLINK_FIRST_OLD_FILES, /* --unlink-first */
- KEEP_OLD_FILES /* --keep-old-files */
+ OVERWRITE_OLD_FILES, /* --overwrite */
+ UNLINK_FIRST_OLD_FILES, /* --unlink-first */
+ KEEP_OLD_FILES, /* --keep-old-files */
+ KEEP_NEWER_FILES /* --keep-newer-files */
};
GLOBAL enum old_files old_files_option;
/* Specified mode change string. */
GLOBAL struct mode_change *mode_option;
+/* Initial umask, if needed for mode change string. */
+GLOBAL mode_t initial_umask;
+
GLOBAL bool multi_volume_option;
-/* The same variable hold the time, whether mtime or ctime. Just fake a
+/* The same variable holds the time, whether mtime or ctime. Just fake a
non-existing option, for making the code clearer, elsewhere. */
#define newer_ctime_option newer_mtime_option
/* Specified threshold date and time. Files having an older time stamp
do not get archived (also see after_date_option above). */
-GLOBAL time_t newer_mtime_option;
+GLOBAL struct timespec newer_mtime_option;
+
+/* Return true if newer_mtime_option is initialized. */
+#define NEWER_OPTION_INITIALIZED(opt) (0 <= (opt).tv_nsec)
+
+/* Return true if the struct stat ST's M time is less than
+ newer_mtime_option. */
+#define OLDER_STAT_TIME(st, m) \
+ ((st).st_##m##time < newer_mtime_option.tv_sec \
+ || ((st).st_##m##time == newer_mtime_option.tv_sec \
+ && TIMESPEC_NS ((st).st_##m##tim) < newer_mtime_option.tv_nsec))
/* Zero if there is no recursion, otherwise FNM_LEADING_DIR. */
GLOBAL int recursion_option;
GLOBAL bool remove_files_option;
+/* Specified rmt command. */
+GLOBAL const char *rmt_command_option;
+
/* Specified remote shell command. */
GLOBAL const char *rsh_command_option;
/* If positive, preserve permissions when extracting. */
GLOBAL int same_permissions_option;
-/* When set, strip the given number of path elements from the file name
+/* When set, strip the given number of file name components from the file name
before extracting */
-GLOBAL size_t strip_path_elements;
+GLOBAL size_t strip_name_components;
GLOBAL bool show_omitted_dirs_option;
GLOBAL bool touch_option;
+GLOBAL char *to_command_option;
+GLOBAL bool ignore_command_error_option;
+
+/* Return true if the extracted files are not being written to disk */
+#define EXTRACT_OVER_PIPE (to_stdout_option || to_command_option)
+
/* Count how many times the option has been set, multiple setting yields
more verbose behavior. Value 0 means no verbosity, 1 means file name
only, 2 means file name and all attributes. More than 2 is just like 2. */
GLOBAL dev_t ar_dev;
GLOBAL ino_t ar_ino;
+GLOBAL bool seekable_archive;
+
+GLOBAL dev_t root_device;
+
+/* Unquote filenames */
+GLOBAL bool unquote_option;
\f
/* Declarations for each module. */
void xclose (int fd);
void archive_write_error (ssize_t) __attribute__ ((noreturn));
void archive_read_error (void);
+off_t seek_archive (off_t size);
+void set_start_time (void);
/* Module create.c. */
dump_status_not_implemented
};
-bool file_dumpable_p (struct tar_stat_info *stat);
+bool file_dumpable_p (struct tar_stat_info *);
void create_archive (void);
void pad_archive (off_t size_left);
void dump_file (char *, int, dev_t);
union block *start_header (struct tar_stat_info *st);
void finish_header (struct tar_stat_info *, union block *, off_t);
+void simple_finish_header (union block *header);
+union block *start_private_header (const char *name, size_t size);
void write_eot (void);
void check_links (void);
char *get_directory_contents (char *, dev_t);
void read_directory_file (void);
void write_directory_file (void);
-void gnu_restore (char const *);
+void purge_directory (char const *);
/* Module list.c. */
void print_header (struct tar_stat_info *, off_t);
void read_and (void (*) (void));
enum read_header read_header (bool);
+enum read_header tar_checksum (union block *header, bool silent);
void skip_file (off_t);
void skip_member (void);
{
ORDINARY_REMOVE_OPTION,
RECURSIVE_REMOVE_OPTION,
+
+ /* FIXME: The following value is never used. It seems to be intended
+ as a placeholder for a hypothetical option that should instruct tar
+ to recursively remove subdirectories in purge_directory(),
+ as opposed to the functionality of --recursive-unlink
+ (RECURSIVE_REMOVE_OPTION value), which removes them in
+ prepare_to_extract() phase. However, with the addition of more
+ meta-info to the incremental dumps, this should become unnecessary */
WANT_DIRECTORY_REMOVE_OPTION
};
int remove_any_file (const char *, enum remove_option);
void read_error (char const *);
void read_error_details (char const *, off_t, size_t);
void read_fatal (char const *) __attribute__ ((noreturn));
-void read_fatal_details (char const *, off_t, size_t);
+void read_fatal_details (char const *, off_t, size_t) __attribute__ ((noreturn));
void read_warn_details (char const *, off_t, size_t);
void read_diag_details (char const *name, off_t offset, size_t size);
void readlink_error (char const *);
void seek_warn (char const *);
void seek_warn_details (char const *, off_t);
void seek_diag_details (char const *, off_t);
+void stat_fatal (char const *);
void stat_error (char const *);
void stat_warn (char const *);
void stat_diag (char const *name);
void utime_error (char const *);
void waitpid_error (char const *);
void write_error (char const *);
-void write_error_details (char const *, ssize_t, size_t);
+void write_error_details (char const *, size_t, size_t);
void write_fatal (char const *) __attribute__ ((noreturn));
void write_fatal_details (char const *, ssize_t, size_t)
__attribute__ ((noreturn));
pid_t xfork (void);
void xpipe (int[2]);
+void *page_aligned_alloc (void **, size_t);
+
/* Module names.c. */
extern struct name *gnu_list_name;
void gid_to_gname (gid_t, char **gname);
-int gname_to_gid (char *gname, gid_t *);
+int gname_to_gid (char const *, gid_t *);
void uid_to_uname (uid_t, char **uname);
-int uname_to_uid (char *uname, uid_t *);
+int uname_to_uid (char const *, uid_t *);
void init_names (void);
void name_add (const char *);
-void name_init (int, char *const *);
+void name_init (void);
void name_term (void);
char *name_next (int);
-void name_close (void);
void name_gather (void);
struct name *addname (char const *, int);
int name_match (const char *);
void add_avoided_name (char const *);
bool is_avoided_name (char const *);
+bool is_individual_file (char const *);
bool contains_dot_dot (char const *);
+bool removed_prefixes_p (void);
+
#define ISFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
(c)->found_count == occurrence_option)
#define WASFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
/* Module tar.c. */
+void usage (int);
+
int confirm (const char *, const char *);
void request_stdin (const char *);
void tar_stat_init (struct tar_stat_info *st);
void tar_stat_destroy (struct tar_stat_info *st);
+void usage (int) __attribute__ ((noreturn));
/* Module update.c. */
/* Module xheader.c. */
void xheader_decode (struct tar_stat_info *);
+void xheader_decode_global (void);
void xheader_store (char const *, struct tar_stat_info const *, void *);
void xheader_read (union block *, size_t);
+void xheader_write (char type, char *name, struct xheader *xhdr);
+void xheader_write_global (void);
void xheader_finish (struct xheader *);
void xheader_destroy (struct xheader *);
+char *xheader_xhdr_name (struct tar_stat_info *st);
+char *xheader_ghdr_name (void);
+void xheader_write (char, char *, struct xheader *);
+void xheader_write_global (void);
+void xheader_set_option (char *string);
/* Module system.c */
-void sys_stat_nanoseconds (struct tar_stat_info *stat);
+void sys_stat_nanoseconds (struct tar_stat_info *);
void sys_detect_dev_null_output (void);
void sys_save_archive_dev_ino (void);
void sys_drain_input_pipe (void);
bool sys_file_is_archive (struct tar_stat_info *p);
bool sys_compare_links (struct stat *link_data, struct stat *stat_data);
int sys_truncate (int fd);
-void sys_reset_uid_gid (void);
pid_t sys_child_open_for_compress (void);
pid_t sys_child_open_for_uncompress (void);
-ssize_t sys_write_archive_buffer (void);
+size_t sys_write_archive_buffer (void);
bool sys_get_archive_stat (void);
+int sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st);
+void sys_wait_command (void);
/* Module compare.c */
void report_difference (struct tar_stat_info *st, const char *message, ...);
/* Module sparse.c */
-bool sparse_file_p (struct tar_stat_info *stat);
-enum dump_status sparse_dump_file (int fd, struct tar_stat_info *stat);
-enum dump_status sparse_extract_file (int fd, struct tar_stat_info *stat, off_t *size);
-bool sparse_diff_file (int fd, struct tar_stat_info *stat);
+bool sparse_file_p (struct tar_stat_info *);
+bool sparse_member_p (struct tar_stat_info *);
+bool sparse_fixup_header (struct tar_stat_info *);
+enum dump_status sparse_dump_file (int, struct tar_stat_info *);
+enum dump_status sparse_extract_file (int, struct tar_stat_info *, off_t *);
+enum dump_status sparse_skip_file (struct tar_stat_info *);
+bool sparse_diff_file (int, struct tar_stat_info *);
+
+/* Module utf8.c */
+bool string_ascii_p (const char *str);
+bool utf8_convert (bool to_utf, char const *input, char **output);