Class: Tar

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
ext/tarruby.c

Defined Under Namespace

Classes: Error

Constant Summary collapse

VERSION =
rb_str_new2(VERSION)
GNU =

use GNU extensions

INT2NUM(TAR_GNU)
VERBOSE =

output file info to stdout

INT2NUM(TAR_VERBOSE)
NOOVERWRITE =

don’t overwrite existing files

INT2NUM(TAR_NOOVERWRITE)
IGNORE_EOT =

ignore double zero blocks as EOF

INT2NUM(TAR_IGNORE_EOT)
CHECK_MAGIC =

check magic in file header

INT2NUM(TAR_CHECK_MAGIC)
CHECK_VERSION =

check version in file header

INT2NUM(TAR_CHECK_VERSION)
IGNORE_CRC =

ignore CRC in file header

INT2NUM(TAR_IGNORE_CRC)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.bzopen(*args) ⇒ Object



243
244
245
# File 'ext/tarruby.c', line 243

static VALUE tarruby_s_bzopen(int argc, VALUE *argv, VALUE self) {
  return tarruby_s_open0(argc, argv, self, &bztype);
}

.gzopen(*args) ⇒ Object



236
237
238
# File 'ext/tarruby.c', line 236

static VALUE tarruby_s_gzopen(int argc, VALUE *argv, VALUE self) {
  return tarruby_s_open0(argc, argv, self, &gztype);
}

.open(*args) ⇒ Object

ignore CRC in file header



230
231
232
# File 'ext/tarruby.c', line 230

static VALUE tarruby_s_open(int argc, VALUE *argv, VALUE self) {
  return tarruby_s_open0(argc, argv, self, NULL);
}

Instance Method Details

#append_buffer(savename, buffer) ⇒ Object



282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
# File 'ext/tarruby.c', line 282

static VALUE tarruby_append_buffer(VALUE self, VALUE savename, VALUE buffer) {
  struct tarruby_tar *p_tar;
  char *s_savename, *s_buffer;
  int i_size;

  Check_Type(savename, T_STRING);
  Check_Type(buffer, T_STRING);
  s_savename = RSTRING_PTR(savename);
  strip_sep(s_savename);
  s_buffer = RSTRING_PTR(buffer);
  i_size = RSTRING_LEN(buffer);

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  if (tar_append_function(p_tar->tar, s_savename, i_size, (void *) &s_buffer, tarruby_append_buffer0) != 0) {
    rb_raise(Error, "Append buffer failed: %s", strerror(errno));
  }

  return Qnil;
}

#append_file(*args) ⇒ Object



249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# File 'ext/tarruby.c', line 249

static VALUE tarruby_append_file(int argc, VALUE *argv, VALUE self) {
  VALUE realname, savename;
  struct tarruby_tar *p_tar;
  char *s_realname, *s_savename = NULL;

  rb_scan_args(argc, argv, "11", &realname, &savename);
  Check_Type(realname, T_STRING);
  s_realname = RSTRING_PTR(realname);
  strip_sep(s_realname);

  if (!NIL_P(savename)) {
    Check_Type(savename, T_STRING);
    s_savename = RSTRING_PTR(savename);
    strip_sep(s_savename);
  }

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  if (tar_append_file(p_tar->tar, s_realname, s_savename) != 0) {
    rb_raise(Error, "Append file failed: %s", strerror(errno));
  }

  return Qnil;
}

#append_tree(*args) ⇒ Object



304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
# File 'ext/tarruby.c', line 304

static VALUE tarruby_append_tree(int argc, VALUE *argv, VALUE self) {
  VALUE realdir, savedir;
  struct tarruby_tar *p_tar;
  char *s_realdir, *s_savedir = NULL;
  int result = -1;

  rb_scan_args(argc, argv, "11", &realdir, &savedir);
  Check_Type(realdir, T_STRING);
  s_realdir = RSTRING_PTR(realdir);
  strip_sep(s_realdir);

  if (!NIL_P(savedir)) {
    Check_Type(savedir, T_STRING);
    s_savedir = RSTRING_PTR(savedir);
    strip_sep(s_savedir);
  }

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  TRAP_BEG;
  result = tar_append_tree(p_tar->tar, s_realdir, s_savedir);
  TRAP_END;

  if (result != 0) {
    rb_raise(Error, "Append tree failed: %s", strerror(errno));
  }

  return Qnil;
}

#blk?Boolean

Returns:

  • (Boolean)


611
612
613
614
615
616
617
# File 'ext/tarruby.c', line 611

