#include "tar.h"
#define CHKBLANKS " "
#define NAME_FIELD_SIZE 100
#define PREFIX_FIELD_SIZE 155
#define UNAME_FIELD_SIZE 32
#define GNAME_FIELD_SIZE 32
#if MSDOS
# define TTY_NAME "con"
#else
# define TTY_NAME "/dev/tty"
#endif
#ifndef GLOBAL
# define GLOBAL extern
#endif
GLOBAL int exit_status;
#define TAREXIT_SUCCESS 0
#define TAREXIT_DIFFERS 1
#define TAREXIT_FAILURE 2
#define WARN(Args) \
error Args
#define ERROR(Args) \
(error Args, exit_status = TAREXIT_FAILURE)
#define FATAL_ERROR(Args) \
(error Args, error (TAREXIT_FAILURE, 0, \
_("Error is not recoverable: exiting now")), 0)
#define USAGE_ERROR(Args) \
(error Args, usage (TAREXIT_FAILURE), 0)
#include "arith.h"
#include "backupfile.h"
#include "basename.h"
#include "exclude.h"
#include "modechange.h"
#include "safe-read.h"
GLOBAL const char *program_name;
enum subcommand
{
UNKNOWN_SUBCOMMAND,
APPEND_SUBCOMMAND,
CAT_SUBCOMMAND,
CREATE_SUBCOMMAND,
DELETE_SUBCOMMAND,
DIFF_SUBCOMMAND,
EXTRACT_SUBCOMMAND,
LIST_SUBCOMMAND,
UPDATE_SUBCOMMAND
};
GLOBAL enum subcommand subcommand_option;
GLOBAL enum archive_format archive_format;
GLOBAL char filename_terminator;
GLOBAL int blocking_factor;
GLOBAL size_t record_size;
GLOBAL int absolute_names_option;
GLOBAL int after_date_option;
GLOBAL int atime_preserve_option;
GLOBAL int backup_option;
GLOBAL enum backup_type backup_type;
GLOBAL int block_number_option;
GLOBAL int checkpoint_option;
GLOBAL const char *use_compress_program_option;
GLOBAL int dereference_option;
GLOBAL struct exclude *excluded;
GLOBAL const char *files_from_option;
GLOBAL int force_local_option;
GLOBAL gid_t group_option;
GLOBAL int ignore_failed_read_option;
GLOBAL int ignore_zeros_option;
GLOBAL int incremental_option;
GLOBAL const char *info_script_option;
GLOBAL int interactive_option;
GLOBAL int keep_old_files_option;
GLOBAL const char *listed_incremental_option;
GLOBAL struct mode_change *mode_option;
GLOBAL int multi_volume_option;
#define newer_ctime_option newer_mtime_option
GLOBAL time_t newer_mtime_option;
GLOBAL int no_recurse_option;
GLOBAL int numeric_owner_option;
GLOBAL int one_file_system_option;
GLOBAL uid_t owner_option;
GLOBAL int recursive_unlink_option;
GLOBAL int read_full_records_option;
GLOBAL int remove_files_option;
GLOBAL const char *rsh_command_option;
GLOBAL int same_order_option;
GLOBAL int same_owner_option;
GLOBAL int same_permissions_option;
GLOBAL int show_omitted_dirs_option;
GLOBAL int sparse_option;
GLOBAL int starting_file_option;
GLOBAL tarlong tape_length_option;
GLOBAL int to_stdout_option;
GLOBAL int totals_option;
GLOBAL int touch_option;
GLOBAL int unlink_first_option;
GLOBAL int verbose_option;
GLOBAL int verify_option;
GLOBAL const char *volno_file_option;
GLOBAL const char *volume_label_option;
GLOBAL int archive;
GLOBAL int dev_null_output;
GLOBAL char *current_file_name;
GLOBAL char *current_link_name;
GLOBAL const char **archive_name_array;
GLOBAL int archive_names;
GLOBAL int allocated_archive_names;
GLOBAL const char **archive_name_cursor;
struct name
{
struct name *next;
size_t length;
char found;
char firstch;
char regexp;
char *change_dir;
const char *dir_contents;
char fake;
char name[1];
};
GLOBAL struct name *namelist;
GLOBAL struct name *namelast;
struct sp_array
{
off_t offset;
size_t numbytes;
};
GLOBAL struct sp_array *sparsearray;
GLOBAL int sp_array_size;
enum access_mode
{
ACCESS_READ,
ACCESS_WRITE,
ACCESS_UPDATE
};
extern enum access_mode access_mode;
extern FILE *stdlis;
extern char *save_name;
extern off_t save_sizeleft;
extern off_t save_totsize;
extern int write_archive_to_stdout;
size_t available_space_after PARAMS ((union block *));
off_t current_block_ordinal PARAMS ((void));
void close_archive PARAMS ((void));
void closeout_volume_number PARAMS ((void));
union block *find_next_block PARAMS ((void));
void flush_read PARAMS ((void));
void flush_write PARAMS ((void));
void flush_archive PARAMS ((void));
void init_total_written PARAMS ((void));
void init_volume_number PARAMS ((void));
void open_archive PARAMS ((enum access_mode));
void print_total_written PARAMS ((void));
void reset_eof PARAMS ((void));
void set_next_block_after PARAMS ((union block *));
void create_archive PARAMS ((void));
void dump_file PARAMS ((char *, dev_t, int));
void finish_header PARAMS ((union block *));
void write_eot PARAMS ((void));
#define GID_TO_OCT(val, where) gid_to_oct (val, where, sizeof (where))
#define MAJOR_TO_OCT(val, where) major_to_oct (val, where, sizeof (where))
#define MINOR_TO_OCT(val, where) minor_to_oct (val, where, sizeof (where))
#define MODE_TO_OCT(val, where) mode_to_oct (val, where, sizeof (where))
#define OFF_TO_OCT(val, where) off_to_oct (val, where, sizeof (where))
#define SIZE_TO_OCT(val, where) size_to_oct (val, where, sizeof (where))
#define TIME_TO_OCT(val, where) time_to_oct (val, where, sizeof (where))
#define UID_TO_OCT(val, where) uid_to_oct (val, where, sizeof (where))
#define UINTMAX_TO_OCT(val, where) uintmax_to_oct (val, where, sizeof (where))
void gid_to_oct PARAMS ((gid_t, char *, size_t));
void major_to_oct PARAMS ((major_t, char *, size_t));
void minor_to_oct PARAMS ((minor_t, char *, size_t));
void mode_to_oct PARAMS ((mode_t, char *, size_t));
void off_to_oct PARAMS ((off_t, char *, size_t));
void size_to_oct PARAMS ((size_t, char *, size_t));
void time_to_oct PARAMS ((time_t, char *, size_t));
void uid_to_oct PARAMS ((uid_t, char *, size_t));
void uintmax_to_oct PARAMS ((uintmax_t, char *, size_t));
extern int now_verifying;
void diff_archive PARAMS ((void));
void diff_init PARAMS ((void));
void verify_volume PARAMS ((void));
void extr_init PARAMS ((void));
void extract_archive PARAMS ((void));
void apply_delayed_set_stat PARAMS ((void));
void delete_archive_members PARAMS ((void));
void collect_and_sort_names PARAMS ((void));
char *get_directory_contents PARAMS ((char *, dev_t));
void write_dir_file PARAMS ((void));
void gnu_restore PARAMS ((int));
void write_directory_file PARAMS ((void));
enum read_header
{
HEADER_STILL_UNREAD,
HEADER_SUCCESS,
HEADER_ZERO_BLOCK,
HEADER_END_OF_FILE,
HEADER_FAILURE
};
extern union block *current_header;
extern struct stat current_stat;
extern enum archive_format current_format;
void decode_header PARAMS ((union block *, struct stat *,
enum archive_format *, int));
#define STRINGIFY_BIGINT(i, b) \
stringify_uintmax_t_backwards ((uintmax_t) (i), (b) + sizeof (b))
char *stringify_uintmax_t_backwards PARAMS ((uintmax_t, char *));
#define GID_FROM_OCT(where) gid_from_oct (where, sizeof (where))
#define MAJOR_FROM_OCT(where) major_from_oct (where, sizeof (where))
#define MINOR_FROM_OCT(where) minor_from_oct (where, sizeof (where))
#define MODE_FROM_OCT(where) mode_from_oct (where, sizeof (where))
#define OFF_FROM_OCT(where) off_from_oct (where, sizeof (where))
#define SIZE_FROM_OCT(where) size_from_oct (where, sizeof (where))
#define TIME_FROM_OCT(where) time_from_oct (where, sizeof (where))
#define UID_FROM_OCT(where) uid_from_oct (where, sizeof (where))
#define UINTMAX_FROM_OCT(where) uintmax_from_oct (where, sizeof (where))
gid_t gid_from_oct PARAMS ((const char *, size_t));
major_t major_from_oct PARAMS ((const char *, size_t));
minor_t minor_from_oct PARAMS ((const char *, size_t));
mode_t mode_from_oct PARAMS ((const char *, size_t));
off_t off_from_oct PARAMS ((const char *, size_t));
size_t size_from_oct PARAMS ((const char *, size_t));
time_t time_from_oct PARAMS ((const char *, size_t));
uid_t uid_from_oct PARAMS ((const char *, size_t));
uintmax_t uintmax_from_oct PARAMS ((const char *, size_t));
void list_archive PARAMS ((void));
void print_for_mkdir PARAMS ((char *, int, mode_t));
void print_header PARAMS ((void));
void read_and PARAMS ((void (*do_) ()));
enum read_header read_header PARAMS ((void));
void skip_extended_headers PARAMS ((void));
void skip_file PARAMS ((off_t));
void extract_mangle PARAMS ((void));
void assign_string PARAMS ((char **, const char *));
char *quote_copy_string PARAMS ((const char *));
int unquote_string PARAMS ((char *));
char *merge_sort PARAMS ((char *, int, int, int (*) (char *, char *)));
int is_dot_or_dotdot PARAMS ((const char *));
int remove_any_file PARAMS ((const char *, int));
int maybe_backup_file PARAMS ((const char *, int));
void undo_last_backup PARAMS ((void));
void gid_to_gname PARAMS ((gid_t, char gname[GNAME_FIELD_SIZE]));
int gname_to_gid PARAMS ((char gname[GNAME_FIELD_SIZE], gid_t *));
void uid_to_uname PARAMS ((uid_t, char uname[UNAME_FIELD_SIZE]));
int uname_to_uid PARAMS ((char uname[UNAME_FIELD_SIZE], uid_t *));
void init_names PARAMS ((void));
void name_add PARAMS ((const char *));
void name_init PARAMS ((int, char *const *));
void name_term PARAMS ((void));
char *name_next PARAMS ((int change_));
void name_close PARAMS ((void));
void name_gather PARAMS ((void));
void addname PARAMS ((const char *));
int name_match PARAMS ((const char *));
void names_notfound PARAMS ((void));
void name_expand PARAMS ((void));
struct name *name_scan PARAMS ((const char *));
char *name_from_list PARAMS ((void));
void blank_name_list PARAMS ((void));
char *new_name PARAMS ((const char *, const char *));
int confirm PARAMS ((const char *, const char *));
void request_stdin PARAMS ((const char *));
extern char *output_start;
void update_archive PARAMS ((void));