1228753Smm/*- 2228753Smm * Copyright (c) 2003-2007 Tim Kientzle 3228753Smm * All rights reserved. 4228753Smm * 5228753Smm * Redistribution and use in source and binary forms, with or without 6228753Smm * modification, are permitted provided that the following conditions 7228753Smm * are met: 8228753Smm * 1. Redistributions of source code must retain the above copyright 9228753Smm * notice, this list of conditions and the following disclaimer. 10228753Smm * 2. Redistributions in binary form must reproduce the above copyright 11228753Smm * notice, this list of conditions and the following disclaimer in the 12228753Smm * documentation and/or other materials provided with the distribution. 13228753Smm * 14228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24228753Smm * 25228763Smm * $FreeBSD$ 26228753Smm */ 27228753Smm 28228753Smm#ifndef __LIBARCHIVE_BUILD 29228753Smm#error This header is only to be used internally to libarchive. 30228753Smm#endif 31228753Smm 32228753Smm#ifndef ARCHIVE_PRIVATE_H_INCLUDED 33228753Smm#define ARCHIVE_PRIVATE_H_INCLUDED 34228753Smm 35232153Smm#if HAVE_ICONV_H 36232153Smm#include <iconv.h> 37232153Smm#endif 38232153Smm 39228753Smm#include "archive.h" 40228753Smm#include "archive_string.h" 41228753Smm 42228753Smm#if defined(__GNUC__) && (__GNUC__ > 2 || \ 43228753Smm (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) 44228753Smm#define __LA_DEAD __attribute__((__noreturn__)) 45228753Smm#else 46228753Smm#define __LA_DEAD 47228753Smm#endif 48228753Smm 49228753Smm#define ARCHIVE_WRITE_MAGIC (0xb0c5c0deU) 50228753Smm#define ARCHIVE_READ_MAGIC (0xdeb0c5U) 51228753Smm#define ARCHIVE_WRITE_DISK_MAGIC (0xc001b0c5U) 52228753Smm#define ARCHIVE_READ_DISK_MAGIC (0xbadb0c5U) 53238856Smm#define ARCHIVE_MATCH_MAGIC (0xcad11c9U) 54228753Smm 55228753Smm#define ARCHIVE_STATE_NEW 1U 56228753Smm#define ARCHIVE_STATE_HEADER 2U 57228753Smm#define ARCHIVE_STATE_DATA 4U 58228753Smm#define ARCHIVE_STATE_EOF 0x10U 59228753Smm#define ARCHIVE_STATE_CLOSED 0x20U 60228753Smm#define ARCHIVE_STATE_FATAL 0x8000U 61232153Smm#define ARCHIVE_STATE_ANY (0xFFFFU & ~ARCHIVE_STATE_FATAL) 62228753Smm 63228753Smmstruct archive_vtable { 64228753Smm int (*archive_close)(struct archive *); 65228773Smm int (*archive_free)(struct archive *); 66228753Smm int (*archive_write_header)(struct archive *, 67228753Smm struct archive_entry *); 68228753Smm int (*archive_write_finish_entry)(struct archive *); 69228753Smm ssize_t (*archive_write_data)(struct archive *, 70228753Smm const void *, size_t); 71228753Smm ssize_t (*archive_write_data_block)(struct archive *, 72232153Smm const void *, size_t, int64_t); 73232153Smm 74232153Smm int (*archive_read_next_header)(struct archive *, 75232153Smm struct archive_entry **); 76232153Smm int (*archive_read_next_header2)(struct archive *, 77232153Smm struct archive_entry *); 78232153Smm int (*archive_read_data_block)(struct archive *, 79232153Smm const void **, size_t *, int64_t *); 80232153Smm 81232153Smm int (*archive_filter_count)(struct archive *); 82232153Smm int64_t (*archive_filter_bytes)(struct archive *, int); 83232153Smm int (*archive_filter_code)(struct archive *, int); 84232153Smm const char * (*archive_filter_name)(struct archive *, int); 85228753Smm}; 86228753Smm 87232153Smmstruct archive_string_conv; 88232153Smm 89228753Smmstruct archive { 90228753Smm /* 91228753Smm * The magic/state values are used to sanity-check the 92228753Smm * client's usage. If an API function is called at a 93228753Smm * ridiculous time, or the client passes us an invalid 94228753Smm * pointer, these values allow me to catch that. 95228753Smm */ 96228753Smm unsigned int magic; 97228753Smm unsigned int state; 98228753Smm 99228753Smm /* 100228753Smm * Some public API functions depend on the "real" type of the 101228753Smm * archive object. 102228753Smm */ 103228753Smm struct archive_vtable *vtable; 104228753Smm 105228753Smm int archive_format; 106228753Smm const char *archive_format_name; 107228753Smm 108228753Smm int compression_code; /* Currently active compression. */ 109228753Smm const char *compression_name; 110228753Smm 111228753Smm /* Number of file entries processed. */ 112228753Smm int file_count; 113228753Smm 114228753Smm int archive_error_number; 115228753Smm const char *error; 116228753Smm struct archive_string error_string; 117232153Smm 118232153Smm char *current_code; 119232153Smm unsigned current_codepage; /* Current ACP(ANSI CodePage). */ 120232153Smm unsigned current_oemcp; /* Current OEMCP(OEM CodePage). */ 121232153Smm struct archive_string_conv *sconv; 122228753Smm}; 123228753Smm 124232153Smm/* Check magic value and state; return(ARCHIVE_FATAL) if it isn't valid. */ 125232153Smmint __archive_check_magic(struct archive *, unsigned int magic, 126228753Smm unsigned int state, const char *func); 127232153Smm#define archive_check_magic(a, expected_magic, allowed_states, function_name) \ 128232153Smm do { \ 129232153Smm int magic_test = __archive_check_magic((a), (expected_magic), \ 130232153Smm (allowed_states), (function_name)); \ 131232153Smm if (magic_test == ARCHIVE_FATAL) \ 132232153Smm return ARCHIVE_FATAL; \ 133232153Smm } while (0) 134228753Smm 135228753Smmvoid __archive_errx(int retvalue, const char *msg) __LA_DEAD; 136228753Smm 137248616Smmvoid __archive_ensure_cloexec_flag(int fd); 138232153Smmint __archive_mktemp(const char *tmpdir); 139228753Smm 140232153Smmint __archive_clean(struct archive *); 141232153Smm 142228753Smm#define err_combine(a,b) ((a) < (b) ? (a) : (b)) 143228753Smm 144228753Smm#if defined(__BORLANDC__) || (defined(_MSC_VER) && _MSC_VER <= 1300) 145228753Smm# define ARCHIVE_LITERAL_LL(x) x##i64 146228753Smm# define ARCHIVE_LITERAL_ULL(x) x##ui64 147228753Smm#else 148228753Smm# define ARCHIVE_LITERAL_LL(x) x##ll 149228753Smm# define ARCHIVE_LITERAL_ULL(x) x##ull 150228753Smm#endif 151228753Smm 152228753Smm#endif 153