Skip to content

Commit 3894218

Browse files
authored
Merge pull request #72 from srandall52/master
Set options for writing archive. Set uid/gid lookup for reading disk.
2 parents c4d812a + 3d59828 commit 3894218

3 files changed

Lines changed: 34 additions & 13 deletions

File tree

libarchive/ffi.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ def ffi(name, argtypes, restype, errcheck=None):
193193
# archive_read_disk
194194

195195
ffi('read_disk_new', [], c_archive_p, check_null)
196+
ffi('read_disk_set_behavior', [c_archive_p, c_int], c_int, check_int)
196197
ffi('read_disk_set_standard_lookup', [c_archive_p], c_int, check_int)
197198
ffi('read_disk_open', [c_archive_p, c_char_p], c_int, check_int)
198199
ffi('read_disk_open_w', [c_archive_p, c_wchar_p], c_int, check_int)
@@ -209,6 +210,7 @@ def ffi(name, argtypes, restype, errcheck=None):
209210
# archive_write
210211

211212
ffi('write_new', [], c_archive_p, check_null)
213+
ffi('write_set_options', [c_archive_p, c_char_p], c_int, check_int)
212214

213215
ffi('write_disk_new', [], c_archive_p, check_null)
214216
ffi('write_disk_set_options', [c_archive_p, c_int], c_int, check_int)

libarchive/flags.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
READDISK_RESTORE_ATIME = 0x0001
2+
READDISK_HONOR_NODUMP = 0x0002
3+
READDISK_MAC_COPYFILE = 0x0004
4+
READDISK_NO_TRAVERSE_MOUNTS = 0x0008
5+
READDISK_NO_XATTR = 0x0010
6+
READDISK_NO_ACL = 0x0020
7+
READDISK_NO_FFLAGS = 0x0040

libarchive/write.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@
1010
DEFAULT_UNIX_PERMISSION, ARCHIVE_EOF,
1111
page_size, entry_sourcepath, entry_clear, read_disk_new, read_disk_open_w,
1212
read_next_header2, read_disk_descend, read_free, write_header, write_data,
13-
write_finish_entry, entry_set_size, entry_set_filetype, entry_set_perm
13+
write_finish_entry, entry_set_size, entry_set_filetype, entry_set_perm,
14+
read_disk_set_behavior
1415
)
1516

1617

1718
@contextmanager
18-
def new_archive_read_disk(path):
19+
def new_archive_read_disk(path, flags=0, lookup=False):
1920
archive_p = read_disk_new()
21+
read_disk_set_behavior(archive_p, flags)
22+
if lookup:
23+
ffi.read_disk_set_standard_lookup(archive_p)
2024
read_disk_open_w(archive_p, path)
2125
try:
2226
yield archive_p
@@ -39,8 +43,10 @@ def add_entries(self, entries):
3943
write_data(write_p, block, len(block))
4044
write_finish_entry(write_p)
4145

42-
def add_files(self, *paths):
46+
def add_files(self, *paths, **kw):
4347
"""Read the given paths from disk and add them to the archive.
48+
49+
The keyword arguments (`**kw`) are passed to `new_archive_read_disk`.
4450
"""
4551
write_p = self._pointer
4652

@@ -51,7 +57,7 @@ def add_files(self, *paths):
5157
with new_archive_entry() as entry_p:
5258
entry = ArchiveEntry(None, entry_p)
5359
for path in paths:
54-
with new_archive_read_disk(path) as read_p:
60+
with new_archive_read_disk(path, **kw) as read_p:
5561
while 1:
5662
r = read_next_header2(read_p, entry_p)
5763
if r == ARCHIVE_EOF:
@@ -109,11 +115,15 @@ def add_file_from_memory(
109115

110116

111117
@contextmanager
112-
def new_archive_write(format_name, filter_name=None):
118+
def new_archive_write(format_name, filter_name=None, options=''):
113119
archive_p = ffi.write_new()
114120
getattr(ffi, 'write_set_format_'+format_name)(archive_p)
115121
if filter_name:
116122
getattr(ffi, 'write_add_filter_'+filter_name)(archive_p)
123+
if options:
124+
if not isinstance(options, bytes):
125+
options = options.encode('utf-8')
126+
ffi.write_set_options(archive_p, options)
117127
try:
118128
yield archive_p
119129
ffi.write_close(archive_p)
@@ -128,7 +138,7 @@ def new_archive_write(format_name, filter_name=None):
128138
def custom_writer(
129139
write_func, format_name, filter_name=None,
130140
open_func=VOID_CB, close_func=VOID_CB, block_size=page_size,
131-
archive_write_class=ArchiveWrite
141+
archive_write_class=ArchiveWrite, options=''
132142
):
133143

134144
def write_cb_internal(archive_p, context, buffer_, length):
@@ -139,7 +149,7 @@ def write_cb_internal(archive_p, context, buffer_, length):
139149
write_cb = WRITE_CALLBACK(write_cb_internal)
140150
close_cb = CLOSE_CALLBACK(close_func)
141151

142-
with new_archive_write(format_name, filter_name) as archive_p:
152+
with new_archive_write(format_name, filter_name, options) as archive_p:
143153
ffi.write_set_bytes_in_last_block(archive_p, 1)
144154
ffi.write_set_bytes_per_block(archive_p, block_size)
145155
ffi.write_open(archive_p, None, open_cb, write_cb, close_cb)
@@ -148,28 +158,30 @@ def write_cb_internal(archive_p, context, buffer_, length):
148158

149159
@contextmanager
150160
def fd_writer(
151-
fd, format_name, filter_name=None, archive_write_class=ArchiveWrite
161+
fd, format_name, filter_name=None,
162+
archive_write_class=ArchiveWrite, options=''
152163
):
153-
with new_archive_write(format_name, filter_name) as archive_p:
164+
with new_archive_write(format_name, filter_name, options) as archive_p:
154165
ffi.write_open_fd(archive_p, fd)
155166
yield archive_write_class(archive_p)
156167

157168

158169
@contextmanager
159170
def file_writer(
160171
filepath, format_name, filter_name=None,
161-
archive_write_class=ArchiveWrite
172+
archive_write_class=ArchiveWrite, options=''
162173
):
163-
with new_archive_write(format_name, filter_name) as archive_p:
174+
with new_archive_write(format_name, filter_name, options) as archive_p:
164175
ffi.write_open_filename_w(archive_p, filepath)
165176
yield archive_write_class(archive_p)
166177

167178

168179
@contextmanager
169180
def memory_writer(
170-
buf, format_name, filter_name=None, archive_write_class=ArchiveWrite
181+
buf, format_name, filter_name=None,
182+
archive_write_class=ArchiveWrite, options=''
171183
):
172-
with new_archive_write(format_name, filter_name) as archive_p:
184+
with new_archive_write(format_name, filter_name, options) as archive_p:
173185
used = byref(c_size_t())
174186
buf_p = cast(buf, c_void_p)
175187
ffi.write_open_memory(archive_p, buf_p, len(buf), used)

0 commit comments

Comments
 (0)