#define PREFIX_FIELD_SIZE 155
#define UNAME_FIELD_SIZE 32
#define GNAME_FIELD_SIZE 32
+
+/* FIXME */
+#define MAXOCTAL11 017777777777L
+#define MAXOCTAL7 07777777
+
+
\f
/* Some various global definitions. */
GLOBAL bool interactive_option;
+/* If nonzero, extract only Nth occurrence of each named file */
+GLOBAL uintmax_t occurrence_option;
+
enum old_files
{
DEFAULT_OLD_FILES, /* default */
/* If positive, preserve permissions when extracting. */
GLOBAL int same_permissions_option;
+/* When set, strip the given number of path elements from the file name
+ before extracting */
+GLOBAL size_t strip_path_elements;
+
GLOBAL bool show_omitted_dirs_option;
GLOBAL bool sparse_option;
{
struct name *next;
size_t length; /* cached strlen(name) */
- char found; /* a matching file has been found */
+ uintmax_t found_count; /* number of times a matching file has
+ been found */
+ int isdir;
char firstch; /* first char is literally matched */
char regexp; /* this name is a regexp, not literal */
int change_dir; /* set with the -C option */
/* Number of elements in sparsearray. */
GLOBAL int sp_array_size;
+
+/* Obnoxious test to see if dimwit is trying to dump the archive. */
+GLOBAL dev_t ar_dev;
+GLOBAL ino_t ar_ino;
+
\f
/* Declarations for each module. */
void print_total_written (void);
void reset_eof (void);
void set_next_block_after (union block *);
+void clear_read_error_count (void);
+void xclose (int fd);
+void archive_write_error (ssize_t) __attribute__ ((noreturn));
+void archive_read_error (void);
/* Module create.c. */
#define TIME_TO_CHARS(val, where) time_to_chars (val, where, sizeof (where))
#define UID_TO_CHARS(val, where) uid_to_chars (val, where, sizeof (where))
#define UINTMAX_TO_CHARS(val, where) uintmax_to_chars (val, where, sizeof (where))
+#define UNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
+#define GNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
void gid_to_chars (gid_t, char *, size_t);
void major_to_chars (major_t, char *, size_t);
void time_to_chars (time_t, char *, size_t);
void uid_to_chars (uid_t, char *, size_t);
void uintmax_to_chars (uintmax_t, char *, size_t);
+void string_to_chars (char *, char *, size_t);
/* Module diffarch.c. */
struct xheader
{
- int nblocks;
- union block *blocks;
+ struct obstack *stk;
+ size_t size;
+ char *buffer;
};
GLOBAL struct xheader extended_header;
extern struct name *gnu_list_name;
-void gid_to_gname (gid_t, char gname[GNAME_FIELD_SIZE]);
-int gname_to_gid (char gname[GNAME_FIELD_SIZE], gid_t *);
-void uid_to_uname (uid_t, char uname[UNAME_FIELD_SIZE]);
-int uname_to_uid (char uname[UNAME_FIELD_SIZE], uid_t *);
+void gid_to_gname (gid_t, char **gname);
+int gname_to_gid (char *gname, gid_t *);
+void uid_to_uname (uid_t, char **uname);
+int uname_to_uid (char *uname, uid_t *);
void init_names (void);
void name_add (const char *);
void blank_name_list (void);
char *new_name (const char *, const char *);
char *safer_name_suffix (char const *, bool);
+size_t stripped_path_len (char const *file_name, size_t num);
+bool all_names_found (struct tar_stat_info *);
bool excluded_name (char const *);
bool contains_dot_dot (char const *);
+#define ISFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
+ (c)->found_count == occurrence_option)
+#define WASFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
+ (c)->found_count >= occurrence_option)
+
/* Module tar.c. */
int confirm (const char *, const char *);
void request_stdin (const char *);
+void destroy_stat (struct tar_stat_info *);
/* Module update.c. */
extern char *output_start;
void update_archive (void);
+
+/* Module xheader.c. */
+
+void xheader_decode (struct tar_stat_info *);
+void xheader_store (char const *, struct tar_stat_info const *);
+void xheader_read (union block *, size_t);
+void xheader_finish (struct xheader *);
+void xheader_destroy (struct xheader *);
+
+/* Module system.c */
+
+void sys_detect_dev_null_output (void);
+void sys_save_archive_dev_ino (void);
+void sys_drain_input_pipe (void);
+void sys_wait_for_child (pid_t);
+void sys_spawn_shell (void);
+void sys_compare_uid_gid (struct stat *a, struct stat *b);
+bool sys_file_is_archive (struct tar_stat_info *p);
+void 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);
+bool sys_get_archive_stat (void);
+
+/* Module compare.c */
+void report_difference (const char *message, ...);