static VALUE tarruby_is_blk(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  return TH_ISBLK(p_tar->tar) ? Qtrue : Qfalse;
}

#chr?Boolean

Returns:

  • (Boolean)


602
603
604
605
606
607
608
# File 'ext/tarruby.c', line 602

static VALUE tarruby_is_chr(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  return TH_ISCHR(p_tar->tar) ? Qtrue : Qfalse;
}

#closeObject



188
189
190
# File 'ext/tarruby.c', line 188

static VALUE tarruby_close(VALUE self) {
  return tarruby_close0(self, 1);
}

#crcObject



485
486
487
488
489
# File 'ext/tarruby.c', line 485

static VALUE tarruby_crc(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return INT2NUM(th_get_crc(p_tar->tar));
}

#devmajorObject



506
507
508
509
510
# File 'ext/tarruby.c', line 506

static VALUE tarruby_devmajor(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return INT2NUM(th_get_devmajor(p_tar->tar));
}

#devminorObject



513
514
515
516
517
# File 'ext/tarruby.c', line 513

static VALUE tarruby_devminor(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return INT2NUM(th_get_devminor(p_tar->tar));
}

#dir?Boolean

Returns:

  • (Boolean)


620
621
622
623
624
625
626
# File 'ext/tarruby.c', line 620

static VALUE tarruby_is_dir(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  return TH_ISDIR(p_tar->tar) ? Qtrue : Qfalse;
}

#eachObject



464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
# File 'ext/tarruby.c', line 464

static VALUE tarruby_each(VALUE self) {
  struct tarruby_tar *p_tar;
  int i;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  tarruby_skip_regfile_if_not_extracted(p_tar);

  while ((i = th_read(p_tar->tar)) == 0) {
    p_tar->extracted = 0;
    rb_yield(self);
    tarruby_skip_regfile_if_not_extracted(p_tar);
  }

  if (i == -1) {
    rb_raise(Error, "Read archive failed: %s", strerror(errno));
  }

  return Qnil;
}

#extract_all(*args) ⇒ Object



408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
# File 'ext/tarruby.c', line 408

static VALUE tarruby_extract_all(int argc, VALUE *argv, VALUE self) {
  VALUE prefix;
  struct tarruby_tar *p_tar;
  char *s_prefix = NULL;
  int result = -1;

  rb_scan_args(argc, argv, "01", &prefix);

  if (!NIL_P(prefix)) {
    Check_Type(prefix, T_STRING);
    s_prefix = RSTRING_PTR(prefix);
  }

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  TRAP_BEG;
  result = tar_extract_all(p_tar->tar, s_prefix);
  TRAP_END;

  if (result != 0) {
    rb_raise(Error, "Extract archive failed: %s", strerror(errno));
  }

  p_tar->extracted = 1;

  return Qnil;
}

#extract_bufferObject



359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
# File 'ext/tarruby.c', line 359

static VALUE tarruby_extract_buffer(VALUE self) {
  VALUE buffer;
  struct tarruby_tar *p_tar;
  int i;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  buffer = rb_str_new("", 0);

  if ((i = tar_extract_function(p_tar->tar, (void *) buffer,  tarruby_extract_buffer0)) == -1) {
    rb_raise(Error, "Extract buffer failed: %s", strerror(errno));
  }

  p_tar->extracted = 1;

  return (i == 0) ? buffer : Qnil;
}

#extract_file(realname) ⇒ Object



335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
# File 'ext/tarruby.c', line 335

static VALUE tarruby_extract_file(VALUE self, VALUE realname) {
  struct tarruby_tar *p_tar;
  char *s_realname;

  Check_Type(realname, T_STRING);
  s_realname = RSTRING_PTR(realname);
  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  if (tar_extract_file(p_tar->tar, s_realname) != 0) {
    rb_raise(Error, "Extract file failed: %s", strerror(errno));
  }

  p_tar->extracted = 1;

  return Qnil;
}

#extract_glob(*args) ⇒ Object



377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
# File 'ext/tarruby.c', line 377

static VALUE tarruby_extract_glob(int argc, VALUE *argv, VALUE self) {
  VALUE globname, prefix;
  struct tarruby_tar *p_tar;
  char *s_globname, *s_prefix = NULL;
  int result = -1;

  rb_scan_args(argc, argv, "11", &globname, &prefix);
  Check_Type(globname, T_STRING);
  s_globname = RSTRING_PTR(globname);

  if (!NIL_P(prefix)) {
    Check_Type(prefix, T_STRING);
    s_prefix = RSTRING_PTR(prefix);
  }

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  TRAP_BEG;
  result = tar_extract_glob(p_tar->tar, s_globname, s_prefix);
  TRAP_END;

  if (result != 0) {
    rb_raise(Error, "Extract archive failed: %s", strerror(errno));
  }

  p_tar->extracted = 1;

  return Qnil;
}

