libarchive-static 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|