/* Common declarations for the tar program.
Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
- 2003 Free Software Foundation, Inc.
+ 2003, 2004 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
#include <modechange.h>
#include <quote.h>
#include <safe-read.h>
+#include <timespec.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
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;
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;
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);
WANT_DIRECTORY_REMOVE_OPTION
};
int remove_any_file (const char *, enum remove_option);
-int maybe_backup_file (const char *, int);
+bool maybe_backup_file (const char *, int);
void undo_last_backup (void);
int deref_stat (bool, char const *, struct stat *);
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 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));
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);
/* 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_store (char const *, struct tar_stat_info const *);
+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 *);
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_compare_uid (struct stat *a, struct stat *b);
+bool sys_compare_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);
+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);
+void sys_reset_uid_gid (void);
+size_t sys_write_archive_buffer (void);
bool sys_get_archive_stat (void);
+void sys_reset_uid_gid (void);
/* Module compare.c */
-void report_difference (const char *message, ...);
+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_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);