libarchive-static 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/Makefile +6 -0
- data/ext/extconf.rb +61 -0
- data/ext/libarchive-0.1.1/COPYING.libarchive +60 -0
- data/ext/libarchive-0.1.1/LICENSE.libbzip2 +42 -0
- data/ext/libarchive-0.1.1/README.txt +143 -0
- data/ext/libarchive-0.1.1/ext/Makefile.in +0 -0
- data/ext/libarchive-0.1.1/ext/archive_read_support_compression.c +31 -0
- data/ext/libarchive-0.1.1/ext/archive_read_support_compression.h +6 -0
- data/ext/libarchive-0.1.1/ext/archive_read_support_format.c +32 -0
- data/ext/libarchive-0.1.1/ext/archive_read_support_format.h +6 -0
- data/ext/libarchive-0.1.1/ext/archive_write_open_rb_str.c +29 -0
- data/ext/libarchive-0.1.1/ext/archive_write_open_rb_str.h +6 -0
- data/ext/libarchive-0.1.1/ext/archive_write_set_compression.c +32 -0
- data/ext/libarchive-0.1.1/ext/archive_write_set_compression.h +6 -0
- data/ext/libarchive-0.1.1/ext/config.h.in +22 -0
- data/ext/libarchive-0.1.1/ext/configure +3904 -0
- data/ext/libarchive-0.1.1/ext/configure.in +11 -0
- data/ext/libarchive-0.1.1/ext/depend +19 -0
- data/ext/libarchive-0.1.1/ext/extconf.rb +6 -0
- data/ext/libarchive-0.1.1/ext/install-sh +250 -0
- data/ext/libarchive-0.1.1/ext/libarchive.c +89 -0
- data/ext/libarchive-0.1.1/ext/libarchive_archive.c +84 -0
- data/ext/libarchive-0.1.1/ext/libarchive_entry.c +1015 -0
- data/ext/libarchive-0.1.1/ext/libarchive_internal.h +155 -0
- data/ext/libarchive-0.1.1/ext/libarchive_reader.c +328 -0
- data/ext/libarchive-0.1.1/ext/libarchive_win32.h +52 -0
- data/ext/libarchive-0.1.1/ext/libarchive_writer.c +246 -0
- data/ext/libarchive-0.1.1/libarchive.c +1762 -0
- data/ext/libarchive-2.8.4/Makefile.in +7076 -0
- data/ext/libarchive-2.8.4/build/autoconf/check_stdcall_func.m4 +51 -0
- data/ext/libarchive-2.8.4/build/autoconf/compile +143 -0
- data/ext/libarchive-2.8.4/build/autoconf/config.guess +1502 -0
- data/ext/libarchive-2.8.4/build/autoconf/config.sub +1708 -0
- data/ext/libarchive-2.8.4/build/autoconf/depcomp +630 -0
- data/ext/libarchive-2.8.4/build/autoconf/install-sh +291 -0
- data/ext/libarchive-2.8.4/build/autoconf/la_uid_t.m4 +20 -0
- data/ext/libarchive-2.8.4/build/autoconf/ltmain.sh +8406 -0
- data/ext/libarchive-2.8.4/build/autoconf/missing +376 -0
- data/ext/libarchive-2.8.4/build/pkgconfig/libarchive.pc.in +10 -0
- data/ext/libarchive-2.8.4/config.h.in +772 -0
- data/ext/libarchive-2.8.4/configure +17916 -0
- data/ext/libarchive-2.8.4/libarchive/archive.h +741 -0
- data/ext/libarchive-2.8.4/libarchive/archive_check_magic.c +134 -0
- data/ext/libarchive-2.8.4/libarchive/archive_crc32.h +66 -0
- data/ext/libarchive-2.8.4/libarchive/archive_endian.h +162 -0
- data/ext/libarchive-2.8.4/libarchive/archive_entry.c +2202 -0
- data/ext/libarchive-2.8.4/libarchive/archive_entry.h +524 -0
- data/ext/libarchive-2.8.4/libarchive/archive_entry_copy_bhfi.c +74 -0
- data/ext/libarchive-2.8.4/libarchive/archive_entry_copy_stat.c +77 -0
- data/ext/libarchive-2.8.4/libarchive/archive_entry_link_resolver.c +405 -0
- data/ext/libarchive-2.8.4/libarchive/archive_entry_private.h +184 -0
- data/ext/libarchive-2.8.4/libarchive/archive_entry_stat.c +118 -0
- data/ext/libarchive-2.8.4/libarchive/archive_entry_strmode.c +87 -0
- data/ext/libarchive-2.8.4/libarchive/archive_entry_xattr.c +158 -0
- data/ext/libarchive-2.8.4/libarchive/archive_hash.h +281 -0
- data/ext/libarchive-2.8.4/libarchive/archive_platform.h +165 -0
- data/ext/libarchive-2.8.4/libarchive/archive_private.h +124 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read.c +1249 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_data_into_fd.c +93 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_disk.c +198 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_disk_entry_from_file.c +570 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_disk_private.h +62 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_disk_set_standard_lookup.c +303 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_extract.c +182 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_open_fd.c +190 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_open_file.c +165 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_open_filename.c +272 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_open_memory.c +156 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_private.h +199 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_all.c +60 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_bzip2.c +353 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_compress.c +444 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_gzip.c +465 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_none.c +40 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_program.c +459 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_rpm.c +287 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_uu.c +627 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_compression_xz.c +708 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_all.c +43 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_ar.c +584 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_cpio.c +777 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_empty.c +93 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_iso9660.c +2830 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_mtree.c +1304 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_raw.c +185 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_tar.c +2418 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_xar.c +3151 -0
- data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_zip.c +903 -0
- data/ext/libarchive-2.8.4/libarchive/archive_string.c +453 -0
- data/ext/libarchive-2.8.4/libarchive/archive_string.h +148 -0
- data/ext/libarchive-2.8.4/libarchive/archive_string_sprintf.c +164 -0
- data/ext/libarchive-2.8.4/libarchive/archive_util.c +391 -0
- data/ext/libarchive-2.8.4/libarchive/archive_virtual.c +94 -0
- data/ext/libarchive-2.8.4/libarchive/archive_windows.c +1236 -0
- data/ext/libarchive-2.8.4/libarchive/archive_windows.h +347 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write.c +466 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_disk.c +2628 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_disk_private.h +38 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_disk_set_standard_lookup.c +262 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_open_fd.c +141 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_open_file.c +105 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_open_filename.c +162 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_open_memory.c +126 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_private.h +122 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_bzip2.c +408 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_compress.c +492 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_gzip.c +477 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_none.c +257 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_program.c +347 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_xz.c +438 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format.c +72 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_ar.c +550 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_by_name.c +76 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio.c +344 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio_newc.c +295 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_mtree.c +1050 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_pax.c +1386 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_shar.c +626 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_ustar.c +587 -0
- data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_zip.c +667 -0
- data/ext/libarchive-2.8.4/libarchive/config_freebsd.h +154 -0
- data/ext/libarchive-2.8.4/libarchive/filter_fork.c +161 -0
- data/ext/libarchive-2.8.4/libarchive/filter_fork.h +41 -0
- data/ext/libarchive-2.8.4/libarchive/filter_fork_windows.c +113 -0
- data/ext/libarchive-static-makefile +80 -0
- data/ext/libarchive-static-wrapper-makefile +22 -0
- data/ext/zlib-1.2.5/Makefile.in +257 -0
- data/ext/zlib-1.2.5/adler32.c +169 -0
- data/ext/zlib-1.2.5/compress.c +80 -0
- data/ext/zlib-1.2.5/configure +596 -0
- data/ext/zlib-1.2.5/crc32.c +442 -0
- data/ext/zlib-1.2.5/crc32.h +441 -0
- data/ext/zlib-1.2.5/deflate.c +1834 -0
- data/ext/zlib-1.2.5/deflate.h +342 -0
- data/ext/zlib-1.2.5/example.c +565 -0
- data/ext/zlib-1.2.5/gzclose.c +25 -0
- data/ext/zlib-1.2.5/gzguts.h +132 -0
- data/ext/zlib-1.2.5/gzlib.c +537 -0
- data/ext/zlib-1.2.5/gzread.c +653 -0
- data/ext/zlib-1.2.5/gzwrite.c +531 -0
- data/ext/zlib-1.2.5/infback.c +632 -0
- data/ext/zlib-1.2.5/inffast.c +340 -0
- data/ext/zlib-1.2.5/inffast.h +11 -0
- data/ext/zlib-1.2.5/inffixed.h +94 -0
- data/ext/zlib-1.2.5/inflate.c +1480 -0
- data/ext/zlib-1.2.5/inflate.h +122 -0
- data/ext/zlib-1.2.5/inftrees.c +330 -0
- data/ext/zlib-1.2.5/inftrees.h +62 -0
- data/ext/zlib-1.2.5/minigzip.c +440 -0
- data/ext/zlib-1.2.5/trees.c +1244 -0
- data/ext/zlib-1.2.5/trees.h +128 -0
- data/ext/zlib-1.2.5/uncompr.c +59 -0
- data/ext/zlib-1.2.5/zconf.h +428 -0
- data/ext/zlib-1.2.5/zlib.h +1613 -0
- data/ext/zlib-1.2.5/zutil.c +318 -0
- data/ext/zlib-1.2.5/zutil.h +274 -0
- metadata +211 -0
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
* in this position and unchanged.
|
|
11
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
|
14
|
+
*
|
|
15
|
+
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
|
|
16
|
+
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
17
|
+
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
18
|
+
* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
19
|
+
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
20
|
+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
21
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
22
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
23
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
24
|
+
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
25
|
+
*
|
|
26
|
+
* $FreeBSD: head/lib/libarchive/archive_write_disk_private.h 201086 2009-12-28 02:17:53Z kientzle $
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
#ifndef __LIBARCHIVE_BUILD
|
|
30
|
+
#error This header is only to be used internally to libarchive.
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
#ifndef ARCHIVE_WRITE_DISK_PRIVATE_H_INCLUDED
|
|
34
|
+
#define ARCHIVE_WRITE_DISK_PRIVATE_H_INCLUDED
|
|
35
|
+
|
|
36
|
+
struct archive_write_disk;
|
|
37
|
+
|
|
38
|
+
#endif
|
|
@@ -0,0 +1,262 @@
|
|
|
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
|
+
#include "archive_platform.h"
|
|
27
|
+
__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_disk_set_standard_lookup.c 201083 2009-12-28 02:09:57Z kientzle $");
|
|
28
|
+
|
|
29
|
+
#ifdef HAVE_SYS_TYPES_H
|
|
30
|
+
#include <sys/types.h>
|
|
31
|
+
#endif
|
|
32
|
+
#ifdef HAVE_ERRNO_H
|
|
33
|
+
#include <errno.h>
|
|
34
|
+
#endif
|
|
35
|
+
#ifdef HAVE_GRP_H
|
|
36
|
+
#include <grp.h>
|
|
37
|
+
#endif
|
|
38
|
+
#ifdef HAVE_PWD_H
|
|
39
|
+
#include <pwd.h>
|
|
40
|
+
#endif
|
|
41
|
+
#ifdef HAVE_STDLIB_H
|
|
42
|
+
#include <stdlib.h>
|
|
43
|
+
#endif
|
|
44
|
+
#ifdef HAVE_STRING_H
|
|
45
|
+
#include <string.h>
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
#include "archive.h"
|
|
49
|
+
#include "archive_private.h"
|
|
50
|
+
#include "archive_read_private.h"
|
|
51
|
+
#include "archive_write_disk_private.h"
|
|
52
|
+
|
|
53
|
+
struct bucket {
|
|
54
|
+
char *name;
|
|
55
|
+
int hash;
|
|
56
|
+
id_t id;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
static const size_t cache_size = 127;
|
|
60
|
+
static unsigned int hash(const char *);
|
|
61
|
+
static gid_t lookup_gid(void *, const char *uname, gid_t);
|
|
62
|
+
static uid_t lookup_uid(void *, const char *uname, uid_t);
|
|
63
|
+
static void cleanup(void *);
|
|
64
|
+
|
|
65
|
+
/*
|
|
66
|
+
* Installs functions that use getpwnam()/getgrnam()---along with
|
|
67
|
+
* a simple cache to accelerate such lookups---into the archive_write_disk
|
|
68
|
+
* object. This is in a separate file because getpwnam()/getgrnam()
|
|
69
|
+
* can pull in a LOT of library code (including NIS/LDAP functions, which
|
|
70
|
+
* pull in DNS resolveers, etc). This can easily top 500kB, which makes
|
|
71
|
+
* it inappropriate for some space-constrained applications.
|
|
72
|
+
*
|
|
73
|
+
* Applications that are size-sensitive may want to just use the
|
|
74
|
+
* real default functions (defined in archive_write_disk.c) that just
|
|
75
|
+
* use the uid/gid without the lookup. Or define your own custom functions
|
|
76
|
+
* if you prefer.
|
|
77
|
+
*
|
|
78
|
+
* TODO: Replace these hash tables with simpler move-to-front LRU
|
|
79
|
+
* lists with a bounded size (128 items?). The hash is a bit faster,
|
|
80
|
+
* but has a bad pathology in which it thrashes a single bucket. Even
|
|
81
|
+
* walking a list of 128 items is a lot faster than calling
|
|
82
|
+
* getpwnam()!
|
|
83
|
+
*/
|
|
84
|
+
int
|
|
85
|
+
archive_write_disk_set_standard_lookup(struct archive *a)
|
|
86
|
+
{
|
|
87
|
+
struct bucket *ucache = malloc(cache_size * sizeof(struct bucket));
|
|
88
|
+
struct bucket *gcache = malloc(cache_size * sizeof(struct bucket));
|
|
89
|
+
memset(ucache, 0, cache_size * sizeof(struct bucket));
|
|
90
|
+
memset(gcache, 0, cache_size * sizeof(struct bucket));
|
|
91
|
+
archive_write_disk_set_group_lookup(a, gcache, lookup_gid, cleanup);
|
|
92
|
+
archive_write_disk_set_user_lookup(a, ucache, lookup_uid, cleanup);
|
|
93
|
+
return (ARCHIVE_OK);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
static gid_t
|
|
97
|
+
lookup_gid(void *private_data, const char *gname, gid_t gid)
|
|
98
|
+
{
|
|
99
|
+
int h;
|
|
100
|
+
struct bucket *b;
|
|
101
|
+
struct bucket *gcache = (struct bucket *)private_data;
|
|
102
|
+
|
|
103
|
+
/* If no gname, just use the gid provided. */
|
|
104
|
+
if (gname == NULL || *gname == '\0')
|
|
105
|
+
return (gid);
|
|
106
|
+
|
|
107
|
+
/* Try to find gname in the cache. */
|
|
108
|
+
h = hash(gname);
|
|
109
|
+
b = &gcache[h % cache_size ];
|
|
110
|
+
if (b->name != NULL && b->hash == h && strcmp(gname, b->name) == 0)
|
|
111
|
+
return ((gid_t)b->id);
|
|
112
|
+
|
|
113
|
+
/* Free the cache slot for a new entry. */
|
|
114
|
+
if (b->name != NULL)
|
|
115
|
+
free(b->name);
|
|
116
|
+
b->name = strdup(gname);
|
|
117
|
+
/* Note: If strdup fails, that's okay; we just won't cache. */
|
|
118
|
+
b->hash = h;
|
|
119
|
+
#if HAVE_GRP_H
|
|
120
|
+
# if HAVE_GETGRNAM_R
|
|
121
|
+
{
|
|
122
|
+
char _buffer[128];
|
|
123
|
+
size_t bufsize = 128;
|
|
124
|
+
char *buffer = _buffer;
|
|
125
|
+
struct group grent, *result;
|
|
126
|
+
int r;
|
|
127
|
+
|
|
128
|
+
for (;;) {
|
|
129
|
+
result = &grent; /* Old getgrnam_r ignores last arg. */
|
|
130
|
+
r = getgrnam_r(gname, &grent, buffer, bufsize, &result);
|
|
131
|
+
if (r == 0)
|
|
132
|
+
break;
|
|
133
|
+
if (r != ERANGE)
|
|
134
|
+
break;
|
|
135
|
+
bufsize *= 2;
|
|
136
|
+
if (buffer != _buffer)
|
|
137
|
+
free(buffer);
|
|
138
|
+
buffer = malloc(bufsize);
|
|
139
|
+
if (buffer == NULL)
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
if (result != NULL)
|
|
143
|
+
gid = result->gr_gid;
|
|
144
|
+
if (buffer != _buffer)
|
|
145
|
+
free(buffer);
|
|
146
|
+
}
|
|
147
|
+
# else /* HAVE_GETGRNAM_R */
|
|
148
|
+
{
|
|
149
|
+
struct group *result;
|
|
150
|
+
|
|
151
|
+
result = getgrnam(gname);
|
|
152
|
+
if (result != NULL)
|
|
153
|
+
gid = result->gr_gid;
|
|
154
|
+
}
|
|
155
|
+
# endif /* HAVE_GETGRNAM_R */
|
|
156
|
+
#elif defined(_WIN32) && !defined(__CYGWIN__)
|
|
157
|
+
/* TODO: do a gname->gid lookup for Windows. */
|
|
158
|
+
#else
|
|
159
|
+
#error No way to perform gid lookups on this platform
|
|
160
|
+
#endif
|
|
161
|
+
b->id = gid;
|
|
162
|
+
|
|
163
|
+
return (gid);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
static uid_t
|
|
167
|
+
lookup_uid(void *private_data, const char *uname, uid_t uid)
|
|
168
|
+
{
|
|
169
|
+
int h;
|
|
170
|
+
struct bucket *b;
|
|
171
|
+
struct bucket *ucache = (struct bucket *)private_data;
|
|
172
|
+
|
|
173
|
+
/* If no uname, just use the uid provided. */
|
|
174
|
+
if (uname == NULL || *uname == '\0')
|
|
175
|
+
return (uid);
|
|
176
|
+
|
|
177
|
+
/* Try to find uname in the cache. */
|
|
178
|
+
h = hash(uname);
|
|
179
|
+
b = &ucache[h % cache_size ];
|
|
180
|
+
if (b->name != NULL && b->hash == h && strcmp(uname, b->name) == 0)
|
|
181
|
+
return ((uid_t)b->id);
|
|
182
|
+
|
|
183
|
+
/* Free the cache slot for a new entry. */
|
|
184
|
+
if (b->name != NULL)
|
|
185
|
+
free(b->name);
|
|
186
|
+
b->name = strdup(uname);
|
|
187
|
+
/* Note: If strdup fails, that's okay; we just won't cache. */
|
|
188
|
+
b->hash = h;
|
|
189
|
+
#if HAVE_PWD_H
|
|
190
|
+
# if HAVE_GETPWNAM_R
|
|
191
|
+
{
|
|
192
|
+
char _buffer[128];
|
|
193
|
+
size_t bufsize = 128;
|
|
194
|
+
char *buffer = _buffer;
|
|
195
|
+
struct passwd pwent, *result;
|
|
196
|
+
int r;
|
|
197
|
+
|
|
198
|
+
for (;;) {
|
|
199
|
+
result = &pwent; /* Old getpwnam_r ignores last arg. */
|
|
200
|
+
r = getpwnam_r(uname, &pwent, buffer, bufsize, &result);
|
|
201
|
+
if (r == 0)
|
|
202
|
+
break;
|
|
203
|
+
if (r != ERANGE)
|
|
204
|
+
break;
|
|
205
|
+
bufsize *= 2;
|
|
206
|
+
if (buffer != _buffer)
|
|
207
|
+
free(buffer);
|
|
208
|
+
buffer = malloc(bufsize);
|
|
209
|
+
if (buffer == NULL)
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
if (result != NULL)
|
|
213
|
+
uid = result->pw_uid;
|
|
214
|
+
if (buffer != _buffer)
|
|
215
|
+
free(buffer);
|
|
216
|
+
}
|
|
217
|
+
# else /* HAVE_GETPWNAM_R */
|
|
218
|
+
{
|
|
219
|
+
struct passwd *result;
|
|
220
|
+
|
|
221
|
+
result = getpwnam(uname);
|
|
222
|
+
if (result != NULL)
|
|
223
|
+
uid = result->pw_uid;
|
|
224
|
+
}
|
|
225
|
+
#endif /* HAVE_GETPWNAM_R */
|
|
226
|
+
#elif defined(_WIN32) && !defined(__CYGWIN__)
|
|
227
|
+
/* TODO: do a uname->uid lookup for Windows. */
|
|
228
|
+
#else
|
|
229
|
+
#error No way to look up uids on this platform
|
|
230
|
+
#endif
|
|
231
|
+
b->id = uid;
|
|
232
|
+
|
|
233
|
+
return (uid);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
static void
|
|
237
|
+
cleanup(void *private)
|
|
238
|
+
{
|
|
239
|
+
size_t i;
|
|
240
|
+
struct bucket *cache = (struct bucket *)private;
|
|
241
|
+
|
|
242
|
+
for (i = 0; i < cache_size; i++)
|
|
243
|
+
free(cache[i].name);
|
|
244
|
+
free(cache);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
static unsigned int
|
|
249
|
+
hash(const char *p)
|
|
250
|
+
{
|
|
251
|
+
/* A 32-bit version of Peter Weinberger's (PJW) hash algorithm,
|
|
252
|
+
as used by ELF for hashing function names. */
|
|
253
|
+
unsigned g, h = 0;
|
|
254
|
+
while (*p != '\0') {
|
|
255
|
+
h = (h << 4) + *p++;
|
|
256
|
+
if ((g = h & 0xF0000000) != 0) {
|
|
257
|
+
h ^= g >> 24;
|
|
258
|
+
h &= 0x0FFFFFFF;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return h;
|
|
262
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
#include "archive_platform.h"
|
|
27
|
+
__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_open_fd.c 201093 2009-12-28 02:28:44Z kientzle $");
|
|
28
|
+
|
|
29
|
+
#ifdef HAVE_SYS_STAT_H
|
|
30
|
+
#include <sys/stat.h>
|
|
31
|
+
#endif
|
|
32
|
+
#ifdef HAVE_ERRNO_H
|
|
33
|
+
#include <errno.h>
|
|
34
|
+
#endif
|
|
35
|
+
#ifdef HAVE_FCNTL_H
|
|
36
|
+
#include <fcntl.h>
|
|
37
|
+
#endif
|
|
38
|
+
#ifdef HAVE_IO_H
|
|
39
|
+
#include <io.h>
|
|
40
|
+
#endif
|
|
41
|
+
#ifdef HAVE_STDLIB_H
|
|
42
|
+
#include <stdlib.h>
|
|
43
|
+
#endif
|
|
44
|
+
#ifdef HAVE_STRING_H
|
|
45
|
+
#include <string.h>
|
|
46
|
+
#endif
|
|
47
|
+
#ifdef HAVE_UNISTD_H
|
|
48
|
+
#include <unistd.h>
|
|
49
|
+
#endif
|
|
50
|
+
|
|
51
|
+
#include "archive.h"
|
|
52
|
+
|
|
53
|
+
struct write_fd_data {
|
|
54
|
+
off_t offset;
|
|
55
|
+
int fd;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
static int file_close(struct archive *, void *);
|
|
59
|
+
static int file_open(struct archive *, void *);
|
|
60
|
+
static ssize_t file_write(struct archive *, void *, const void *buff, size_t);
|
|
61
|
+
|
|
62
|
+
int
|
|
63
|
+
archive_write_open_fd(struct archive *a, int fd)
|
|
64
|
+
{
|
|
65
|
+
struct write_fd_data *mine;
|
|
66
|
+
|
|
67
|
+
mine = (struct write_fd_data *)malloc(sizeof(*mine));
|
|
68
|
+
if (mine == NULL) {
|
|
69
|
+
archive_set_error(a, ENOMEM, "No memory");
|
|
70
|
+
return (ARCHIVE_FATAL);
|
|
71
|
+
}
|
|
72
|
+
mine->fd = fd;
|
|
73
|
+
#if defined(__CYGWIN__) || defined(_WIN32)
|
|
74
|
+
setmode(mine->fd, O_BINARY);
|
|
75
|
+
#endif
|
|
76
|
+
return (archive_write_open(a, mine,
|
|
77
|
+
file_open, file_write, file_close));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
static int
|
|
81
|
+
file_open(struct archive *a, void *client_data)
|
|
82
|
+
{
|
|
83
|
+
struct write_fd_data *mine;
|
|
84
|
+
struct stat st;
|
|
85
|
+
|
|
86
|
+
mine = (struct write_fd_data *)client_data;
|
|
87
|
+
|
|
88
|
+
if (fstat(mine->fd, &st) != 0) {
|
|
89
|
+
archive_set_error(a, errno, "Couldn't stat fd %d", mine->fd);
|
|
90
|
+
return (ARCHIVE_FATAL);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/*
|
|
94
|
+
* If this is a regular file, don't add it to itself.
|
|
95
|
+
*/
|
|
96
|
+
if (S_ISREG(st.st_mode))
|
|
97
|
+
archive_write_set_skip_file(a, st.st_dev, st.st_ino);
|
|
98
|
+
|
|
99
|
+
/*
|
|
100
|
+
* If client hasn't explicitly set the last block handling,
|
|
101
|
+
* then set it here.
|
|
102
|
+
*/
|
|
103
|
+
if (archive_write_get_bytes_in_last_block(a) < 0) {
|
|
104
|
+
/* If the output is a block or character device, fifo,
|
|
105
|
+
* or stdout, pad the last block, otherwise leave it
|
|
106
|
+
* unpadded. */
|
|
107
|
+
if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode) ||
|
|
108
|
+
S_ISFIFO(st.st_mode) || (mine->fd == 1))
|
|
109
|
+
/* Last block will be fully padded. */
|
|
110
|
+
archive_write_set_bytes_in_last_block(a, 0);
|
|
111
|
+
else
|
|
112
|
+
archive_write_set_bytes_in_last_block(a, 1);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return (ARCHIVE_OK);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
static ssize_t
|
|
119
|
+
file_write(struct archive *a, void *client_data, const void *buff, size_t length)
|
|
120
|
+
{
|
|
121
|
+
struct write_fd_data *mine;
|
|
122
|
+
ssize_t bytesWritten;
|
|
123
|
+
|
|
124
|
+
mine = (struct write_fd_data *)client_data;
|
|
125
|
+
bytesWritten = write(mine->fd, buff, length);
|
|
126
|
+
if (bytesWritten <= 0) {
|
|
127
|
+
archive_set_error(a, errno, "Write error");
|
|
128
|
+
return (-1);
|
|
129
|
+
}
|
|
130
|
+
return (bytesWritten);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
static int
|
|
134
|
+
file_close(struct archive *a, void *client_data)
|
|
135
|
+
{
|
|
136
|
+
struct write_fd_data *mine = (struct write_fd_data *)client_data;
|
|
137
|
+
|
|
138
|
+
(void)a; /* UNUSED */
|
|
139
|
+
free(mine);
|
|
140
|
+
return (ARCHIVE_OK);
|
|
141
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
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
|
+
#include "archive_platform.h"
|
|
27
|
+
__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_open_file.c,v 1.19 2007/01/09 08:05:56 kientzle Exp $");
|
|
28
|
+
|
|
29
|
+
#ifdef HAVE_SYS_STAT_H
|
|
30
|
+
#include <sys/stat.h>
|
|
31
|
+
#endif
|
|
32
|
+
#ifdef HAVE_ERRNO_H
|
|
33
|
+
#include <errno.h>
|
|
34
|
+
#endif
|
|
35
|
+
#ifdef HAVE_FCNTL_H
|
|
36
|
+
#include <fcntl.h>
|
|
37
|
+
#endif
|
|
38
|
+
#ifdef HAVE_STDLIB_H
|
|
39
|
+
#include <stdlib.h>
|
|
40
|
+
#endif
|
|
41
|
+
#ifdef HAVE_STRING_H
|
|
42
|
+
#include <string.h>
|
|
43
|
+
#endif
|
|
44
|
+
#ifdef HAVE_UNISTD_H
|
|
45
|
+
#include <unistd.h>
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
#include "archive.h"
|
|
49
|
+
|
|
50
|
+
struct write_FILE_data {
|
|
51
|
+
FILE *f;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
static int file_close(struct archive *, void *);
|
|
55
|
+
static int file_open(struct archive *, void *);
|
|
56
|
+
static ssize_t file_write(struct archive *, void *, const void *buff, size_t);
|
|
57
|
+
|
|
58
|
+
int
|
|
59
|
+
archive_write_open_FILE(struct archive *a, FILE *f)
|
|
60
|
+
{
|
|
61
|
+
struct write_FILE_data *mine;
|
|
62
|
+
|
|
63
|
+
mine = (struct write_FILE_data *)malloc(sizeof(*mine));
|
|
64
|
+
if (mine == NULL) {
|
|
65
|
+
archive_set_error(a, ENOMEM, "No memory");
|
|
66
|
+
return (ARCHIVE_FATAL);
|
|
67
|
+
}
|
|
68
|
+
mine->f = f;
|
|
69
|
+
return (archive_write_open(a, mine,
|
|
70
|
+
file_open, file_write, file_close));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
static int
|
|
74
|
+
file_open(struct archive *a, void *client_data)
|
|
75
|
+
{
|
|
76
|
+
(void)a; /* UNUSED */
|
|
77
|
+
(void)client_data; /* UNUSED */
|
|
78
|
+
|
|
79
|
+
return (ARCHIVE_OK);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static ssize_t
|
|
83
|
+
file_write(struct archive *a, void *client_data, const void *buff, size_t length)
|
|
84
|
+
{
|
|
85
|
+
struct write_FILE_data *mine;
|
|
86
|
+
size_t bytesWritten;
|
|
87
|
+
|
|
88
|
+
mine = client_data;
|
|
89
|
+
bytesWritten = fwrite(buff, 1, length, mine->f);
|
|
90
|
+
if (bytesWritten < length) {
|
|
91
|
+
archive_set_error(a, errno, "Write error");
|
|
92
|
+
return (-1);
|
|
93
|
+
}
|
|
94
|
+
return (bytesWritten);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
static int
|
|
98
|
+
file_close(struct archive *a, void *client_data)
|
|
99
|
+
{
|
|
100
|
+
struct write_FILE_data *mine = client_data;
|
|
101
|
+
|
|
102
|
+
(void)a; /* UNUSED */
|
|
103
|
+
free(mine);
|
|
104
|
+
return (ARCHIVE_OK);
|
|
105
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
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
|
+
#include "archive_platform.h"
|
|
27
|
+
__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_open_filename.c 191165 2009-04-17 00:39:35Z kientzle $");
|
|
28
|
+
|
|
29
|
+
#ifdef HAVE_SYS_STAT_H
|
|
30
|
+
#include <sys/stat.h>
|
|
31
|
+
#endif
|
|
32
|
+
#ifdef HAVE_ERRNO_H
|
|
33
|
+
#include <errno.h>
|
|
34
|
+
#endif
|
|
35
|
+
#ifdef HAVE_FCNTL_H
|
|
36
|
+
#include <fcntl.h>
|
|
37
|
+
#endif
|
|
38
|
+
#ifdef HAVE_STDLIB_H
|
|
39
|
+
#include <stdlib.h>
|
|
40
|
+
#endif
|
|
41
|
+
#ifdef HAVE_STRING_H
|
|
42
|
+
#include <string.h>
|
|
43
|
+
#endif
|
|
44
|
+
#ifdef HAVE_UNISTD_H
|
|
45
|
+
#include <unistd.h>
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
#include "archive.h"
|
|
49
|
+
|
|
50
|
+
#ifndef O_BINARY
|
|
51
|
+
#define O_BINARY 0
|
|
52
|
+
#endif
|
|
53
|
+
|
|
54
|
+
struct write_file_data {
|
|
55
|
+
int fd;
|
|
56
|
+
char filename[1];
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
static int file_close(struct archive *, void *);
|
|
60
|
+
static int file_open(struct archive *, void *);
|
|
61
|
+
static ssize_t file_write(struct archive *, void *, const void *buff, size_t);
|
|
62
|
+
|
|
63
|
+
int
|
|
64
|
+
archive_write_open_file(struct archive *a, const char *filename)
|
|
65
|
+
{
|
|
66
|
+
return (archive_write_open_filename(a, filename));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
int
|
|
70
|
+
archive_write_open_filename(struct archive *a, const char *filename)
|
|
71
|
+
{
|
|
72
|
+
struct write_file_data *mine;
|
|
73
|
+
|
|
74
|
+
if (filename == NULL || filename[0] == '\0')
|
|
75
|
+
return (archive_write_open_fd(a, 1));
|
|
76
|
+
|
|
77
|
+
mine = (struct write_file_data *)malloc(sizeof(*mine) + strlen(filename));
|
|
78
|
+
if (mine == NULL) {
|
|
79
|
+
archive_set_error(a, ENOMEM, "No memory");
|
|
80
|
+
return (ARCHIVE_FATAL);
|
|
81
|
+
}
|
|
82
|
+
strcpy(mine->filename, filename);
|
|
83
|
+
mine->fd = -1;
|
|
84
|
+
return (archive_write_open(a, mine,
|
|
85
|
+
file_open, file_write, file_close));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
static int
|
|
89
|
+
file_open(struct archive *a, void *client_data)
|
|
90
|
+
{
|
|
91
|
+
int flags;
|
|
92
|
+
struct write_file_data *mine;
|
|
93
|
+
struct stat st;
|
|
94
|
+
|
|
95
|
+
mine = (struct write_file_data *)client_data;
|
|
96
|
+
flags = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY;
|
|
97
|
+
|
|
98
|
+
/*
|
|
99
|
+
* Open the file.
|
|
100
|
+
*/
|
|
101
|
+
mine->fd = open(mine->filename, flags, 0666);
|
|
102
|
+
if (mine->fd < 0) {
|
|
103
|
+
archive_set_error(a, errno, "Failed to open '%s'",
|
|
104
|
+
mine->filename);
|
|
105
|
+
return (ARCHIVE_FATAL);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (fstat(mine->fd, &st) != 0) {
|
|
109
|
+
archive_set_error(a, errno, "Couldn't stat '%s'",
|
|
110
|
+
mine->filename);
|
|
111
|
+
return (ARCHIVE_FATAL);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/*
|
|
115
|
+
* Set up default last block handling.
|
|
116
|
+
*/
|
|
117
|
+
if (archive_write_get_bytes_in_last_block(a) < 0) {
|
|
118
|
+
if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode) ||
|
|
119
|
+
S_ISFIFO(st.st_mode))
|
|
120
|
+
/* Pad last block when writing to device or FIFO. */
|
|
121
|
+
archive_write_set_bytes_in_last_block(a, 0);
|
|
122
|
+
else
|
|
123
|
+
/* Don't pad last block otherwise. */
|
|
124
|
+
archive_write_set_bytes_in_last_block(a, 1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/*
|
|
128
|
+
* If the output file is a regular file, don't add it to
|
|
129
|
+
* itself. If it's a device file, it's okay to add the device
|
|
130
|
+
* entry to the output archive.
|
|
131
|
+
*/
|
|
132
|
+
if (S_ISREG(st.st_mode))
|
|
133
|
+
archive_write_set_skip_file(a, st.st_dev, st.st_ino);
|
|
134
|
+
|
|
135
|
+
return (ARCHIVE_OK);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
static ssize_t
|
|
139
|
+
file_write(struct archive *a, void *client_data, const void *buff, size_t length)
|
|
140
|
+
{
|
|
141
|
+
struct write_file_data *mine;
|
|
142
|
+
ssize_t bytesWritten;
|
|
143
|
+
|
|
144
|
+
mine = (struct write_file_data *)client_data;
|
|
145
|
+
bytesWritten = write(mine->fd, buff, length);
|
|
146
|
+
if (bytesWritten <= 0) {
|
|
147
|
+
archive_set_error(a, errno, "Write error");
|
|
148
|
+
return (-1);
|
|
149
|
+
}
|
|
150
|
+
return (bytesWritten);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
static int
|
|
154
|
+
file_close(struct archive *a, void *client_data)
|
|
155
|
+
{
|
|
156
|
+
struct write_file_data *mine = (struct write_file_data *)client_data;
|
|
157
|
+
|
|
158
|
+
(void)a; /* UNUSED */
|
|
159
|
+
close(mine->fd);
|
|
160
|
+
free(mine);
|
|
161
|
+
return (ARCHIVE_OK);
|
|
162
|
+
}
|