109ade360Sjoerg /*- 29fde5391Sjoerg * Copyright (c) 2003-2008 Tim Kientzle 3d05f0226Sjoerg * Copyright (c) 2016 Martin Matuska 409ade360Sjoerg * All rights reserved. 509ade360Sjoerg * 609ade360Sjoerg * Redistribution and use in source and binary forms, with or without 709ade360Sjoerg * modification, are permitted provided that the following conditions 809ade360Sjoerg * are met: 909ade360Sjoerg * 1. Redistributions of source code must retain the above copyright 1009ade360Sjoerg * notice, this list of conditions and the following disclaimer. 1109ade360Sjoerg * 2. Redistributions in binary form must reproduce the above copyright 1209ade360Sjoerg * notice, this list of conditions and the following disclaimer in the 1309ade360Sjoerg * documentation and/or other materials provided with the distribution. 1409ade360Sjoerg * 1509ade360Sjoerg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 1609ade360Sjoerg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1709ade360Sjoerg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1809ade360Sjoerg * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 1909ade360Sjoerg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2009ade360Sjoerg * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2109ade360Sjoerg * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2209ade360Sjoerg * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2309ade360Sjoerg * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2409ade360Sjoerg * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2509ade360Sjoerg * 269fde5391Sjoerg * $FreeBSD: head/lib/libarchive/archive_entry.h 201096 2009-12-28 02:41:27Z kientzle $ 2709ade360Sjoerg */ 2809ade360Sjoerg 2909ade360Sjoerg #ifndef ARCHIVE_ENTRY_H_INCLUDED 3009ade360Sjoerg #define ARCHIVE_ENTRY_H_INCLUDED 3109ade360Sjoerg 32d05f0226Sjoerg /* Note: Compiler will complain if this does not match archive.h! */ 33*efdd4e46Sjoerg #define ARCHIVE_VERSION_NUMBER 3004000 34d05f0226Sjoerg 3509ade360Sjoerg /* 3609ade360Sjoerg * Note: archive_entry.h is for use outside of libarchive; the 3709ade360Sjoerg * configuration headers (config.h, archive_platform.h, etc.) are 3809ade360Sjoerg * purely internal. Do NOT use HAVE_XXX configuration macros to 3909ade360Sjoerg * control the behavior of this header! If you must conditionalize, 4009ade360Sjoerg * use predefined compiler and/or platform macros. 4109ade360Sjoerg */ 4209ade360Sjoerg 4309ade360Sjoerg #include <sys/types.h> 4409ade360Sjoerg #include <stddef.h> /* for wchar_t */ 45*efdd4e46Sjoerg #include <stdint.h> 4609ade360Sjoerg #include <time.h> 4709ade360Sjoerg 489fde5391Sjoerg #if defined(_WIN32) && !defined(__CYGWIN__) 499fde5391Sjoerg #include <windows.h> 509fde5391Sjoerg #endif 519fde5391Sjoerg 52d05f0226Sjoerg /* Get a suitable 64-bit integer type. */ 53d05f0226Sjoerg #if !defined(__LA_INT64_T_DEFINED) 54d05f0226Sjoerg # if ARCHIVE_VERSION_NUMBER < 4000000 55d05f0226Sjoerg #define __LA_INT64_T la_int64_t 569fde5391Sjoerg # endif 57d05f0226Sjoerg #define __LA_INT64_T_DEFINED 58d05f0226Sjoerg # if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) 59d05f0226Sjoerg typedef __int64 la_int64_t; 6009ade360Sjoerg # else 6109ade360Sjoerg #include <unistd.h> 62d05f0226Sjoerg # if defined(_SCO_DS) || defined(__osf__) 63d05f0226Sjoerg typedef long long la_int64_t; 64d05f0226Sjoerg # else 65d05f0226Sjoerg typedef int64_t la_int64_t; 66d05f0226Sjoerg # endif 67d05f0226Sjoerg # endif 68d05f0226Sjoerg #endif 69d05f0226Sjoerg 70d05f0226Sjoerg /* The la_ssize_t should match the type used in 'struct stat' */ 71d05f0226Sjoerg #if !defined(__LA_SSIZE_T_DEFINED) 72d05f0226Sjoerg /* Older code relied on the __LA_SSIZE_T macro; after 4.0 we'll switch to the typedef exclusively. */ 73d05f0226Sjoerg # if ARCHIVE_VERSION_NUMBER < 4000000 74d05f0226Sjoerg #define __LA_SSIZE_T la_ssize_t 75d05f0226Sjoerg # endif 76d05f0226Sjoerg #define __LA_SSIZE_T_DEFINED 77d05f0226Sjoerg # if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) 78d05f0226Sjoerg # if defined(_SSIZE_T_DEFINED) || defined(_SSIZE_T_) 79d05f0226Sjoerg typedef ssize_t la_ssize_t; 80d05f0226Sjoerg # elif defined(_WIN64) 81d05f0226Sjoerg typedef __int64 la_ssize_t; 82d05f0226Sjoerg # else 83d05f0226Sjoerg typedef long la_ssize_t; 84d05f0226Sjoerg # endif 85d05f0226Sjoerg # else 86d05f0226Sjoerg # include <unistd.h> /* ssize_t */ 87d05f0226Sjoerg typedef ssize_t la_ssize_t; 88d05f0226Sjoerg # endif 89d05f0226Sjoerg #endif 90d05f0226Sjoerg 91d05f0226Sjoerg /* Get a suitable definition for mode_t */ 92d05f0226Sjoerg #if ARCHIVE_VERSION_NUMBER >= 3999000 93d05f0226Sjoerg /* Switch to plain 'int' for libarchive 4.0. It's less broken than 'mode_t' */ 94d05f0226Sjoerg # define __LA_MODE_T int 95d05f0226Sjoerg #elif defined(_WIN32) && !defined(__CYGWIN__) && !defined(__BORLANDC__) && !defined(__WATCOMC__) 96d05f0226Sjoerg # define __LA_MODE_T unsigned short 97d05f0226Sjoerg #else 9809ade360Sjoerg # define __LA_MODE_T mode_t 9909ade360Sjoerg #endif 10009ade360Sjoerg 101d05f0226Sjoerg /* Large file support for Android */ 102d05f0226Sjoerg #ifdef __ANDROID__ 103d05f0226Sjoerg #include "android_lf.h" 104d05f0226Sjoerg #endif 10509ade360Sjoerg 10609ade360Sjoerg /* 10709ade360Sjoerg * On Windows, define LIBARCHIVE_STATIC if you're building or using a 10809ade360Sjoerg * .lib. The default here assumes you're building a DLL. Only 10909ade360Sjoerg * libarchive source should ever define __LIBARCHIVE_BUILD. 11009ade360Sjoerg */ 1119fde5391Sjoerg #if ((defined __WIN32__) || (defined _WIN32) || defined(__CYGWIN__)) && (!defined LIBARCHIVE_STATIC) 11209ade360Sjoerg # ifdef __LIBARCHIVE_BUILD 11309ade360Sjoerg # ifdef __GNUC__ 11409ade360Sjoerg # define __LA_DECL __attribute__((dllexport)) extern 11509ade360Sjoerg # else 11609ade360Sjoerg # define __LA_DECL __declspec(dllexport) 11709ade360Sjoerg # endif 11809ade360Sjoerg # else 11909ade360Sjoerg # ifdef __GNUC__ 120d05f0226Sjoerg # define __LA_DECL 12109ade360Sjoerg # else 12209ade360Sjoerg # define __LA_DECL __declspec(dllimport) 12309ade360Sjoerg # endif 12409ade360Sjoerg # endif 12509ade360Sjoerg #else 12609ade360Sjoerg /* Static libraries on all platforms and shared libraries on non-Windows. */ 12709ade360Sjoerg # define __LA_DECL 12809ade360Sjoerg #endif 12909ade360Sjoerg 130d05f0226Sjoerg #if defined(__GNUC__) && __GNUC__ >= 3 && __GNUC_MINOR__ >= 1 131d05f0226Sjoerg # define __LA_DEPRECATED __attribute__((deprecated)) 132d05f0226Sjoerg #else 133d05f0226Sjoerg # define __LA_DEPRECATED 134d05f0226Sjoerg #endif 135d05f0226Sjoerg 13609ade360Sjoerg #ifdef __cplusplus 13709ade360Sjoerg extern "C" { 13809ade360Sjoerg #endif 13909ade360Sjoerg 14009ade360Sjoerg /* 14109ade360Sjoerg * Description of an archive entry. 14209ade360Sjoerg * 14309ade360Sjoerg * You can think of this as "struct stat" with some text fields added in. 14409ade360Sjoerg * 14509ade360Sjoerg * TODO: Add "comment", "charset", and possibly other entries that are 14609ade360Sjoerg * supported by "pax interchange" format. However, GNU, ustar, cpio, 14709ade360Sjoerg * and other variants don't support these features, so they're not an 14809ade360Sjoerg * excruciatingly high priority right now. 14909ade360Sjoerg * 15009ade360Sjoerg * TODO: "pax interchange" format allows essentially arbitrary 15109ade360Sjoerg * key/value attributes to be attached to any entry. Supporting 15209ade360Sjoerg * such extensions may make this library useful for special 15309ade360Sjoerg * applications (e.g., a package manager could attach special 15409ade360Sjoerg * package-management attributes to each entry). 15509ade360Sjoerg */ 156d05f0226Sjoerg struct archive; 15709ade360Sjoerg struct archive_entry; 15809ade360Sjoerg 15909ade360Sjoerg /* 16009ade360Sjoerg * File-type constants. These are returned from archive_entry_filetype() 16109ade360Sjoerg * and passed to archive_entry_set_filetype(). 16209ade360Sjoerg * 16309ade360Sjoerg * These values match S_XXX defines on every platform I've checked, 16409ade360Sjoerg * including Windows, AIX, Linux, Solaris, and BSD. They're 16509ade360Sjoerg * (re)defined here because platforms generally don't define the ones 16609ade360Sjoerg * they don't support. For example, Windows doesn't define S_IFLNK or 16709ade360Sjoerg * S_IFBLK. Instead of having a mass of conditional logic and system 16809ade360Sjoerg * checks to define any S_XXX values that aren't supported locally, 16909ade360Sjoerg * I've just defined a new set of such constants so that 17009ade360Sjoerg * libarchive-based applications can manipulate and identify archive 17109ade360Sjoerg * entries properly even if the hosting platform can't store them on 17209ade360Sjoerg * disk. 17309ade360Sjoerg * 17409ade360Sjoerg * These values are also used directly within some portable formats, 17509ade360Sjoerg * such as cpio. If you find a platform that varies from these, the 17609ade360Sjoerg * correct solution is to leave these alone and translate from these 17709ade360Sjoerg * portable values to platform-native values when entries are read from 17809ade360Sjoerg * or written to disk. 17909ade360Sjoerg */ 180d05f0226Sjoerg /* 181d05f0226Sjoerg * In libarchive 4.0, we can drop the casts here. 182d05f0226Sjoerg * They're needed to work around Borland C's broken mode_t. 183d05f0226Sjoerg */ 184d05f0226Sjoerg #define AE_IFMT ((__LA_MODE_T)0170000) 185d05f0226Sjoerg #define AE_IFREG ((__LA_MODE_T)0100000) 186d05f0226Sjoerg #define AE_IFLNK ((__LA_MODE_T)0120000) 187d05f0226Sjoerg #define AE_IFSOCK ((__LA_MODE_T)0140000) 188d05f0226Sjoerg #define AE_IFCHR ((__LA_MODE_T)0020000) 189d05f0226Sjoerg #define AE_IFBLK ((__LA_MODE_T)0060000) 190d05f0226Sjoerg #define AE_IFDIR ((__LA_MODE_T)0040000) 191d05f0226Sjoerg #define AE_IFIFO ((__LA_MODE_T)0010000) 19209ade360Sjoerg 19309ade360Sjoerg /* 194*efdd4e46Sjoerg * Symlink types 195*efdd4e46Sjoerg */ 196*efdd4e46Sjoerg #define AE_SYMLINK_TYPE_UNDEFINED 0 197*efdd4e46Sjoerg #define AE_SYMLINK_TYPE_FILE 1 198*efdd4e46Sjoerg #define AE_SYMLINK_TYPE_DIRECTORY 2 199*efdd4e46Sjoerg 200*efdd4e46Sjoerg /* 20109ade360Sjoerg * Basic object manipulation 20209ade360Sjoerg */ 20309ade360Sjoerg 20409ade360Sjoerg __LA_DECL struct archive_entry *archive_entry_clear(struct archive_entry *); 20509ade360Sjoerg /* The 'clone' function does a deep copy; all of the strings are copied too. */ 20609ade360Sjoerg __LA_DECL struct archive_entry *archive_entry_clone(struct archive_entry *); 20709ade360Sjoerg __LA_DECL void archive_entry_free(struct archive_entry *); 20809ade360Sjoerg __LA_DECL struct archive_entry *archive_entry_new(void); 20909ade360Sjoerg 21009ade360Sjoerg /* 211d05f0226Sjoerg * This form of archive_entry_new2() will pull character-set 212d05f0226Sjoerg * conversion information from the specified archive handle. The 213d05f0226Sjoerg * older archive_entry_new(void) form is equivalent to calling 214d05f0226Sjoerg * archive_entry_new2(NULL) and will result in the use of an internal 215d05f0226Sjoerg * default character-set conversion. 216d05f0226Sjoerg */ 217d05f0226Sjoerg __LA_DECL struct archive_entry *archive_entry_new2(struct archive *); 218d05f0226Sjoerg 219d05f0226Sjoerg /* 22009ade360Sjoerg * Retrieve fields from an archive_entry. 2219fde5391Sjoerg * 2229fde5391Sjoerg * There are a number of implicit conversions among these fields. For 2239fde5391Sjoerg * example, if a regular string field is set and you read the _w wide 2249fde5391Sjoerg * character field, the entry will implicitly convert narrow-to-wide 2259fde5391Sjoerg * using the current locale. Similarly, dev values are automatically 2269fde5391Sjoerg * updated when you write devmajor or devminor and vice versa. 2279fde5391Sjoerg * 2289fde5391Sjoerg * In addition, fields can be "set" or "unset." Unset string fields 2299fde5391Sjoerg * return NULL, non-string fields have _is_set() functions to test 2309fde5391Sjoerg * whether they've been set. You can "unset" a string field by 2319fde5391Sjoerg * assigning NULL; non-string fields have _unset() functions to 2329fde5391Sjoerg * unset them. 2339fde5391Sjoerg * 2349fde5391Sjoerg * Note: There is one ambiguity in the above; string fields will 2359fde5391Sjoerg * also return NULL when implicit character set conversions fail. 2369fde5391Sjoerg * This is usually what you want. 23709ade360Sjoerg */ 23809ade360Sjoerg __LA_DECL time_t archive_entry_atime(struct archive_entry *); 23909ade360Sjoerg __LA_DECL long archive_entry_atime_nsec(struct archive_entry *); 2409fde5391Sjoerg __LA_DECL int archive_entry_atime_is_set(struct archive_entry *); 2419fde5391Sjoerg __LA_DECL time_t archive_entry_birthtime(struct archive_entry *); 2429fde5391Sjoerg __LA_DECL long archive_entry_birthtime_nsec(struct archive_entry *); 2439fde5391Sjoerg __LA_DECL int archive_entry_birthtime_is_set(struct archive_entry *); 24409ade360Sjoerg __LA_DECL time_t archive_entry_ctime(struct archive_entry *); 24509ade360Sjoerg __LA_DECL long archive_entry_ctime_nsec(struct archive_entry *); 2469fde5391Sjoerg __LA_DECL int archive_entry_ctime_is_set(struct archive_entry *); 24709ade360Sjoerg __LA_DECL dev_t archive_entry_dev(struct archive_entry *); 248d05f0226Sjoerg __LA_DECL int archive_entry_dev_is_set(struct archive_entry *); 24909ade360Sjoerg __LA_DECL dev_t archive_entry_devmajor(struct archive_entry *); 25009ade360Sjoerg __LA_DECL dev_t archive_entry_devminor(struct archive_entry *); 25109ade360Sjoerg __LA_DECL __LA_MODE_T archive_entry_filetype(struct archive_entry *); 25209ade360Sjoerg __LA_DECL void archive_entry_fflags(struct archive_entry *, 25309ade360Sjoerg unsigned long * /* set */, 25409ade360Sjoerg unsigned long * /* clear */); 25509ade360Sjoerg __LA_DECL const char *archive_entry_fflags_text(struct archive_entry *); 256d05f0226Sjoerg __LA_DECL la_int64_t archive_entry_gid(struct archive_entry *); 25709ade360Sjoerg __LA_DECL const char *archive_entry_gname(struct archive_entry *); 258d05f0226Sjoerg __LA_DECL const char *archive_entry_gname_utf8(struct archive_entry *); 25909ade360Sjoerg __LA_DECL const wchar_t *archive_entry_gname_w(struct archive_entry *); 26009ade360Sjoerg __LA_DECL const char *archive_entry_hardlink(struct archive_entry *); 261d05f0226Sjoerg __LA_DECL const char *archive_entry_hardlink_utf8(struct archive_entry *); 26209ade360Sjoerg __LA_DECL const wchar_t *archive_entry_hardlink_w(struct archive_entry *); 263d05f0226Sjoerg __LA_DECL la_int64_t archive_entry_ino(struct archive_entry *); 264d05f0226Sjoerg __LA_DECL la_int64_t archive_entry_ino64(struct archive_entry *); 265d05f0226Sjoerg __LA_DECL int archive_entry_ino_is_set(struct archive_entry *); 26609ade360Sjoerg __LA_DECL __LA_MODE_T archive_entry_mode(struct archive_entry *); 26709ade360Sjoerg __LA_DECL time_t archive_entry_mtime(struct archive_entry *); 26809ade360Sjoerg __LA_DECL long archive_entry_mtime_nsec(struct archive_entry *); 2699fde5391Sjoerg __LA_DECL int archive_entry_mtime_is_set(struct archive_entry *); 27009ade360Sjoerg __LA_DECL unsigned int archive_entry_nlink(struct archive_entry *); 27109ade360Sjoerg __LA_DECL const char *archive_entry_pathname(struct archive_entry *); 272d05f0226Sjoerg __LA_DECL const char *archive_entry_pathname_utf8(struct archive_entry *); 27309ade360Sjoerg __LA_DECL const wchar_t *archive_entry_pathname_w(struct archive_entry *); 274d05f0226Sjoerg __LA_DECL __LA_MODE_T archive_entry_perm(struct archive_entry *); 27509ade360Sjoerg __LA_DECL dev_t archive_entry_rdev(struct archive_entry *); 27609ade360Sjoerg __LA_DECL dev_t archive_entry_rdevmajor(struct archive_entry *); 27709ade360Sjoerg __LA_DECL dev_t archive_entry_rdevminor(struct archive_entry *); 27809ade360Sjoerg __LA_DECL const char *archive_entry_sourcepath(struct archive_entry *); 279d05f0226Sjoerg __LA_DECL const wchar_t *archive_entry_sourcepath_w(struct archive_entry *); 280d05f0226Sjoerg __LA_DECL la_int64_t archive_entry_size(struct archive_entry *); 2819fde5391Sjoerg __LA_DECL int archive_entry_size_is_set(struct archive_entry *); 28209ade360Sjoerg __LA_DECL const char *archive_entry_strmode(struct archive_entry *); 28309ade360Sjoerg __LA_DECL const char *archive_entry_symlink(struct archive_entry *); 284d05f0226Sjoerg __LA_DECL const char *archive_entry_symlink_utf8(struct archive_entry *); 285*efdd4e46Sjoerg __LA_DECL int archive_entry_symlink_type(struct archive_entry *); 28609ade360Sjoerg __LA_DECL const wchar_t *archive_entry_symlink_w(struct archive_entry *); 287d05f0226Sjoerg __LA_DECL la_int64_t archive_entry_uid(struct archive_entry *); 28809ade360Sjoerg __LA_DECL const char *archive_entry_uname(struct archive_entry *); 289d05f0226Sjoerg __LA_DECL const char *archive_entry_uname_utf8(struct archive_entry *); 29009ade360Sjoerg __LA_DECL const wchar_t *archive_entry_uname_w(struct archive_entry *); 291d05f0226Sjoerg __LA_DECL int archive_entry_is_data_encrypted(struct archive_entry *); 292d05f0226Sjoerg __LA_DECL int archive_entry_is_metadata_encrypted(struct archive_entry *); 293d05f0226Sjoerg __LA_DECL int archive_entry_is_encrypted(struct archive_entry *); 29409ade360Sjoerg 29509ade360Sjoerg /* 29609ade360Sjoerg * Set fields in an archive_entry. 29709ade360Sjoerg * 298d05f0226Sjoerg * Note: Before libarchive 2.4, there were 'set' and 'copy' versions 299d05f0226Sjoerg * of the string setters. 'copy' copied the actual string, 'set' just 300d05f0226Sjoerg * stored the pointer. In libarchive 2.4 and later, strings are 301d05f0226Sjoerg * always copied. 30209ade360Sjoerg */ 30309ade360Sjoerg 30409ade360Sjoerg __LA_DECL void archive_entry_set_atime(struct archive_entry *, time_t, long); 3059fde5391Sjoerg __LA_DECL void archive_entry_unset_atime(struct archive_entry *); 3069fde5391Sjoerg #if defined(_WIN32) && !defined(__CYGWIN__) 307d05f0226Sjoerg __LA_DECL void archive_entry_copy_bhfi(struct archive_entry *, BY_HANDLE_FILE_INFORMATION *); 3089fde5391Sjoerg #endif 3099fde5391Sjoerg __LA_DECL void archive_entry_set_birthtime(struct archive_entry *, time_t, long); 3109fde5391Sjoerg __LA_DECL void archive_entry_unset_birthtime(struct archive_entry *); 31109ade360Sjoerg __LA_DECL void archive_entry_set_ctime(struct archive_entry *, time_t, long); 3129fde5391Sjoerg __LA_DECL void archive_entry_unset_ctime(struct archive_entry *); 31309ade360Sjoerg __LA_DECL void archive_entry_set_dev(struct archive_entry *, dev_t); 31409ade360Sjoerg __LA_DECL void archive_entry_set_devmajor(struct archive_entry *, dev_t); 31509ade360Sjoerg __LA_DECL void archive_entry_set_devminor(struct archive_entry *, dev_t); 31609ade360Sjoerg __LA_DECL void archive_entry_set_filetype(struct archive_entry *, unsigned int); 31709ade360Sjoerg __LA_DECL void archive_entry_set_fflags(struct archive_entry *, 31809ade360Sjoerg unsigned long /* set */, unsigned long /* clear */); 31909ade360Sjoerg /* Returns pointer to start of first invalid token, or NULL if none. */ 32009ade360Sjoerg /* Note that all recognized tokens are processed, regardless. */ 32109ade360Sjoerg __LA_DECL const char *archive_entry_copy_fflags_text(struct archive_entry *, 32209ade360Sjoerg const char *); 32309ade360Sjoerg __LA_DECL const wchar_t *archive_entry_copy_fflags_text_w(struct archive_entry *, 32409ade360Sjoerg const wchar_t *); 325d05f0226Sjoerg __LA_DECL void archive_entry_set_gid(struct archive_entry *, la_int64_t); 32609ade360Sjoerg __LA_DECL void archive_entry_set_gname(struct archive_entry *, const char *); 327d05f0226Sjoerg __LA_DECL void archive_entry_set_gname_utf8(struct archive_entry *, const char *); 32809ade360Sjoerg __LA_DECL void archive_entry_copy_gname(struct archive_entry *, const char *); 32909ade360Sjoerg __LA_DECL void archive_entry_copy_gname_w(struct archive_entry *, const wchar_t *); 33009ade360Sjoerg __LA_DECL int archive_entry_update_gname_utf8(struct archive_entry *, const char *); 33109ade360Sjoerg __LA_DECL void archive_entry_set_hardlink(struct archive_entry *, const char *); 332d05f0226Sjoerg __LA_DECL void archive_entry_set_hardlink_utf8(struct archive_entry *, const char *); 33309ade360Sjoerg __LA_DECL void archive_entry_copy_hardlink(struct archive_entry *, const char *); 33409ade360Sjoerg __LA_DECL void archive_entry_copy_hardlink_w(struct archive_entry *, const wchar_t *); 3359fde5391Sjoerg __LA_DECL int archive_entry_update_hardlink_utf8(struct archive_entry *, const char *); 336d05f0226Sjoerg __LA_DECL void archive_entry_set_ino(struct archive_entry *, la_int64_t); 337d05f0226Sjoerg __LA_DECL void archive_entry_set_ino64(struct archive_entry *, la_int64_t); 33809ade360Sjoerg __LA_DECL void archive_entry_set_link(struct archive_entry *, const char *); 339d05f0226Sjoerg __LA_DECL void archive_entry_set_link_utf8(struct archive_entry *, const char *); 34009ade360Sjoerg __LA_DECL void archive_entry_copy_link(struct archive_entry *, const char *); 34109ade360Sjoerg __LA_DECL void archive_entry_copy_link_w(struct archive_entry *, const wchar_t *); 34209ade360Sjoerg __LA_DECL int archive_entry_update_link_utf8(struct archive_entry *, const char *); 34309ade360Sjoerg __LA_DECL void archive_entry_set_mode(struct archive_entry *, __LA_MODE_T); 34409ade360Sjoerg __LA_DECL void archive_entry_set_mtime(struct archive_entry *, time_t, long); 3459fde5391Sjoerg __LA_DECL void archive_entry_unset_mtime(struct archive_entry *); 34609ade360Sjoerg __LA_DECL void archive_entry_set_nlink(struct archive_entry *, unsigned int); 34709ade360Sjoerg __LA_DECL void archive_entry_set_pathname(struct archive_entry *, const char *); 348d05f0226Sjoerg __LA_DECL void archive_entry_set_pathname_utf8(struct archive_entry *, const char *); 34909ade360Sjoerg __LA_DECL void archive_entry_copy_pathname(struct archive_entry *, const char *); 35009ade360Sjoerg __LA_DECL void archive_entry_copy_pathname_w(struct archive_entry *, const wchar_t *); 35109ade360Sjoerg __LA_DECL int archive_entry_update_pathname_utf8(struct archive_entry *, const char *); 35209ade360Sjoerg __LA_DECL void archive_entry_set_perm(struct archive_entry *, __LA_MODE_T); 35309ade360Sjoerg __LA_DECL void archive_entry_set_rdev(struct archive_entry *, dev_t); 35409ade360Sjoerg __LA_DECL void archive_entry_set_rdevmajor(struct archive_entry *, dev_t); 35509ade360Sjoerg __LA_DECL void archive_entry_set_rdevminor(struct archive_entry *, dev_t); 356d05f0226Sjoerg __LA_DECL void archive_entry_set_size(struct archive_entry *, la_int64_t); 3579fde5391Sjoerg __LA_DECL void archive_entry_unset_size(struct archive_entry *); 35809ade360Sjoerg __LA_DECL void archive_entry_copy_sourcepath(struct archive_entry *, const char *); 359d05f0226Sjoerg __LA_DECL void archive_entry_copy_sourcepath_w(struct archive_entry *, const wchar_t *); 36009ade360Sjoerg __LA_DECL void archive_entry_set_symlink(struct archive_entry *, const char *); 361*efdd4e46Sjoerg __LA_DECL void archive_entry_set_symlink_type(struct archive_entry *, int); 362d05f0226Sjoerg __LA_DECL void archive_entry_set_symlink_utf8(struct archive_entry *, const char *); 36309ade360Sjoerg __LA_DECL void archive_entry_copy_symlink(struct archive_entry *, const char *); 36409ade360Sjoerg __LA_DECL void archive_entry_copy_symlink_w(struct archive_entry *, const wchar_t *); 3659fde5391Sjoerg __LA_DECL int archive_entry_update_symlink_utf8(struct archive_entry *, const char *); 366d05f0226Sjoerg __LA_DECL void archive_entry_set_uid(struct archive_entry *, la_int64_t); 36709ade360Sjoerg __LA_DECL void archive_entry_set_uname(struct archive_entry *, const char *); 368d05f0226Sjoerg __LA_DECL void archive_entry_set_uname_utf8(struct archive_entry *, const char *); 36909ade360Sjoerg __LA_DECL void archive_entry_copy_uname(struct archive_entry *, const char *); 37009ade360Sjoerg __LA_DECL void archive_entry_copy_uname_w(struct archive_entry *, const wchar_t *); 37109ade360Sjoerg __LA_DECL int archive_entry_update_uname_utf8(struct archive_entry *, const char *); 372d05f0226Sjoerg __LA_DECL void archive_entry_set_is_data_encrypted(struct archive_entry *, char is_encrypted); 373d05f0226Sjoerg __LA_DECL void archive_entry_set_is_metadata_encrypted(struct archive_entry *, char is_encrypted); 37409ade360Sjoerg /* 37509ade360Sjoerg * Routines to bulk copy fields to/from a platform-native "struct 37609ade360Sjoerg * stat." Libarchive used to just store a struct stat inside of each 37709ade360Sjoerg * archive_entry object, but this created issues when trying to 37809ade360Sjoerg * manipulate archives on systems different than the ones they were 37909ade360Sjoerg * created on. 38009ade360Sjoerg * 381d05f0226Sjoerg * TODO: On Linux and other LFS systems, provide both stat32 and 382d05f0226Sjoerg * stat64 versions of these functions and all of the macro glue so 383d05f0226Sjoerg * that archive_entry_stat is magically defined to 384d05f0226Sjoerg * archive_entry_stat32 or archive_entry_stat64 as appropriate. 38509ade360Sjoerg */ 38609ade360Sjoerg __LA_DECL const struct stat *archive_entry_stat(struct archive_entry *); 38709ade360Sjoerg __LA_DECL void archive_entry_copy_stat(struct archive_entry *, const struct stat *); 38809ade360Sjoerg 389d05f0226Sjoerg /* 390d05f0226Sjoerg * Storage for Mac OS-specific AppleDouble metadata information. 391d05f0226Sjoerg * Apple-format tar files store a separate binary blob containing 392d05f0226Sjoerg * encoded metadata with ACL, extended attributes, etc. 393d05f0226Sjoerg * This provides a place to store that blob. 394d05f0226Sjoerg */ 395d05f0226Sjoerg 396d05f0226Sjoerg __LA_DECL const void * archive_entry_mac_metadata(struct archive_entry *, size_t *); 397d05f0226Sjoerg __LA_DECL void archive_entry_copy_mac_metadata(struct archive_entry *, const void *, size_t); 3989fde5391Sjoerg 39909ade360Sjoerg /* 40009ade360Sjoerg * ACL routines. This used to simply store and return text-format ACL 40109ade360Sjoerg * strings, but that proved insufficient for a number of reasons: 40209ade360Sjoerg * = clients need control over uname/uid and gname/gid mappings 40309ade360Sjoerg * = there are many different ACL text formats 40409ade360Sjoerg * = would like to be able to read/convert archives containing ACLs 40509ade360Sjoerg * on platforms that lack ACL libraries 40609ade360Sjoerg * 40709ade360Sjoerg * This last point, in particular, forces me to implement a reasonably 40809ade360Sjoerg * complete set of ACL support routines. 40909ade360Sjoerg */ 41009ade360Sjoerg 41109ade360Sjoerg /* 412d05f0226Sjoerg * Permission bits. 41309ade360Sjoerg */ 414d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_EXECUTE 0x00000001 415d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_WRITE 0x00000002 416d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_READ 0x00000004 417d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_READ_DATA 0x00000008 418d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_LIST_DIRECTORY 0x00000008 419d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_WRITE_DATA 0x00000010 420d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_ADD_FILE 0x00000010 421d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_APPEND_DATA 0x00000020 422d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY 0x00000020 423d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS 0x00000040 424d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS 0x00000080 425d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_DELETE_CHILD 0x00000100 426d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES 0x00000200 427d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES 0x00000400 428d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_DELETE 0x00000800 429d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_READ_ACL 0x00001000 430d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_WRITE_ACL 0x00002000 431d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_WRITE_OWNER 0x00004000 432d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_SYNCHRONIZE 0x00008000 43309ade360Sjoerg 434d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_PERMS_POSIX1E \ 435d05f0226Sjoerg (ARCHIVE_ENTRY_ACL_EXECUTE \ 436d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_WRITE \ 437d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_READ) 438d05f0226Sjoerg 439d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_PERMS_NFS4 \ 440d05f0226Sjoerg (ARCHIVE_ENTRY_ACL_EXECUTE \ 441d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_READ_DATA \ 442d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_LIST_DIRECTORY \ 443d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_WRITE_DATA \ 444d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_ADD_FILE \ 445d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_APPEND_DATA \ 446d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY \ 447d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS \ 448d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS \ 449d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_DELETE_CHILD \ 450d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES \ 451d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES \ 452d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_DELETE \ 453d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_READ_ACL \ 454d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_WRITE_ACL \ 455d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_WRITE_OWNER \ 456d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_SYNCHRONIZE) 457d05f0226Sjoerg 458d05f0226Sjoerg /* 459d05f0226Sjoerg * Inheritance values (NFS4 ACLs only); included in permset. 460d05f0226Sjoerg */ 461d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_ENTRY_INHERITED 0x01000000 462d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT 0x02000000 463d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT 0x04000000 464d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT 0x08000000 465d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY 0x10000000 466d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS 0x20000000 467d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS 0x40000000 468d05f0226Sjoerg 469d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_INHERITANCE_NFS4 \ 470d05f0226Sjoerg (ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT \ 471d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT \ 472d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT \ 473d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY \ 474d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS \ 475d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS \ 476d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_ENTRY_INHERITED) 477d05f0226Sjoerg 478d05f0226Sjoerg /* We need to be able to specify combinations of these. */ 479d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_TYPE_ACCESS 0x00000100 /* POSIX.1e only */ 480d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_TYPE_DEFAULT 0x00000200 /* POSIX.1e only */ 481d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_TYPE_ALLOW 0x00000400 /* NFS4 only */ 482d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_TYPE_DENY 0x00000800 /* NFS4 only */ 483d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_TYPE_AUDIT 0x00001000 /* NFS4 only */ 484d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_TYPE_ALARM 0x00002000 /* NFS4 only */ 485d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_TYPE_POSIX1E (ARCHIVE_ENTRY_ACL_TYPE_ACCESS \ 486d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_TYPE_DEFAULT) 487d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_TYPE_NFS4 (ARCHIVE_ENTRY_ACL_TYPE_ALLOW \ 488d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_TYPE_DENY \ 489d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_TYPE_AUDIT \ 490d05f0226Sjoerg | ARCHIVE_ENTRY_ACL_TYPE_ALARM) 49109ade360Sjoerg 49209ade360Sjoerg /* Tag values mimic POSIX.1e */ 49309ade360Sjoerg #define ARCHIVE_ENTRY_ACL_USER 10001 /* Specified user. */ 49409ade360Sjoerg #define ARCHIVE_ENTRY_ACL_USER_OBJ 10002 /* User who owns the file. */ 49509ade360Sjoerg #define ARCHIVE_ENTRY_ACL_GROUP 10003 /* Specified group. */ 49609ade360Sjoerg #define ARCHIVE_ENTRY_ACL_GROUP_OBJ 10004 /* Group who owns the file. */ 497d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_MASK 10005 /* Modify group access (POSIX.1e only) */ 498d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_OTHER 10006 /* Public (POSIX.1e only) */ 499d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_EVERYONE 10107 /* Everyone (NFS4 only) */ 50009ade360Sjoerg 50109ade360Sjoerg /* 50209ade360Sjoerg * Set the ACL by clearing it and adding entries one at a time. 50309ade360Sjoerg * Unlike the POSIX.1e ACL routines, you must specify the type 50409ade360Sjoerg * (access/default) for each entry. Internally, the ACL data is just 50509ade360Sjoerg * a soup of entries. API calls here allow you to retrieve just the 50609ade360Sjoerg * entries of interest. This design (which goes against the spirit of 50709ade360Sjoerg * POSIX.1e) is useful for handling archive formats that combine 50809ade360Sjoerg * default and access information in a single ACL list. 50909ade360Sjoerg */ 51009ade360Sjoerg __LA_DECL void archive_entry_acl_clear(struct archive_entry *); 511d05f0226Sjoerg __LA_DECL int archive_entry_acl_add_entry(struct archive_entry *, 51209ade360Sjoerg int /* type */, int /* permset */, int /* tag */, 51309ade360Sjoerg int /* qual */, const char * /* name */); 514d05f0226Sjoerg __LA_DECL int archive_entry_acl_add_entry_w(struct archive_entry *, 51509ade360Sjoerg int /* type */, int /* permset */, int /* tag */, 51609ade360Sjoerg int /* qual */, const wchar_t * /* name */); 51709ade360Sjoerg 51809ade360Sjoerg /* 51909ade360Sjoerg * To retrieve the ACL, first "reset", then repeatedly ask for the 52009ade360Sjoerg * "next" entry. The want_type parameter allows you to request only 521d05f0226Sjoerg * certain types of entries. 52209ade360Sjoerg */ 52309ade360Sjoerg __LA_DECL int archive_entry_acl_reset(struct archive_entry *, int /* want_type */); 52409ade360Sjoerg __LA_DECL int archive_entry_acl_next(struct archive_entry *, int /* want_type */, 52509ade360Sjoerg int * /* type */, int * /* permset */, int * /* tag */, 52609ade360Sjoerg int * /* qual */, const char ** /* name */); 52709ade360Sjoerg __LA_DECL int archive_entry_acl_next_w(struct archive_entry *, int /* want_type */, 52809ade360Sjoerg int * /* type */, int * /* permset */, int * /* tag */, 52909ade360Sjoerg int * /* qual */, const wchar_t ** /* name */); 53009ade360Sjoerg 53109ade360Sjoerg /* 53209ade360Sjoerg * Construct a text-format ACL. The flags argument is a bitmask that 53309ade360Sjoerg * can include any of the following: 53409ade360Sjoerg * 535d05f0226Sjoerg * Flags only for archive entries with POSIX.1e ACL: 536d05f0226Sjoerg * ARCHIVE_ENTRY_ACL_TYPE_ACCESS - Include POSIX.1e "access" entries. 537d05f0226Sjoerg * ARCHIVE_ENTRY_ACL_TYPE_DEFAULT - Include POSIX.1e "default" entries. 53809ade360Sjoerg * ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT - Include "default:" before each 53909ade360Sjoerg * default ACL entry. 540d05f0226Sjoerg * ARCHIVE_ENTRY_ACL_STYLE_SOLARIS - Output only one colon after "other" and 541d05f0226Sjoerg * "mask" entries. 542d05f0226Sjoerg * 543d05f0226Sjoerg * Flags only for archive entries with NFSv4 ACL: 544d05f0226Sjoerg * ARCHIVE_ENTRY_ACL_STYLE_COMPACT - Do not output the minus character for 545d05f0226Sjoerg * unset permissions and flags in NFSv4 ACL permission and flag fields 546d05f0226Sjoerg * 547d05f0226Sjoerg * Flags for for archive entries with POSIX.1e ACL or NFSv4 ACL: 548d05f0226Sjoerg * ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID - Include extra numeric ID field in 549d05f0226Sjoerg * each ACL entry. 550d05f0226Sjoerg * ARCHIVE_ENTRY_ACL_STYLE_SEPARATOR_COMMA - Separate entries with comma 551d05f0226Sjoerg * instead of newline. 55209ade360Sjoerg */ 553d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID 0x00000001 554d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT 0x00000002 555d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_STYLE_SOLARIS 0x00000004 556d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_STYLE_SEPARATOR_COMMA 0x00000008 557d05f0226Sjoerg #define ARCHIVE_ENTRY_ACL_STYLE_COMPACT 0x00000010 558d05f0226Sjoerg 559d05f0226Sjoerg __LA_DECL wchar_t *archive_entry_acl_to_text_w(struct archive_entry *, 560d05f0226Sjoerg la_ssize_t * /* len */, int /* flags */); 561d05f0226Sjoerg __LA_DECL char *archive_entry_acl_to_text(struct archive_entry *, 562d05f0226Sjoerg la_ssize_t * /* len */, int /* flags */); 563d05f0226Sjoerg __LA_DECL int archive_entry_acl_from_text_w(struct archive_entry *, 564d05f0226Sjoerg const wchar_t * /* wtext */, int /* type */); 565d05f0226Sjoerg __LA_DECL int archive_entry_acl_from_text(struct archive_entry *, 566d05f0226Sjoerg const char * /* text */, int /* type */); 567d05f0226Sjoerg 568d05f0226Sjoerg /* Deprecated constants */ 569d05f0226Sjoerg #define OLD_ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID 1024 570d05f0226Sjoerg #define OLD_ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT 2048 571d05f0226Sjoerg 572d05f0226Sjoerg /* Deprecated functions */ 57309ade360Sjoerg __LA_DECL const wchar_t *archive_entry_acl_text_w(struct archive_entry *, 574d05f0226Sjoerg int /* flags */) __LA_DEPRECATED; 575d05f0226Sjoerg __LA_DECL const char *archive_entry_acl_text(struct archive_entry *, 576d05f0226Sjoerg int /* flags */) __LA_DEPRECATED; 577d05f0226Sjoerg 578d05f0226Sjoerg /* Return bitmask of ACL types in an archive entry */ 579d05f0226Sjoerg __LA_DECL int archive_entry_acl_types(struct archive_entry *); 58009ade360Sjoerg 58109ade360Sjoerg /* Return a count of entries matching 'want_type' */ 58209ade360Sjoerg __LA_DECL int archive_entry_acl_count(struct archive_entry *, int /* want_type */); 58309ade360Sjoerg 584d05f0226Sjoerg /* Return an opaque ACL object. */ 585d05f0226Sjoerg /* There's not yet anything clients can actually do with this... */ 586d05f0226Sjoerg struct archive_acl; 587d05f0226Sjoerg __LA_DECL struct archive_acl *archive_entry_acl(struct archive_entry *); 58809ade360Sjoerg 58909ade360Sjoerg /* 59009ade360Sjoerg * extended attributes 59109ade360Sjoerg */ 59209ade360Sjoerg 59309ade360Sjoerg __LA_DECL void archive_entry_xattr_clear(struct archive_entry *); 59409ade360Sjoerg __LA_DECL void archive_entry_xattr_add_entry(struct archive_entry *, 59509ade360Sjoerg const char * /* name */, const void * /* value */, 59609ade360Sjoerg size_t /* size */); 59709ade360Sjoerg 59809ade360Sjoerg /* 59909ade360Sjoerg * To retrieve the xattr list, first "reset", then repeatedly ask for the 60009ade360Sjoerg * "next" entry. 60109ade360Sjoerg */ 60209ade360Sjoerg 60309ade360Sjoerg __LA_DECL int archive_entry_xattr_count(struct archive_entry *); 60409ade360Sjoerg __LA_DECL int archive_entry_xattr_reset(struct archive_entry *); 60509ade360Sjoerg __LA_DECL int archive_entry_xattr_next(struct archive_entry *, 60609ade360Sjoerg const char ** /* name */, const void ** /* value */, size_t *); 60709ade360Sjoerg 60809ade360Sjoerg /* 609d05f0226Sjoerg * sparse 610d05f0226Sjoerg */ 611d05f0226Sjoerg 612d05f0226Sjoerg __LA_DECL void archive_entry_sparse_clear(struct archive_entry *); 613d05f0226Sjoerg __LA_DECL void archive_entry_sparse_add_entry(struct archive_entry *, 614d05f0226Sjoerg la_int64_t /* offset */, la_int64_t /* length */); 615d05f0226Sjoerg 616d05f0226Sjoerg /* 617d05f0226Sjoerg * To retrieve the xattr list, first "reset", then repeatedly ask for the 618d05f0226Sjoerg * "next" entry. 619d05f0226Sjoerg */ 620d05f0226Sjoerg 621d05f0226Sjoerg __LA_DECL int archive_entry_sparse_count(struct archive_entry *); 622d05f0226Sjoerg __LA_DECL int archive_entry_sparse_reset(struct archive_entry *); 623d05f0226Sjoerg __LA_DECL int archive_entry_sparse_next(struct archive_entry *, 624d05f0226Sjoerg la_int64_t * /* offset */, la_int64_t * /* length */); 625d05f0226Sjoerg 626d05f0226Sjoerg /* 62709ade360Sjoerg * Utility to match up hardlinks. 62809ade360Sjoerg * 62909ade360Sjoerg * The 'struct archive_entry_linkresolver' is a cache of archive entries 63009ade360Sjoerg * for files with multiple links. Here's how to use it: 63109ade360Sjoerg * 1. Create a lookup object with archive_entry_linkresolver_new() 63209ade360Sjoerg * 2. Tell it the archive format you're using. 63309ade360Sjoerg * 3. Hand each archive_entry to archive_entry_linkify(). 63409ade360Sjoerg * That function will return 0, 1, or 2 entries that should 63509ade360Sjoerg * be written. 63609ade360Sjoerg * 4. Call archive_entry_linkify(resolver, NULL) until 63709ade360Sjoerg * no more entries are returned. 638d05f0226Sjoerg * 5. Call archive_entry_linkresolver_free(resolver) to free resources. 63909ade360Sjoerg * 64009ade360Sjoerg * The entries returned have their hardlink and size fields updated 64109ade360Sjoerg * appropriately. If an entry is passed in that does not refer to 64209ade360Sjoerg * a file with multiple links, it is returned unchanged. The intention 64309ade360Sjoerg * is that you should be able to simply filter all entries through 64409ade360Sjoerg * this machine. 64509ade360Sjoerg * 64609ade360Sjoerg * To make things more efficient, be sure that each entry has a valid 64709ade360Sjoerg * nlinks value. The hardlink cache uses this to track when all links 64809ade360Sjoerg * have been found. If the nlinks value is zero, it will keep every 64909ade360Sjoerg * name in the cache indefinitely, which can use a lot of memory. 65009ade360Sjoerg * 65109ade360Sjoerg * Note that archive_entry_size() is reset to zero if the file 65209ade360Sjoerg * body should not be written to the archive. Pay attention! 65309ade360Sjoerg */ 6549fde5391Sjoerg struct archive_entry_linkresolver; 65509ade360Sjoerg 65609ade360Sjoerg /* 65709ade360Sjoerg * There are three different strategies for marking hardlinks. 65809ade360Sjoerg * The descriptions below name them after the best-known 65909ade360Sjoerg * formats that rely on each strategy: 66009ade360Sjoerg * 66109ade360Sjoerg * "Old cpio" is the simplest, it always returns any entry unmodified. 66209ade360Sjoerg * As far as I know, only cpio formats use this. Old cpio archives 66309ade360Sjoerg * store every link with the full body; the onus is on the dearchiver 66409ade360Sjoerg * to detect and properly link the files as they are restored. 66509ade360Sjoerg * "tar" is also pretty simple; it caches a copy the first time it sees 66609ade360Sjoerg * any link. Subsequent appearances are modified to be hardlink 66709ade360Sjoerg * references to the first one without any body. Used by all tar 66809ade360Sjoerg * formats, although the newest tar formats permit the "old cpio" strategy 66909ade360Sjoerg * as well. This strategy is very simple for the dearchiver, 67009ade360Sjoerg * and reasonably straightforward for the archiver. 67109ade360Sjoerg * "new cpio" is trickier. It stores the body only with the last 67209ade360Sjoerg * occurrence. The complication is that we might not 67309ade360Sjoerg * see every link to a particular file in a single session, so 67409ade360Sjoerg * there's no easy way to know when we've seen the last occurrence. 67509ade360Sjoerg * The solution here is to queue one link until we see the next. 67609ade360Sjoerg * At the end of the session, you can enumerate any remaining 67709ade360Sjoerg * entries by calling archive_entry_linkify(NULL) and store those 67809ade360Sjoerg * bodies. If you have a file with three links l1, l2, and l3, 67909ade360Sjoerg * you'll get the following behavior if you see all three links: 68009ade360Sjoerg * linkify(l1) => NULL (the resolver stores l1 internally) 68109ade360Sjoerg * linkify(l2) => l1 (resolver stores l2, you write l1) 68209ade360Sjoerg * linkify(l3) => l2, l3 (all links seen, you can write both). 68309ade360Sjoerg * If you only see l1 and l2, you'll get this behavior: 68409ade360Sjoerg * linkify(l1) => NULL 68509ade360Sjoerg * linkify(l2) => l1 68609ade360Sjoerg * linkify(NULL) => l2 (at end, you retrieve remaining links) 68709ade360Sjoerg * As the name suggests, this strategy is used by newer cpio variants. 688d05f0226Sjoerg * It's noticeably more complex for the archiver, slightly more complex 68909ade360Sjoerg * for the dearchiver than the tar strategy, but makes it straightforward 69009ade360Sjoerg * to restore a file using any link by simply continuing to scan until 69109ade360Sjoerg * you see a link that is stored with a body. In contrast, the tar 69209ade360Sjoerg * strategy requires you to rescan the archive from the beginning to 69309ade360Sjoerg * correctly extract an arbitrary link. 69409ade360Sjoerg */ 69509ade360Sjoerg 69609ade360Sjoerg __LA_DECL struct archive_entry_linkresolver *archive_entry_linkresolver_new(void); 69709ade360Sjoerg __LA_DECL void archive_entry_linkresolver_set_strategy( 69809ade360Sjoerg struct archive_entry_linkresolver *, int /* format_code */); 69909ade360Sjoerg __LA_DECL void archive_entry_linkresolver_free(struct archive_entry_linkresolver *); 70009ade360Sjoerg __LA_DECL void archive_entry_linkify(struct archive_entry_linkresolver *, 70109ade360Sjoerg struct archive_entry **, struct archive_entry **); 702d05f0226Sjoerg __LA_DECL struct archive_entry *archive_entry_partial_links( 703d05f0226Sjoerg struct archive_entry_linkresolver *res, unsigned int *links); 70409ade360Sjoerg #ifdef __cplusplus 70509ade360Sjoerg } 70609ade360Sjoerg #endif 70709ade360Sjoerg 70809ade360Sjoerg /* This is meaningless outside of this header. */ 70909ade360Sjoerg #undef __LA_DECL 71009ade360Sjoerg 71109ade360Sjoerg #endif /* !ARCHIVE_ENTRY_H_INCLUDED */ 712