archive_private.h revision 229592
155714Skris/*- 255714Skris * Copyright (c) 2003-2007 Tim Kientzle 355714Skris * All rights reserved. 455714Skris * 555714Skris * Redistribution and use in source and binary forms, with or without 655714Skris * modification, are permitted provided that the following conditions 755714Skris * are met: 855714Skris * 1. Redistributions of source code must retain the above copyright 955714Skris * notice, this list of conditions and the following disclaimer. 1055714Skris * 2. Redistributions in binary form must reproduce the above copyright 1155714Skris * notice, this list of conditions and the following disclaimer in the 1255714Skris * documentation and/or other materials provided with the distribution. 1355714Skris * 1455714Skris * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 1555714Skris * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1655714Skris * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1755714Skris * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 1855714Skris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 1955714Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2055714Skris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2155714Skris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2255714Skris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2355714Skris * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2455714Skris * 2555714Skris * $FreeBSD: stable/9/contrib/libarchive/libarchive/archive_private.h 229592 2012-01-05 12:06:54Z mm $ 2655714Skris */ 2755714Skris 2855714Skris#ifndef __LIBARCHIVE_BUILD 2955714Skris#error This header is only to be used internally to libarchive. 3055714Skris#endif 3155714Skris 3255714Skris#ifndef ARCHIVE_PRIVATE_H_INCLUDED 3355714Skris#define ARCHIVE_PRIVATE_H_INCLUDED 3455714Skris 3555714Skris#include "archive.h" 3655714Skris#include "archive_string.h" 3755714Skris 3855714Skris#if defined(__GNUC__) && (__GNUC__ > 2 || \ 3955714Skris (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) 4055714Skris#define __LA_DEAD __attribute__((__noreturn__)) 4155714Skris#else 4255714Skris#define __LA_DEAD 4355714Skris#endif 4455714Skris 4555714Skris#define ARCHIVE_WRITE_MAGIC (0xb0c5c0deU) 4655714Skris#define ARCHIVE_READ_MAGIC (0xdeb0c5U) 4755714Skris#define ARCHIVE_WRITE_DISK_MAGIC (0xc001b0c5U) 4855714Skris#define ARCHIVE_READ_DISK_MAGIC (0xbadb0c5U) 4955714Skris 5055714Skris#define ARCHIVE_STATE_ANY 0xFFFFU 5155714Skris#define ARCHIVE_STATE_NEW 1U 5255714Skris#define ARCHIVE_STATE_HEADER 2U 5355714Skris#define ARCHIVE_STATE_DATA 4U 5455714Skris#define ARCHIVE_STATE_DATA_END 8U 5555714Skris#define ARCHIVE_STATE_EOF 0x10U 5655714Skris#define ARCHIVE_STATE_CLOSED 0x20U 5755714Skris#define ARCHIVE_STATE_FATAL 0x8000U 5855714Skris 5955714Skrisstruct archive_vtable { 6055714Skris int (*archive_close)(struct archive *); 6155714Skris int (*archive_free)(struct archive *); 6255714Skris int (*archive_write_header)(struct archive *, 6355714Skris struct archive_entry *); 6455714Skris int (*archive_write_finish_entry)(struct archive *); 6555714Skris ssize_t (*archive_write_data)(struct archive *, 6655714Skris const void *, size_t); 6755714Skris ssize_t (*archive_write_data_block)(struct archive *, 6855714Skris const void *, size_t, off_t); 6955714Skris}; 7068651Skris 7155714Skrisstruct archive { 7255714Skris /* 7355714Skris * The magic/state values are used to sanity-check the 7455714Skris * client's usage. If an API function is called at a 7555714Skris * ridiculous time, or the client passes us an invalid 7655714Skris * pointer, these values allow me to catch that. 7755714Skris */ 7868651Skris unsigned int magic; 7955714Skris unsigned int state; 8055714Skris 8155714Skris /* 8255714Skris * Some public API functions depend on the "real" type of the 8355714Skris * archive object. 8455714Skris */ 8555714Skris struct archive_vtable *vtable; 8655714Skris 8755714Skris int archive_format; 8855714Skris const char *archive_format_name; 8955714Skris 9055714Skris int compression_code; /* Currently active compression. */ 9155714Skris const char *compression_name; 9255714Skris 9355714Skris /* Position in UNCOMPRESSED data stream. */ 9455714Skris int64_t file_position; 9555714Skris /* Position in COMPRESSED data stream. */ 9655714Skris int64_t raw_position; 9755714Skris /* Number of file entries processed. */ 9855714Skris int file_count; 9955714Skris 100109998Smarkm int archive_error_number; 10155714Skris const char *error; 10255714Skris struct archive_string error_string; 103109998Smarkm}; 104109998Smarkm 105109998Smarkm/* Check magic value and state; exit if it isn't valid. */ 10655714Skrisvoid __archive_check_magic(struct archive *, unsigned int magic, 107109998Smarkm unsigned int state, const char *func); 10855714Skris 10955714Skrisvoid __archive_errx(int retvalue, const char *msg) __LA_DEAD; 11055714Skris 11155714Skrisint __archive_parse_options(const char *p, const char *fn, 11255714Skris int keysize, char *key, int valsize, char *val); 11355714Skris 11455714Skris#define err_combine(a,b) ((a) < (b) ? (a) : (b)) 11555714Skris 11655714Skris#if defined(__BORLANDC__) || (defined(_MSC_VER) && _MSC_VER <= 1300) 11755714Skris# define ARCHIVE_LITERAL_LL(x) x##i64 11855714Skris# define ARCHIVE_LITERAL_ULL(x) x##ui64 11955714Skris#else 12055714Skris# define ARCHIVE_LITERAL_LL(x) x##ll 12155714Skris# define ARCHIVE_LITERAL_ULL(x) x##ull 12255714Skris#endif 12355714Skris 12455714Skris#endif 12555714Skris