Home | History | Annotate | Line # | Download | only in libarchive
      1 /*-
      2  * Copyright (c) 2003-2007 Tim Kientzle
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
     15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     17  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
     18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef ARCHIVE_WRITE_PRIVATE_H_INCLUDED
     27 #define ARCHIVE_WRITE_PRIVATE_H_INCLUDED
     28 
     29 #ifndef __LIBARCHIVE_BUILD
     30 #ifndef __LIBARCHIVE_TEST
     31 #error This header is only to be used internally to libarchive.
     32 #endif
     33 #endif
     34 
     35 #include "archive.h"
     36 #include "archive_string.h"
     37 #include "archive_private.h"
     38 
     39 #define	ARCHIVE_WRITE_FILTER_STATE_NEW		1U
     40 #define	ARCHIVE_WRITE_FILTER_STATE_OPEN		2U
     41 #define	ARCHIVE_WRITE_FILTER_STATE_CLOSED	4U
     42 #define	ARCHIVE_WRITE_FILTER_STATE_FATAL	0x8000U
     43 
     44 struct archive_write;
     45 
     46 struct archive_write_filter {
     47 	int64_t bytes_written;
     48 	struct archive *archive; /* Associated archive. */
     49 	struct archive_write_filter *next_filter; /* Who I write to. */
     50 	int	(*options)(struct archive_write_filter *,
     51 	    const char *key, const char *value);
     52 	int	(*open)(struct archive_write_filter *);
     53 	int	(*write)(struct archive_write_filter *, const void *, size_t);
     54 	int	(*flush)(struct archive_write_filter *);
     55 	int	(*close)(struct archive_write_filter *);
     56 	int	(*free)(struct archive_write_filter *);
     57 	void	 *data;
     58 	const char *name;
     59 	int	  code;
     60 	int	  bytes_per_block;
     61 	int	  bytes_in_last_block;
     62 	int	  state;
     63 };
     64 
     65 #if ARCHIVE_VERSION < 4000000
     66 void __archive_write_filters_free(struct archive *);
     67 #endif
     68 
     69 struct archive_write_filter *__archive_write_allocate_filter(struct archive *);
     70 
     71 int __archive_write_output(struct archive_write *, const void *, size_t);
     72 int __archive_write_nulls(struct archive_write *, size_t);
     73 int __archive_write_filter(struct archive_write_filter *, const void *, size_t);
     74 
     75 struct archive_write {
     76 	struct archive	archive;
     77 
     78 	/* Dev/ino of the archive being written. */
     79 	int		  skip_file_set;
     80 	int64_t		  skip_file_dev;
     81 	int64_t		  skip_file_ino;
     82 
     83 	/* Utility:  Pointer to a block of nulls. */
     84 	const unsigned char	*nulls;
     85 	size_t			 null_length;
     86 
     87 	/* Callbacks to open/read/write/close archive stream. */
     88 	archive_open_callback	*client_opener;
     89 	archive_write_callback	*client_writer;
     90 	archive_close_callback	*client_closer;
     91 	archive_free_callback	*client_freer;
     92 	void			*client_data;
     93 
     94 	/*
     95 	 * Blocking information.  Note that bytes_in_last_block is
     96 	 * misleadingly named; I should find a better name.  These
     97 	 * control the final output from all compressors, including
     98 	 * compression_none.
     99 	 */
    100 	int		  bytes_per_block;
    101 	int		  bytes_in_last_block;
    102 
    103 	/*
    104 	 * First and last write filters in the pipeline.
    105 	 */
    106 	struct archive_write_filter *filter_first;
    107 	struct archive_write_filter *filter_last;
    108 
    109 	/*
    110 	 * Pointers to format-specific functions for writing.  They're
    111 	 * initialized by archive_write_set_format_XXX() calls.
    112 	 */
    113 	void	 *format_data;
    114 	const char *format_name;
    115 	int	(*format_init)(struct archive_write *);
    116 	int	(*format_options)(struct archive_write *,
    117 		    const char *key, const char *value);
    118 	int	(*format_finish_entry)(struct archive_write *);
    119 	int 	(*format_write_header)(struct archive_write *,
    120 		    struct archive_entry *);
    121 	ssize_t	(*format_write_data)(struct archive_write *,
    122 		    const void *buff, size_t);
    123 	int	(*format_close)(struct archive_write *);
    124 	int	(*format_free)(struct archive_write *);
    125 
    126 
    127 	/*
    128 	 * Encryption passphrase.
    129 	 */
    130 	char		*passphrase;
    131 	archive_passphrase_callback *passphrase_callback;
    132 	void		*passphrase_client_data;
    133 };
    134 
    135 /*
    136  * Utility function to format a USTAR header into a buffer.  If
    137  * "strict" is set, this tries to create the absolutely most portable
    138  * version of a ustar header.  If "strict" is set to 0, then it will
    139  * relax certain requirements.
    140  *
    141  * Generally, format-specific declarations don't belong in this
    142  * header; this is a rare example of a function that is shared by
    143  * two very similar formats (ustar and pax).
    144  */
    145 int
    146 __archive_write_format_header_ustar(struct archive_write *, char buff[512],
    147     struct archive_entry *, int tartype, int strict,
    148     struct archive_string_conv *);
    149 
    150 struct archive_write_program_data;
    151 struct archive_write_program_data * __archive_write_program_allocate(const char *program_name);
    152 int	__archive_write_program_free(struct archive_write_program_data *);
    153 int	__archive_write_program_open(struct archive_write_filter *,
    154 	    struct archive_write_program_data *, const char *);
    155 int	__archive_write_program_close(struct archive_write_filter *,
    156 	    struct archive_write_program_data *);
    157 int	__archive_write_program_write(struct archive_write_filter *,
    158 	    struct archive_write_program_data *, const void *, size_t);
    159 
    160 /*
    161  * Get an encryption passphrase.
    162  */
    163 const char * __archive_write_get_passphrase(struct archive_write *a);
    164 #endif
    165