X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcommon.h;h=c1edba86ef8a0cbf7a5686b3dbe8121d500286ae;hb=df7b55a8f6354e30e8da62eec7f706df033d0c81;hp=c51ab116e41294853f2baea41cb175b4518e915d;hpb=03858cf583ce299b836d8a848967ce290a6bf303;p=chaz%2Ftar diff --git a/src/common.h b/src/common.h index c51ab11..c1edba8 100644 --- a/src/common.h +++ b/src/common.h @@ -1,8 +1,8 @@ /* Common declarations for the tar program. Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, - 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, - Inc. + 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 + 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 @@ -70,6 +70,11 @@ #define LG_8 3 #define LG_64 6 #define LG_256 8 + +_GL_INLINE_HEADER_BEGIN +#ifndef COMMON_INLINE +# define COMMON_INLINE _GL_INLINE +#endif /* Information gleaned from the command line. */ @@ -91,6 +96,11 @@ enum subcommand GLOBAL enum subcommand subcommand_option; +#define READ_LIKE_SUBCOMMAND \ + (subcommand_option == EXTRACT_SUBCOMMAND \ + || subcommand_option == DIFF_SUBCOMMAND \ + || subcommand_option == LIST_SUBCOMMAND) + /* Selected format for output archive. */ GLOBAL enum archive_format archive_format; @@ -138,9 +148,6 @@ GLOBAL const char *use_compress_program_option; GLOBAL bool dereference_option; GLOBAL bool hard_dereference_option; -/* Print a message if not all links are dumped */ -GLOBAL int check_links_option; - /* Patterns that match file names to be excluded. */ GLOBAL struct exclude *excluded; @@ -242,9 +249,6 @@ GLOBAL bool read_full_records_option; GLOBAL bool remove_files_option; -/* Specified rmt command. */ -GLOBAL const char *rmt_command_option; - /* Specified remote shell command. */ GLOBAL const char *rsh_command_option; @@ -256,6 +260,15 @@ GLOBAL int same_owner_option; /* If positive, preserve permissions when extracting. */ GLOBAL int same_permissions_option; +/* If positive, save the SELinux context. */ +GLOBAL int selinux_context_option; + +/* If positive, save the ACLs. */ +GLOBAL int acls_option; + +/* If positive, save the user and root xattrs. */ +GLOBAL int xattrs_option; + /* When set, strip the given number of file name components from the file name before extracting */ GLOBAL size_t strip_name_components; @@ -316,11 +329,10 @@ GLOBAL struct timespec last_stat_time; /* when the statistics was last GLOBAL struct tar_stat_info current_stat_info; -/* List of tape drive names, number of such tape drives, allocated number, +/* List of tape drive names, number of such tape drives, and current cursor in list. */ GLOBAL const char **archive_name_array; GLOBAL size_t archive_names; -GLOBAL size_t allocated_archive_names; GLOBAL const char **archive_name_cursor; /* Output index file name. */ @@ -581,6 +593,8 @@ void skip_member (void); /* Module misc.c. */ +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) < (b) ? (b) : (a)) void assign_string (char **dest, const char *src); int unquote_string (char *str); char *zap_slashes (char *name); @@ -593,11 +607,42 @@ namebuf_t namebuf_create (const char *dir); void namebuf_free (namebuf_t buf); char *namebuf_name (namebuf_t buf, const char *name); +/* Represent N using a signed integer I such that (uintmax_t) I == N. + With a good optimizing compiler, this is equivalent to (intmax_t) i + and requires zero machine instructions. */ +#if ! (UINTMAX_MAX / 2 <= INTMAX_MAX) +# error "represent_uintmax returns intmax_t to represent uintmax_t" +#endif +COMMON_INLINE intmax_t +represent_uintmax (uintmax_t n) +{ + if (n <= INTMAX_MAX) + return n; + else + { + /* Avoid signed integer overflow on picky platforms. */ + intmax_t nd = n - INTMAX_MIN; + return nd + INTMAX_MIN; + } +} + +enum { SYSINT_BUFSIZE = + max (UINTMAX_STRSIZE_BOUND, INT_BUFSIZE_BOUND (intmax_t)) }; +char *sysinttostr (uintmax_t, intmax_t, uintmax_t, char buf[SYSINT_BUFSIZE]); +intmax_t strtosysint (char const *, char **, intmax_t, uintmax_t); void code_ns_fraction (int ns, char *p); char const *code_timespec (struct timespec ts, char *sbuf); enum { BILLION = 1000000000, LOG10_BILLION = 9 }; enum { TIMESPEC_STRSIZE_BOUND = UINTMAX_STRSIZE_BOUND + LOG10_BILLION + sizeof "-." - 1 }; +struct timespec decode_timespec (char const *, char **, bool); + +/* Return true if T does not represent an out-of-range or invalid value. */ +COMMON_INLINE bool +valid_timespec (struct timespec t) +{ + return 0 <= t.tv_nsec; +} bool must_be_dot_or_slash (char const *); @@ -714,13 +759,16 @@ extern char *output_start; void update_archive (void); +/* Module attrs.c. */ +#include "xattrs.h" + /* Module xheader.c. */ void xheader_decode (struct tar_stat_info *stat); void xheader_decode_global (struct xheader *xhdr); void xheader_store (char const *keyword, struct tar_stat_info *st, void const *data); -void xheader_read (struct xheader *xhdr, union block *header, size_t size); +void xheader_read (struct xheader *xhdr, union block *header, off_t size); void xheader_write (char type, char *name, time_t t, struct xheader *xhdr); void xheader_write_global (struct xheader *xhdr); void xheader_finish (struct xheader *hdr); @@ -734,6 +782,12 @@ bool xheader_string_end (struct xheader *xhdr, char const *keyword); bool xheader_keyword_deleted_p (const char *kw); char *xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n); +void xheader_xattr_init (struct tar_stat_info *st); +void xheader_xattr_free (struct xattr_array *vals, size_t sz); +void xheader_xattr_copy (const struct tar_stat_info *st, + struct xattr_array **vals, size_t *sz); +void xheader_xattr_add (struct tar_stat_info *st, + const char *key, const char *val, size_t len); /* Module system.c */ @@ -758,7 +812,8 @@ void sys_exec_checkpoint_script (const char *script_name, int checkpoint_number); /* Module compare.c */ -void report_difference (struct tar_stat_info *st, const char *message, ...); +void report_difference (struct tar_stat_info *st, const char *message, ...) + __attribute__ ((format (printf, 2, 3))); /* Module sparse.c */ bool sparse_member_p (struct tar_stat_info *st); @@ -815,6 +870,7 @@ void checkpoint_run (bool do_write); #define WARN_XDEV 0x00040000 #define WARN_DECOMPRESS_PROGRAM 0x00080000 #define WARN_EXISTING_FILE 0x00100000 +#define WARN_XATTR_WRITE 0x00200000 /* The warnings composing WARN_VERBOSE_WARNINGS are enabled by default in verbose mode */ @@ -840,3 +896,5 @@ void finish_deferred_unlinks (void); /* Module exit.c */ extern void (*fatal_exit_hook) (void); + +_GL_INLINE_HEADER_END