#endif
#include <sys/stat.h>
-#include <sys/types.h> /* Linux requires this for off_t */
+#if ARCHIVE_VERSION_NUMBER < 3000000
+#include <sys/types.h> /* Linux needs this for off_t; 3.0+ doesn't need it */
+#endif
#ifdef __LA_STDINT_H
# include __LA_STDINT_H /* int64_t, etc. */
#endif
/* Record the dev/ino of a file that will not be written. This is
* generally set to the dev/ino of the archive being read. */
+#if ARCHIVE_VERSION_NUMBER < 3000000
__LA_DECL void archive_read_extract_set_skip_file(struct archive *,
dev_t, ino_t);
+#else
+__LA_DECL void archive_read_extract_set_skip_file(struct archive *,
+ __LA_INT64_T, __LA_INT64_T);
+#endif
/* Close the file and release most resources. */
__LA_DECL int archive_read_close(struct archive *);
/* The dev/ino of a file that won't be archived. This is used
* to avoid recursively adding an archive to itself. */
+#if ARCHIVE_VERSION_NUMBER < 3000000
__LA_DECL int archive_write_set_skip_file(struct archive *, dev_t, ino_t);
+#else
+__LA_DECL int archive_write_set_skip_file(struct archive *,
+ __LA_INT64_T, __LA_INT64_T);
+#endif
#if ARCHIVE_VERSION_NUMBER < 4000000
__LA_DECL int archive_write_set_compression_bzip2(struct archive *);
*/
__LA_DECL struct archive *archive_write_disk_new(void);
/* This file will not be overwritten. */
+#if ARCHIVE_VERSION_NUMBER < 3000000
__LA_DECL int archive_write_disk_set_skip_file(struct archive *,
dev_t, ino_t);
+#else
+__LA_DECL int archive_write_disk_set_skip_file(struct archive *,
+ __LA_INT64_T, __LA_INT64_T);
+#endif
/* Set flags to control how the next item gets created.
* This accepts a bitmask of ARCHIVE_EXTRACT_XXX flags defined above. */
__LA_DECL int archive_write_disk_set_options(struct archive *,
* your needs, you can write your own and register them. Be sure to
* include a cleanup function if you have allocated private data.
*/
+#if ARCHIVE_VERSION_NUMBER < 3000000
__LA_DECL int archive_write_disk_set_group_lookup(struct archive *,
void * /* private_data */,
__LA_GID_T (*)(void *, const char *, __LA_GID_T),
void * /* private_data */,
__LA_UID_T (*)(void *, const char *, __LA_UID_T),
void (* /* cleanup */)(void *));
+#else
+__LA_DECL int archive_write_disk_set_group_lookup(struct archive *,
+ void * /* private_data */,
+ __LA_INT64_T (*)(void *, const char *, __LA_INT64_T),
+ void (* /* cleanup */)(void *));
+__LA_DECL int archive_write_disk_set_user_lookup(struct archive *,
+ void * /* private_data */,
+ __LA_INT64_T (*)(void *, const char *, __LA_INT64_T),
+ void (* /* cleanup */)(void *));
+#endif
/*
* ARCHIVE_READ_DISK API
struct archive_entry *, int /* fd */, const struct stat *);
/* Look up gname for gid or uname for uid. */
/* Default implementations are very, very stupid. */
+#if ARCHIVE_VERSION_NUMBER < 3000000
__LA_DECL const char *archive_read_disk_gname(struct archive *, __LA_GID_T);
__LA_DECL const char *archive_read_disk_uname(struct archive *, __LA_UID_T);
+#else
+__LA_DECL const char *archive_read_disk_gname(struct archive *, __LA_INT64_T);
+__LA_DECL const char *archive_read_disk_uname(struct archive *, __LA_INT64_T);
+#endif
/* "Standard" implementation uses getpwuid_r, getgrgid_r and caches the
* results for performance. */
__LA_DECL int archive_read_disk_set_standard_lookup(struct archive *);
/* You can install your own lookups if you like. */
+#if ARCHIVE_VERSION_NUMBER < 3000000
__LA_DECL int archive_read_disk_set_gname_lookup(struct archive *,
void * /* private_data */,
const char *(* /* lookup_fn */)(void *, __LA_GID_T),
void * /* private_data */,
const char *(* /* lookup_fn */)(void *, __LA_UID_T),
void (* /* cleanup_fn */)(void *));
+#else
+__LA_DECL int archive_read_disk_set_gname_lookup(struct archive *,
+ void * /* private_data */,
+ const char *(* /* lookup_fn */)(void *, __LA_INT64_T),
+ void (* /* cleanup_fn */)(void *));
+__LA_DECL int archive_read_disk_set_uname_lookup(struct archive *,
+ void * /* private_data */,
+ const char *(* /* lookup_fn */)(void *, __LA_INT64_T),
+ void (* /* cleanup_fn */)(void *));
+#endif
/*
* Accessor functions to read/set various information in
ssize_t (*archive_write_data)(struct archive *,
const void *, size_t);
ssize_t (*archive_write_data_block)(struct archive *,
- const void *, size_t, off_t);
+ const void *, size_t, int64_t);
int (*archive_filter_count)(struct archive *);
int64_t (*archive_filter_bytes)(struct archive *, int);
/*
* Record the do-not-extract-to file. This belongs in archive_read_extract.c.
*/
+#if ARCHIVE_VERSION_NUMBER < 3000000
void
archive_read_extract_set_skip_file(struct archive *_a, dev_t d, ino_t i)
+#else
+void
+archive_read_extract_set_skip_file(struct archive *_a, int64_t d, int64_t i)
+#endif
{
struct archive_read *a = (struct archive_read *)_a;
__archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_ANY,
* Returns ARCHIVE_OK if the operation is successful, ARCHIVE_EOF if
* the end of entry is encountered.
*/
+#if ARCHIVE_VERSION_NUMBER < 3000000
int
archive_read_data_block(struct archive *_a,
const void **buff, size_t *size, off_t *offset)
+#else
+int
+archive_read_data_block(struct archive *_a,
+ const void **buff, size_t *size, int64_t *offset)
+#endif
{
struct archive_read *a = (struct archive_read *)_a;
__archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_DATA,
static int _archive_read_free(struct archive *);
static int _archive_read_close(struct archive *);
+#if ARCHIVE_VERSION_NUMBER < 3000000
static const char *trivial_lookup_gname(void *, gid_t gid);
static const char *trivial_lookup_uname(void *, uid_t uid);
-
+#else
+static const char *trivial_lookup_gname(void *, int64_t gid);
+static const char *trivial_lookup_uname(void *, int64_t uid);
+#endif
static struct archive_vtable *
archive_read_disk_vtable(void)
{
return (&av);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
const char *
archive_read_disk_gname(struct archive *_a, gid_t gid)
+#else
+const char *
+archive_read_disk_gname(struct archive *_a, int64_t gid)
+#endif
{
struct archive_read_disk *a = (struct archive_read_disk *)_a;
if (a->lookup_gname != NULL)
return (NULL);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
const char *
archive_read_disk_uname(struct archive *_a, uid_t uid)
+#else
+const char *
+archive_read_disk_uname(struct archive *_a, int64_t uid)
+#endif
{
struct archive_read_disk *a = (struct archive_read_disk *)_a;
if (a->lookup_uname != NULL)
return (NULL);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
int
archive_read_disk_set_gname_lookup(struct archive *_a,
void *private_data,
const char * (*lookup_gname)(void *private, gid_t gid),
void (*cleanup_gname)(void *private))
+#else
+int
+archive_read_disk_set_gname_lookup(struct archive *_a,
+ void *private_data,
+ const char * (*lookup_gname)(void *private, int64_t gid),
+ void (*cleanup_gname)(void *private))
+#endif
{
struct archive_read_disk *a = (struct archive_read_disk *)_a;
__archive_check_magic(&a->archive, ARCHIVE_READ_DISK_MAGIC,
return (ARCHIVE_OK);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
int
archive_read_disk_set_uname_lookup(struct archive *_a,
void *private_data,
const char * (*lookup_uname)(void *private, uid_t uid),
void (*cleanup_uname)(void *private))
+#else
+int
+archive_read_disk_set_uname_lookup(struct archive *_a,
+ void *private_data,
+ const char * (*lookup_uname)(void *private, int64_t uid),
+ void (*cleanup_uname)(void *private))
+#endif
{
struct archive_read_disk *a = (struct archive_read_disk *)_a;
__archive_check_magic(&a->archive, ARCHIVE_READ_DISK_MAGIC,
* These are normally overridden by the client, but these stub
* versions ensure that we always have something that works.
*/
+#if ARCHIVE_VERSION_NUMBER < 3000000
static const char *
trivial_lookup_gname(void *private_data, gid_t gid)
+#else
+static const char *
+trivial_lookup_gname(void *private_data, int64_t gid)
+#endif
{
(void)private_data; /* UNUSED */
(void)gid; /* UNUSED */
return (NULL);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
static const char *
trivial_lookup_uname(void *private_data, uid_t uid)
+#else
+static const char *
+trivial_lookup_uname(void *private_data, int64_t uid)
+#endif
{
(void)private_data; /* UNUSED */
(void)uid; /* UNUSED */
*/
char follow_symlinks; /* Either 'L' or 'P'. */
+#if ARCHIVE_VERSION_NUMBER < 3000000
const char * (*lookup_gname)(void *private, gid_t gid);
+#else
+ const char * (*lookup_gname)(void *private, int64_t gid);
+#endif
void (*cleanup_gname)(void *private);
void *lookup_gname_data;
- const char * (*lookup_uname)(void *private, gid_t gid);
+#if ARCHIVE_VERSION_NUMBER < 3000000
+ const char * (*lookup_uname)(void *private, uid_t uid);
+#else
+ const char * (*lookup_uname)(void *private, int64_t uid);
+#endif
void (*cleanup_uname)(void *private);
void *lookup_uname_data;
};
} cache[name_cache_size];
};
+#if ARCHIVE_VERSION_NUMBER < 3000000
static const char * lookup_gname(void *, gid_t);
static const char * lookup_uname(void *, uid_t);
+#else
+static const char * lookup_gname(void *, int64_t);
+static const char * lookup_uname(void *, int64_t);
+#endif
static void cleanup(void *);
static const char * lookup_gname_helper(struct name_cache *, id_t gid);
static const char * lookup_uname_helper(struct name_cache *, id_t uid);
return (cache->cache[slot].name);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
static const char *
lookup_uname(void *data, uid_t uid)
+#else
+static const char *
+lookup_uname(void *data, int64_t uid)
+#endif
{
struct name_cache *uname_cache = (struct name_cache *)data;
return (lookup_name(uname_cache,
return strdup(result->pw_name);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
static const char *
lookup_gname(void *data, gid_t gid)
+#else
+static const char *
+lookup_gname(void *data, int64_t gid)
+#endif
{
struct name_cache *gname_cache = (struct name_cache *)data;
return (lookup_name(gname_cache,
return ((a->vtable->archive_write_data)(a, buff, s));
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
ssize_t
archive_write_data_block(struct archive *a, const void *buff, size_t s, off_t o)
+#else
+ssize_t
+archive_write_data_block(struct archive *a, const void *buff, size_t s, int64_t o)
+#endif
{
return ((a->vtable->archive_write_data_block)(a, buff, s, o));
}
* dev/ino of a file to be rejected. Used to prevent adding
* an archive to itself recursively.
*/
+#if ARCHIVE_VERSION_NUMBER < 3000000
int
archive_write_set_skip_file(struct archive *_a, dev_t d, ino_t i)
+#else
+int
+archive_write_set_skip_file(struct archive *_a, int64_t d, int64_t i)
+#endif
{
struct archive_write *a = (struct archive_write *)_a;
__archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC,
mode_t user_umask;
struct fixup_entry *fixup_list;
struct fixup_entry *current_fixup;
- uid_t user_uid;
+ int64_t user_uid;
dev_t skip_file_dev;
ino_t skip_file_ino;
time_t start_time;
+#if ARCHIVE_VERSION_NUMBER < 3000000
gid_t (*lookup_gid)(void *private, const char *gname, gid_t gid);
+#else
+ int64_t (*lookup_gid)(void *private, const char *gname, int64_t gid);
+#endif
void (*cleanup_gid)(void *private);
void *lookup_gid_data;
- uid_t (*lookup_uid)(void *private, const char *gname, gid_t gid);
+#if ARCHIVE_VERSION_NUMBER < 3000000
+ uid_t (*lookup_uid)(void *private, const char *uname, uid_t uid);
+#else
+ int64_t (*lookup_uid)(void *private, const char *uname, int64_t uid);
+#endif
void (*cleanup_uid)(void *private);
void *lookup_uid_data;
/* Mode we should use for this entry; affected by _PERM and umask. */
mode_t mode;
/* UID/GID to use in restoring this entry. */
- uid_t uid;
- gid_t gid;
+ int64_t uid;
+ int64_t gid;
};
/*
static int set_time(int, int, const char *, time_t, long, time_t, long);
static int set_times(struct archive_write_disk *);
static struct fixup_entry *sort_dir_list(struct fixup_entry *p);
+#if ARCHIVE_VERSION_NUMBER < 3000000
static gid_t trivial_lookup_gid(void *, const char *, gid_t);
static uid_t trivial_lookup_uid(void *, const char *, uid_t);
+#else
+static int64_t trivial_lookup_gid(void *, const char *, int64_t);
+static int64_t trivial_lookup_uid(void *, const char *, int64_t);
+#endif
static ssize_t write_data_block(struct archive_write_disk *,
const char *, size_t);
static int64_t _archive_write_disk_filter_bytes(struct archive *, int);
static int _archive_write_disk_finish_entry(struct archive *);
static ssize_t _archive_write_disk_data(struct archive *, const void *, size_t);
-static ssize_t _archive_write_disk_data_block(struct archive *, const void *, size_t, off_t);
+static ssize_t _archive_write_disk_data_block(struct archive *, const void *, size_t, int64_t);
static int
lazy_stat(struct archive_write_disk *a)
return (ret);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
int
archive_write_disk_set_skip_file(struct archive *_a, dev_t d, ino_t i)
+#else
+int
+archive_write_disk_set_skip_file(struct archive *_a, int64_t d, int64_t i)
+#endif
{
struct archive_write_disk *a = (struct archive_write_disk *)_a;
__archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC,
static ssize_t
_archive_write_disk_data_block(struct archive *_a,
- const void *buff, size_t size, off_t offset)
+ const void *buff, size_t size, int64_t offset)
{
struct archive_write_disk *a = (struct archive_write_disk *)_a;
ssize_t r;
return (ret);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
int
archive_write_disk_set_group_lookup(struct archive *_a,
void *private_data,
gid_t (*lookup_gid)(void *private, const char *gname, gid_t gid),
void (*cleanup_gid)(void *private))
+#else
+int
+archive_write_disk_set_group_lookup(struct archive *_a,
+ void *private_data,
+ int64_t (*lookup_gid)(void *private, const char *gname, int64_t gid),
+ void (*cleanup_gid)(void *private))
+#endif
{
struct archive_write_disk *a = (struct archive_write_disk *)_a;
__archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC,
return (ARCHIVE_OK);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
int
archive_write_disk_set_user_lookup(struct archive *_a,
void *private_data,
uid_t (*lookup_uid)(void *private, const char *uname, uid_t uid),
void (*cleanup_uid)(void *private))
+#else
+int
+archive_write_disk_set_user_lookup(struct archive *_a,
+ void *private_data,
+ int64_t (*lookup_uid)(void *private, const char *uname, int64_t uid),
+ void (*cleanup_uid)(void *private))
+#endif
{
struct archive_write_disk *a = (struct archive_write_disk *)_a;
__archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC,
* These are normally overridden by the client, but these stub
* versions ensure that we always have something that works.
*/
+#if ARCHIVE_VERSION_NUMBER < 3000000
static gid_t
trivial_lookup_gid(void *private_data, const char *gname, gid_t gid)
+#else
+static int64_t
+trivial_lookup_gid(void *private_data, const char *gname, int64_t gid)
+#endif
{
(void)private_data; /* UNUSED */
(void)gname; /* UNUSED */
return (gid);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
static uid_t
trivial_lookup_uid(void *private_data, const char *uname, uid_t uid)
+#else
+static int64_t
+trivial_lookup_uid(void *private_data, const char *uname, int64_t uid)
+#endif
{
(void)private_data; /* UNUSED */
(void)uname; /* UNUSED */
static const size_t cache_size = 127;
static unsigned int hash(const char *);
+#if ARCHIVE_VERSION_NUMBER < 3000000
static gid_t lookup_gid(void *, const char *uname, gid_t);
static uid_t lookup_uid(void *, const char *uname, uid_t);
+#else
+static int64_t lookup_gid(void *, const char *uname, int64_t);
+static int64_t lookup_uid(void *, const char *uname, int64_t);
+#endif
static void cleanup(void *);
/*
return (ARCHIVE_OK);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
static gid_t
lookup_gid(void *private_data, const char *gname, gid_t gid)
+#else
+static int64_t
+lookup_gid(void *private_data, const char *gname, int64_t gid)
+#endif
{
int h;
struct bucket *b;
return (gid);
}
+#if ARCHIVE_VERSION_NUMBER < 3000000
static uid_t
lookup_uid(void *private_data, const char *uname, uid_t uid)
+#else
+static int64_t
+lookup_uid(void *private_data, const char *uname, int64_t uid)
+#endif
{
int h;
struct bucket *b;