1/* libarchive.vapi - Bindings for libarchive(3) (version 3).
2 *
3 * Copyright (C) 2009 Julian Andres Klode <jak@jak-linux.org>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
18 *
19 * Author:
20 * 	Julian Andres Klode <jak@jak-linux.org>
21 *
22 */
23
24
25[CCode (cprefix="ARCHIVE_", lower_case_cprefix="archive_", cheader_filename = "archive.h")]
26namespace Archive {
27	public const int VERSION_NUMBER;
28	public const string VERSION_STRING;
29	public int version_number ();
30	public unowned string version_string ();
31
32	[CCode (instance_pos = 1.9, cname="archive_read_callback")]
33	public delegate ssize_t ReadCallback (Archive archive,[CCode (array_length = false)] out unowned uint8[] buffer);
34	[CCode (instance_pos = 1.9, cname="archive_skip_callback")]
35	public delegate int64_t SkipCallback (Archive archive, int64_t request);
36	[CCode (instance_pos = 1.9, cname="archive_write_callback")]
37	public delegate ssize_t WriteCallback (Archive archive,[CCode (array_length_type = "size_t")] uint8[] buffer);
38	[CCode (instance_pos = 1.9, cname="archive_open_callback")]
39	public delegate int OpenCallback (Archive archive);
40
41	[CCode (cname="archive_close_callback")]
42	public delegate int CloseCallback (Archive archive);
43
44	// "void (*_progress_func)(void *)" function pointer without typedef.
45	[CCode (has_typedef = false)]
46	public delegate void ExtractProgressCallback ();
47
48	[CCode (cprefix="ARCHIVE_", cname="int", has_type_id = false)]
49	public enum Result {
50		EOF,
51		OK,
52		RETRY,
53		WARN,
54		FAILED
55	}
56
57	// see libarchive/archive.h, l. 218 ff.
58	[CCode (cname="int", has_type_id = false)]
59	public enum Filter {
60		NONE,
61		GZIP,
62		BZIP2,
63		COMPRESS,
64		PROGRAM,
65		LZMA,
66		XZ,
67		UU,
68		RPM,
69		LZIP,
70		LRZIP,
71		LZOP,
72		GRZIP
73	}
74
75	[CCode (cname="int", has_type_id = false)]
76	public enum Format {
77		BASE_MASK,
78		CPIO,
79		CPIO_POSIX,
80		CPIO_BIN_LE,
81		CPIO_BIN_BE,
82		CPIO_SVR4_NOCRC,
83		CPIO_SVR4_CRC,
84		SHAR,
85		SHAR_BASE,
86		SHAR_DUMP,
87		TAR,
88		TAR_USTAR,
89		TAR_PAX_INTERCHANGE,
90		TAR_PAX_RESTRICTED,
91		TAR_GNUTAR,
92		ISO9660,
93		ISO9660_ROCKRIDGE,
94		ZIP,
95		EMPTY,
96		AR,
97		AR_GNU,
98		AR_BSD,
99		MTREE
100	}
101
102	[CCode (cprefix="ARCHIVE_EXTRACT_", cname="int", has_type_id = false)]
103	public enum ExtractFlags {
104		OWNER,
105		PERM,
106		TIME,
107		NO_OVERWRITE,
108		UNLINK,
109		ACL,
110		FFLAGS,
111		XATTR,
112		SECURE_SYMLINKS,
113		SECURE_NODOTDOT,
114		NO_AUTODIR,
115		NO_OVERWRITE_NEWER,
116		SPARSE
117	}
118
119	[SimpleType]
120	[IntegerType (rank = 9)]
121	[CCode (cname="la_int64_t")]
122	public struct int64_t {
123	}
124
125	[Compact]
126	[CCode (cname="struct archive", cprefix="archive_")]
127	public class Archive {
128		public int64_t position_compressed ();
129		public int64_t position_uncompressed ();
130
131		public Format format ();
132		// Filter #0 is the one closest to the format, -1 is a synonym
133		// for the last filter, which is always the pseudo-filter that
134		// wraps the client callbacks. (libarchive/archive.h, l. 955)
135		public Filter filter_code (int filter_no);
136
137		public unowned string compression_name ();
138		public unowned string format_name ();
139		public unowned string filter_name (int filter_no = 0);
140
141		public int filter_count ();
142		public int file_count ();
143
144		public int errno ();
145		public unowned string error_string ();
146		public void clear_error ();
147		public void set_error (int err, string fmt, ...);
148		public void copy_error (Archive src);
149	}
150
151
152	[Compact]
153	[CCode (cname="struct archive", free_function="archive_read_free")]
154	public class Read : Archive {
155		public Read ();
156		public Result support_filter_all ();
157		public Result support_filter_bzip2 ();
158		public Result support_filter_compress ();
159		public Result support_filter_gzip ();
160		public Result support_filter_grzip ();
161		public Result support_filter_lrzip ();
162		public Result support_filter_lzip ();
163		public Result support_filter_lzma ();
164		public Result support_filter_lzop ();
165		public Result support_filter_none ();
166		public Result support_filter_program (string command);
167		// TODO support_filter_program_signature (string, const void *, size_t)
168		public Result support_filter_rpm ();
169		public Result support_filter_uu ();
170		public Result support_filter_xz ();
171		public Result support_format_7zip ();
172		public Result support_format_all ();
173		public Result support_format_ar ();
174		public Result support_format_by_code (Format format_code);
175		public Result support_format_cab ();
176		public Result support_format_cpio ();
177		public Result support_format_empty ();
178		public Result support_format_gnutar ();
179		public Result support_format_iso9660 ();
180		public Result support_format_lha ();
181		public Result support_format_mtree ();
182		public Result support_format_rar ();
183		public Result support_format_raw ();
184		public Result support_format_tar ();
185		public Result support_format_xar ();
186		public Result support_format_zip ();
187		public Result support_format_zip_streamable ();
188		public Result support_format_zip_seekable ();
189
190		public Result set_format (Format format_code);
191		public Result append_filter (Filter filter_code);
192		public Result append_filter_program (string cmd);
193		// TODO append_filter_program_signature (string, const void *, size_t);
194
195		public Result open (
196			[CCode (delegate_target_pos = 0.9)] OpenCallback ocb,
197			[CCode (delegate_target_pos = 0.9)] ReadCallback rcb,
198			[CCode (delegate_target_pos = 0.9)] CloseCallback ccb
199		);
200
201		public Result open2 (
202			[CCode (delegate_target_pos = 0.9)] OpenCallback ocb,
203			[CCode (delegate_target_pos = 0.9)] ReadCallback rcb,
204			[CCode (delegate_target_pos = 0.9)] SkipCallback scb,
205			[CCode (delegate_target_pos = 0.9)] CloseCallback ccb
206		);
207
208		public Result open_filename (string filename, size_t block_size);
209		public Result open_memory ([CCode (array_length_type = "size_t")] uint8[] buffer);
210		public Result open_fd (int fd, size_t block_size);
211#if POSIX
212		public Result open_FILE (Posix.FILE file);
213#else
214		public Result open_FILE (GLib.FileStream file);
215#endif
216		public Result next_header (out unowned Entry entry);
217		public int64_t header_position ();
218
219		[CCode (cname="archive_read_data")]
220		public ssize_t read_data ([CCode (array_length_type = "size_t")] uint8[] buffer);
221		[CCode (cname="archive_read_data_block")]
222		public Result read_data_block ([CCode (array_length_type = "size_t")] out unowned uint8[] buffer, out int64_t offset);
223		[CCode (cname="archive_read_data_skip")]
224		public Result read_data_skip ();
225		[CCode (cname="archive_read_data_into_fd")]
226		public Result read_data_into_fd (int fd);
227
228		public Result extract (Entry entry, ExtractFlags? flags=0);
229		public Result extract2 (Entry entry, Write dest);
230		public void extract_set_progress_callback (ExtractProgressCallback cb);
231		public void extract_set_skip_file (int64_t dev, int64_t ino);
232		public Result close ();
233	}
234
235	[Compact]
236	[CCode (cname = "struct archive", free_function="archive_read_free")]
237	public class ReadDisk : Read {
238		public ReadDisk ();
239		public Result set_symlink_logical ();
240		public Result set_symlink_physical ();
241		public Result set_symlink_hybrid ();
242		public Result entry_from_file (Entry entry, int fd, Posix.Stat stat);
243		public unowned string gname (int64_t gid);
244		public unowned string uname (int64_t uid);
245		public Result set_standard_lookup ();
246
247		// HACK, they have no name in C. May not work correctly.
248		[CCode (instance_pos = 0, cname="void")]
249		public delegate unowned string GNameLookup (int64_t gid);
250		[CCode (instance_pos = 0, cname="void")]
251		public delegate unowned string UNameLookup (int64_t uid);
252		[CCode (instance_pos = 0, cname="void")]
253		public delegate void Cleanup ();
254
255		public Result set_gname_lookup (
256			GNameLookup lookup,
257			Cleanup? cleanup = null
258		);
259
260		public Result set_uname_lookup (
261			UNameLookup lookup,
262			Cleanup? cleanup = null
263		);
264	}
265
266	[CCode (cname = "struct archive", free_function="archive_write_free")]
267	public class Write : Archive {
268		public Write ();
269		public Result add_filter (Filter filter_code);
270		public Result add_filter_by_name (string name);
271		public Result add_filter_b64encode ();
272		public Result add_filter_bzip2 ();
273		public Result add_filter_compress ();
274		public Result add_filter_grzip ();
275		public Result add_filter_gzip ();
276		public Result add_filter_lrzip ();
277		public Result add_filter_lzip ();
278		public Result add_filter_lzma ();
279		public Result add_filter_lzop ();
280		public Result add_filter_none ();
281		public Result add_filter_program (string cmd);
282		public Result add_filter_uuencode ();
283		public Result add_filter_xz ();
284		public Result set_format (Format format);
285		public Result set_format_by_name (string name);
286		public Result set_format_7zip ();
287		public Result set_format_ar_bsd ();
288		public Result set_format_ar_svr4 ();
289		public Result set_format_cpio ();
290		public Result set_format_cpio_newc ();
291		public Result set_format_gnutar ();
292		public Result set_format_iso9660 ();
293		public Result set_format_mtree ();
294		public Result set_format_mtree_classic ();
295		public Result set_format_pax ();
296		public Result set_format_pax_restricted ();
297		public Result set_format_raw ();
298		public Result set_format_shar ();
299		public Result set_format_shar_dump ();
300		public Result set_format_ustar ();
301		public Result set_format_v7tar ();
302		public Result set_format_xar ();
303		public Result set_format_zip ();
304
305		public Result set_bytes_per_block (int bytes_per_block);
306		public int get_bytes_per_block ();
307		public Result set_bytes_in_last_block (int bytes_in_last_block);
308		public int get_bytes_in_last_block ();
309		public Result set_skip_file (int64_t dev, int64_t ino);
310
311		public Result open (
312			[CCode (delegate_target_pos = 0.9)] OpenCallback ocb,
313			[CCode (delegate_target_pos = 0.9)] WriteCallback rcb,
314			[CCode (delegate_target_pos = 0.9)] CloseCallback ccb
315		);
316		public Result open_fd (int fd);
317		public Result open_filename (string filename);
318#if POSIX
319		public Result open_FILE (Posix.FILE file);
320#else
321		public Result open_FILE (GLib.FileStream file);
322#endif
323		public Result open_memory ([CCode (array_length_type = "size_t")] uint8[] buffer, out size_t used);
324
325		[CCode (cname="archive_write_header")]
326		public Result write_header (Entry entry);
327		[CCode (cname="archive_write_data")]
328		public ssize_t write_data ([CCode (array_length_type = "size_t")] uint8[] data);
329		[CCode (cname="archive_write_data_block")]
330		public ssize_t write_data_block ([CCode (array_length_type = "size_t")] uint8[] data, int64_t offset);
331
332		public Result finish_entry ();
333		public Result close ();
334	}
335
336	[Compact]
337	[CCode (cname = "struct archive", free_function="archive_write_free")]
338	public class WriteDisk : Write {
339		public WriteDisk ();
340
341		public Result set_skip_file (int64_t dev, int64_t ino);
342		public Result set_options (ExtractFlags flags);
343		public Result set_standard_lookup ();
344
345		// "la_int64_t (*)(void *, const char *, la_int64_t)"
346		[CCode (has_typedef = false, instance_pos = 0)]
347		public delegate int64_t GroupLookup (string group, int64_t gid);
348		// "la_int64_t (*)(void *, const char *, la_int64_t)"
349		[CCode (has_typedef = false, instance_pos = 0)]
350		public delegate int64_t UserLookup (string user, int64_t uid);
351		// "void (*)(void *)"
352		[CCode (has_typedef = false, instance_pos = 0)]
353		public delegate void Cleanup ();
354
355		public Result set_group_lookup (
356			[CCode (delegate_target_pos = 0.9) ] GroupLookup lookup,
357			[CCode (delegate_target_pos = 0.9) ] Cleanup? cleanup = null
358		);
359
360		public Result set_user_lookup (
361			[CCode (delegate_target_pos = 0.9) ] UserLookup lookup,
362			[CCode (delegate_target_pos = 0.9) ] Cleanup? cleanup = null
363		);
364	}
365
366	[SimpleType]
367	[CCode (cheader_filename = "archive_entry.h", cname = "__LA_MODE_T", has_type_id = false)]
368	[IntegerType (rank = 9)]
369	public struct FileMode : Posix.mode_t {
370	}
371
372	[CCode (cheader_filename = "archive_entry.h", cprefix = "AE_", cname = "__LA_MODE_T", has_type_id = false)]
373	public enum FileType {
374		IFMT,
375		IFREG,
376		IFLNK,
377		IFSOCK,
378		IFCHR,
379		IFBLK,
380		IFDIR,
381		IFIFO
382	}
383
384	[Compact]
385	[CCode (cname = "struct archive_entry", cheader_filename = "archive_entry.h")]
386	public class Entry {
387		[CCode (cname="archive_entry_new2")]
388		public Entry (Archive? archive = null);
389		public time_t atime ();
390		public long atime_nsec ();
391		public bool atime_is_set ();
392		public time_t birthtime ();
393		public long birthtime_nsec ();
394		public bool birthtime_is_set ();
395		public time_t ctime ();
396		public long ctime_nsec ();
397		public bool ctime_is_set ();
398		public int64_t dev ();
399		public int64_t devmajor ();
400		public int64_t devminor ();
401		public FileType filetype ();
402		public unowned string fflags_text ();
403		public int64_t gid ();
404		public unowned string gname ();
405		public unowned string hardlink ();
406		public int64_t ino ();
407		public FileMode mode ();
408		public time_t mtime ();
409		public long mtime_nsec ();
410		public bool mtime_is_set ();
411		public uint nlink ();
412		public unowned string pathname ();
413		public FileMode perm ();
414		public int64_t rdev ();
415		public int64_t rdevmajor ();
416		public int64_t rdevminor ();
417		public unowned string sourcepath ();
418		public int64_t size ();
419		public bool size_is_set ();
420		public unowned string strmode ();
421		public unowned string symlink ();
422		public int64_t uid ();
423		public unowned string uname ();
424		public void set_atime (time_t atime, long blah);
425		public void unset_atime ();
426		public void set_birthtime (time_t birthtime, long blah);
427		public void unset_birthtime ();
428		public void set_ctime (time_t atime, long blah);
429		public void unset_ctime ();
430		public void set_dev (int64_t dev);
431		public void set_devmajor (int64_t major);
432		public void set_devminor (int64_t major);
433		public void set_filetype (FileType filetype);
434		public void set_fflags (ulong set, ulong clear);
435		public unowned string copy_fflags_text (string text);
436		public void set_gid (int64_t gid);
437		public void set_gname (string gname);
438		public Result update_gname_utf8 (string gname);
439		public void set_hardlink (string link);
440		public void set_ino (ulong ino);
441		public void set_link (string link);
442		public Result update_link_utf8 (string link);
443		public void set_mode (FileMode mode);
444		public void set_mtime (time_t mtime, long blah);
445		public void unset_mtime ();
446		public void set_nlink (uint nlink);
447		public void set_pathname (string pathname);
448		public Result  update_pathname_utf8 (string pathname);
449		public void set_perm (FileMode mode);
450		public void set_rdev (int64_t dev);
451		public void set_rdevmajor (int64_t devmajor);
452		public void set_rdevminor (int64_t devminor);
453		public void set_size (int64_t size);
454		public void unset_size ();
455		public void copy_sourcepath (string sourcepath);
456		public void set_symlink (string symlink);
457		public void set_uid (int64_t uid);
458		public void set_uname (string uname);
459		public Result update_uname_utf8 (string uname);
460
461		public unowned Posix.Stat stat ();
462		public void copy_stat (Posix.Stat stat);
463
464		public unowned Entry clear ();
465		public Entry clone ();
466
467		public void xattr_clear();
468		public void xattr_add_entry(string name, void* value, size_t size);
469		public int xattr_count();
470		public Result xattr_reset();
471		public Result xattr_next(out unowned string name, out void* value, out size_t size);
472
473		[Compact]
474		public class LinkResolver {
475			public LinkResolver ();
476			public void set_strategy (Format format_code);
477			public void linkify (Entry a, Entry b);
478		}
479	}
480}
481