#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;
GLOBAL time_t start_time;
#endif
-/* Name of file read from the archive header */
-GLOBAL char *orig_file_name;
-
-/* Name of file for the current archive entry after being normalized. */
-GLOBAL char *current_file_name;
-
-/* Nonzero if the current archive entry had a trailing slash before it
- was normalized. */
-GLOBAL int current_trailing_slash;
-
-/* Name of link for the current archive entry. */
-GLOBAL char *current_link_name;
+GLOBAL struct tar_stat_info current_stat_info;
/* List of tape drive names, number of such tape drives, allocated number,
and current cursor in list. */
{
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 */
#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. */
HEADER_FAILURE /* ill-formed header, or bad checksum */
};
+struct xheader
+{
+ struct obstack *stk;
+ size_t size;
+ char *buffer;
+};
+
+GLOBAL struct xheader extended_header;
extern union block *current_header;
-extern struct stat current_stat;
extern enum archive_format current_format;
extern size_t recent_long_name_blocks;
extern size_t recent_long_link_blocks;
-void decode_header (union block *, struct stat *,
- enum archive_format *, int);
+void decode_header (union block *, struct tar_stat_info *,
+ enum archive_format *, int);
#define STRINGIFY_BIGINT(i, b) \
stringify_uintmax_t_backwards ((uintmax_t) (i), (b) + UINTMAX_STRSIZE_BOUND)
char *stringify_uintmax_t_backwards (uintmax_t, char *);
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 *);