#fifo?Boolean

Returns:

  • (Boolean)


629
630
631
632
633
634
635
# File 'ext/tarruby.c', line 629

static VALUE tarruby_is_fifo(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  return TH_ISFIFO(p_tar->tar) ? Qtrue : Qfalse;
}

#gidObject



548
549
550
551
552
# File 'ext/tarruby.c', line 548

static VALUE tarruby_gid(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return LONG2NUM(th_get_gid(p_tar->tar));
}

#linknameObject



520
521
522
523
524
# File 'ext/tarruby.c', line 520

static VALUE tarruby_linkname(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return rb_str_new2(th_get_linkname(p_tar->tar));
}

#lnk?Boolean

Returns:

  • (Boolean)


584
585
586
587
588
589
590
# File 'ext/tarruby.c', line 584

static VALUE tarruby_is_lnk(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  return TH_ISLNK(p_tar->tar) ? Qtrue : Qfalse;
}

#longlink?Boolean

Returns:

  • (Boolean)


647
648
649
650
651
652
653
# File 'ext/tarruby.c', line 647

static VALUE tarruby_is_longlink(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  return TH_ISLONGLINK(p_tar->tar) ? Qtrue : Qfalse;
}

#longname?Boolean

Returns:

  • (Boolean)


638
639
640
641
642
643
644
# File 'ext/tarruby.c', line 638

static VALUE tarruby_is_longname(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  return TH_ISLONGNAME(p_tar->tar) ? Qtrue : Qfalse;
}

#modeObject



534
535
536
537
538
# File 'ext/tarruby.c', line 534

static VALUE tarruby_mode(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return LONG2NUM(th_get_mode(p_tar->tar));
}

#mtimeObject



499
500
501
502
503
# File 'ext/tarruby.c', line 499

static VALUE tarruby_mtime(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return INT2TIME(th_get_mtime(p_tar->tar));
}

#pathnameObject



527
528
529
530
531
# File 'ext/tarruby.c', line 527

static VALUE tarruby_pathname(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return rb_str_new2(th_get_pathname(p_tar->tar));
}


555
556
557
558
559
560
561
562
# File 'ext/tarruby.c', line 555

static VALUE tarruby_print(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  th_print(p_tar->tar);

  return Qnil;
}


565
566
567
568
569
570
571
572
# File 'ext/tarruby.c', line 565

static VALUE tarruby_print_long_ls(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  th_print_long_ls(p_tar->tar);

  return Qnil;
}

#readObject



447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
# File 'ext/tarruby.c', line 447

static VALUE tarruby_read(VALUE self) {
  struct tarruby_tar *p_tar;
  int i;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  tarruby_skip_regfile_if_not_extracted(p_tar);

  if ((i = th_read(p_tar->tar)) == -1) {
    rb_raise(Error, "Read archive failed: %s", strerror(errno));
  }

  p_tar->extracted = 0;

  return (i == 0) ? Qtrue : Qfalse;
}

#reg?Boolean

Returns:

  • (Boolean)


575
576
577
578
579
580
581
# File 'ext/tarruby.c', line 575

static VALUE tarruby_is_reg(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  return TH_ISREG(p_tar->tar) ? Qtrue : Qfalse;
}

#sizeObject



492
493
494
495
496
# File 'ext/tarruby.c', line 492

static VALUE tarruby_size(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return INT2NUM(th_get_size(p_tar->tar));
}

#sym?Boolean

Returns:

  • (Boolean)


593
594
595
596
597
598
599
# File 'ext/tarruby.c', line 593

static VALUE tarruby_is_sym(VALUE self) {
  struct tarruby_tar *p_tar;

  Data_Get_Struct(self, struct tarruby_tar, p_tar);

  return TH_ISSYM(p_tar->tar) ? Qtrue : Qfalse;
}

#uidObject



541
542
543
544
545
# File 'ext/tarruby.c', line 541

static VALUE tarruby_uid(VALUE self) {
  struct tarruby_tar *p_tar;
  Data_Get_Struct(self, struct tarruby_tar, p_tar);
  return LONG2NUM(th_get_uid(p_tar->tar));
}