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