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 */
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 *);