libarchive-static 1.0.3-i386-mswin32 → 1.0.4-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/README.txt +143 -143
  3. data/lib/libarchive_ruby.so +0 -0
  4. data/libarchive.c +1762 -1762
  5. metadata +7 -9
data/libarchive.c CHANGED
@@ -1,1762 +1,1762 @@
1
- #include "libarchive_internal.h"
2
-
3
- VALUE rb_mArchive;
4
- VALUE rb_eArchiveError;
5
-
6
- /* */
7
- VALUE rb_libarchive_s_version_number(VALUE self) {
8
- #if ARCHIVE_VERSION >= 2005000
9
- return INT2NUM(archive_version_number());
10
- #else
11
- return INT2NUM(archive_version_stamp());
12
- #endif
13
- }
14
-
15
- /* */
16
- VALUE rb_libarchive_s_version_string(VALUE self) {
17
- #if ARCHIVE_VERSION_NUMBER >= 2005000
18
- return rb_str_new2(archive_version_string());
19
- #else
20
- return rb_str_new2(archive_version());
21
- #endif
22
- }
23
-
24
- void DLLEXPORT Init_libarchive_ruby() {
25
- rb_mArchive = rb_define_module("Archive");
26
- rb_define_const(rb_mArchive, "VERSION", rb_str_new2(VERSION));
27
-
28
- rb_define_const(rb_mArchive, "COMPRESSION_NONE", INT2NUM(ARCHIVE_COMPRESSION_NONE));
29
- rb_define_const(rb_mArchive, "COMPRESSION_GZIP", INT2NUM(ARCHIVE_COMPRESSION_GZIP));
30
- rb_define_const(rb_mArchive, "COMPRESSION_BZIP2", INT2NUM(ARCHIVE_COMPRESSION_BZIP2));
31
- rb_define_const(rb_mArchive, "COMPRESSION_COMPRESS", INT2NUM(ARCHIVE_COMPRESSION_COMPRESS));
32
- // XXX:
33
- /*
34
- rb_define_const(rb_mArchive, "COMPRESSION_PROGRAM", INT2NUM(ARCHIVE_COMPRESSION_PROGRAM));
35
- rb_define_const(rb_mArchive, "COMPRESSION_LZMA", INT2NUM(ARCHIVE_COMPRESSION_LZMA));
36
- */
37
-
38
- rb_define_const(rb_mArchive, "FORMAT_BASE_MASK", INT2NUM(ARCHIVE_FORMAT_BASE_MASK));
39
- rb_define_const(rb_mArchive, "FORMAT_CPIO", INT2NUM(ARCHIVE_FORMAT_CPIO));
40
- rb_define_const(rb_mArchive, "FORMAT_CPIO_POSIX", INT2NUM(ARCHIVE_FORMAT_CPIO_POSIX));
41
- rb_define_const(rb_mArchive, "FORMAT_CPIO_BIN_LE", INT2NUM(ARCHIVE_FORMAT_CPIO_BIN_LE));
42
- rb_define_const(rb_mArchive, "FORMAT_CPIO_BIN_BE", INT2NUM(ARCHIVE_FORMAT_CPIO_BIN_BE));
43
- rb_define_const(rb_mArchive, "FORMAT_CPIO_SVR4_NOCRC", INT2NUM(ARCHIVE_FORMAT_CPIO_SVR4_NOCRC));
44
- rb_define_const(rb_mArchive, "FORMAT_CPIO_SVR4_CRC", INT2NUM(ARCHIVE_FORMAT_CPIO_SVR4_CRC));
45
- rb_define_const(rb_mArchive, "FORMAT_SHAR", INT2NUM(ARCHIVE_FORMAT_SHAR));
46
- rb_define_const(rb_mArchive, "FORMAT_SHAR_BASE", INT2NUM(ARCHIVE_FORMAT_SHAR_BASE));
47
- rb_define_const(rb_mArchive, "FORMAT_SHAR_DUMP", INT2NUM(ARCHIVE_FORMAT_SHAR_DUMP));
48
- rb_define_const(rb_mArchive, "FORMAT_TAR", INT2NUM(ARCHIVE_FORMAT_TAR));
49
- rb_define_const(rb_mArchive, "FORMAT_TAR_USTAR", INT2NUM(ARCHIVE_FORMAT_TAR_USTAR));
50
- rb_define_const(rb_mArchive, "FORMAT_TAR_PAX_INTERCHANGE", INT2NUM(ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE));
51
- rb_define_const(rb_mArchive, "FORMAT_TAR_PAX_RESTRICTED", INT2NUM(ARCHIVE_FORMAT_TAR_PAX_RESTRICTED));
52
- rb_define_const(rb_mArchive, "FORMAT_TAR_GNUTAR", INT2NUM(ARCHIVE_FORMAT_TAR_GNUTAR));
53
- rb_define_const(rb_mArchive, "FORMAT_ISO9660", INT2NUM(ARCHIVE_FORMAT_ISO9660));
54
- rb_define_const(rb_mArchive, "FORMAT_ISO9660_ROCKRIDGE", INT2NUM(ARCHIVE_FORMAT_ISO9660_ROCKRIDGE));
55
- rb_define_const(rb_mArchive, "FORMAT_ZIP", INT2NUM(ARCHIVE_FORMAT_ZIP));
56
- rb_define_const(rb_mArchive, "FORMAT_EMPTY", INT2NUM(ARCHIVE_FORMAT_EMPTY));
57
- rb_define_const(rb_mArchive, "FORMAT_AR", INT2NUM(ARCHIVE_FORMAT_AR));
58
- rb_define_const(rb_mArchive, "FORMAT_AR_GNU", INT2NUM(ARCHIVE_FORMAT_AR_GNU));
59
- rb_define_const(rb_mArchive, "FORMAT_AR_BSD", INT2NUM(ARCHIVE_FORMAT_AR_BSD));
60
- #ifdef ARCHIVE_FORMAT_MTREE
61
- rb_define_const(rb_mArchive, "FORMAT_MTREE", INT2NUM(ARCHIVE_FORMAT_MTREE));
62
- #endif
63
-
64
- rb_define_const(rb_mArchive, "EXTRACT_OWNER", INT2NUM(ARCHIVE_EXTRACT_OWNER));
65
- rb_define_const(rb_mArchive, "EXTRACT_PERM", INT2NUM(ARCHIVE_EXTRACT_PERM));
66
- rb_define_const(rb_mArchive, "EXTRACT_TIME", INT2NUM(ARCHIVE_EXTRACT_TIME));
67
- rb_define_const(rb_mArchive, "EXTRACT_NO_OVERWRITE", INT2NUM(ARCHIVE_EXTRACT_NO_OVERWRITE));
68
- rb_define_const(rb_mArchive, "EXTRACT_UNLINK", INT2NUM(ARCHIVE_EXTRACT_UNLINK));
69
- rb_define_const(rb_mArchive, "EXTRACT_ACL", INT2NUM(ARCHIVE_EXTRACT_ACL));
70
- rb_define_const(rb_mArchive, "EXTRACT_FFLAGS", INT2NUM(ARCHIVE_EXTRACT_FFLAGS));
71
- rb_define_const(rb_mArchive, "EXTRACT_XATTR", INT2NUM(ARCHIVE_EXTRACT_XATTR));
72
- rb_define_const(rb_mArchive, "EXTRACT_SECURE_SYMLINKS", INT2NUM(ARCHIVE_EXTRACT_SECURE_SYMLINKS));
73
- rb_define_const(rb_mArchive, "EXTRACT_SECURE_NODOTDOT", INT2NUM(ARCHIVE_EXTRACT_SECURE_NODOTDOT));
74
- rb_define_const(rb_mArchive, "EXTRACT_NO_AUTODIR", INT2NUM(ARCHIVE_EXTRACT_NO_AUTODIR));
75
- rb_define_const(rb_mArchive, "EXTRACT_NO_OVERWRITE_NEWER", INT2NUM(ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER));
76
- #ifdef ARCHIVE_EXTRACT_SPARSE
77
- rb_define_const(rb_mArchive, "EXTRACT_SPARSE", INT2NUM(ARCHIVE_EXTRACT_SPARSE));
78
- #endif
79
-
80
- rb_define_module_function(rb_mArchive, "version_number", rb_libarchive_s_version_number, 0);
81
- rb_define_module_function(rb_mArchive, "version_string", rb_libarchive_s_version_string, 0);
82
-
83
- rb_eArchiveError = rb_define_class_under(rb_mArchive, "Error", rb_eStandardError);
84
-
85
- Init_libarchive_reader();
86
- Init_libarchive_writer();
87
- Init_libarchive_archive();
88
- Init_libarchive_entry();
89
- }
90
- #include "libarchive_internal.h"
91
-
92
- extern VALUE rb_cArchiveReader;
93
- extern VALUE rb_cArchiveWriter;
94
- extern VALUE rb_eArchiveError;
95
-
96
- static void rb_libarchive_archive_free(struct rb_libarchive_archive_container *p) {
97
- xfree(p);
98
- }
99
-
100
- static void rb_libarchive_archive_mark(struct rb_libarchive_archive_container *p) {
101
- rb_gc_mark(p->memory);
102
- }
103
-
104
- VALUE rb_libarchive_archive_alloc(VALUE klass) {
105
- struct rb_libarchive_archive_container *p = ALLOC(struct rb_libarchive_archive_container);
106
- p->ar = NULL;
107
- p->eof = 0;
108
- p->memory = Qnil;
109
- return Data_Wrap_Struct(klass, rb_libarchive_archive_mark, rb_libarchive_archive_free, p);
110
- }
111
-
112
- /* */
113
- static VALUE rb_libarchive_archive_position_compressed(VALUE self) {
114
- struct rb_libarchive_archive_container *p;
115
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
116
- Check_Archive(p);
117
- return LL2NUM(archive_position_compressed(p->ar));
118
- }
119
-
120
- /* */
121
- static VALUE rb_libarchive_archive_position_uncompressed(VALUE self) {
122
- struct rb_libarchive_archive_container *p;
123
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
124
- Check_Archive(p);
125
- return LL2NUM(archive_position_uncompressed(p->ar));
126
- }
127
-
128
- /* */
129
- static VALUE rb_libarchive_archive_compression_name(VALUE self) {
130
- struct rb_libarchive_archive_container *p;
131
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
132
- Check_Archive(p);
133
- return rb_str_new2(archive_compression_name(p->ar));
134
- }
135
-
136
- /* */
137
- static VALUE rb_libarchive_archive_compression(VALUE self) {
138
- struct rb_libarchive_archive_container *p;
139
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
140
- Check_Archive(p);
141
- return INT2NUM(archive_compression(p->ar));
142
- }
143
-
144
- /* */
145
- static VALUE rb_libarchive_archive_format_name(VALUE self) {
146
- struct rb_libarchive_archive_container *p;
147
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
148
- Check_Archive(p);
149
- return rb_str_new2(archive_format_name(p->ar));
150
- }
151
-
152
- /* */
153
- static VALUE rb_libarchive_archive_format(VALUE self) {
154
- struct rb_libarchive_archive_container *p;
155
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
156
- Check_Archive(p);
157
- return NUM2INT(archive_format(p->ar));
158
- }
159
-
160
- void Init_libarchive_archive() {
161
- rb_define_method(rb_cArchiveReader, "position_compressed", rb_libarchive_archive_position_compressed, 0);
162
- rb_define_method(rb_cArchiveWriter, "position_compressed", rb_libarchive_archive_position_compressed, 0);
163
- rb_define_method(rb_cArchiveReader, "position_uncompressed", rb_libarchive_archive_position_uncompressed, 0);
164
- rb_define_method(rb_cArchiveWriter, "position_uncompressed", rb_libarchive_archive_position_uncompressed, 0);
165
- rb_define_method(rb_cArchiveReader, "compression_name", rb_libarchive_archive_compression_name, 0);
166
- rb_define_method(rb_cArchiveWriter, "compression_name", rb_libarchive_archive_compression_name, 0);
167
- rb_define_method(rb_cArchiveReader, "compression", rb_libarchive_archive_compression, 0);
168
- rb_define_method(rb_cArchiveWriter, "compression", rb_libarchive_archive_compression, 0);
169
- rb_define_method(rb_cArchiveReader, "format_name", rb_libarchive_archive_format_name, 0);
170
- rb_define_method(rb_cArchiveWriter, "format_name", rb_libarchive_archive_format_name, 0);
171
- rb_define_method(rb_cArchiveReader, "format", rb_libarchive_archive_format, 0);
172
- rb_define_method(rb_cArchiveWriter, "format", rb_libarchive_archive_format, 0);
173
- }
174
- #include "libarchive_internal.h"
175
-
176
- extern VALUE rb_mArchive;
177
- VALUE rb_cArchiveEntry;
178
- extern VALUE rb_eArchiveError;
179
-
180
- static void rb_libarchive_entry_free(struct rb_libarchive_entry_container *p) {
181
- xfree(p);
182
- }
183
-
184
- static VALUE rb_libarchive_entry_alloc(VALUE klass) {
185
- struct rb_libarchive_entry_container *p = ALLOC(struct rb_libarchive_entry_container);
186
- p->ae = NULL;
187
- p->must_close = 1;
188
- return Data_Wrap_Struct(klass, 0, rb_libarchive_entry_free, p);
189
- }
190
-
191
- /* */
192
- VALUE rb_libarchive_entry_close(VALUE self) {
193
- struct rb_libarchive_entry_container *p;
194
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
195
- Check_Entry(p);
196
-
197
- if (!p->must_close) {
198
- rb_raise(rb_eArchiveError, "Close entry failed: It is not necessary to close");
199
- }
200
-
201
- archive_entry_free(p->ae);
202
- p->ae = NULL;
203
- return Qnil;
204
- }
205
-
206
- VALUE rb_libarchive_entry_new(struct archive_entry *ae, int must_close) {
207
- VALUE entry;
208
- struct rb_libarchive_entry_container *p;
209
- entry = rb_funcall(rb_cArchiveEntry, rb_intern("new"), 0);
210
- Data_Get_Struct(entry, struct rb_libarchive_entry_container, p);
211
- p->ae = ae;
212
- p->must_close = must_close;
213
- return entry;
214
- }
215
-
216
- /* */
217
- static VALUE rb_libarchive_entry_atime(VALUE self) {
218
- struct rb_libarchive_entry_container *p;
219
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
220
- Check_Entry(p);
221
- return LONG2TIME((long) archive_entry_atime(p->ae));
222
- }
223
-
224
- /* */
225
- static VALUE rb_libarchive_entry_atime_nsec(VALUE self) {
226
- struct rb_libarchive_entry_container *p;
227
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
228
- Check_Entry(p);
229
- return LONG2NUM(archive_entry_atime_nsec(p->ae));
230
- }
231
-
232
- /* */
233
- static VALUE rb_libarchive_entry_atime_is_set(VALUE self) {
234
- struct rb_libarchive_entry_container *p;
235
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
236
- Check_Entry(p);
237
- return archive_entry_atime_is_set(p->ae) ? Qtrue : Qfalse;
238
- }
239
-
240
- /* */
241
- static VALUE rb_libarchive_entry_birthtime(VALUE self) {
242
- struct rb_libarchive_entry_container *p;
243
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
244
- Check_Entry(p);
245
- return LONG2TIME((long) archive_entry_birthtime(p->ae));
246
- }
247
-
248
- /* */
249
- static VALUE rb_libarchive_entry_birthtime_nsec(VALUE self) {
250
- struct rb_libarchive_entry_container *p;
251
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
252
- Check_Entry(p);
253
- return LONG2NUM(archive_entry_birthtime_nsec(p->ae));
254
- }
255
-
256
- /* */
257
- static VALUE rb_libarchive_entry_birthtime_is_set(VALUE self) {
258
- struct rb_libarchive_entry_container *p;
259
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
260
- Check_Entry(p);
261
- return archive_entry_birthtime_is_set(p->ae) ? Qtrue : Qfalse;
262
- }
263
-
264
- /* */
265
- static VALUE rb_libarchive_entry_ctime(VALUE self) {
266
- struct rb_libarchive_entry_container *p;
267
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
268
- Check_Entry(p);
269
- return LONG2TIME((long) archive_entry_ctime(p->ae));
270
- }
271
-
272
- /* */
273
- static VALUE rb_libarchive_entry_ctime_nsec(VALUE self) {
274
- struct rb_libarchive_entry_container *p;
275
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
276
- Check_Entry(p);
277
- return LONG2NUM(archive_entry_ctime_nsec(p->ae));
278
- }
279
-
280
- /* */
281
- static VALUE rb_libarchive_entry_ctime_is_set(VALUE self) {
282
- struct rb_libarchive_entry_container *p;
283
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
284
- Check_Entry(p);
285
- return archive_entry_ctime_is_set(p->ae) ? Qtrue : Qfalse;
286
- }
287
-
288
- /* */
289
- static VALUE rb_libarchive_entry_dev(VALUE self) {
290
- struct rb_libarchive_entry_container *p;
291
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
292
- Check_Entry(p);
293
- return LONG2NUM(archive_entry_dev(p->ae));
294
- }
295
-
296
- /* */
297
- static VALUE rb_libarchive_entry_devmajor(VALUE self) {
298
- struct rb_libarchive_entry_container *p;
299
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
300
- Check_Entry(p);
301
- return LONG2NUM(archive_entry_devmajor(p->ae));
302
- }
303
-
304
- /* */
305
- static VALUE rb_libarchive_entry_devminor(VALUE self) {
306
- struct rb_libarchive_entry_container *p;
307
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
308
- Check_Entry(p);
309
- return LONG2NUM(archive_entry_devminor(p->ae));
310
- }
311
-
312
- /* */
313
- static VALUE rb_libarchive_entry_filetype(VALUE self) {
314
- struct rb_libarchive_entry_container *p;
315
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
316
- Check_Entry(p);
317
- return INT2NUM(archive_entry_filetype(p->ae));
318
- }
319
-
320
- /* */
321
- static VALUE rb_libarchive_entry_is_directory(VALUE self) {
322
- struct rb_libarchive_entry_container *p;
323
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
324
- Check_Entry(p);
325
- return S_ISDIR(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
326
- }
327
-
328
- /* */
329
- static VALUE rb_libarchive_entry_is_character_special(VALUE self) {
330
- struct rb_libarchive_entry_container *p;
331
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
332
- Check_Entry(p);
333
- return S_ISCHR(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
334
- }
335
-
336
- /* */
337
- static VALUE rb_libarchive_entry_is_block_special(VALUE self) {
338
- struct rb_libarchive_entry_container *p;
339
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
340
- Check_Entry(p);
341
- return S_ISBLK(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
342
- }
343
-
344
- /* */
345
- static VALUE rb_libarchive_entry_is_regular(VALUE self) {
346
- struct rb_libarchive_entry_container *p;
347
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
348
- Check_Entry(p);
349
- return S_ISREG(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
350
- }
351
-
352
- /* */
353
- static VALUE rb_libarchive_entry_is_symbolic_link(VALUE self) {
354
- struct rb_libarchive_entry_container *p;
355
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
356
- Check_Entry(p);
357
- return S_ISLNK(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
358
- }
359
-
360
- /* */
361
- static VALUE rb_libarchive_entry_is_socket(VALUE self) {
362
- struct rb_libarchive_entry_container *p;
363
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
364
- Check_Entry(p);
365
- return S_ISSOCK(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
366
- }
367
-
368
- /* */
369
- static VALUE rb_libarchive_entry_is_fifo(VALUE self) {
370
- struct rb_libarchive_entry_container *p;
371
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
372
- Check_Entry(p);
373
- return S_ISFIFO(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
374
- }
375
-
376
- /* */
377
- static VALUE rb_libarchive_entry_fflags(VALUE self) {
378
- struct rb_libarchive_entry_container *p;
379
- long set, clear;
380
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
381
- Check_Entry(p);
382
- archive_entry_fflags(p->ae, &set, &clear);
383
- return rb_ary_new3(2, LONG2NUM(set), LONG2NUM(clear));
384
- }
385
-
386
- /* */
387
- static VALUE rb_libarchive_entry_fflags_text(VALUE self) {
388
- struct rb_libarchive_entry_container *p;
389
- const char *fflags_text;
390
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
391
- Check_Entry(p);
392
- fflags_text = archive_entry_fflags_text(p->ae);
393
- return (fflags_text != NULL) ? rb_str_new2(fflags_text) : Qnil;
394
- }
395
-
396
- /* */
397
- static VALUE rb_libarchive_entry_gid(VALUE self) {
398
- struct rb_libarchive_entry_container *p;
399
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
400
- Check_Entry(p);
401
- return LONG2NUM(archive_entry_gid(p->ae));
402
- }
403
-
404
- /* */
405
- static VALUE rb_libarchive_entry_gname(VALUE self) {
406
- struct rb_libarchive_entry_container *p;
407
- const char *gname;
408
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
409
- Check_Entry(p);
410
- gname = archive_entry_gname(p->ae);
411
- return (gname != NULL) ? rb_str_new2(gname) : Qnil;
412
- }
413
-
414
- /* */
415
- static VALUE rb_libarchive_entry_hardlink(VALUE self) {
416
- struct rb_libarchive_entry_container *p;
417
- const char *hardlink;
418
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
419
- Check_Entry(p);
420
- hardlink = archive_entry_hardlink(p->ae);
421
- return (hardlink != NULL) ? rb_str_new2(hardlink) : Qnil;
422
- }
423
-
424
- /* */
425
- static VALUE rb_libarchive_entry_ino(VALUE self) {
426
- struct rb_libarchive_entry_container *p;
427
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
428
- return LONG2NUM(archive_entry_ino(p->ae));
429
- }
430
-
431
- /* */
432
- static VALUE rb_libarchive_entry_mode(VALUE self) {
433
- struct rb_libarchive_entry_container *p;
434
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
435
- return LONG2NUM(archive_entry_mode(p->ae));
436
- }
437
-
438
- /* */
439
- static VALUE rb_libarchive_entry_mtime(VALUE self) {
440
- struct rb_libarchive_entry_container *p;
441
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
442
- Check_Entry(p);
443
- return LONG2TIME((long) archive_entry_mtime(p->ae));
444
- }
445
-
446
- /* */
447
- static VALUE rb_libarchive_entry_mtime_nsec(VALUE self) {
448
- struct rb_libarchive_entry_container *p;
449
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
450
- Check_Entry(p);
451
- return LONG2NUM(archive_entry_mtime_nsec(p->ae));
452
- }
453
-
454
- /* */
455
- static VALUE rb_libarchive_entry_mtime_is_set(VALUE self) {
456
- struct rb_libarchive_entry_container *p;
457
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
458
- Check_Entry(p);
459
- return archive_entry_mtime_is_set(p->ae) ? Qtrue : Qfalse;
460
- }
461
-
462
- /* */
463
- static VALUE rb_libarchive_entry_nlink(VALUE self) {
464
- struct rb_libarchive_entry_container *p;
465
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
466
- Check_Entry(p);
467
- return LONG2NUM(archive_entry_nlink(p->ae));
468
- }
469
-
470
- /* */
471
- static VALUE rb_libarchive_entry_pathname(VALUE self) {
472
- struct rb_libarchive_entry_container *p;
473
- const char *pathname;
474
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
475
- Check_Entry(p);
476
- pathname = archive_entry_pathname(p->ae);
477
- return (pathname != NULL) ? rb_str_new2(pathname) : Qnil;
478
- }
479
-
480
- /* */
481
- static VALUE rb_libarchive_entry_rdev(VALUE self) {
482
- struct rb_libarchive_entry_container *p;
483
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
484
- Check_Entry(p);
485
- return LONG2NUM(archive_entry_rdev(p->ae));
486
- }
487
-
488
- /* */
489
- static VALUE rb_libarchive_entry_rdevmajor(VALUE self) {
490
- struct rb_libarchive_entry_container *p;
491
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
492
- Check_Entry(p);
493
- return LONG2NUM(archive_entry_rdevmajor(p->ae));
494
- }
495
-
496
- /* */
497
- static VALUE rb_libarchive_entry_rdevminor(VALUE self) {
498
- struct rb_libarchive_entry_container *p;
499
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
500
- Check_Entry(p);
501
- return LONG2NUM(archive_entry_rdevminor(p->ae));
502
- }
503
-
504
- #if ARCHIVE_VERSION_NUMBER >= 2005003
505
- /* */
506
- static VALUE rb_libarchive_entry_sourcepath(VALUE self) {
507
- struct rb_libarchive_entry_container *p;
508
- const char *sourcepath;
509
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
510
- Check_Entry(p);
511
- sourcepath = archive_entry_sourcepath(p->ae);
512
- return (sourcepath != NULL) ? rb_str_new2(sourcepath) : Qnil;
513
- }
514
- #endif
515
-
516
- /* */
517
- static VALUE rb_libarchive_entry_size(VALUE self) {
518
- struct rb_libarchive_entry_container *p;
519
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
520
- Check_Entry(p);
521
- return LL2NUM(archive_entry_size(p->ae));
522
- }
523
-
524
- /* */
525
- static VALUE rb_libarchive_entry_size_is_set(VALUE self) {
526
- struct rb_libarchive_entry_container *p;
527
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
528
- Check_Entry(p);
529
- return archive_entry_size_is_set(p->ae) ? Qtrue : Qfalse;
530
- }
531
-
532
- #if ARCHIVE_VERSION_NUMBER >= 2003002
533
- /* */
534
- static VALUE rb_libarchive_entry_strmode(VALUE self) {
535
- struct rb_libarchive_entry_container *p;
536
- const char *strmode;
537
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
538
- Check_Entry(p);
539
- strmode = archive_entry_strmode(p->ae);
540
- return (strmode != NULL) ? rb_str_new2(strmode) : Qnil;
541
- }
542
- #endif
543
-
544
- /* */
545
- static VALUE rb_libarchive_entry_symlink(VALUE self) {
546
- struct rb_libarchive_entry_container *p;
547
- const char *symlink;
548
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
549
- Check_Entry(p);
550
- symlink = archive_entry_symlink(p->ae);
551
- return (symlink != NULL) ? rb_str_new2(symlink) : Qnil;
552
- }
553
-
554
- /* */
555
- static VALUE rb_libarchive_entry_uid(VALUE self) {
556
- struct rb_libarchive_entry_container *p;
557
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
558
- Check_Entry(p);
559
- return LONG2NUM(archive_entry_uid(p->ae));
560
- }
561
-
562
- /* */
563
- static VALUE rb_libarchive_entry_uname(VALUE self) {
564
- struct rb_libarchive_entry_container *p;
565
- const char *uname;
566
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
567
- Check_Entry(p);
568
- uname = archive_entry_uname(p->ae);
569
- return (uname != NULL) ? rb_str_new2(uname) : Qnil;
570
- }
571
-
572
- /* */
573
- static VALUE rb_libarchive_entry_set_atime(VALUE self, VALUE v_time) {
574
- struct rb_libarchive_entry_container *p;
575
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
576
- Check_Entry(p);
577
- Check_Class(v_time, rb_cTime);
578
- archive_entry_set_atime(p->ae, TIME2LONG(v_time), 0);
579
- return Qnil;
580
- }
581
-
582
- /* */
583
- static VALUE rb_libarchive_entry_set_atime2(VALUE self, VALUE v_time, VALUE v_ns) {
584
- struct rb_libarchive_entry_container *p;
585
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
586
- Check_Entry(p);
587
- Check_Class(v_time, rb_cTime);
588
- Check_Type(v_ns, T_FIXNUM);
589
- archive_entry_set_atime(p->ae, TIME2LONG(v_time), NUM2LONG(v_ns));
590
- return Qnil;
591
- }
592
-
593
- /* */
594
- static VALUE rb_libarchive_entry_unset_atime(VALUE self) {
595
- struct rb_libarchive_entry_container *p;
596
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
597
- Check_Entry(p);
598
- archive_entry_unset_atime(p->ae);
599
- return Qnil;
600
- }
601
-
602
- /* */
603
- static VALUE rb_libarchive_entry_set_birthtime(VALUE self, VALUE v_time) {
604
- struct rb_libarchive_entry_container *p;
605
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
606
- Check_Entry(p);
607
- Check_Class(v_time, rb_cTime);
608
- archive_entry_set_birthtime(p->ae, TIME2LONG(v_time), 0);
609
- return Qnil;
610
- }
611
-
612
- /* */
613
- static VALUE rb_libarchive_entry_set_birthtime2(VALUE self, VALUE v_time, VALUE v_ns) {
614
- struct rb_libarchive_entry_container *p;
615
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
616
- Check_Entry(p);
617
- Check_Class(v_time, rb_cTime);
618
- Check_Type(v_ns, T_FIXNUM);
619
- archive_entry_set_birthtime(p->ae, TIME2LONG(v_time), NUM2LONG(v_ns));
620
- return Qnil;
621
- }
622
-
623
- /* */
624
- static VALUE rb_libarchive_entry_unset_birthtime(VALUE self) {
625
- struct rb_libarchive_entry_container *p;
626
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
627
- Check_Entry(p);
628
- archive_entry_unset_birthtime(p->ae);
629
- return Qnil;
630
- }
631
-
632
- /* */
633
- static VALUE rb_libarchive_entry_set_ctime(VALUE self, VALUE v_time) {
634
- struct rb_libarchive_entry_container *p;
635
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
636
- Check_Entry(p);
637
- Check_Class(v_time, rb_cTime);
638
- archive_entry_set_ctime(p->ae, TIME2LONG(v_time), 0);
639
- return Qnil;
640
- }
641
-
642
- /* */
643
- static VALUE rb_libarchive_entry_set_ctime2(VALUE self, VALUE v_time, VALUE v_ns) {
644
- struct rb_libarchive_entry_container *p;
645
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
646
- Check_Entry(p);
647
- Check_Class(v_time, rb_cTime);
648
- Check_Type(v_ns, T_FIXNUM);
649
- archive_entry_set_ctime(p->ae, TIME2LONG(v_time), NUM2LONG(v_ns));
650
- return Qnil;
651
- }
652
-
653
- /* */
654
- static VALUE rb_libarchive_entry_unset_ctime(VALUE self) {
655
- struct rb_libarchive_entry_container *p;
656
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
657
- Check_Entry(p);
658
- archive_entry_unset_ctime(p->ae);
659
- return Qnil;
660
- }
661
-
662
- /* */
663
- static VALUE rb_libarchive_entry_set_dev(VALUE self, VALUE v_dev) {
664
- struct rb_libarchive_entry_container *p;
665
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
666
- Check_Entry(p);
667
- Check_Type(v_dev, T_FIXNUM);
668
- archive_entry_set_dev(p->ae, NUM2LONG(v_dev));
669
- return Qnil;
670
- }
671
-
672
- /* */
673
- static VALUE rb_libarchive_entry_set_devmajor(VALUE self, VALUE v_dev) {
674
- struct rb_libarchive_entry_container *p;
675
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
676
- Check_Entry(p);
677
- Check_Type(v_dev, T_FIXNUM);
678
- archive_entry_set_devmajor(p->ae, NUM2LONG(v_dev));
679
- return Qnil;
680
- }
681
-
682
- /* */
683
- static VALUE rb_libarchive_entry_set_devminor(VALUE self, VALUE v_dev) {
684
- struct rb_libarchive_entry_container *p;
685
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
686
- Check_Entry(p);
687
- Check_Type(v_dev, T_FIXNUM);
688
- archive_entry_set_devminor(p->ae, NUM2LONG(v_dev));
689
- return Qnil;
690
- }
691
-
692
- /* */
693
- static VALUE rb_libarchive_entry_set_filetype(VALUE self, VALUE v_type) {
694
- struct rb_libarchive_entry_container *p;
695
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
696
- Check_Entry(p);
697
- Check_Type(v_type, T_FIXNUM);
698
- archive_entry_set_filetype(p->ae, NUM2LONG(v_type));
699
- return Qnil;
700
- }
701
-
702
- /* */
703
- static VALUE rb_libarchive_entry_set_fflags(VALUE self, VALUE v_set, VALUE v_clear) {
704
- struct rb_libarchive_entry_container *p;
705
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
706
- Check_Entry(p);
707
- Check_Type(v_set, T_FIXNUM);
708
- Check_Type(v_clear, T_FIXNUM);
709
- archive_entry_set_fflags(p->ae, (unsigned long) NUM2LONG(v_set), (unsigned long) NUM2LONG(v_clear));
710
- return Qnil;
711
- }
712
-
713
- /* */
714
- static VALUE rb_libarchive_entry_copy_fflags_text(VALUE self, VALUE v_fflags_text) {
715
- struct rb_libarchive_entry_container *p;
716
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
717
- Check_Entry(p);
718
- Check_Type(v_fflags_text, T_STRING);
719
- archive_entry_copy_fflags_text(p->ae, RSTRING_PTR(v_fflags_text));
720
- return Qnil;
721
- }
722
-
723
- /* */
724
- static VALUE rb_libarchive_entry_set_gid(VALUE self, VALUE v_gid) {
725
- struct rb_libarchive_entry_container *p;
726
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
727
- Check_Entry(p);
728
- Check_Type(v_gid, T_FIXNUM);
729
- archive_entry_set_gid(p->ae, NUM2LONG(v_gid));
730
- return Qnil;
731
- }
732
-
733
- /* */
734
- static VALUE rb_libarchive_entry_set_gname(VALUE self, VALUE v_gname) {
735
- struct rb_libarchive_entry_container *p;
736
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
737
- Check_Entry(p);
738
- Check_Type(v_gname, T_STRING);
739
- archive_entry_set_gname(p->ae, RSTRING_PTR(v_gname));
740
- return Qnil;
741
- }
742
-
743
- /* */
744
- static VALUE rb_libarchive_entry_copy_gname(VALUE self, VALUE v_gname) {
745
- struct rb_libarchive_entry_container *p;
746
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
747
- Check_Entry(p);
748
- Check_Type(v_gname, T_STRING);
749
- archive_entry_copy_gname(p->ae, RSTRING_PTR(v_gname));
750
- return Qnil;
751
- }
752
-
753
- /* */
754
- static VALUE rb_libarchive_entry_set_hardlink(VALUE self, VALUE v_hardlink) {
755
- struct rb_libarchive_entry_container *p;
756
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
757
- Check_Entry(p);
758
- Check_Type(v_hardlink, T_STRING);
759
- archive_entry_set_hardlink(p->ae, RSTRING_PTR(v_hardlink));
760
- return Qnil;
761
- }
762
-
763
- /* */
764
- static VALUE rb_libarchive_entry_copy_hardlink(VALUE self, VALUE v_hardlink) {
765
- struct rb_libarchive_entry_container *p;
766
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
767
- Check_Entry(p);
768
- Check_Type(v_hardlink, T_STRING);
769
- archive_entry_copy_hardlink(p->ae, RSTRING_PTR(v_hardlink));
770
- return Qnil;
771
- }
772
-
773
- /* */
774
- static VALUE rb_libarchive_entry_set_ino(VALUE self, VALUE v_ino) {
775
- struct rb_libarchive_entry_container *p;
776
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
777
- Check_Entry(p);
778
- Check_Type(v_ino, T_FIXNUM);
779
- archive_entry_set_ino(p->ae, (unsigned long) NUM2LONG(v_ino));
780
- return Qnil;
781
- }
782
-
783
- /* */
784
- static VALUE rb_libarchive_entry_set_link(VALUE self, VALUE v_link) {
785
- struct rb_libarchive_entry_container *p;
786
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
787
- Check_Entry(p);
788
- Check_Type(v_link, T_STRING);
789
- archive_entry_set_link(p->ae, RSTRING_PTR(v_link));
790
- return Qnil;
791
- }
792
-
793
- /* */
794
- static VALUE rb_libarchive_entry_copy_link(VALUE self, VALUE v_link) {
795
- struct rb_libarchive_entry_container *p;
796
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
797
- Check_Entry(p);
798
- Check_Type(v_link, T_STRING);
799
- archive_entry_copy_link(p->ae, RSTRING_PTR(v_link));
800
- return Qnil;
801
- }
802
-
803
- /* */
804
- static VALUE rb_libarchive_entry_set_mode(VALUE self, VALUE v_mode) {
805
- struct rb_libarchive_entry_container *p;
806
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
807
- Check_Entry(p);
808
- Check_Type(v_mode, T_STRING);
809
- archive_entry_set_mode(p->ae, NUM2INT(v_mode));
810
- return Qnil;
811
- }
812
-
813
- /* */
814
- static VALUE rb_libarchive_entry_set_mtime(VALUE self, VALUE v_time) {
815
- struct rb_libarchive_entry_container *p;
816
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
817
- Check_Entry(p);
818
- Check_Class(v_time, rb_cTime);
819
- archive_entry_set_mtime(p->ae, TIME2LONG(v_time), 0);
820
- return Qnil;
821
- }
822
-
823
- /* */
824
- static VALUE rb_libarchive_entry_set_mtime2(VALUE self, VALUE v_time, VALUE v_ns) {
825
- struct rb_libarchive_entry_container *p;
826
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
827
- Check_Entry(p);
828
- Check_Class(v_time, rb_cTime);
829
- Check_Type(v_ns, T_FIXNUM);
830
- archive_entry_set_mtime(p->ae, TIME2LONG(v_time), NUM2LONG(v_ns));
831
- return Qnil;
832
- }
833
-
834
- /* */
835
- static VALUE rb_libarchive_entry_unset_mtime(VALUE self) {
836
- struct rb_libarchive_entry_container *p;
837
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
838
- Check_Entry(p);
839
- archive_entry_unset_mtime(p->ae);
840
- return Qnil;
841
- }
842
-
843
- /* */
844
- static VALUE rb_libarchive_entry_set_nlink(VALUE self, VALUE v_nlink) {
845
- struct rb_libarchive_entry_container *p;
846
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
847
- Check_Entry(p);
848
- Check_Type(v_nlink, T_FIXNUM);
849
- archive_entry_set_nlink(p->ae, NUM2LONG(v_nlink));
850
- return Qnil;
851
- }
852
-
853
- /* */
854
- static VALUE rb_libarchive_entry_set_pathname(VALUE self, VALUE v_filename) {
855
- struct rb_libarchive_entry_container *p;
856
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
857
- Check_Entry(p);
858
- Check_Type(v_filename, T_STRING);
859
- archive_entry_set_pathname(p->ae, RSTRING_PTR(v_filename));
860
- return Qnil;
861
- }
862
-
863
- /* */
864
- static VALUE rb_libarchive_entry_copy_pathname(VALUE self, VALUE v_filename) {
865
- struct rb_libarchive_entry_container *p;
866
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
867
- Check_Entry(p);
868
- Check_Type(v_filename, T_STRING);
869
- archive_entry_copy_pathname(p->ae, RSTRING_PTR(v_filename));
870
- return Qnil;
871
- }
872
-
873
- /* */
874
- static VALUE rb_libarchive_entry_set_perm(VALUE self, VALUE v_perm) {
875
- struct rb_libarchive_entry_container *p;
876
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
877
- Check_Entry(p);
878
- Check_Type(v_perm, T_STRING);
879
- archive_entry_set_perm(p->ae, NUM2INT(v_perm));
880
- return Qnil;
881
- }
882
-
883
- /* */
884
- static VALUE rb_libarchive_entry_set_rdev(VALUE self, VALUE v_rdev) {
885
- struct rb_libarchive_entry_container *p;
886
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
887
- Check_Entry(p);
888
- Check_Type(v_rdev, T_FIXNUM);
889
- archive_entry_set_rdev(p->ae, NUM2LONG(v_rdev));
890
- return Qnil;
891
- }
892
-
893
- /* */
894
- static VALUE rb_libarchive_entry_set_rdevmajor(VALUE self, VALUE v_rdev) {
895
- struct rb_libarchive_entry_container *p;
896
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
897
- Check_Entry(p);
898
- Check_Type(v_rdev, T_FIXNUM);
899
- archive_entry_set_rdevmajor(p->ae, NUM2LONG(v_rdev));
900
- return Qnil;
901
- }
902
-
903
- /* */
904
- static VALUE rb_libarchive_entry_set_rdevminor(VALUE self, VALUE v_rdev) {
905
- struct rb_libarchive_entry_container *p;
906
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
907
- Check_Entry(p);
908
- Check_Type(v_rdev, T_FIXNUM);
909
- archive_entry_set_rdevminor(p->ae, NUM2LONG(v_rdev));
910
- return Qnil;
911
- }
912
-
913
- /* */
914
- static VALUE rb_libarchive_entry_set_size(VALUE self, VALUE v_size) {
915
- struct rb_libarchive_entry_container *p;
916
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
917
- Check_Entry(p);
918
- Check_Type(v_size, T_FIXNUM);
919
- archive_entry_set_size(p->ae, NUM2LL(v_size));
920
- return Qnil;
921
- }
922
-
923
- /* */
924
- static VALUE rb_libarchive_entry_unset_size(VALUE self) {
925
- struct rb_libarchive_entry_container *p;
926
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
927
- Check_Entry(p);
928
- archive_entry_unset_size(p->ae);
929
- return Qnil;
930
- }
931
-
932
- #if ARCHIVE_VERSION_NUMBER >= 2005003
933
- /* */
934
- static VALUE rb_libarchive_entry_copy_sourcepath(VALUE self, VALUE v_sourcepath) {
935
- struct rb_libarchive_entry_container *p;
936
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
937
- Check_Entry(p);
938
- Check_Type(v_sourcepath, T_STRING);
939
- archive_entry_copy_sourcepath(p->ae, RSTRING_PTR(v_sourcepath));
940
- return Qnil;
941
- }
942
- #endif
943
-
944
- /* */
945
- static VALUE rb_libarchive_entry_set_symlink(VALUE self, VALUE v_symlink) {
946
- struct rb_libarchive_entry_container *p;
947
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
948
- Check_Entry(p);
949
- Check_Type(v_symlink, T_STRING);
950
- archive_entry_set_symlink(p->ae, RSTRING_PTR(v_symlink));
951
- return Qnil;
952
- }
953
-
954
- /* */
955
- static VALUE rb_libarchive_entry_copy_symlink(VALUE self, VALUE v_symlink) {
956
- struct rb_libarchive_entry_container *p;
957
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
958
- Check_Entry(p);
959
- Check_Type(v_symlink, T_STRING);
960
- archive_entry_copy_symlink(p->ae, RSTRING_PTR(v_symlink));
961
- return Qnil;
962
- }
963
-
964
- /* */
965
- static VALUE rb_libarchive_entry_set_uid(VALUE self, VALUE v_uid) {
966
- struct rb_libarchive_entry_container *p;
967
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
968
- Check_Entry(p);
969
- Check_Type(v_uid, T_FIXNUM);
970
- archive_entry_set_uid(p->ae, NUM2LONG(v_uid));
971
- return Qnil;
972
- }
973
-
974
- /* */
975
- static VALUE rb_libarchive_entry_set_uname(VALUE self, VALUE v_uname) {
976
- struct rb_libarchive_entry_container *p;
977
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
978
- Check_Entry(p);
979
- Check_Type(v_uname, T_STRING);
980
- archive_entry_set_uname(p->ae, RSTRING_PTR(v_uname));
981
- return Qnil;
982
- }
983
-
984
- /* */
985
- static VALUE rb_libarchive_entry_copy_uname(VALUE self, VALUE v_uname) {
986
- struct rb_libarchive_entry_container *p;
987
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
988
- Check_Entry(p);
989
- Check_Type(v_uname, T_STRING);
990
- archive_entry_copy_uname(p->ae, RSTRING_PTR(v_uname));
991
- return Qnil;
992
- }
993
-
994
- /* */
995
- static VALUE rb_libarchive_entry_copy_stat(VALUE self, VALUE v_filename) {
996
- struct rb_libarchive_entry_container *p;
997
- const char *filename;
998
- struct stat s;
999
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1000
- Check_Entry(p);
1001
- Check_Type(v_filename, T_STRING);
1002
- filename = RSTRING_PTR(v_filename);
1003
-
1004
- if (stat(filename, &s) != 0) {
1005
- rb_raise(rb_eArchiveError, "Copy stat failed: %", strerror(errno));
1006
- }
1007
-
1008
- archive_entry_copy_stat(p->ae, &s);
1009
- return Qnil;
1010
- }
1011
-
1012
- /* */
1013
- static VALUE rb_libarchive_entry_copy_lstat(VALUE self, VALUE v_filename) {
1014
- struct rb_libarchive_entry_container *p;
1015
- const char *filename;
1016
- struct stat s;
1017
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1018
- Check_Entry(p);
1019
- Check_Type(v_filename, T_STRING);
1020
- filename = RSTRING_PTR(v_filename);
1021
-
1022
- if (lstat(filename, &s) != 0) {
1023
- rb_raise(rb_eArchiveError, "Copy stat failed: %", strerror(errno));
1024
- }
1025
-
1026
- archive_entry_copy_stat(p->ae, &s);
1027
- return Qnil;
1028
- }
1029
-
1030
- /* */
1031
- static VALUE rb_libarchive_entry_xattr_clear(VALUE self) {
1032
- struct rb_libarchive_entry_container *p;
1033
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1034
- Check_Entry(p);
1035
- archive_entry_xattr_clear(p->ae);
1036
- return Qnil;
1037
- }
1038
-
1039
- /* */
1040
- static VALUE rb_libarchive_entry_xattr_add_entry(VALUE self, VALUE v_name, VALUE v_value) {
1041
- struct rb_libarchive_entry_container *p;
1042
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1043
- Check_Entry(p);
1044
- Check_Type(v_name, T_STRING);
1045
- Check_Type(v_value, T_STRING);
1046
- archive_entry_xattr_add_entry(p->ae, RSTRING_PTR(v_name), RSTRING_PTR(v_value), RSTRING_LEN(v_value));
1047
- return Qnil;
1048
- }
1049
-
1050
- /* */
1051
- static VALUE rb_libarchive_entry_xattr_count(VALUE self) {
1052
- struct rb_libarchive_entry_container *p;
1053
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1054
- Check_Entry(p);
1055
- return INT2NUM(archive_entry_xattr_count(p->ae));
1056
- }
1057
-
1058
- /* */
1059
- static VALUE rb_libarchive_entry_xattr_reset(VALUE self) {
1060
- struct rb_libarchive_entry_container *p;
1061
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1062
- Check_Entry(p);
1063
- return INT2NUM(archive_entry_xattr_reset(p->ae));
1064
- }
1065
-
1066
- /* */
1067
- static VALUE rb_libarchive_entry_xattr_next(VALUE self) {
1068
- struct rb_libarchive_entry_container *p;
1069
- const char *name;
1070
- const void *value;
1071
- size_t size;
1072
- Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1073
- Check_Entry(p);
1074
-
1075
- if (archive_entry_xattr_next(p->ae, &name, &value, &size) != ARCHIVE_OK) {
1076
- return Qnil;
1077
- } else {
1078
- return rb_ary_new3(3, rb_str_new2(name), rb_str_new(value, size));
1079
- }
1080
- }
1081
-
1082
- void Init_libarchive_entry() {
1083
- rb_cArchiveEntry = rb_define_class_under(rb_mArchive, "Entry", rb_cObject);
1084
- rb_define_alloc_func(rb_cArchiveEntry, rb_libarchive_entry_alloc);
1085
- rb_funcall(rb_cArchiveEntry, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("new")));
1086
- rb_define_method(rb_cArchiveEntry, "close", rb_libarchive_entry_close, 0);
1087
-
1088
- rb_define_method(rb_cArchiveEntry, "atime", rb_libarchive_entry_atime, 0);
1089
- rb_define_method(rb_cArchiveEntry, "atime_nsec", rb_libarchive_entry_atime_nsec, 0);
1090
- rb_define_method(rb_cArchiveEntry, "atime_is_set?", rb_libarchive_entry_atime_is_set, 0);
1091
- rb_define_method(rb_cArchiveEntry, "birthtime", rb_libarchive_entry_birthtime, 0);
1092
- rb_define_method(rb_cArchiveEntry, "birthtime_nsec", rb_libarchive_entry_birthtime_nsec, 0);
1093
- rb_define_method(rb_cArchiveEntry, "birthtime_is_set?", rb_libarchive_entry_birthtime_is_set, 0);
1094
- rb_define_method(rb_cArchiveEntry, "ctime", rb_libarchive_entry_ctime, 0);
1095
- rb_define_method(rb_cArchiveEntry, "ctime_nsec", rb_libarchive_entry_ctime_nsec, 0);
1096
- rb_define_method(rb_cArchiveEntry, "ctime_is_set?", rb_libarchive_entry_ctime_is_set, 0);
1097
- rb_define_method(rb_cArchiveEntry, "dev", rb_libarchive_entry_dev, 0);
1098
- rb_define_method(rb_cArchiveEntry, "devmajor", rb_libarchive_entry_devmajor, 0);
1099
- rb_define_method(rb_cArchiveEntry, "devminor", rb_libarchive_entry_devminor, 0);
1100
- rb_define_method(rb_cArchiveEntry, "filetype", rb_libarchive_entry_filetype, 0);
1101
- rb_define_method(rb_cArchiveEntry, "directory?", rb_libarchive_entry_is_directory, 0);
1102
- rb_define_method(rb_cArchiveEntry, "character_special?", rb_libarchive_entry_is_character_special, 0);
1103
- rb_define_method(rb_cArchiveEntry, "block_special?", rb_libarchive_entry_is_block_special, 0);
1104
- rb_define_method(rb_cArchiveEntry, "regular?", rb_libarchive_entry_is_regular, 0);
1105
- rb_define_method(rb_cArchiveEntry, "symbolic_link?", rb_libarchive_entry_is_symbolic_link, 0);
1106
- rb_define_method(rb_cArchiveEntry, "socket?", rb_libarchive_entry_is_socket, 0);
1107
- rb_define_method(rb_cArchiveEntry, "fifo?", rb_libarchive_entry_is_fifo, 0);
1108
- rb_define_method(rb_cArchiveEntry, "fflags", rb_libarchive_entry_fflags, 0);
1109
- rb_define_method(rb_cArchiveEntry, "fflags_text", rb_libarchive_entry_fflags_text, 0);
1110
- rb_define_method(rb_cArchiveEntry, "gid", rb_libarchive_entry_gid, 0);
1111
- rb_define_method(rb_cArchiveEntry, "gname", rb_libarchive_entry_gname, 0);
1112
- rb_define_method(rb_cArchiveEntry, "hardlink", rb_libarchive_entry_hardlink, 0);
1113
- rb_define_method(rb_cArchiveEntry, "ino", rb_libarchive_entry_ino, 0);
1114
- rb_define_method(rb_cArchiveEntry, "mode", rb_libarchive_entry_mode, 0);
1115
- rb_define_method(rb_cArchiveEntry, "mtime", rb_libarchive_entry_mtime, 0);
1116
- rb_define_method(rb_cArchiveEntry, "mtime_nsec", rb_libarchive_entry_mtime_nsec, 0);
1117
- rb_define_method(rb_cArchiveEntry, "mtime_is_set?", rb_libarchive_entry_mtime_is_set, 0);
1118
- rb_define_method(rb_cArchiveEntry, "nlink", rb_libarchive_entry_nlink, 0);
1119
- rb_define_method(rb_cArchiveEntry, "pathname", rb_libarchive_entry_pathname, 0);
1120
- rb_define_method(rb_cArchiveEntry, "rdev", rb_libarchive_entry_rdev, 0);
1121
- rb_define_method(rb_cArchiveEntry, "rdevmajor", rb_libarchive_entry_rdevmajor, 0);
1122
- rb_define_method(rb_cArchiveEntry, "rdevminor", rb_libarchive_entry_rdevminor, 0);
1123
- #if ARCHIVE_VERSION_NUMBER >= 2005003
1124
- rb_define_method(rb_cArchiveEntry, "sourcepath", rb_libarchive_entry_sourcepath, 0);
1125
- #endif
1126
- rb_define_method(rb_cArchiveEntry, "size", rb_libarchive_entry_size, 0);
1127
- rb_define_method(rb_cArchiveEntry, "size_is_set?", rb_libarchive_entry_size_is_set, 0);
1128
- #if ARCHIVE_VERSION_NUMBER >= 2003002
1129
- rb_define_method(rb_cArchiveEntry, "strmode", rb_libarchive_entry_strmode, 0);
1130
- #endif
1131
- rb_define_method(rb_cArchiveEntry, "symlink", rb_libarchive_entry_symlink, 0);
1132
- rb_define_method(rb_cArchiveEntry, "uid", rb_libarchive_entry_uid, 0);
1133
- rb_define_method(rb_cArchiveEntry, "uname", rb_libarchive_entry_uname, 0);
1134
-
1135
- rb_define_method(rb_cArchiveEntry, "atime=", rb_libarchive_entry_set_atime, 1);
1136
- rb_define_method(rb_cArchiveEntry, "set_atime", rb_libarchive_entry_set_atime2, 2);
1137
- rb_define_method(rb_cArchiveEntry, "unset_atime", rb_libarchive_entry_unset_atime, 0);
1138
- rb_define_method(rb_cArchiveEntry, "birthtimee=", rb_libarchive_entry_set_birthtime, 1);
1139
- rb_define_method(rb_cArchiveEntry, "set_birthtime", rb_libarchive_entry_set_birthtime2, 2);
1140
- rb_define_method(rb_cArchiveEntry, "unset_birthtime", rb_libarchive_entry_unset_birthtime, 0);
1141
- rb_define_method(rb_cArchiveEntry, "ctime=", rb_libarchive_entry_set_ctime, 1);
1142
- rb_define_method(rb_cArchiveEntry, "set_ctime", rb_libarchive_entry_set_ctime2, 2);
1143
- rb_define_method(rb_cArchiveEntry, "unset_ctime", rb_libarchive_entry_unset_ctime, 0);
1144
- rb_define_method(rb_cArchiveEntry, "dev=", rb_libarchive_entry_set_dev, 1);
1145
- rb_define_method(rb_cArchiveEntry, "devmajor=", rb_libarchive_entry_set_devmajor, 1);
1146
- rb_define_method(rb_cArchiveEntry, "devminor=", rb_libarchive_entry_set_devminor, 1);
1147
- rb_define_method(rb_cArchiveEntry, "filetype=", rb_libarchive_entry_set_filetype, 1);
1148
- rb_define_method(rb_cArchiveEntry, "set_fflags", rb_libarchive_entry_set_fflags, 2);
1149
- rb_define_method(rb_cArchiveEntry, "copy_fflags_text", rb_libarchive_entry_copy_fflags_text, 1);
1150
- rb_define_method(rb_cArchiveEntry, "gid=", rb_libarchive_entry_set_gid, 1);
1151
- rb_define_method(rb_cArchiveEntry, "gname=", rb_libarchive_entry_set_gname, 1);
1152
- rb_define_method(rb_cArchiveEntry, "copy_gname", rb_libarchive_entry_copy_gname, 1);
1153
- rb_define_method(rb_cArchiveEntry, "hardlink=", rb_libarchive_entry_set_hardlink, 1);
1154
- rb_define_method(rb_cArchiveEntry, "copy_hardlink", rb_libarchive_entry_copy_hardlink, 1);
1155
- rb_define_method(rb_cArchiveEntry, "ino=", rb_libarchive_entry_set_ino, 1);
1156
- rb_define_method(rb_cArchiveEntry, "link=", rb_libarchive_entry_set_link, 1);
1157
- rb_define_method(rb_cArchiveEntry, "copy_link", rb_libarchive_entry_copy_link, 1);
1158
- rb_define_method(rb_cArchiveEntry, "mode=", rb_libarchive_entry_set_mode, 1);
1159
- rb_define_method(rb_cArchiveEntry, "mtime=", rb_libarchive_entry_set_mtime, 1);
1160
- rb_define_method(rb_cArchiveEntry, "set_mtime", rb_libarchive_entry_set_mtime2, 2);
1161
- rb_define_method(rb_cArchiveEntry, "unset_mtime", rb_libarchive_entry_unset_mtime, 0);
1162
- rb_define_method(rb_cArchiveEntry, "nlink=", rb_libarchive_entry_set_nlink, 1);
1163
- rb_define_method(rb_cArchiveEntry, "pathname=", rb_libarchive_entry_set_pathname, 1);
1164
- rb_define_method(rb_cArchiveEntry, "copy_pathname", rb_libarchive_entry_copy_pathname, 1);
1165
- rb_define_method(rb_cArchiveEntry, "perm=", rb_libarchive_entry_set_perm, 1);
1166
- rb_define_method(rb_cArchiveEntry, "rdev=", rb_libarchive_entry_set_rdev, 1);
1167
- rb_define_method(rb_cArchiveEntry, "rdevmajor=", rb_libarchive_entry_set_rdevmajor, 1);
1168
- rb_define_method(rb_cArchiveEntry, "rdevminor=", rb_libarchive_entry_set_rdevminor, 1);
1169
- rb_define_method(rb_cArchiveEntry, "size=", rb_libarchive_entry_set_size, 1);
1170
- rb_define_method(rb_cArchiveEntry, "unset_size", rb_libarchive_entry_unset_size, 0);
1171
- #if ARCHIVE_VERSION_NUMBER >= 2005003
1172
- rb_define_method(rb_cArchiveEntry, "copy_sourcepath", rb_libarchive_entry_copy_sourcepath, 1);
1173
- #endif
1174
- rb_define_method(rb_cArchiveEntry, "symlink=", rb_libarchive_entry_set_symlink, 1);
1175
- rb_define_method(rb_cArchiveEntry, "copy_symlink", rb_libarchive_entry_copy_symlink, 1);
1176
- rb_define_method(rb_cArchiveEntry, "uid=", rb_libarchive_entry_set_uid, 1);
1177
- rb_define_method(rb_cArchiveEntry, "uname=", rb_libarchive_entry_set_uname, 1);
1178
- rb_define_method(rb_cArchiveEntry, "copy_uname", rb_libarchive_entry_copy_uname, 1);
1179
-
1180
- rb_define_method(rb_cArchiveEntry, "copy_stat", rb_libarchive_entry_copy_stat, 1);
1181
- rb_define_method(rb_cArchiveEntry, "copy_lstat", rb_libarchive_entry_copy_lstat, 1);
1182
-
1183
- rb_define_method(rb_cArchiveEntry, "xattr_clear", rb_libarchive_entry_xattr_clear, 0);
1184
- rb_define_method(rb_cArchiveEntry, "xattr_add_entry", rb_libarchive_entry_xattr_add_entry, 2);
1185
- rb_define_method(rb_cArchiveEntry, "xattr_count", rb_libarchive_entry_xattr_count, 0);
1186
- rb_define_method(rb_cArchiveEntry, "xattr_reset", rb_libarchive_entry_xattr_reset, 0);
1187
- rb_define_method(rb_cArchiveEntry, "xattr_next", rb_libarchive_entry_xattr_next, 0);
1188
- }
1189
- #include "libarchive_internal.h"
1190
-
1191
- extern VALUE rb_mArchive;
1192
- VALUE rb_cArchiveReader;
1193
- extern VALUE rb_eArchiveError;
1194
- extern VALUE rb_cArchiveEntry;
1195
-
1196
- static void rb_libarchive_reader_close0(struct rb_libarchive_archive_container *p) {
1197
- archive_read_close(p->ar);
1198
- archive_read_finish(p->ar);
1199
- p->ar = NULL;
1200
- }
1201
-
1202
- /* */
1203
- static VALUE rb_libarchive_reader_close(VALUE self) {
1204
- struct rb_libarchive_archive_container *p;
1205
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1206
- Check_Archive(p);
1207
- rb_libarchive_reader_close0(p);
1208
- return Qnil;
1209
- }
1210
-
1211
- static VALUE rb_libarchive_reader_s_open0(int (*archive_open)(struct rb_libarchive_archive_container *, void *), void *arg, int compression, int format, const char *cmd) {
1212
- VALUE reader;
1213
- struct rb_libarchive_archive_container *p;
1214
- int r;
1215
- reader = rb_funcall(rb_cArchiveReader, rb_intern("new"), 0);
1216
- Data_Get_Struct(reader, struct rb_libarchive_archive_container, p);
1217
-
1218
- if ((p->ar = archive_read_new()) == NULL) {
1219
- rb_raise(rb_eArchiveError, "Open reader failed: %s", strerror(errno));
1220
- }
1221
-
1222
- if (cmd != NULL) {
1223
- r = archive_read_support_compression_program(p->ar, cmd);
1224
- } else if (compression != -1) {
1225
- r = archive_read_support_compression(p->ar, compression);
1226
- } else {
1227
- r = archive_read_support_compression_all(p->ar);
1228
- }
1229
-
1230
- if (r != ARCHIVE_OK) {
1231
- char error_string[BUFSIZ];
1232
- archive_copy_error_string(p->ar, error_string, BUFSIZ);
1233
- rb_libarchive_reader_close0(p);
1234
- rb_raise(rb_eArchiveError, "Support compression failed: %s", error_string);
1235
- }
1236
-
1237
- if (format != -1) {
1238
- r = archive_read_support_format(p->ar, format);
1239
- } else {
1240
- r = archive_read_support_format_all(p->ar);
1241
- }
1242
-
1243
- if (r != ARCHIVE_OK) {
1244
- char error_string[BUFSIZ];
1245
- archive_copy_error_string(p->ar, error_string, BUFSIZ);
1246
- rb_libarchive_reader_close0(p);
1247
- rb_raise(rb_eArchiveError, "Support format failed: %s", error_string);
1248
- }
1249
-
1250
- if (archive_open(p, arg) != ARCHIVE_OK) {
1251
- char error_string[BUFSIZ];
1252
- archive_copy_error_string(p->ar, error_string, BUFSIZ);
1253
- rb_libarchive_reader_close0(p);
1254
- rb_raise(rb_eArchiveError, "Open reader failed: %s", error_string);
1255
- }
1256
-
1257
- if (rb_block_given_p()) {
1258
- VALUE retval;
1259
- int status;
1260
- retval = rb_protect(rb_yield, reader, &status);
1261
- rb_libarchive_reader_close0(p);
1262
-
1263
- if (status != 0) {
1264
- rb_jump_tag(status);
1265
- }
1266
-
1267
- return retval;
1268
- } else {
1269
- return reader;
1270
- }
1271
- }
1272
-
1273
- static int rb_libarchive_reader_s_open_filename0(struct rb_libarchive_archive_container *p, void *arg) {
1274
- const char *filename = (const char *) arg;
1275
-
1276
- if (filename != NULL) {
1277
- struct stat s;
1278
-
1279
- if (stat(filename, &s) != 0) {
1280
- archive_set_error(p->ar, -1, strerror(errno));
1281
- return (ARCHIVE_FATAL);
1282
- }
1283
- }
1284
-
1285
- return archive_read_open_filename(p->ar, filename, BLOCK_SIZE);
1286
- }
1287
-
1288
- /* */
1289
- static VALUE rb_libarchive_reader_s_open_filename(int argc, VALUE *argv, VALUE self) {
1290
- VALUE v_filename, v_compression, v_format;
1291
- const char *filename = NULL;
1292
- int compression = -1, format = -1;
1293
- const char *cmd = NULL;
1294
- rb_scan_args(argc, argv, "12", &v_filename, &v_compression, &v_format);
1295
- Check_Type(v_filename, T_STRING);
1296
- filename = RSTRING_PTR(v_filename);
1297
-
1298
- if (T_STRING == TYPE(v_compression)) {
1299
- compression = -1;
1300
- cmd = RSTRING_PTR(v_compression);
1301
- } else if (!NIL_P(v_compression)) {
1302
- compression = NUM2INT(v_compression);
1303
- }
1304
-
1305
- if (!NIL_P(v_format)) {
1306
- format = NUM2INT(v_format);
1307
- }
1308
-
1309
- return rb_libarchive_reader_s_open0(rb_libarchive_reader_s_open_filename0, (void *) filename, compression, format, cmd);
1310
- }
1311
-
1312
- static int rb_libarchive_reader_s_open_memory0(struct rb_libarchive_archive_container *p, void *arg) {
1313
- VALUE v_buff = (VALUE) arg;
1314
- return archive_read_open_memory(p->ar, RSTRING_PTR(v_buff), RSTRING_LEN(v_buff));
1315
- }
1316
-
1317
- /* */
1318
- static VALUE rb_libarchive_reader_s_open_memory(int argc, VALUE *argv, VALUE self) {
1319
- VALUE v_memory, v_compression, v_format;
1320
- int compression = -1, format = -1;
1321
- const char *cmd = NULL;
1322
- rb_scan_args(argc, argv, "12", &v_memory, &v_compression, &v_format);
1323
- Check_Type(v_memory, T_STRING);
1324
-
1325
- if (T_STRING == TYPE(v_compression)) {
1326
- compression = -1;
1327
- cmd = RSTRING_PTR(v_compression);
1328
- } else if (!NIL_P(v_compression)) {
1329
- compression = NUM2INT(v_compression);
1330
- }
1331
-
1332
- if (!NIL_P(v_format)) {
1333
- format = NUM2INT(v_format);
1334
- }
1335
-
1336
- return rb_libarchive_reader_s_open0(rb_libarchive_reader_s_open_memory0, (void *) v_memory, compression, format, cmd);
1337
- }
1338
-
1339
- /* */
1340
- static VALUE rb_libarchive_reader_next_header(VALUE self) {
1341
- struct rb_libarchive_archive_container *p;
1342
- struct archive_entry *ae;
1343
- int r;
1344
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1345
- Check_Archive(p);
1346
-
1347
- if (p->eof) {
1348
- return Qnil;
1349
- }
1350
-
1351
- r = archive_read_next_header(p->ar, &ae);
1352
-
1353
- if (r == ARCHIVE_EOF) {
1354
- p->eof = 1;
1355
- return Qnil;
1356
- } else if (r != ARCHIVE_OK) {
1357
- rb_raise(rb_eArchiveError, "Fetch entry failed: %s", archive_error_string(p->ar));
1358
- }
1359
-
1360
- return rb_libarchive_entry_new(ae, 0);
1361
- }
1362
-
1363
- /* */
1364
- static VALUE rb_libarchive_reader_header_position(VALUE self) {
1365
- struct rb_libarchive_archive_container *p;
1366
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1367
- Check_Archive(p);
1368
- return LONG2NUM((long) archive_read_header_position(p->ar));
1369
- }
1370
-
1371
- /* */
1372
- static VALUE rb_libarchive_reader_read_data(int argc, VALUE *argv, VALUE self) {
1373
- VALUE v_size;
1374
- struct rb_libarchive_archive_container *p;
1375
- char *buff;
1376
- size_t size = DATA_BUFFER_SIZE;
1377
- ssize_t n;
1378
- rb_scan_args(argc, argv, "01", &v_size);
1379
-
1380
- if (!NIL_P(v_size)) {
1381
- size = NUM2INT(v_size);
1382
- }
1383
-
1384
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1385
- Check_Archive(p);
1386
-
1387
- if (p->eof) {
1388
- return Qnil;
1389
- }
1390
-
1391
- if (rb_block_given_p()) {
1392
- ssize_t len = 0;
1393
- int status = 0;
1394
- buff = xmalloc(size);
1395
-
1396
- while ((n = archive_read_data(p->ar, buff, size)) > 0) {
1397
- rb_protect(rb_yield, rb_str_new(buff, n), &status);
1398
-
1399
- if (status != 0) {
1400
- break;
1401
- }
1402
-
1403
- len += n;
1404
- }
1405
-
1406
- xfree(buff);
1407
-
1408
- if (status != 0) {
1409
- rb_jump_tag(status);
1410
- }
1411
-
1412
- if (n < 0) {
1413
- rb_raise(rb_eArchiveError, "Read data failed: %s", archive_error_string(p->ar));
1414
- }
1415
-
1416
- return LONG2NUM(len);
1417
- } else {
1418
- VALUE retval = rb_str_new("", 0);
1419
- buff = xmalloc(size);
1420
-
1421
- while ((n = archive_read_data(p->ar, buff, size)) > 0) {
1422
- rb_str_cat(retval, buff, n);
1423
- }
1424
-
1425
- xfree(buff);
1426
-
1427
- if (n < 0) {
1428
- rb_raise(rb_eArchiveError, "Read data failed: %s", archive_error_string(p->ar));
1429
- }
1430
-
1431
- return retval;
1432
- }
1433
- }
1434
-
1435
- /* */
1436
- static VALUE rb_libarchive_reader_save_data(int argc, VALUE *argv, VALUE self) {
1437
- VALUE v_filename, v_flags;
1438
- struct rb_libarchive_archive_container *p;
1439
- const char *filename;
1440
- int flags, fd, r;
1441
- rb_scan_args(argc, argv, "11", &v_filename, &v_flags);
1442
- Check_Type(v_filename, T_STRING);
1443
- filename = RSTRING_PTR(v_filename);
1444
-
1445
- if (!NIL_P(v_flags)) {
1446
- flags = ((O_WRONLY | NUM2INT(v_flags)) & O_FLAGS);
1447
- } else {
1448
- flags = (O_WRONLY | O_CREAT | O_EXCL
1449
- #ifdef O_BINARY
1450
- | O_BINARY
1451
- #endif
1452
- );
1453
- }
1454
-
1455
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1456
- Check_Archive(p);
1457
-
1458
- if ((fd = open(filename, flags)) == -1) {
1459
- rb_raise(rb_eArchiveError, "Save data failed: %s", strerror(errno));
1460
- }
1461
-
1462
- r = archive_read_data_into_fd(p->ar, fd);
1463
- _close(fd);
1464
-
1465
- if (r != ARCHIVE_OK) {
1466
- rb_raise(rb_eArchiveError, "Save data failed: %s", archive_error_string(p->ar));
1467
- }
1468
-
1469
- return Qnil;
1470
- }
1471
-
1472
- /* */
1473
- static VALUE rb_libarchive_reader_extract(int argc, VALUE *argv, VALUE self) {
1474
- VALUE v_entry, v_flags;
1475
- struct rb_libarchive_archive_container *pa;
1476
- struct rb_libarchive_entry_container *pae;
1477
- int flags = 0;
1478
- rb_scan_args(argc, argv, "11", &v_entry, &v_flags);
1479
- Check_Class(v_entry, rb_cArchiveEntry);
1480
-
1481
- if (!NIL_P(v_flags)) {
1482
- flags = (NUM2INT(v_flags) & EXTRACT_FLAGS);
1483
- }
1484
-
1485
- Data_Get_Struct(self, struct rb_libarchive_archive_container, pa);
1486
- Check_Archive(pa);
1487
-
1488
- if (pa->eof) {
1489
- rb_raise(rb_eArchiveError, "Extract archive failed: It has already reached EOF");
1490
- }
1491
-
1492
- Data_Get_Struct(v_entry, struct rb_libarchive_entry_container, pae);
1493
- Check_Entry(pae);
1494
-
1495
- if (archive_read_extract(pa->ar, pae->ae, flags) != ARCHIVE_OK) {
1496
- rb_raise(rb_eArchiveError, "Extract archive failed: %s", archive_error_string(pa->ar));
1497
- }
1498
-
1499
- return Qnil;
1500
- }
1501
-
1502
- void Init_libarchive_reader() {
1503
- rb_cArchiveReader = rb_define_class_under(rb_mArchive, "Reader", rb_cObject);
1504
- rb_define_alloc_func(rb_cArchiveReader, rb_libarchive_archive_alloc);
1505
- rb_funcall(rb_cArchiveReader, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("new")));
1506
- rb_define_singleton_method(rb_cArchiveReader, "open_filename", rb_libarchive_reader_s_open_filename, -1);
1507
- rb_define_module_function(rb_mArchive, "read_open_filename", rb_libarchive_reader_s_open_filename, -1);
1508
- rb_define_singleton_method(rb_cArchiveReader, "open_memory", rb_libarchive_reader_s_open_memory, -1);
1509
- rb_define_module_function(rb_mArchive, "read_open_memory", rb_libarchive_reader_s_open_memory, -1);
1510
- rb_define_method(rb_cArchiveReader, "close", rb_libarchive_reader_close, 0);
1511
- rb_define_method(rb_cArchiveReader, "next_header", rb_libarchive_reader_next_header, 0);
1512
- rb_define_method(rb_cArchiveReader, "header_position", rb_libarchive_reader_header_position, 0);
1513
- rb_define_method(rb_cArchiveReader, "read_data", rb_libarchive_reader_read_data, -1);
1514
- rb_define_method(rb_cArchiveReader, "save_data", rb_libarchive_reader_save_data, -1);
1515
- rb_define_method(rb_cArchiveReader, "extract", rb_libarchive_reader_extract, -1);
1516
- }
1517
- #include "libarchive_internal.h"
1518
-
1519
- extern VALUE rb_mArchive;
1520
- VALUE rb_cArchiveWriter;
1521
- extern VALUE rb_eArchiveError;
1522
- extern VALUE rb_cArchiveEntry;
1523
-
1524
- static void rb_libarchive_writer_close0(struct rb_libarchive_archive_container *p) {
1525
- archive_write_close(p->ar);
1526
- archive_write_finish(p->ar);
1527
- p->ar = NULL;
1528
- }
1529
-
1530
- /* */
1531
- static VALUE rb_libarchive_writer_close(VALUE self) {
1532
- struct rb_libarchive_archive_container *p;
1533
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1534
- Check_Archive(p);
1535
- rb_libarchive_writer_close0(p);
1536
- return Qnil;
1537
- }
1538
-
1539
- static VALUE rb_libarchive_writer_s_open0(int (*archive_open)(struct rb_libarchive_archive_container *, void *), void *arg, int compression, int format, const char *cmd) {
1540
- VALUE writer;
1541
- struct rb_libarchive_archive_container *p;
1542
- int r;
1543
- writer = rb_funcall(rb_cArchiveWriter, rb_intern("new"), 0);
1544
- Data_Get_Struct(writer, struct rb_libarchive_archive_container, p);
1545
-
1546
- if ((p->ar = archive_write_new()) == NULL) {
1547
- rb_raise(rb_eArchiveError, "Open writer failed: %s", strerror(errno));
1548
- }
1549
-
1550
- if (cmd != NULL) {
1551
- r = archive_write_set_compression_program(p->ar, cmd);
1552
- } else {
1553
- r = archive_write_set_compression(p->ar, compression);
1554
- }
1555
-
1556
- if (r != ARCHIVE_OK) {
1557
- char error_string[BUFSIZ];
1558
- archive_copy_error_string(p->ar, error_string, BUFSIZ);
1559
- rb_libarchive_writer_close0(p);
1560
- rb_raise(rb_eArchiveError, "Set compression failed: %s", error_string);
1561
- }
1562
-
1563
- if (archive_write_set_format(p->ar, format) != ARCHIVE_OK) {
1564
- char error_string[BUFSIZ];
1565
- archive_copy_error_string(p->ar, error_string, BUFSIZ);
1566
- rb_libarchive_writer_close0(p);
1567
- rb_raise(rb_eArchiveError, "Set format failed: %s", error_string);
1568
- }
1569
-
1570
- if (archive_open(p, arg) != ARCHIVE_OK) {
1571
- char error_string[BUFSIZ];
1572
- archive_copy_error_string(p->ar, error_string, BUFSIZ);
1573
- rb_libarchive_writer_close0(p);
1574
- rb_raise(rb_eArchiveError, "Open writer failed: %s", error_string);
1575
- }
1576
-
1577
- if (rb_block_given_p()) {
1578
- VALUE retval;
1579
- int status;
1580
- retval = rb_protect(rb_yield, writer, &status);
1581
- rb_libarchive_writer_close0(p);
1582
-
1583
- if (status != 0) {
1584
- rb_jump_tag(status);
1585
- }
1586
-
1587
- return retval;
1588
- } else {
1589
- return writer;
1590
- }
1591
- }
1592
-
1593
- static int rb_libarchive_writer_s_open_filename0(struct rb_libarchive_archive_container *p, void *arg) {
1594
- const char *filename = (const char *) arg;
1595
- return archive_write_open_filename(p->ar, filename);
1596
- }
1597
-
1598
- /* */
1599
- static VALUE rb_libarchive_writer_s_open_filename(VALUE self, VALUE v_filename, VALUE v_compression, VALUE v_format) {
1600
- const char *filename = NULL;
1601
- int compression, format;
1602
- const char *cmd = NULL;
1603
- Check_Type(v_filename, T_STRING);
1604
-
1605
- if (RSTRING_LEN(v_filename) < 1) {
1606
- rb_raise(rb_eArchiveError, "Open writer failed: No such file or directory");
1607
- }
1608
-
1609
- filename = RSTRING_PTR(v_filename);
1610
-
1611
- if (T_STRING == TYPE(v_compression)) {
1612
- compression = -1;
1613
- cmd = RSTRING_PTR(v_compression);
1614
- } else {
1615
- compression = NUM2INT(v_compression);
1616
- }
1617
-
1618
-
1619
- format = NUM2INT(v_format);
1620
- return rb_libarchive_writer_s_open0(rb_libarchive_writer_s_open_filename0, (void *) filename, compression, format, cmd);
1621
- }
1622
-
1623
- static int rb_libarchive_writer_s_open_memory0(struct rb_libarchive_archive_container *p, void *arg) {
1624
- VALUE str = (VALUE) arg;
1625
- p->memory = str;
1626
- return archive_write_open_rb_str(p->ar, str);
1627
- }
1628
-
1629
- /* */
1630
- static VALUE rb_libarchive_writer_s_open_memory(VALUE self, VALUE v_memory, VALUE v_compression, VALUE v_format) {
1631
- int compression, format;
1632
- const char *cmd = NULL;
1633
- Check_Type(v_memory, T_STRING);
1634
-
1635
- if (T_STRING == TYPE(v_compression)) {
1636
- compression = -1;
1637
- cmd = RSTRING_PTR(v_compression);
1638
- } else {
1639
- compression = NUM2INT(v_compression);
1640
- }
1641
-
1642
- format = NUM2INT(v_format);
1643
- return rb_libarchive_writer_s_open0(rb_libarchive_writer_s_open_memory0, (void *) v_memory, compression, format, cmd);
1644
- }
1645
-
1646
- /* */
1647
- static VALUE rb_libarchive_writer_new_entry(VALUE self) {
1648
- VALUE entry;
1649
- struct rb_libarchive_archive_container *p;
1650
- struct archive_entry *ae;
1651
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1652
- Check_Archive(p);
1653
-
1654
- if ((ae = archive_entry_new()) == NULL) {
1655
- rb_raise(rb_eArchiveError, "New entry failed: %s", strerror(errno));
1656
- }
1657
-
1658
- entry = rb_libarchive_entry_new(ae, 1);
1659
-
1660
- if (rb_block_given_p()) {
1661
- VALUE retval;
1662
- int status;
1663
- retval = rb_protect(rb_yield, entry, &status);
1664
- rb_libarchive_entry_close(entry);
1665
-
1666
- if (status != 0) {
1667
- rb_jump_tag(status);
1668
- }
1669
-
1670
- return retval;
1671
- } else {
1672
- return entry;
1673
- }
1674
- }
1675
-
1676
- /* */
1677
- static VALUE rb_libarchive_writer_write_header(VALUE self, VALUE v_entry) {
1678
- struct rb_libarchive_archive_container *pa;
1679
- struct rb_libarchive_entry_container *pae;
1680
- Check_Class(v_entry, rb_cArchiveEntry);
1681
- Data_Get_Struct(self, struct rb_libarchive_archive_container, pa);
1682
- Check_Archive(pa);
1683
- Data_Get_Struct(v_entry, struct rb_libarchive_entry_container, pae);
1684
- Check_Entry(pae);
1685
-
1686
- if (archive_write_header(pa->ar, pae->ae) != ARCHIVE_OK) {
1687
- rb_raise(rb_eArchiveError, "Write header failed: %s", archive_error_string(pa->ar));
1688
- }
1689
-
1690
- return Qnil;
1691
- }
1692
-
1693
- static ssize_t rb_libarchive_writer_write_data0(struct archive *ar, VALUE v_buff) {
1694
- const char *buff;
1695
- size_t size;
1696
- ssize_t n;
1697
-
1698
- if (NIL_P(v_buff)) {
1699
- return 0;
1700
- }
1701
-
1702
- Check_Type(v_buff, T_STRING);
1703
- buff = RSTRING_PTR(v_buff);
1704
- size = RSTRING_LEN(v_buff);
1705
-
1706
- if (size < 1) {
1707
- return 0;
1708
- }
1709
-
1710
- if ((n = archive_write_data(ar, buff, size)) < 0) {
1711
- rb_raise(rb_eArchiveError, "Write data failed: %s", archive_error_string(ar));
1712
- }
1713
-
1714
- return n;
1715
- }
1716
-
1717
- /* */
1718
- static VALUE rb_libarchive_writer_write_data(int argc, VALUE *argv, VALUE self) {
1719
- struct rb_libarchive_archive_container *p;
1720
- Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1721
- Check_Archive(p);
1722
-
1723
- if (rb_block_given_p()) {
1724
- ssize_t len = 0;
1725
-
1726
- if (argc > 0) {
1727
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
1728
- }
1729
-
1730
- while(1) {
1731
- VALUE retval;
1732
- ssize_t n;
1733
- retval = rb_yield(Qnil);
1734
-
1735
- if ((n = rb_libarchive_writer_write_data0(p->ar, retval)) < 1) {
1736
- return LONG2NUM(len);
1737
- }
1738
-
1739
- len += n;
1740
- }
1741
- } else {
1742
- VALUE v_buff;
1743
- ssize_t n;
1744
- rb_scan_args(argc, argv, "10", &v_buff);
1745
- n = rb_libarchive_writer_write_data0(p->ar, v_buff);
1746
- return LONG2NUM(n);
1747
- }
1748
- }
1749
-
1750
- void Init_libarchive_writer() {
1751
- rb_cArchiveWriter = rb_define_class_under(rb_mArchive, "Writer", rb_cObject);
1752
- rb_define_alloc_func(rb_cArchiveWriter, rb_libarchive_archive_alloc);
1753
- rb_funcall(rb_cArchiveWriter, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("new")));
1754
- rb_define_singleton_method(rb_cArchiveWriter, "open_filename", rb_libarchive_writer_s_open_filename, 3);
1755
- rb_define_singleton_method(rb_mArchive, "write_open_filename", rb_libarchive_writer_s_open_filename, 3);
1756
- rb_define_singleton_method(rb_cArchiveWriter, "open_memory", rb_libarchive_writer_s_open_memory, 3);
1757
- rb_define_singleton_method(rb_mArchive, "write_open_memory", rb_libarchive_writer_s_open_memory, 3);
1758
- rb_define_method(rb_cArchiveWriter, "close", rb_libarchive_writer_close, 0);
1759
- rb_define_method(rb_cArchiveWriter, "new_entry", rb_libarchive_writer_new_entry, 0);
1760
- rb_define_method(rb_cArchiveWriter, "write_header", rb_libarchive_writer_write_header, 1);
1761
- rb_define_method(rb_cArchiveWriter, "write_data", rb_libarchive_writer_write_data, -1);
1762
- }
1
+ #include "libarchive_internal.h"
2
+
3
+ VALUE rb_mArchive;
4
+ VALUE rb_eArchiveError;
5
+
6
+ /* */
7
+ VALUE rb_libarchive_s_version_number(VALUE self) {
8
+ #if ARCHIVE_VERSION >= 2005000
9
+ return INT2NUM(archive_version_number());
10
+ #else
11
+ return INT2NUM(archive_version_stamp());
12
+ #endif
13
+ }
14
+
15
+ /* */
16
+ VALUE rb_libarchive_s_version_string(VALUE self) {
17
+ #if ARCHIVE_VERSION_NUMBER >= 2005000
18
+ return rb_str_new2(archive_version_string());
19
+ #else
20
+ return rb_str_new2(archive_version());
21
+ #endif
22
+ }
23
+
24
+ void DLLEXPORT Init_libarchive_ruby() {
25
+ rb_mArchive = rb_define_module("Archive");
26
+ rb_define_const(rb_mArchive, "VERSION", rb_str_new2(VERSION));
27
+
28
+ rb_define_const(rb_mArchive, "COMPRESSION_NONE", INT2NUM(ARCHIVE_COMPRESSION_NONE));
29
+ rb_define_const(rb_mArchive, "COMPRESSION_GZIP", INT2NUM(ARCHIVE_COMPRESSION_GZIP));
30
+ rb_define_const(rb_mArchive, "COMPRESSION_BZIP2", INT2NUM(ARCHIVE_COMPRESSION_BZIP2));
31
+ rb_define_const(rb_mArchive, "COMPRESSION_COMPRESS", INT2NUM(ARCHIVE_COMPRESSION_COMPRESS));
32
+ // XXX:
33
+ /*
34
+ rb_define_const(rb_mArchive, "COMPRESSION_PROGRAM", INT2NUM(ARCHIVE_COMPRESSION_PROGRAM));
35
+ rb_define_const(rb_mArchive, "COMPRESSION_LZMA", INT2NUM(ARCHIVE_COMPRESSION_LZMA));
36
+ */
37
+
38
+ rb_define_const(rb_mArchive, "FORMAT_BASE_MASK", INT2NUM(ARCHIVE_FORMAT_BASE_MASK));
39
+ rb_define_const(rb_mArchive, "FORMAT_CPIO", INT2NUM(ARCHIVE_FORMAT_CPIO));
40
+ rb_define_const(rb_mArchive, "FORMAT_CPIO_POSIX", INT2NUM(ARCHIVE_FORMAT_CPIO_POSIX));
41
+ rb_define_const(rb_mArchive, "FORMAT_CPIO_BIN_LE", INT2NUM(ARCHIVE_FORMAT_CPIO_BIN_LE));
42
+ rb_define_const(rb_mArchive, "FORMAT_CPIO_BIN_BE", INT2NUM(ARCHIVE_FORMAT_CPIO_BIN_BE));
43
+ rb_define_const(rb_mArchive, "FORMAT_CPIO_SVR4_NOCRC", INT2NUM(ARCHIVE_FORMAT_CPIO_SVR4_NOCRC));
44
+ rb_define_const(rb_mArchive, "FORMAT_CPIO_SVR4_CRC", INT2NUM(ARCHIVE_FORMAT_CPIO_SVR4_CRC));
45
+ rb_define_const(rb_mArchive, "FORMAT_SHAR", INT2NUM(ARCHIVE_FORMAT_SHAR));
46
+ rb_define_const(rb_mArchive, "FORMAT_SHAR_BASE", INT2NUM(ARCHIVE_FORMAT_SHAR_BASE));
47
+ rb_define_const(rb_mArchive, "FORMAT_SHAR_DUMP", INT2NUM(ARCHIVE_FORMAT_SHAR_DUMP));
48
+ rb_define_const(rb_mArchive, "FORMAT_TAR", INT2NUM(ARCHIVE_FORMAT_TAR));
49
+ rb_define_const(rb_mArchive, "FORMAT_TAR_USTAR", INT2NUM(ARCHIVE_FORMAT_TAR_USTAR));
50
+ rb_define_const(rb_mArchive, "FORMAT_TAR_PAX_INTERCHANGE", INT2NUM(ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE));
51
+ rb_define_const(rb_mArchive, "FORMAT_TAR_PAX_RESTRICTED", INT2NUM(ARCHIVE_FORMAT_TAR_PAX_RESTRICTED));
52
+ rb_define_const(rb_mArchive, "FORMAT_TAR_GNUTAR", INT2NUM(ARCHIVE_FORMAT_TAR_GNUTAR));
53
+ rb_define_const(rb_mArchive, "FORMAT_ISO9660", INT2NUM(ARCHIVE_FORMAT_ISO9660));
54
+ rb_define_const(rb_mArchive, "FORMAT_ISO9660_ROCKRIDGE", INT2NUM(ARCHIVE_FORMAT_ISO9660_ROCKRIDGE));
55
+ rb_define_const(rb_mArchive, "FORMAT_ZIP", INT2NUM(ARCHIVE_FORMAT_ZIP));
56
+ rb_define_const(rb_mArchive, "FORMAT_EMPTY", INT2NUM(ARCHIVE_FORMAT_EMPTY));
57
+ rb_define_const(rb_mArchive, "FORMAT_AR", INT2NUM(ARCHIVE_FORMAT_AR));
58
+ rb_define_const(rb_mArchive, "FORMAT_AR_GNU", INT2NUM(ARCHIVE_FORMAT_AR_GNU));
59
+ rb_define_const(rb_mArchive, "FORMAT_AR_BSD", INT2NUM(ARCHIVE_FORMAT_AR_BSD));
60
+ #ifdef ARCHIVE_FORMAT_MTREE
61
+ rb_define_const(rb_mArchive, "FORMAT_MTREE", INT2NUM(ARCHIVE_FORMAT_MTREE));
62
+ #endif
63
+
64
+ rb_define_const(rb_mArchive, "EXTRACT_OWNER", INT2NUM(ARCHIVE_EXTRACT_OWNER));
65
+ rb_define_const(rb_mArchive, "EXTRACT_PERM", INT2NUM(ARCHIVE_EXTRACT_PERM));
66
+ rb_define_const(rb_mArchive, "EXTRACT_TIME", INT2NUM(ARCHIVE_EXTRACT_TIME));
67
+ rb_define_const(rb_mArchive, "EXTRACT_NO_OVERWRITE", INT2NUM(ARCHIVE_EXTRACT_NO_OVERWRITE));
68
+ rb_define_const(rb_mArchive, "EXTRACT_UNLINK", INT2NUM(ARCHIVE_EXTRACT_UNLINK));
69
+ rb_define_const(rb_mArchive, "EXTRACT_ACL", INT2NUM(ARCHIVE_EXTRACT_ACL));
70
+ rb_define_const(rb_mArchive, "EXTRACT_FFLAGS", INT2NUM(ARCHIVE_EXTRACT_FFLAGS));
71
+ rb_define_const(rb_mArchive, "EXTRACT_XATTR", INT2NUM(ARCHIVE_EXTRACT_XATTR));
72
+ rb_define_const(rb_mArchive, "EXTRACT_SECURE_SYMLINKS", INT2NUM(ARCHIVE_EXTRACT_SECURE_SYMLINKS));
73
+ rb_define_const(rb_mArchive, "EXTRACT_SECURE_NODOTDOT", INT2NUM(ARCHIVE_EXTRACT_SECURE_NODOTDOT));
74
+ rb_define_const(rb_mArchive, "EXTRACT_NO_AUTODIR", INT2NUM(ARCHIVE_EXTRACT_NO_AUTODIR));
75
+ rb_define_const(rb_mArchive, "EXTRACT_NO_OVERWRITE_NEWER", INT2NUM(ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER));
76
+ #ifdef ARCHIVE_EXTRACT_SPARSE
77
+ rb_define_const(rb_mArchive, "EXTRACT_SPARSE", INT2NUM(ARCHIVE_EXTRACT_SPARSE));
78
+ #endif
79
+
80
+ rb_define_module_function(rb_mArchive, "version_number", rb_libarchive_s_version_number, 0);
81
+ rb_define_module_function(rb_mArchive, "version_string", rb_libarchive_s_version_string, 0);
82
+
83
+ rb_eArchiveError = rb_define_class_under(rb_mArchive, "Error", rb_eStandardError);
84
+
85
+ Init_libarchive_reader();
86
+ Init_libarchive_writer();
87
+ Init_libarchive_archive();
88
+ Init_libarchive_entry();
89
+ }
90
+ #include "libarchive_internal.h"
91
+
92
+ extern VALUE rb_cArchiveReader;
93
+ extern VALUE rb_cArchiveWriter;
94
+ extern VALUE rb_eArchiveError;
95
+
96
+ static void rb_libarchive_archive_free(struct rb_libarchive_archive_container *p) {
97
+ xfree(p);
98
+ }
99
+
100
+ static void rb_libarchive_archive_mark(struct rb_libarchive_archive_container *p) {
101
+ rb_gc_mark(p->memory);
102
+ }
103
+
104
+ VALUE rb_libarchive_archive_alloc(VALUE klass) {
105
+ struct rb_libarchive_archive_container *p = ALLOC(struct rb_libarchive_archive_container);
106
+ p->ar = NULL;
107
+ p->eof = 0;
108
+ p->memory = Qnil;
109
+ return Data_Wrap_Struct(klass, rb_libarchive_archive_mark, rb_libarchive_archive_free, p);
110
+ }
111
+
112
+ /* */
113
+ static VALUE rb_libarchive_archive_position_compressed(VALUE self) {
114
+ struct rb_libarchive_archive_container *p;
115
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
116
+ Check_Archive(p);
117
+ return LL2NUM(archive_position_compressed(p->ar));
118
+ }
119
+
120
+ /* */
121
+ static VALUE rb_libarchive_archive_position_uncompressed(VALUE self) {
122
+ struct rb_libarchive_archive_container *p;
123
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
124
+ Check_Archive(p);
125
+ return LL2NUM(archive_position_uncompressed(p->ar));
126
+ }
127
+
128
+ /* */
129
+ static VALUE rb_libarchive_archive_compression_name(VALUE self) {
130
+ struct rb_libarchive_archive_container *p;
131
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
132
+ Check_Archive(p);
133
+ return rb_str_new2(archive_compression_name(p->ar));
134
+ }
135
+
136
+ /* */
137
+ static VALUE rb_libarchive_archive_compression(VALUE self) {
138
+ struct rb_libarchive_archive_container *p;
139
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
140
+ Check_Archive(p);
141
+ return INT2NUM(archive_compression(p->ar));
142
+ }
143
+
144
+ /* */
145
+ static VALUE rb_libarchive_archive_format_name(VALUE self) {
146
+ struct rb_libarchive_archive_container *p;
147
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
148
+ Check_Archive(p);
149
+ return rb_str_new2(archive_format_name(p->ar));
150
+ }
151
+
152
+ /* */
153
+ static VALUE rb_libarchive_archive_format(VALUE self) {
154
+ struct rb_libarchive_archive_container *p;
155
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
156
+ Check_Archive(p);
157
+ return NUM2INT(archive_format(p->ar));
158
+ }
159
+
160
+ void Init_libarchive_archive() {
161
+ rb_define_method(rb_cArchiveReader, "position_compressed", rb_libarchive_archive_position_compressed, 0);
162
+ rb_define_method(rb_cArchiveWriter, "position_compressed", rb_libarchive_archive_position_compressed, 0);
163
+ rb_define_method(rb_cArchiveReader, "position_uncompressed", rb_libarchive_archive_position_uncompressed, 0);
164
+ rb_define_method(rb_cArchiveWriter, "position_uncompressed", rb_libarchive_archive_position_uncompressed, 0);
165
+ rb_define_method(rb_cArchiveReader, "compression_name", rb_libarchive_archive_compression_name, 0);
166
+ rb_define_method(rb_cArchiveWriter, "compression_name", rb_libarchive_archive_compression_name, 0);
167
+ rb_define_method(rb_cArchiveReader, "compression", rb_libarchive_archive_compression, 0);
168
+ rb_define_method(rb_cArchiveWriter, "compression", rb_libarchive_archive_compression, 0);
169
+ rb_define_method(rb_cArchiveReader, "format_name", rb_libarchive_archive_format_name, 0);
170
+ rb_define_method(rb_cArchiveWriter, "format_name", rb_libarchive_archive_format_name, 0);
171
+ rb_define_method(rb_cArchiveReader, "format", rb_libarchive_archive_format, 0);
172
+ rb_define_method(rb_cArchiveWriter, "format", rb_libarchive_archive_format, 0);
173
+ }
174
+ #include "libarchive_internal.h"
175
+
176
+ extern VALUE rb_mArchive;
177
+ VALUE rb_cArchiveEntry;
178
+ extern VALUE rb_eArchiveError;
179
+
180
+ static void rb_libarchive_entry_free(struct rb_libarchive_entry_container *p) {
181
+ xfree(p);
182
+ }
183
+
184
+ static VALUE rb_libarchive_entry_alloc(VALUE klass) {
185
+ struct rb_libarchive_entry_container *p = ALLOC(struct rb_libarchive_entry_container);
186
+ p->ae = NULL;
187
+ p->must_close = 1;
188
+ return Data_Wrap_Struct(klass, 0, rb_libarchive_entry_free, p);
189
+ }
190
+
191
+ /* */
192
+ VALUE rb_libarchive_entry_close(VALUE self) {
193
+ struct rb_libarchive_entry_container *p;
194
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
195
+ Check_Entry(p);
196
+
197
+ if (!p->must_close) {
198
+ rb_raise(rb_eArchiveError, "Close entry failed: It is not necessary to close");
199
+ }
200
+
201
+ archive_entry_free(p->ae);
202
+ p->ae = NULL;
203
+ return Qnil;
204
+ }
205
+
206
+ VALUE rb_libarchive_entry_new(struct archive_entry *ae, int must_close) {
207
+ VALUE entry;
208
+ struct rb_libarchive_entry_container *p;
209
+ entry = rb_funcall(rb_cArchiveEntry, rb_intern("new"), 0);
210
+ Data_Get_Struct(entry, struct rb_libarchive_entry_container, p);
211
+ p->ae = ae;
212
+ p->must_close = must_close;
213
+ return entry;
214
+ }
215
+
216
+ /* */
217
+ static VALUE rb_libarchive_entry_atime(VALUE self) {
218
+ struct rb_libarchive_entry_container *p;
219
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
220
+ Check_Entry(p);
221
+ return LONG2TIME((long) archive_entry_atime(p->ae));
222
+ }
223
+
224
+ /* */
225
+ static VALUE rb_libarchive_entry_atime_nsec(VALUE self) {
226
+ struct rb_libarchive_entry_container *p;
227
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
228
+ Check_Entry(p);
229
+ return LONG2NUM(archive_entry_atime_nsec(p->ae));
230
+ }
231
+
232
+ /* */
233
+ static VALUE rb_libarchive_entry_atime_is_set(VALUE self) {
234
+ struct rb_libarchive_entry_container *p;
235
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
236
+ Check_Entry(p);
237
+ return archive_entry_atime_is_set(p->ae) ? Qtrue : Qfalse;
238
+ }
239
+
240
+ /* */
241
+ static VALUE rb_libarchive_entry_birthtime(VALUE self) {
242
+ struct rb_libarchive_entry_container *p;
243
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
244
+ Check_Entry(p);
245
+ return LONG2TIME((long) archive_entry_birthtime(p->ae));
246
+ }
247
+
248
+ /* */
249
+ static VALUE rb_libarchive_entry_birthtime_nsec(VALUE self) {
250
+ struct rb_libarchive_entry_container *p;
251
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
252
+ Check_Entry(p);
253
+ return LONG2NUM(archive_entry_birthtime_nsec(p->ae));
254
+ }
255
+
256
+ /* */
257
+ static VALUE rb_libarchive_entry_birthtime_is_set(VALUE self) {
258
+ struct rb_libarchive_entry_container *p;
259
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
260
+ Check_Entry(p);
261
+ return archive_entry_birthtime_is_set(p->ae) ? Qtrue : Qfalse;
262
+ }
263
+
264
+ /* */
265
+ static VALUE rb_libarchive_entry_ctime(VALUE self) {
266
+ struct rb_libarchive_entry_container *p;
267
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
268
+ Check_Entry(p);
269
+ return LONG2TIME((long) archive_entry_ctime(p->ae));
270
+ }
271
+
272
+ /* */
273
+ static VALUE rb_libarchive_entry_ctime_nsec(VALUE self) {
274
+ struct rb_libarchive_entry_container *p;
275
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
276
+ Check_Entry(p);
277
+ return LONG2NUM(archive_entry_ctime_nsec(p->ae));
278
+ }
279
+
280
+ /* */
281
+ static VALUE rb_libarchive_entry_ctime_is_set(VALUE self) {
282
+ struct rb_libarchive_entry_container *p;
283
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
284
+ Check_Entry(p);
285
+ return archive_entry_ctime_is_set(p->ae) ? Qtrue : Qfalse;
286
+ }
287
+
288
+ /* */
289
+ static VALUE rb_libarchive_entry_dev(VALUE self) {
290
+ struct rb_libarchive_entry_container *p;
291
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
292
+ Check_Entry(p);
293
+ return LONG2NUM(archive_entry_dev(p->ae));
294
+ }
295
+
296
+ /* */
297
+ static VALUE rb_libarchive_entry_devmajor(VALUE self) {
298
+ struct rb_libarchive_entry_container *p;
299
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
300
+ Check_Entry(p);
301
+ return LONG2NUM(archive_entry_devmajor(p->ae));
302
+ }
303
+
304
+ /* */
305
+ static VALUE rb_libarchive_entry_devminor(VALUE self) {
306
+ struct rb_libarchive_entry_container *p;
307
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
308
+ Check_Entry(p);
309
+ return LONG2NUM(archive_entry_devminor(p->ae));
310
+ }
311
+
312
+ /* */
313
+ static VALUE rb_libarchive_entry_filetype(VALUE self) {
314
+ struct rb_libarchive_entry_container *p;
315
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
316
+ Check_Entry(p);
317
+ return INT2NUM(archive_entry_filetype(p->ae));
318
+ }
319
+
320
+ /* */
321
+ static VALUE rb_libarchive_entry_is_directory(VALUE self) {
322
+ struct rb_libarchive_entry_container *p;
323
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
324
+ Check_Entry(p);
325
+ return S_ISDIR(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
326
+ }
327
+
328
+ /* */
329
+ static VALUE rb_libarchive_entry_is_character_special(VALUE self) {
330
+ struct rb_libarchive_entry_container *p;
331
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
332
+ Check_Entry(p);
333
+ return S_ISCHR(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
334
+ }
335
+
336
+ /* */
337
+ static VALUE rb_libarchive_entry_is_block_special(VALUE self) {
338
+ struct rb_libarchive_entry_container *p;
339
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
340
+ Check_Entry(p);
341
+ return S_ISBLK(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
342
+ }
343
+
344
+ /* */
345
+ static VALUE rb_libarchive_entry_is_regular(VALUE self) {
346
+ struct rb_libarchive_entry_container *p;
347
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
348
+ Check_Entry(p);
349
+ return S_ISREG(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
350
+ }
351
+
352
+ /* */
353
+ static VALUE rb_libarchive_entry_is_symbolic_link(VALUE self) {
354
+ struct rb_libarchive_entry_container *p;
355
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
356
+ Check_Entry(p);
357
+ return S_ISLNK(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
358
+ }
359
+
360
+ /* */
361
+ static VALUE rb_libarchive_entry_is_socket(VALUE self) {
362
+ struct rb_libarchive_entry_container *p;
363
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
364
+ Check_Entry(p);
365
+ return S_ISSOCK(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
366
+ }
367
+
368
+ /* */
369
+ static VALUE rb_libarchive_entry_is_fifo(VALUE self) {
370
+ struct rb_libarchive_entry_container *p;
371
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
372
+ Check_Entry(p);
373
+ return S_ISFIFO(archive_entry_filetype(p->ae)) ? Qtrue : Qfalse;
374
+ }
375
+
376
+ /* */
377
+ static VALUE rb_libarchive_entry_fflags(VALUE self) {
378
+ struct rb_libarchive_entry_container *p;
379
+ long set, clear;
380
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
381
+ Check_Entry(p);
382
+ archive_entry_fflags(p->ae, &set, &clear);
383
+ return rb_ary_new3(2, LONG2NUM(set), LONG2NUM(clear));
384
+ }
385
+
386
+ /* */
387
+ static VALUE rb_libarchive_entry_fflags_text(VALUE self) {
388
+ struct rb_libarchive_entry_container *p;
389
+ const char *fflags_text;
390
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
391
+ Check_Entry(p);
392
+ fflags_text = archive_entry_fflags_text(p->ae);
393
+ return (fflags_text != NULL) ? rb_str_new2(fflags_text) : Qnil;
394
+ }
395
+
396
+ /* */
397
+ static VALUE rb_libarchive_entry_gid(VALUE self) {
398
+ struct rb_libarchive_entry_container *p;
399
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
400
+ Check_Entry(p);
401
+ return LONG2NUM(archive_entry_gid(p->ae));
402
+ }
403
+
404
+ /* */
405
+ static VALUE rb_libarchive_entry_gname(VALUE self) {
406
+ struct rb_libarchive_entry_container *p;
407
+ const char *gname;
408
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
409
+ Check_Entry(p);
410
+ gname = archive_entry_gname(p->ae);
411
+ return (gname != NULL) ? rb_str_new2(gname) : Qnil;
412
+ }
413
+
414
+ /* */
415
+ static VALUE rb_libarchive_entry_hardlink(VALUE self) {
416
+ struct rb_libarchive_entry_container *p;
417
+ const char *hardlink;
418
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
419
+ Check_Entry(p);
420
+ hardlink = archive_entry_hardlink(p->ae);
421
+ return (hardlink != NULL) ? rb_str_new2(hardlink) : Qnil;
422
+ }
423
+
424
+ /* */
425
+ static VALUE rb_libarchive_entry_ino(VALUE self) {
426
+ struct rb_libarchive_entry_container *p;
427
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
428
+ return LONG2NUM(archive_entry_ino(p->ae));
429
+ }
430
+
431
+ /* */
432
+ static VALUE rb_libarchive_entry_mode(VALUE self) {
433
+ struct rb_libarchive_entry_container *p;
434
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
435
+ return LONG2NUM(archive_entry_mode(p->ae));
436
+ }
437
+
438
+ /* */
439
+ static VALUE rb_libarchive_entry_mtime(VALUE self) {
440
+ struct rb_libarchive_entry_container *p;
441
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
442
+ Check_Entry(p);
443
+ return LONG2TIME((long) archive_entry_mtime(p->ae));
444
+ }
445
+
446
+ /* */
447
+ static VALUE rb_libarchive_entry_mtime_nsec(VALUE self) {
448
+ struct rb_libarchive_entry_container *p;
449
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
450
+ Check_Entry(p);
451
+ return LONG2NUM(archive_entry_mtime_nsec(p->ae));
452
+ }
453
+
454
+ /* */
455
+ static VALUE rb_libarchive_entry_mtime_is_set(VALUE self) {
456
+ struct rb_libarchive_entry_container *p;
457
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
458
+ Check_Entry(p);
459
+ return archive_entry_mtime_is_set(p->ae) ? Qtrue : Qfalse;
460
+ }
461
+
462
+ /* */
463
+ static VALUE rb_libarchive_entry_nlink(VALUE self) {
464
+ struct rb_libarchive_entry_container *p;
465
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
466
+ Check_Entry(p);
467
+ return LONG2NUM(archive_entry_nlink(p->ae));
468
+ }
469
+
470
+ /* */
471
+ static VALUE rb_libarchive_entry_pathname(VALUE self) {
472
+ struct rb_libarchive_entry_container *p;
473
+ const char *pathname;
474
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
475
+ Check_Entry(p);
476
+ pathname = archive_entry_pathname(p->ae);
477
+ return (pathname != NULL) ? rb_str_new2(pathname) : Qnil;
478
+ }
479
+
480
+ /* */
481
+ static VALUE rb_libarchive_entry_rdev(VALUE self) {
482
+ struct rb_libarchive_entry_container *p;
483
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
484
+ Check_Entry(p);
485
+ return LONG2NUM(archive_entry_rdev(p->ae));
486
+ }
487
+
488
+ /* */
489
+ static VALUE rb_libarchive_entry_rdevmajor(VALUE self) {
490
+ struct rb_libarchive_entry_container *p;
491
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
492
+ Check_Entry(p);
493
+ return LONG2NUM(archive_entry_rdevmajor(p->ae));
494
+ }
495
+
496
+ /* */
497
+ static VALUE rb_libarchive_entry_rdevminor(VALUE self) {
498
+ struct rb_libarchive_entry_container *p;
499
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
500
+ Check_Entry(p);
501
+ return LONG2NUM(archive_entry_rdevminor(p->ae));
502
+ }
503
+
504
+ #if ARCHIVE_VERSION_NUMBER >= 2005003
505
+ /* */
506
+ static VALUE rb_libarchive_entry_sourcepath(VALUE self) {
507
+ struct rb_libarchive_entry_container *p;
508
+ const char *sourcepath;
509
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
510
+ Check_Entry(p);
511
+ sourcepath = archive_entry_sourcepath(p->ae);
512
+ return (sourcepath != NULL) ? rb_str_new2(sourcepath) : Qnil;
513
+ }
514
+ #endif
515
+
516
+ /* */
517
+ static VALUE rb_libarchive_entry_size(VALUE self) {
518
+ struct rb_libarchive_entry_container *p;
519
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
520
+ Check_Entry(p);
521
+ return LL2NUM(archive_entry_size(p->ae));
522
+ }
523
+
524
+ /* */
525
+ static VALUE rb_libarchive_entry_size_is_set(VALUE self) {
526
+ struct rb_libarchive_entry_container *p;
527
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
528
+ Check_Entry(p);
529
+ return archive_entry_size_is_set(p->ae) ? Qtrue : Qfalse;
530
+ }
531
+
532
+ #if ARCHIVE_VERSION_NUMBER >= 2003002
533
+ /* */
534
+ static VALUE rb_libarchive_entry_strmode(VALUE self) {
535
+ struct rb_libarchive_entry_container *p;
536
+ const char *strmode;
537
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
538
+ Check_Entry(p);
539
+ strmode = archive_entry_strmode(p->ae);
540
+ return (strmode != NULL) ? rb_str_new2(strmode) : Qnil;
541
+ }
542
+ #endif
543
+
544
+ /* */
545
+ static VALUE rb_libarchive_entry_symlink(VALUE self) {
546
+ struct rb_libarchive_entry_container *p;
547
+ const char *symlink;
548
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
549
+ Check_Entry(p);
550
+ symlink = archive_entry_symlink(p->ae);
551
+ return (symlink != NULL) ? rb_str_new2(symlink) : Qnil;
552
+ }
553
+
554
+ /* */
555
+ static VALUE rb_libarchive_entry_uid(VALUE self) {
556
+ struct rb_libarchive_entry_container *p;
557
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
558
+ Check_Entry(p);
559
+ return LONG2NUM(archive_entry_uid(p->ae));
560
+ }
561
+
562
+ /* */
563
+ static VALUE rb_libarchive_entry_uname(VALUE self) {
564
+ struct rb_libarchive_entry_container *p;
565
+ const char *uname;
566
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
567
+ Check_Entry(p);
568
+ uname = archive_entry_uname(p->ae);
569
+ return (uname != NULL) ? rb_str_new2(uname) : Qnil;
570
+ }
571
+
572
+ /* */
573
+ static VALUE rb_libarchive_entry_set_atime(VALUE self, VALUE v_time) {
574
+ struct rb_libarchive_entry_container *p;
575
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
576
+ Check_Entry(p);
577
+ Check_Class(v_time, rb_cTime);
578
+ archive_entry_set_atime(p->ae, TIME2LONG(v_time), 0);
579
+ return Qnil;
580
+ }
581
+
582
+ /* */
583
+ static VALUE rb_libarchive_entry_set_atime2(VALUE self, VALUE v_time, VALUE v_ns) {
584
+ struct rb_libarchive_entry_container *p;
585
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
586
+ Check_Entry(p);
587
+ Check_Class(v_time, rb_cTime);
588
+ Check_Type(v_ns, T_FIXNUM);
589
+ archive_entry_set_atime(p->ae, TIME2LONG(v_time), NUM2LONG(v_ns));
590
+ return Qnil;
591
+ }
592
+
593
+ /* */
594
+ static VALUE rb_libarchive_entry_unset_atime(VALUE self) {
595
+ struct rb_libarchive_entry_container *p;
596
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
597
+ Check_Entry(p);
598
+ archive_entry_unset_atime(p->ae);
599
+ return Qnil;
600
+ }
601
+
602
+ /* */
603
+ static VALUE rb_libarchive_entry_set_birthtime(VALUE self, VALUE v_time) {
604
+ struct rb_libarchive_entry_container *p;
605
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
606
+ Check_Entry(p);
607
+ Check_Class(v_time, rb_cTime);
608
+ archive_entry_set_birthtime(p->ae, TIME2LONG(v_time), 0);
609
+ return Qnil;
610
+ }
611
+
612
+ /* */
613
+ static VALUE rb_libarchive_entry_set_birthtime2(VALUE self, VALUE v_time, VALUE v_ns) {
614
+ struct rb_libarchive_entry_container *p;
615
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
616
+ Check_Entry(p);
617
+ Check_Class(v_time, rb_cTime);
618
+ Check_Type(v_ns, T_FIXNUM);
619
+ archive_entry_set_birthtime(p->ae, TIME2LONG(v_time), NUM2LONG(v_ns));
620
+ return Qnil;
621
+ }
622
+
623
+ /* */
624
+ static VALUE rb_libarchive_entry_unset_birthtime(VALUE self) {
625
+ struct rb_libarchive_entry_container *p;
626
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
627
+ Check_Entry(p);
628
+ archive_entry_unset_birthtime(p->ae);
629
+ return Qnil;
630
+ }
631
+
632
+ /* */
633
+ static VALUE rb_libarchive_entry_set_ctime(VALUE self, VALUE v_time) {
634
+ struct rb_libarchive_entry_container *p;
635
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
636
+ Check_Entry(p);
637
+ Check_Class(v_time, rb_cTime);
638
+ archive_entry_set_ctime(p->ae, TIME2LONG(v_time), 0);
639
+ return Qnil;
640
+ }
641
+
642
+ /* */
643
+ static VALUE rb_libarchive_entry_set_ctime2(VALUE self, VALUE v_time, VALUE v_ns) {
644
+ struct rb_libarchive_entry_container *p;
645
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
646
+ Check_Entry(p);
647
+ Check_Class(v_time, rb_cTime);
648
+ Check_Type(v_ns, T_FIXNUM);
649
+ archive_entry_set_ctime(p->ae, TIME2LONG(v_time), NUM2LONG(v_ns));
650
+ return Qnil;
651
+ }
652
+
653
+ /* */
654
+ static VALUE rb_libarchive_entry_unset_ctime(VALUE self) {
655
+ struct rb_libarchive_entry_container *p;
656
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
657
+ Check_Entry(p);
658
+ archive_entry_unset_ctime(p->ae);
659
+ return Qnil;
660
+ }
661
+
662
+ /* */
663
+ static VALUE rb_libarchive_entry_set_dev(VALUE self, VALUE v_dev) {
664
+ struct rb_libarchive_entry_container *p;
665
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
666
+ Check_Entry(p);
667
+ Check_Type(v_dev, T_FIXNUM);
668
+ archive_entry_set_dev(p->ae, NUM2LONG(v_dev));
669
+ return Qnil;
670
+ }
671
+
672
+ /* */
673
+ static VALUE rb_libarchive_entry_set_devmajor(VALUE self, VALUE v_dev) {
674
+ struct rb_libarchive_entry_container *p;
675
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
676
+ Check_Entry(p);
677
+ Check_Type(v_dev, T_FIXNUM);
678
+ archive_entry_set_devmajor(p->ae, NUM2LONG(v_dev));
679
+ return Qnil;
680
+ }
681
+
682
+ /* */
683
+ static VALUE rb_libarchive_entry_set_devminor(VALUE self, VALUE v_dev) {
684
+ struct rb_libarchive_entry_container *p;
685
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
686
+ Check_Entry(p);
687
+ Check_Type(v_dev, T_FIXNUM);
688
+ archive_entry_set_devminor(p->ae, NUM2LONG(v_dev));
689
+ return Qnil;
690
+ }
691
+
692
+ /* */
693
+ static VALUE rb_libarchive_entry_set_filetype(VALUE self, VALUE v_type) {
694
+ struct rb_libarchive_entry_container *p;
695
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
696
+ Check_Entry(p);
697
+ Check_Type(v_type, T_FIXNUM);
698
+ archive_entry_set_filetype(p->ae, NUM2LONG(v_type));
699
+ return Qnil;
700
+ }
701
+
702
+ /* */
703
+ static VALUE rb_libarchive_entry_set_fflags(VALUE self, VALUE v_set, VALUE v_clear) {
704
+ struct rb_libarchive_entry_container *p;
705
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
706
+ Check_Entry(p);
707
+ Check_Type(v_set, T_FIXNUM);
708
+ Check_Type(v_clear, T_FIXNUM);
709
+ archive_entry_set_fflags(p->ae, (unsigned long) NUM2LONG(v_set), (unsigned long) NUM2LONG(v_clear));
710
+ return Qnil;
711
+ }
712
+
713
+ /* */
714
+ static VALUE rb_libarchive_entry_copy_fflags_text(VALUE self, VALUE v_fflags_text) {
715
+ struct rb_libarchive_entry_container *p;
716
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
717
+ Check_Entry(p);
718
+ Check_Type(v_fflags_text, T_STRING);
719
+ archive_entry_copy_fflags_text(p->ae, RSTRING_PTR(v_fflags_text));
720
+ return Qnil;
721
+ }
722
+
723
+ /* */
724
+ static VALUE rb_libarchive_entry_set_gid(VALUE self, VALUE v_gid) {
725
+ struct rb_libarchive_entry_container *p;
726
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
727
+ Check_Entry(p);
728
+ Check_Type(v_gid, T_FIXNUM);
729
+ archive_entry_set_gid(p->ae, NUM2LONG(v_gid));
730
+ return Qnil;
731
+ }
732
+
733
+ /* */
734
+ static VALUE rb_libarchive_entry_set_gname(VALUE self, VALUE v_gname) {
735
+ struct rb_libarchive_entry_container *p;
736
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
737
+ Check_Entry(p);
738
+ Check_Type(v_gname, T_STRING);
739
+ archive_entry_set_gname(p->ae, RSTRING_PTR(v_gname));
740
+ return Qnil;
741
+ }
742
+
743
+ /* */
744
+ static VALUE rb_libarchive_entry_copy_gname(VALUE self, VALUE v_gname) {
745
+ struct rb_libarchive_entry_container *p;
746
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
747
+ Check_Entry(p);
748
+ Check_Type(v_gname, T_STRING);
749
+ archive_entry_copy_gname(p->ae, RSTRING_PTR(v_gname));
750
+ return Qnil;
751
+ }
752
+
753
+ /* */
754
+ static VALUE rb_libarchive_entry_set_hardlink(VALUE self, VALUE v_hardlink) {
755
+ struct rb_libarchive_entry_container *p;
756
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
757
+ Check_Entry(p);
758
+ Check_Type(v_hardlink, T_STRING);
759
+ archive_entry_set_hardlink(p->ae, RSTRING_PTR(v_hardlink));
760
+ return Qnil;
761
+ }
762
+
763
+ /* */
764
+ static VALUE rb_libarchive_entry_copy_hardlink(VALUE self, VALUE v_hardlink) {
765
+ struct rb_libarchive_entry_container *p;
766
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
767
+ Check_Entry(p);
768
+ Check_Type(v_hardlink, T_STRING);
769
+ archive_entry_copy_hardlink(p->ae, RSTRING_PTR(v_hardlink));
770
+ return Qnil;
771
+ }
772
+
773
+ /* */
774
+ static VALUE rb_libarchive_entry_set_ino(VALUE self, VALUE v_ino) {
775
+ struct rb_libarchive_entry_container *p;
776
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
777
+ Check_Entry(p);
778
+ Check_Type(v_ino, T_FIXNUM);
779
+ archive_entry_set_ino(p->ae, (unsigned long) NUM2LONG(v_ino));
780
+ return Qnil;
781
+ }
782
+
783
+ /* */
784
+ static VALUE rb_libarchive_entry_set_link(VALUE self, VALUE v_link) {
785
+ struct rb_libarchive_entry_container *p;
786
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
787
+ Check_Entry(p);
788
+ Check_Type(v_link, T_STRING);
789
+ archive_entry_set_link(p->ae, RSTRING_PTR(v_link));
790
+ return Qnil;
791
+ }
792
+
793
+ /* */
794
+ static VALUE rb_libarchive_entry_copy_link(VALUE self, VALUE v_link) {
795
+ struct rb_libarchive_entry_container *p;
796
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
797
+ Check_Entry(p);
798
+ Check_Type(v_link, T_STRING);
799
+ archive_entry_copy_link(p->ae, RSTRING_PTR(v_link));
800
+ return Qnil;
801
+ }
802
+
803
+ /* */
804
+ static VALUE rb_libarchive_entry_set_mode(VALUE self, VALUE v_mode) {
805
+ struct rb_libarchive_entry_container *p;
806
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
807
+ Check_Entry(p);
808
+ Check_Type(v_mode, T_STRING);
809
+ archive_entry_set_mode(p->ae, NUM2INT(v_mode));
810
+ return Qnil;
811
+ }
812
+
813
+ /* */
814
+ static VALUE rb_libarchive_entry_set_mtime(VALUE self, VALUE v_time) {
815
+ struct rb_libarchive_entry_container *p;
816
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
817
+ Check_Entry(p);
818
+ Check_Class(v_time, rb_cTime);
819
+ archive_entry_set_mtime(p->ae, TIME2LONG(v_time), 0);
820
+ return Qnil;
821
+ }
822
+
823
+ /* */
824
+ static VALUE rb_libarchive_entry_set_mtime2(VALUE self, VALUE v_time, VALUE v_ns) {
825
+ struct rb_libarchive_entry_container *p;
826
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
827
+ Check_Entry(p);
828
+ Check_Class(v_time, rb_cTime);
829
+ Check_Type(v_ns, T_FIXNUM);
830
+ archive_entry_set_mtime(p->ae, TIME2LONG(v_time), NUM2LONG(v_ns));
831
+ return Qnil;
832
+ }
833
+
834
+ /* */
835
+ static VALUE rb_libarchive_entry_unset_mtime(VALUE self) {
836
+ struct rb_libarchive_entry_container *p;
837
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
838
+ Check_Entry(p);
839
+ archive_entry_unset_mtime(p->ae);
840
+ return Qnil;
841
+ }
842
+
843
+ /* */
844
+ static VALUE rb_libarchive_entry_set_nlink(VALUE self, VALUE v_nlink) {
845
+ struct rb_libarchive_entry_container *p;
846
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
847
+ Check_Entry(p);
848
+ Check_Type(v_nlink, T_FIXNUM);
849
+ archive_entry_set_nlink(p->ae, NUM2LONG(v_nlink));
850
+ return Qnil;
851
+ }
852
+
853
+ /* */
854
+ static VALUE rb_libarchive_entry_set_pathname(VALUE self, VALUE v_filename) {
855
+ struct rb_libarchive_entry_container *p;
856
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
857
+ Check_Entry(p);
858
+ Check_Type(v_filename, T_STRING);
859
+ archive_entry_set_pathname(p->ae, RSTRING_PTR(v_filename));
860
+ return Qnil;
861
+ }
862
+
863
+ /* */
864
+ static VALUE rb_libarchive_entry_copy_pathname(VALUE self, VALUE v_filename) {
865
+ struct rb_libarchive_entry_container *p;
866
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
867
+ Check_Entry(p);
868
+ Check_Type(v_filename, T_STRING);
869
+ archive_entry_copy_pathname(p->ae, RSTRING_PTR(v_filename));
870
+ return Qnil;
871
+ }
872
+
873
+ /* */
874
+ static VALUE rb_libarchive_entry_set_perm(VALUE self, VALUE v_perm) {
875
+ struct rb_libarchive_entry_container *p;
876
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
877
+ Check_Entry(p);
878
+ Check_Type(v_perm, T_STRING);
879
+ archive_entry_set_perm(p->ae, NUM2INT(v_perm));
880
+ return Qnil;
881
+ }
882
+
883
+ /* */
884
+ static VALUE rb_libarchive_entry_set_rdev(VALUE self, VALUE v_rdev) {
885
+ struct rb_libarchive_entry_container *p;
886
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
887
+ Check_Entry(p);
888
+ Check_Type(v_rdev, T_FIXNUM);
889
+ archive_entry_set_rdev(p->ae, NUM2LONG(v_rdev));
890
+ return Qnil;
891
+ }
892
+
893
+ /* */
894
+ static VALUE rb_libarchive_entry_set_rdevmajor(VALUE self, VALUE v_rdev) {
895
+ struct rb_libarchive_entry_container *p;
896
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
897
+ Check_Entry(p);
898
+ Check_Type(v_rdev, T_FIXNUM);
899
+ archive_entry_set_rdevmajor(p->ae, NUM2LONG(v_rdev));
900
+ return Qnil;
901
+ }
902
+
903
+ /* */
904
+ static VALUE rb_libarchive_entry_set_rdevminor(VALUE self, VALUE v_rdev) {
905
+ struct rb_libarchive_entry_container *p;
906
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
907
+ Check_Entry(p);
908
+ Check_Type(v_rdev, T_FIXNUM);
909
+ archive_entry_set_rdevminor(p->ae, NUM2LONG(v_rdev));
910
+ return Qnil;
911
+ }
912
+
913
+ /* */
914
+ static VALUE rb_libarchive_entry_set_size(VALUE self, VALUE v_size) {
915
+ struct rb_libarchive_entry_container *p;
916
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
917
+ Check_Entry(p);
918
+ Check_Type(v_size, T_FIXNUM);
919
+ archive_entry_set_size(p->ae, NUM2LL(v_size));
920
+ return Qnil;
921
+ }
922
+
923
+ /* */
924
+ static VALUE rb_libarchive_entry_unset_size(VALUE self) {
925
+ struct rb_libarchive_entry_container *p;
926
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
927
+ Check_Entry(p);
928
+ archive_entry_unset_size(p->ae);
929
+ return Qnil;
930
+ }
931
+
932
+ #if ARCHIVE_VERSION_NUMBER >= 2005003
933
+ /* */
934
+ static VALUE rb_libarchive_entry_copy_sourcepath(VALUE self, VALUE v_sourcepath) {
935
+ struct rb_libarchive_entry_container *p;
936
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
937
+ Check_Entry(p);
938
+ Check_Type(v_sourcepath, T_STRING);
939
+ archive_entry_copy_sourcepath(p->ae, RSTRING_PTR(v_sourcepath));
940
+ return Qnil;
941
+ }
942
+ #endif
943
+
944
+ /* */
945
+ static VALUE rb_libarchive_entry_set_symlink(VALUE self, VALUE v_symlink) {
946
+ struct rb_libarchive_entry_container *p;
947
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
948
+ Check_Entry(p);
949
+ Check_Type(v_symlink, T_STRING);
950
+ archive_entry_set_symlink(p->ae, RSTRING_PTR(v_symlink));
951
+ return Qnil;
952
+ }
953
+
954
+ /* */
955
+ static VALUE rb_libarchive_entry_copy_symlink(VALUE self, VALUE v_symlink) {
956
+ struct rb_libarchive_entry_container *p;
957
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
958
+ Check_Entry(p);
959
+ Check_Type(v_symlink, T_STRING);
960
+ archive_entry_copy_symlink(p->ae, RSTRING_PTR(v_symlink));
961
+ return Qnil;
962
+ }
963
+
964
+ /* */
965
+ static VALUE rb_libarchive_entry_set_uid(VALUE self, VALUE v_uid) {
966
+ struct rb_libarchive_entry_container *p;
967
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
968
+ Check_Entry(p);
969
+ Check_Type(v_uid, T_FIXNUM);
970
+ archive_entry_set_uid(p->ae, NUM2LONG(v_uid));
971
+ return Qnil;
972
+ }
973
+
974
+ /* */
975
+ static VALUE rb_libarchive_entry_set_uname(VALUE self, VALUE v_uname) {
976
+ struct rb_libarchive_entry_container *p;
977
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
978
+ Check_Entry(p);
979
+ Check_Type(v_uname, T_STRING);
980
+ archive_entry_set_uname(p->ae, RSTRING_PTR(v_uname));
981
+ return Qnil;
982
+ }
983
+
984
+ /* */
985
+ static VALUE rb_libarchive_entry_copy_uname(VALUE self, VALUE v_uname) {
986
+ struct rb_libarchive_entry_container *p;
987
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
988
+ Check_Entry(p);
989
+ Check_Type(v_uname, T_STRING);
990
+ archive_entry_copy_uname(p->ae, RSTRING_PTR(v_uname));
991
+ return Qnil;
992
+ }
993
+
994
+ /* */
995
+ static VALUE rb_libarchive_entry_copy_stat(VALUE self, VALUE v_filename) {
996
+ struct rb_libarchive_entry_container *p;
997
+ const char *filename;
998
+ struct stat s;
999
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1000
+ Check_Entry(p);
1001
+ Check_Type(v_filename, T_STRING);
1002
+ filename = RSTRING_PTR(v_filename);
1003
+
1004
+ if (stat(filename, &s) != 0) {
1005
+ rb_raise(rb_eArchiveError, "Copy stat failed: %", strerror(errno));
1006
+ }
1007
+
1008
+ archive_entry_copy_stat(p->ae, &s);
1009
+ return Qnil;
1010
+ }
1011
+
1012
+ /* */
1013
+ static VALUE rb_libarchive_entry_copy_lstat(VALUE self, VALUE v_filename) {
1014
+ struct rb_libarchive_entry_container *p;
1015
+ const char *filename;
1016
+ struct stat s;
1017
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1018
+ Check_Entry(p);
1019
+ Check_Type(v_filename, T_STRING);
1020
+ filename = RSTRING_PTR(v_filename);
1021
+
1022
+ if (lstat(filename, &s) != 0) {
1023
+ rb_raise(rb_eArchiveError, "Copy stat failed: %", strerror(errno));
1024
+ }
1025
+
1026
+ archive_entry_copy_stat(p->ae, &s);
1027
+ return Qnil;
1028
+ }
1029
+
1030
+ /* */
1031
+ static VALUE rb_libarchive_entry_xattr_clear(VALUE self) {
1032
+ struct rb_libarchive_entry_container *p;
1033
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1034
+ Check_Entry(p);
1035
+ archive_entry_xattr_clear(p->ae);
1036
+ return Qnil;
1037
+ }
1038
+
1039
+ /* */
1040
+ static VALUE rb_libarchive_entry_xattr_add_entry(VALUE self, VALUE v_name, VALUE v_value) {
1041
+ struct rb_libarchive_entry_container *p;
1042
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1043
+ Check_Entry(p);
1044
+ Check_Type(v_name, T_STRING);
1045
+ Check_Type(v_value, T_STRING);
1046
+ archive_entry_xattr_add_entry(p->ae, RSTRING_PTR(v_name), RSTRING_PTR(v_value), RSTRING_LEN(v_value));
1047
+ return Qnil;
1048
+ }
1049
+
1050
+ /* */
1051
+ static VALUE rb_libarchive_entry_xattr_count(VALUE self) {
1052
+ struct rb_libarchive_entry_container *p;
1053
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1054
+ Check_Entry(p);
1055
+ return INT2NUM(archive_entry_xattr_count(p->ae));
1056
+ }
1057
+
1058
+ /* */
1059
+ static VALUE rb_libarchive_entry_xattr_reset(VALUE self) {
1060
+ struct rb_libarchive_entry_container *p;
1061
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1062
+ Check_Entry(p);
1063
+ return INT2NUM(archive_entry_xattr_reset(p->ae));
1064
+ }
1065
+
1066
+ /* */
1067
+ static VALUE rb_libarchive_entry_xattr_next(VALUE self) {
1068
+ struct rb_libarchive_entry_container *p;
1069
+ const char *name;
1070
+ const void *value;
1071
+ size_t size;
1072
+ Data_Get_Struct(self, struct rb_libarchive_entry_container, p);
1073
+ Check_Entry(p);
1074
+
1075
+ if (archive_entry_xattr_next(p->ae, &name, &value, &size) != ARCHIVE_OK) {
1076
+ return Qnil;
1077
+ } else {
1078
+ return rb_ary_new3(3, rb_str_new2(name), rb_str_new(value, size));
1079
+ }
1080
+ }
1081
+
1082
+ void Init_libarchive_entry() {
1083
+ rb_cArchiveEntry = rb_define_class_under(rb_mArchive, "Entry", rb_cObject);
1084
+ rb_define_alloc_func(rb_cArchiveEntry, rb_libarchive_entry_alloc);
1085
+ rb_funcall(rb_cArchiveEntry, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("new")));
1086
+ rb_define_method(rb_cArchiveEntry, "close", rb_libarchive_entry_close, 0);
1087
+
1088
+ rb_define_method(rb_cArchiveEntry, "atime", rb_libarchive_entry_atime, 0);
1089
+ rb_define_method(rb_cArchiveEntry, "atime_nsec", rb_libarchive_entry_atime_nsec, 0);
1090
+ rb_define_method(rb_cArchiveEntry, "atime_is_set?", rb_libarchive_entry_atime_is_set, 0);
1091
+ rb_define_method(rb_cArchiveEntry, "birthtime", rb_libarchive_entry_birthtime, 0);
1092
+ rb_define_method(rb_cArchiveEntry, "birthtime_nsec", rb_libarchive_entry_birthtime_nsec, 0);
1093
+ rb_define_method(rb_cArchiveEntry, "birthtime_is_set?", rb_libarchive_entry_birthtime_is_set, 0);
1094
+ rb_define_method(rb_cArchiveEntry, "ctime", rb_libarchive_entry_ctime, 0);
1095
+ rb_define_method(rb_cArchiveEntry, "ctime_nsec", rb_libarchive_entry_ctime_nsec, 0);
1096
+ rb_define_method(rb_cArchiveEntry, "ctime_is_set?", rb_libarchive_entry_ctime_is_set, 0);
1097
+ rb_define_method(rb_cArchiveEntry, "dev", rb_libarchive_entry_dev, 0);
1098
+ rb_define_method(rb_cArchiveEntry, "devmajor", rb_libarchive_entry_devmajor, 0);
1099
+ rb_define_method(rb_cArchiveEntry, "devminor", rb_libarchive_entry_devminor, 0);
1100
+ rb_define_method(rb_cArchiveEntry, "filetype", rb_libarchive_entry_filetype, 0);
1101
+ rb_define_method(rb_cArchiveEntry, "directory?", rb_libarchive_entry_is_directory, 0);
1102
+ rb_define_method(rb_cArchiveEntry, "character_special?", rb_libarchive_entry_is_character_special, 0);
1103
+ rb_define_method(rb_cArchiveEntry, "block_special?", rb_libarchive_entry_is_block_special, 0);
1104
+ rb_define_method(rb_cArchiveEntry, "regular?", rb_libarchive_entry_is_regular, 0);
1105
+ rb_define_method(rb_cArchiveEntry, "symbolic_link?", rb_libarchive_entry_is_symbolic_link, 0);
1106
+ rb_define_method(rb_cArchiveEntry, "socket?", rb_libarchive_entry_is_socket, 0);
1107
+ rb_define_method(rb_cArchiveEntry, "fifo?", rb_libarchive_entry_is_fifo, 0);
1108
+ rb_define_method(rb_cArchiveEntry, "fflags", rb_libarchive_entry_fflags, 0);
1109
+ rb_define_method(rb_cArchiveEntry, "fflags_text", rb_libarchive_entry_fflags_text, 0);
1110
+ rb_define_method(rb_cArchiveEntry, "gid", rb_libarchive_entry_gid, 0);
1111
+ rb_define_method(rb_cArchiveEntry, "gname", rb_libarchive_entry_gname, 0);
1112
+ rb_define_method(rb_cArchiveEntry, "hardlink", rb_libarchive_entry_hardlink, 0);
1113
+ rb_define_method(rb_cArchiveEntry, "ino", rb_libarchive_entry_ino, 0);
1114
+ rb_define_method(rb_cArchiveEntry, "mode", rb_libarchive_entry_mode, 0);
1115
+ rb_define_method(rb_cArchiveEntry, "mtime", rb_libarchive_entry_mtime, 0);
1116
+ rb_define_method(rb_cArchiveEntry, "mtime_nsec", rb_libarchive_entry_mtime_nsec, 0);
1117
+ rb_define_method(rb_cArchiveEntry, "mtime_is_set?", rb_libarchive_entry_mtime_is_set, 0);
1118
+ rb_define_method(rb_cArchiveEntry, "nlink", rb_libarchive_entry_nlink, 0);
1119
+ rb_define_method(rb_cArchiveEntry, "pathname", rb_libarchive_entry_pathname, 0);
1120
+ rb_define_method(rb_cArchiveEntry, "rdev", rb_libarchive_entry_rdev, 0);
1121
+ rb_define_method(rb_cArchiveEntry, "rdevmajor", rb_libarchive_entry_rdevmajor, 0);
1122
+ rb_define_method(rb_cArchiveEntry, "rdevminor", rb_libarchive_entry_rdevminor, 0);
1123
+ #if ARCHIVE_VERSION_NUMBER >= 2005003
1124
+ rb_define_method(rb_cArchiveEntry, "sourcepath", rb_libarchive_entry_sourcepath, 0);
1125
+ #endif
1126
+ rb_define_method(rb_cArchiveEntry, "size", rb_libarchive_entry_size, 0);
1127
+ rb_define_method(rb_cArchiveEntry, "size_is_set?", rb_libarchive_entry_size_is_set, 0);
1128
+ #if ARCHIVE_VERSION_NUMBER >= 2003002
1129
+ rb_define_method(rb_cArchiveEntry, "strmode", rb_libarchive_entry_strmode, 0);
1130
+ #endif
1131
+ rb_define_method(rb_cArchiveEntry, "symlink", rb_libarchive_entry_symlink, 0);
1132
+ rb_define_method(rb_cArchiveEntry, "uid", rb_libarchive_entry_uid, 0);
1133
+ rb_define_method(rb_cArchiveEntry, "uname", rb_libarchive_entry_uname, 0);
1134
+
1135
+ rb_define_method(rb_cArchiveEntry, "atime=", rb_libarchive_entry_set_atime, 1);
1136
+ rb_define_method(rb_cArchiveEntry, "set_atime", rb_libarchive_entry_set_atime2, 2);
1137
+ rb_define_method(rb_cArchiveEntry, "unset_atime", rb_libarchive_entry_unset_atime, 0);
1138
+ rb_define_method(rb_cArchiveEntry, "birthtimee=", rb_libarchive_entry_set_birthtime, 1);
1139
+ rb_define_method(rb_cArchiveEntry, "set_birthtime", rb_libarchive_entry_set_birthtime2, 2);
1140
+ rb_define_method(rb_cArchiveEntry, "unset_birthtime", rb_libarchive_entry_unset_birthtime, 0);
1141
+ rb_define_method(rb_cArchiveEntry, "ctime=", rb_libarchive_entry_set_ctime, 1);
1142
+ rb_define_method(rb_cArchiveEntry, "set_ctime", rb_libarchive_entry_set_ctime2, 2);
1143
+ rb_define_method(rb_cArchiveEntry, "unset_ctime", rb_libarchive_entry_unset_ctime, 0);
1144
+ rb_define_method(rb_cArchiveEntry, "dev=", rb_libarchive_entry_set_dev, 1);
1145
+ rb_define_method(rb_cArchiveEntry, "devmajor=", rb_libarchive_entry_set_devmajor, 1);
1146
+ rb_define_method(rb_cArchiveEntry, "devminor=", rb_libarchive_entry_set_devminor, 1);
1147
+ rb_define_method(rb_cArchiveEntry, "filetype=", rb_libarchive_entry_set_filetype, 1);
1148
+ rb_define_method(rb_cArchiveEntry, "set_fflags", rb_libarchive_entry_set_fflags, 2);
1149
+ rb_define_method(rb_cArchiveEntry, "copy_fflags_text", rb_libarchive_entry_copy_fflags_text, 1);
1150
+ rb_define_method(rb_cArchiveEntry, "gid=", rb_libarchive_entry_set_gid, 1);
1151
+ rb_define_method(rb_cArchiveEntry, "gname=", rb_libarchive_entry_set_gname, 1);
1152
+ rb_define_method(rb_cArchiveEntry, "copy_gname", rb_libarchive_entry_copy_gname, 1);
1153
+ rb_define_method(rb_cArchiveEntry, "hardlink=", rb_libarchive_entry_set_hardlink, 1);
1154
+ rb_define_method(rb_cArchiveEntry, "copy_hardlink", rb_libarchive_entry_copy_hardlink, 1);
1155
+ rb_define_method(rb_cArchiveEntry, "ino=", rb_libarchive_entry_set_ino, 1);
1156
+ rb_define_method(rb_cArchiveEntry, "link=", rb_libarchive_entry_set_link, 1);
1157
+ rb_define_method(rb_cArchiveEntry, "copy_link", rb_libarchive_entry_copy_link, 1);
1158
+ rb_define_method(rb_cArchiveEntry, "mode=", rb_libarchive_entry_set_mode, 1);
1159
+ rb_define_method(rb_cArchiveEntry, "mtime=", rb_libarchive_entry_set_mtime, 1);
1160
+ rb_define_method(rb_cArchiveEntry, "set_mtime", rb_libarchive_entry_set_mtime2, 2);
1161
+ rb_define_method(rb_cArchiveEntry, "unset_mtime", rb_libarchive_entry_unset_mtime, 0);
1162
+ rb_define_method(rb_cArchiveEntry, "nlink=", rb_libarchive_entry_set_nlink, 1);
1163
+ rb_define_method(rb_cArchiveEntry, "pathname=", rb_libarchive_entry_set_pathname, 1);
1164
+ rb_define_method(rb_cArchiveEntry, "copy_pathname", rb_libarchive_entry_copy_pathname, 1);
1165
+ rb_define_method(rb_cArchiveEntry, "perm=", rb_libarchive_entry_set_perm, 1);
1166
+ rb_define_method(rb_cArchiveEntry, "rdev=", rb_libarchive_entry_set_rdev, 1);
1167
+ rb_define_method(rb_cArchiveEntry, "rdevmajor=", rb_libarchive_entry_set_rdevmajor, 1);
1168
+ rb_define_method(rb_cArchiveEntry, "rdevminor=", rb_libarchive_entry_set_rdevminor, 1);
1169
+ rb_define_method(rb_cArchiveEntry, "size=", rb_libarchive_entry_set_size, 1);
1170
+ rb_define_method(rb_cArchiveEntry, "unset_size", rb_libarchive_entry_unset_size, 0);
1171
+ #if ARCHIVE_VERSION_NUMBER >= 2005003
1172
+ rb_define_method(rb_cArchiveEntry, "copy_sourcepath", rb_libarchive_entry_copy_sourcepath, 1);
1173
+ #endif
1174
+ rb_define_method(rb_cArchiveEntry, "symlink=", rb_libarchive_entry_set_symlink, 1);
1175
+ rb_define_method(rb_cArchiveEntry, "copy_symlink", rb_libarchive_entry_copy_symlink, 1);
1176
+ rb_define_method(rb_cArchiveEntry, "uid=", rb_libarchive_entry_set_uid, 1);
1177
+ rb_define_method(rb_cArchiveEntry, "uname=", rb_libarchive_entry_set_uname, 1);
1178
+ rb_define_method(rb_cArchiveEntry, "copy_uname", rb_libarchive_entry_copy_uname, 1);
1179
+
1180
+ rb_define_method(rb_cArchiveEntry, "copy_stat", rb_libarchive_entry_copy_stat, 1);
1181
+ rb_define_method(rb_cArchiveEntry, "copy_lstat", rb_libarchive_entry_copy_lstat, 1);
1182
+
1183
+ rb_define_method(rb_cArchiveEntry, "xattr_clear", rb_libarchive_entry_xattr_clear, 0);
1184
+ rb_define_method(rb_cArchiveEntry, "xattr_add_entry", rb_libarchive_entry_xattr_add_entry, 2);
1185
+ rb_define_method(rb_cArchiveEntry, "xattr_count", rb_libarchive_entry_xattr_count, 0);
1186
+ rb_define_method(rb_cArchiveEntry, "xattr_reset", rb_libarchive_entry_xattr_reset, 0);
1187
+ rb_define_method(rb_cArchiveEntry, "xattr_next", rb_libarchive_entry_xattr_next, 0);
1188
+ }
1189
+ #include "libarchive_internal.h"
1190
+
1191
+ extern VALUE rb_mArchive;
1192
+ VALUE rb_cArchiveReader;
1193
+ extern VALUE rb_eArchiveError;
1194
+ extern VALUE rb_cArchiveEntry;
1195
+
1196
+ static void rb_libarchive_reader_close0(struct rb_libarchive_archive_container *p) {
1197
+ archive_read_close(p->ar);
1198
+ archive_read_finish(p->ar);
1199
+ p->ar = NULL;
1200
+ }
1201
+
1202
+ /* */
1203
+ static VALUE rb_libarchive_reader_close(VALUE self) {
1204
+ struct rb_libarchive_archive_container *p;
1205
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1206
+ Check_Archive(p);
1207
+ rb_libarchive_reader_close0(p);
1208
+ return Qnil;
1209
+ }
1210
+
1211
+ static VALUE rb_libarchive_reader_s_open0(int (*archive_open)(struct rb_libarchive_archive_container *, void *), void *arg, int compression, int format, const char *cmd) {
1212
+ VALUE reader;
1213
+ struct rb_libarchive_archive_container *p;
1214
+ int r;
1215
+ reader = rb_funcall(rb_cArchiveReader, rb_intern("new"), 0);
1216
+ Data_Get_Struct(reader, struct rb_libarchive_archive_container, p);
1217
+
1218
+ if ((p->ar = archive_read_new()) == NULL) {
1219
+ rb_raise(rb_eArchiveError, "Open reader failed: %s", strerror(errno));
1220
+ }
1221
+
1222
+ if (cmd != NULL) {
1223
+ r = archive_read_support_compression_program(p->ar, cmd);
1224
+ } else if (compression != -1) {
1225
+ r = archive_read_support_compression(p->ar, compression);
1226
+ } else {
1227
+ r = archive_read_support_compression_all(p->ar);
1228
+ }
1229
+
1230
+ if (r != ARCHIVE_OK) {
1231
+ char error_string[BUFSIZ];
1232
+ archive_copy_error_string(p->ar, error_string, BUFSIZ);
1233
+ rb_libarchive_reader_close0(p);
1234
+ rb_raise(rb_eArchiveError, "Support compression failed: %s", error_string);
1235
+ }
1236
+
1237
+ if (format != -1) {
1238
+ r = archive_read_support_format(p->ar, format);
1239
+ } else {
1240
+ r = archive_read_support_format_all(p->ar);
1241
+ }
1242
+
1243
+ if (r != ARCHIVE_OK) {
1244
+ char error_string[BUFSIZ];
1245
+ archive_copy_error_string(p->ar, error_string, BUFSIZ);
1246
+ rb_libarchive_reader_close0(p);
1247
+ rb_raise(rb_eArchiveError, "Support format failed: %s", error_string);
1248
+ }
1249
+
1250
+ if (archive_open(p, arg) != ARCHIVE_OK) {
1251
+ char error_string[BUFSIZ];
1252
+ archive_copy_error_string(p->ar, error_string, BUFSIZ);
1253
+ rb_libarchive_reader_close0(p);
1254
+ rb_raise(rb_eArchiveError, "Open reader failed: %s", error_string);
1255
+ }
1256
+
1257
+ if (rb_block_given_p()) {
1258
+ VALUE retval;
1259
+ int status;
1260
+ retval = rb_protect(rb_yield, reader, &status);
1261
+ rb_libarchive_reader_close0(p);
1262
+
1263
+ if (status != 0) {
1264
+ rb_jump_tag(status);
1265
+ }
1266
+
1267
+ return retval;
1268
+ } else {
1269
+ return reader;
1270
+ }
1271
+ }
1272
+
1273
+ static int rb_libarchive_reader_s_open_filename0(struct rb_libarchive_archive_container *p, void *arg) {
1274
+ const char *filename = (const char *) arg;
1275
+
1276
+ if (filename != NULL) {
1277
+ struct stat s;
1278
+
1279
+ if (stat(filename, &s) != 0) {
1280
+ archive_set_error(p->ar, -1, strerror(errno));
1281
+ return (ARCHIVE_FATAL);
1282
+ }
1283
+ }
1284
+
1285
+ return archive_read_open_filename(p->ar, filename, BLOCK_SIZE);
1286
+ }
1287
+
1288
+ /* */
1289
+ static VALUE rb_libarchive_reader_s_open_filename(int argc, VALUE *argv, VALUE self) {
1290
+ VALUE v_filename, v_compression, v_format;
1291
+ const char *filename = NULL;
1292
+ int compression = -1, format = -1;
1293
+ const char *cmd = NULL;
1294
+ rb_scan_args(argc, argv, "12", &v_filename, &v_compression, &v_format);
1295
+ Check_Type(v_filename, T_STRING);
1296
+ filename = RSTRING_PTR(v_filename);
1297
+
1298
+ if (T_STRING == TYPE(v_compression)) {
1299
+ compression = -1;
1300
+ cmd = RSTRING_PTR(v_compression);
1301
+ } else if (!NIL_P(v_compression)) {
1302
+ compression = NUM2INT(v_compression);
1303
+ }
1304
+
1305
+ if (!NIL_P(v_format)) {
1306
+ format = NUM2INT(v_format);
1307
+ }
1308
+
1309
+ return rb_libarchive_reader_s_open0(rb_libarchive_reader_s_open_filename0, (void *) filename, compression, format, cmd);
1310
+ }
1311
+
1312
+ static int rb_libarchive_reader_s_open_memory0(struct rb_libarchive_archive_container *p, void *arg) {
1313
+ VALUE v_buff = (VALUE) arg;
1314
+ return archive_read_open_memory(p->ar, RSTRING_PTR(v_buff), RSTRING_LEN(v_buff));
1315
+ }
1316
+
1317
+ /* */
1318
+ static VALUE rb_libarchive_reader_s_open_memory(int argc, VALUE *argv, VALUE self) {
1319
+ VALUE v_memory, v_compression, v_format;
1320
+ int compression = -1, format = -1;
1321
+ const char *cmd = NULL;
1322
+ rb_scan_args(argc, argv, "12", &v_memory, &v_compression, &v_format);
1323
+ Check_Type(v_memory, T_STRING);
1324
+
1325
+ if (T_STRING == TYPE(v_compression)) {
1326
+ compression = -1;
1327
+ cmd = RSTRING_PTR(v_compression);
1328
+ } else if (!NIL_P(v_compression)) {
1329
+ compression = NUM2INT(v_compression);
1330
+ }
1331
+
1332
+ if (!NIL_P(v_format)) {
1333
+ format = NUM2INT(v_format);
1334
+ }
1335
+
1336
+ return rb_libarchive_reader_s_open0(rb_libarchive_reader_s_open_memory0, (void *) v_memory, compression, format, cmd);
1337
+ }
1338
+
1339
+ /* */
1340
+ static VALUE rb_libarchive_reader_next_header(VALUE self) {
1341
+ struct rb_libarchive_archive_container *p;
1342
+ struct archive_entry *ae;
1343
+ int r;
1344
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1345
+ Check_Archive(p);
1346
+
1347
+ if (p->eof) {
1348
+ return Qnil;
1349
+ }
1350
+
1351
+ r = archive_read_next_header(p->ar, &ae);
1352
+
1353
+ if (r == ARCHIVE_EOF) {
1354
+ p->eof = 1;
1355
+ return Qnil;
1356
+ } else if (r != ARCHIVE_OK) {
1357
+ rb_raise(rb_eArchiveError, "Fetch entry failed: %s", archive_error_string(p->ar));
1358
+ }
1359
+
1360
+ return rb_libarchive_entry_new(ae, 0);
1361
+ }
1362
+
1363
+ /* */
1364
+ static VALUE rb_libarchive_reader_header_position(VALUE self) {
1365
+ struct rb_libarchive_archive_container *p;
1366
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1367
+ Check_Archive(p);
1368
+ return LONG2NUM((long) archive_read_header_position(p->ar));
1369
+ }
1370
+
1371
+ /* */
1372
+ static VALUE rb_libarchive_reader_read_data(int argc, VALUE *argv, VALUE self) {
1373
+ VALUE v_size;
1374
+ struct rb_libarchive_archive_container *p;
1375
+ char *buff;
1376
+ size_t size = DATA_BUFFER_SIZE;
1377
+ ssize_t n;
1378
+ rb_scan_args(argc, argv, "01", &v_size);
1379
+
1380
+ if (!NIL_P(v_size)) {
1381
+ size = NUM2INT(v_size);
1382
+ }
1383
+
1384
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1385
+ Check_Archive(p);
1386
+
1387
+ if (p->eof) {
1388
+ return Qnil;
1389
+ }
1390
+
1391
+ if (rb_block_given_p()) {
1392
+ ssize_t len = 0;
1393
+ int status = 0;
1394
+ buff = xmalloc(size);
1395
+
1396
+ while ((n = archive_read_data(p->ar, buff, size)) > 0) {
1397
+ rb_protect(rb_yield, rb_str_new(buff, n), &status);
1398
+
1399
+ if (status != 0) {
1400
+ break;
1401
+ }
1402
+
1403
+ len += n;
1404
+ }
1405
+
1406
+ xfree(buff);
1407
+
1408
+ if (status != 0) {
1409
+ rb_jump_tag(status);
1410
+ }
1411
+
1412
+ if (n < 0) {
1413
+ rb_raise(rb_eArchiveError, "Read data failed: %s", archive_error_string(p->ar));
1414
+ }
1415
+
1416
+ return LONG2NUM(len);
1417
+ } else {
1418
+ VALUE retval = rb_str_new("", 0);
1419
+ buff = xmalloc(size);
1420
+
1421
+ while ((n = archive_read_data(p->ar, buff, size)) > 0) {
1422
+ rb_str_cat(retval, buff, n);
1423
+ }
1424
+
1425
+ xfree(buff);
1426
+
1427
+ if (n < 0) {
1428
+ rb_raise(rb_eArchiveError, "Read data failed: %s", archive_error_string(p->ar));
1429
+ }
1430
+
1431
+ return retval;
1432
+ }
1433
+ }
1434
+
1435
+ /* */
1436
+ static VALUE rb_libarchive_reader_save_data(int argc, VALUE *argv, VALUE self) {
1437
+ VALUE v_filename, v_flags;
1438
+ struct rb_libarchive_archive_container *p;
1439
+ const char *filename;
1440
+ int flags, fd, r;
1441
+ rb_scan_args(argc, argv, "11", &v_filename, &v_flags);
1442
+ Check_Type(v_filename, T_STRING);
1443
+ filename = RSTRING_PTR(v_filename);
1444
+
1445
+ if (!NIL_P(v_flags)) {
1446
+ flags = ((O_WRONLY | NUM2INT(v_flags)) & O_FLAGS);
1447
+ } else {
1448
+ flags = (O_WRONLY | O_CREAT | O_EXCL
1449
+ #ifdef O_BINARY
1450
+ | O_BINARY
1451
+ #endif
1452
+ );
1453
+ }
1454
+
1455
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1456
+ Check_Archive(p);
1457
+
1458
+ if ((fd = open(filename, flags)) == -1) {
1459
+ rb_raise(rb_eArchiveError, "Save data failed: %s", strerror(errno));
1460
+ }
1461
+
1462
+ r = archive_read_data_into_fd(p->ar, fd);
1463
+ _close(fd);
1464
+
1465
+ if (r != ARCHIVE_OK) {
1466
+ rb_raise(rb_eArchiveError, "Save data failed: %s", archive_error_string(p->ar));
1467
+ }
1468
+
1469
+ return Qnil;
1470
+ }
1471
+
1472
+ /* */
1473
+ static VALUE rb_libarchive_reader_extract(int argc, VALUE *argv, VALUE self) {
1474
+ VALUE v_entry, v_flags;
1475
+ struct rb_libarchive_archive_container *pa;
1476
+ struct rb_libarchive_entry_container *pae;
1477
+ int flags = 0;
1478
+ rb_scan_args(argc, argv, "11", &v_entry, &v_flags);
1479
+ Check_Class(v_entry, rb_cArchiveEntry);
1480
+
1481
+ if (!NIL_P(v_flags)) {
1482
+ flags = (NUM2INT(v_flags) & EXTRACT_FLAGS);
1483
+ }
1484
+
1485
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, pa);
1486
+ Check_Archive(pa);
1487
+
1488
+ if (pa->eof) {
1489
+ rb_raise(rb_eArchiveError, "Extract archive failed: It has already reached EOF");
1490
+ }
1491
+
1492
+ Data_Get_Struct(v_entry, struct rb_libarchive_entry_container, pae);
1493
+ Check_Entry(pae);
1494
+
1495
+ if (archive_read_extract(pa->ar, pae->ae, flags) != ARCHIVE_OK) {
1496
+ rb_raise(rb_eArchiveError, "Extract archive failed: %s", archive_error_string(pa->ar));
1497
+ }
1498
+
1499
+ return Qnil;
1500
+ }
1501
+
1502
+ void Init_libarchive_reader() {
1503
+ rb_cArchiveReader = rb_define_class_under(rb_mArchive, "Reader", rb_cObject);
1504
+ rb_define_alloc_func(rb_cArchiveReader, rb_libarchive_archive_alloc);
1505
+ rb_funcall(rb_cArchiveReader, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("new")));
1506
+ rb_define_singleton_method(rb_cArchiveReader, "open_filename", rb_libarchive_reader_s_open_filename, -1);
1507
+ rb_define_module_function(rb_mArchive, "read_open_filename", rb_libarchive_reader_s_open_filename, -1);
1508
+ rb_define_singleton_method(rb_cArchiveReader, "open_memory", rb_libarchive_reader_s_open_memory, -1);
1509
+ rb_define_module_function(rb_mArchive, "read_open_memory", rb_libarchive_reader_s_open_memory, -1);
1510
+ rb_define_method(rb_cArchiveReader, "close", rb_libarchive_reader_close, 0);
1511
+ rb_define_method(rb_cArchiveReader, "next_header", rb_libarchive_reader_next_header, 0);
1512
+ rb_define_method(rb_cArchiveReader, "header_position", rb_libarchive_reader_header_position, 0);
1513
+ rb_define_method(rb_cArchiveReader, "read_data", rb_libarchive_reader_read_data, -1);
1514
+ rb_define_method(rb_cArchiveReader, "save_data", rb_libarchive_reader_save_data, -1);
1515
+ rb_define_method(rb_cArchiveReader, "extract", rb_libarchive_reader_extract, -1);
1516
+ }
1517
+ #include "libarchive_internal.h"
1518
+
1519
+ extern VALUE rb_mArchive;
1520
+ VALUE rb_cArchiveWriter;
1521
+ extern VALUE rb_eArchiveError;
1522
+ extern VALUE rb_cArchiveEntry;
1523
+
1524
+ static void rb_libarchive_writer_close0(struct rb_libarchive_archive_container *p) {
1525
+ archive_write_close(p->ar);
1526
+ archive_write_finish(p->ar);
1527
+ p->ar = NULL;
1528
+ }
1529
+
1530
+ /* */
1531
+ static VALUE rb_libarchive_writer_close(VALUE self) {
1532
+ struct rb_libarchive_archive_container *p;
1533
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1534
+ Check_Archive(p);
1535
+ rb_libarchive_writer_close0(p);
1536
+ return Qnil;
1537
+ }
1538
+
1539
+ static VALUE rb_libarchive_writer_s_open0(int (*archive_open)(struct rb_libarchive_archive_container *, void *), void *arg, int compression, int format, const char *cmd) {
1540
+ VALUE writer;
1541
+ struct rb_libarchive_archive_container *p;
1542
+ int r;
1543
+ writer = rb_funcall(rb_cArchiveWriter, rb_intern("new"), 0);
1544
+ Data_Get_Struct(writer, struct rb_libarchive_archive_container, p);
1545
+
1546
+ if ((p->ar = archive_write_new()) == NULL) {
1547
+ rb_raise(rb_eArchiveError, "Open writer failed: %s", strerror(errno));
1548
+ }
1549
+
1550
+ if (cmd != NULL) {
1551
+ r = archive_write_set_compression_program(p->ar, cmd);
1552
+ } else {
1553
+ r = archive_write_set_compression(p->ar, compression);
1554
+ }
1555
+
1556
+ if (r != ARCHIVE_OK) {
1557
+ char error_string[BUFSIZ];
1558
+ archive_copy_error_string(p->ar, error_string, BUFSIZ);
1559
+ rb_libarchive_writer_close0(p);
1560
+ rb_raise(rb_eArchiveError, "Set compression failed: %s", error_string);
1561
+ }
1562
+
1563
+ if (archive_write_set_format(p->ar, format) != ARCHIVE_OK) {
1564
+ char error_string[BUFSIZ];
1565
+ archive_copy_error_string(p->ar, error_string, BUFSIZ);
1566
+ rb_libarchive_writer_close0(p);
1567
+ rb_raise(rb_eArchiveError, "Set format failed: %s", error_string);
1568
+ }
1569
+
1570
+ if (archive_open(p, arg) != ARCHIVE_OK) {
1571
+ char error_string[BUFSIZ];
1572
+ archive_copy_error_string(p->ar, error_string, BUFSIZ);
1573
+ rb_libarchive_writer_close0(p);
1574
+ rb_raise(rb_eArchiveError, "Open writer failed: %s", error_string);
1575
+ }
1576
+
1577
+ if (rb_block_given_p()) {
1578
+ VALUE retval;
1579
+ int status;
1580
+ retval = rb_protect(rb_yield, writer, &status);
1581
+ rb_libarchive_writer_close0(p);
1582
+
1583
+ if (status != 0) {
1584
+ rb_jump_tag(status);
1585
+ }
1586
+
1587
+ return retval;
1588
+ } else {
1589
+ return writer;
1590
+ }
1591
+ }
1592
+
1593
+ static int rb_libarchive_writer_s_open_filename0(struct rb_libarchive_archive_container *p, void *arg) {
1594
+ const char *filename = (const char *) arg;
1595
+ return archive_write_open_filename(p->ar, filename);
1596
+ }
1597
+
1598
+ /* */
1599
+ static VALUE rb_libarchive_writer_s_open_filename(VALUE self, VALUE v_filename, VALUE v_compression, VALUE v_format) {
1600
+ const char *filename = NULL;
1601
+ int compression, format;
1602
+ const char *cmd = NULL;
1603
+ Check_Type(v_filename, T_STRING);
1604
+
1605
+ if (RSTRING_LEN(v_filename) < 1) {
1606
+ rb_raise(rb_eArchiveError, "Open writer failed: No such file or directory");
1607
+ }
1608
+
1609
+ filename = RSTRING_PTR(v_filename);
1610
+
1611
+ if (T_STRING == TYPE(v_compression)) {
1612
+ compression = -1;
1613
+ cmd = RSTRING_PTR(v_compression);
1614
+ } else {
1615
+ compression = NUM2INT(v_compression);
1616
+ }
1617
+
1618
+
1619
+ format = NUM2INT(v_format);
1620
+ return rb_libarchive_writer_s_open0(rb_libarchive_writer_s_open_filename0, (void *) filename, compression, format, cmd);
1621
+ }
1622
+
1623
+ static int rb_libarchive_writer_s_open_memory0(struct rb_libarchive_archive_container *p, void *arg) {
1624
+ VALUE str = (VALUE) arg;
1625
+ p->memory = str;
1626
+ return archive_write_open_rb_str(p->ar, str);
1627
+ }
1628
+
1629
+ /* */
1630
+ static VALUE rb_libarchive_writer_s_open_memory(VALUE self, VALUE v_memory, VALUE v_compression, VALUE v_format) {
1631
+ int compression, format;
1632
+ const char *cmd = NULL;
1633
+ Check_Type(v_memory, T_STRING);
1634
+
1635
+ if (T_STRING == TYPE(v_compression)) {
1636
+ compression = -1;
1637
+ cmd = RSTRING_PTR(v_compression);
1638
+ } else {
1639
+ compression = NUM2INT(v_compression);
1640
+ }
1641
+
1642
+ format = NUM2INT(v_format);
1643
+ return rb_libarchive_writer_s_open0(rb_libarchive_writer_s_open_memory0, (void *) v_memory, compression, format, cmd);
1644
+ }
1645
+
1646
+ /* */
1647
+ static VALUE rb_libarchive_writer_new_entry(VALUE self) {
1648
+ VALUE entry;
1649
+ struct rb_libarchive_archive_container *p;
1650
+ struct archive_entry *ae;
1651
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1652
+ Check_Archive(p);
1653
+
1654
+ if ((ae = archive_entry_new()) == NULL) {
1655
+ rb_raise(rb_eArchiveError, "New entry failed: %s", strerror(errno));
1656
+ }
1657
+
1658
+ entry = rb_libarchive_entry_new(ae, 1);
1659
+
1660
+ if (rb_block_given_p()) {
1661
+ VALUE retval;
1662
+ int status;
1663
+ retval = rb_protect(rb_yield, entry, &status);
1664
+ rb_libarchive_entry_close(entry);
1665
+
1666
+ if (status != 0) {
1667
+ rb_jump_tag(status);
1668
+ }
1669
+
1670
+ return retval;
1671
+ } else {
1672
+ return entry;
1673
+ }
1674
+ }
1675
+
1676
+ /* */
1677
+ static VALUE rb_libarchive_writer_write_header(VALUE self, VALUE v_entry) {
1678
+ struct rb_libarchive_archive_container *pa;
1679
+ struct rb_libarchive_entry_container *pae;
1680
+ Check_Class(v_entry, rb_cArchiveEntry);
1681
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, pa);
1682
+ Check_Archive(pa);
1683
+ Data_Get_Struct(v_entry, struct rb_libarchive_entry_container, pae);
1684
+ Check_Entry(pae);
1685
+
1686
+ if (archive_write_header(pa->ar, pae->ae) != ARCHIVE_OK) {
1687
+ rb_raise(rb_eArchiveError, "Write header failed: %s", archive_error_string(pa->ar));
1688
+ }
1689
+
1690
+ return Qnil;
1691
+ }
1692
+
1693
+ static ssize_t rb_libarchive_writer_write_data0(struct archive *ar, VALUE v_buff) {
1694
+ const char *buff;
1695
+ size_t size;
1696
+ ssize_t n;
1697
+
1698
+ if (NIL_P(v_buff)) {
1699
+ return 0;
1700
+ }
1701
+
1702
+ Check_Type(v_buff, T_STRING);
1703
+ buff = RSTRING_PTR(v_buff);
1704
+ size = RSTRING_LEN(v_buff);
1705
+
1706
+ if (size < 1) {
1707
+ return 0;
1708
+ }
1709
+
1710
+ if ((n = archive_write_data(ar, buff, size)) < 0) {
1711
+ rb_raise(rb_eArchiveError, "Write data failed: %s", archive_error_string(ar));
1712
+ }
1713
+
1714
+ return n;
1715
+ }
1716
+
1717
+ /* */
1718
+ static VALUE rb_libarchive_writer_write_data(int argc, VALUE *argv, VALUE self) {
1719
+ struct rb_libarchive_archive_container *p;
1720
+ Data_Get_Struct(self, struct rb_libarchive_archive_container, p);
1721
+ Check_Archive(p);
1722
+
1723
+ if (rb_block_given_p()) {
1724
+ ssize_t len = 0;
1725
+
1726
+ if (argc > 0) {
1727
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
1728
+ }
1729
+
1730
+ while(1) {
1731
+ VALUE retval;
1732
+ ssize_t n;
1733
+ retval = rb_yield(Qnil);
1734
+
1735
+ if ((n = rb_libarchive_writer_write_data0(p->ar, retval)) < 1) {
1736
+ return LONG2NUM(len);
1737
+ }
1738
+
1739
+ len += n;
1740
+ }
1741
+ } else {
1742
+ VALUE v_buff;
1743
+ ssize_t n;
1744
+ rb_scan_args(argc, argv, "10", &v_buff);
1745
+ n = rb_libarchive_writer_write_data0(p->ar, v_buff);
1746
+ return LONG2NUM(n);
1747
+ }
1748
+ }
1749
+
1750
+ void Init_libarchive_writer() {
1751
+ rb_cArchiveWriter = rb_define_class_under(rb_mArchive, "Writer", rb_cObject);
1752
+ rb_define_alloc_func(rb_cArchiveWriter, rb_libarchive_archive_alloc);
1753
+ rb_funcall(rb_cArchiveWriter, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("new")));
1754
+ rb_define_singleton_method(rb_cArchiveWriter, "open_filename", rb_libarchive_writer_s_open_filename, 3);
1755
+ rb_define_singleton_method(rb_mArchive, "write_open_filename", rb_libarchive_writer_s_open_filename, 3);
1756
+ rb_define_singleton_method(rb_cArchiveWriter, "open_memory", rb_libarchive_writer_s_open_memory, 3);
1757
+ rb_define_singleton_method(rb_mArchive, "write_open_memory", rb_libarchive_writer_s_open_memory, 3);
1758
+ rb_define_method(rb_cArchiveWriter, "close", rb_libarchive_writer_close, 0);
1759
+ rb_define_method(rb_cArchiveWriter, "new_entry", rb_libarchive_writer_new_entry, 0);
1760
+ rb_define_method(rb_cArchiveWriter, "write_header", rb_libarchive_writer_write_header, 1);
1761
+ rb_define_method(rb_cArchiveWriter, "write_data", rb_libarchive_writer_write_data, -1);
1762
+ }