Lines Matching refs:bsdtar

77 #include "bsdtar.h"
96 static int append_archive(struct bsdtar *, struct archive *,
98 static int append_archive_filename(struct bsdtar *,
100 static void archive_names_from_file(struct bsdtar *bsdtar,
102 static int copy_file_data_block(struct bsdtar *,
107 static void report_write(struct bsdtar *, struct archive *,
109 static void test_for_append(struct bsdtar *);
112 static void write_archive(struct archive *, struct bsdtar *);
113 static void write_entry(struct bsdtar *, struct archive *,
115 static void write_file(struct bsdtar *, struct archive *,
117 static void write_hierarchy(struct bsdtar *, struct archive *,
141 set_writer_options(struct bsdtar *bsdtar, struct archive *a)
166 if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options))
171 set_reader_options(struct bsdtar *bsdtar, struct archive *a)
176 (void)bsdtar; /* UNUSED */
202 tar_mode_c(struct bsdtar *bsdtar)
208 if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL)
214 if (cset_get_format(bsdtar->cset) == NULL) {
216 cset_set_format(bsdtar->cset, "pax restricted");
219 cset_get_format(bsdtar->cset));
223 cset_get_format(bsdtar->cset),
228 archive_write_set_bytes_per_block(a, bsdtar->bytes_per_block);
229 archive_write_set_bytes_in_last_block(a, bsdtar->bytes_in_last_block);
231 r = cset_write_add_filters(bsdtar->cset, a, &filter_name);
237 set_writer_options(bsdtar, a);
238 if (bsdtar->passphrase != NULL)
239 r = archive_write_set_passphrase(a, bsdtar->passphrase);
241 r = archive_write_set_passphrase_callback(a, bsdtar,
245 if (ARCHIVE_OK != archive_write_open_filename(a, bsdtar->filename))
247 write_archive(a, bsdtar);
255 tar_mode_r(struct bsdtar *bsdtar)
264 test_for_append(bsdtar);
269 bsdtar->fd = open(bsdtar->filename, O_RDWR | O_CREAT | O_BINARY);
271 bsdtar->fd = open(bsdtar->filename, O_RDWR | O_CREAT | O_BINARY, 0666);
273 if (bsdtar->fd < 0)
275 "Cannot open %s", bsdtar->filename);
282 set_reader_options(bsdtar, a);
283 r = archive_read_open_fd(a, bsdtar->fd, 10240);
286 "Can't read archive %s: %s", bsdtar->filename,
291 close(bsdtar->fd);
312 if (cset_get_format(bsdtar->cset) != NULL) {
315 cset_get_format(bsdtar->cset));
322 cset_get_format(bsdtar->cset), bsdtar->filename);
333 if (lseek(bsdtar->fd, end_offset, SEEK_SET) < 0)
335 set_writer_options(bsdtar, a);
336 if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd))
339 write_archive(a, bsdtar); /* XXX check return val XXX */
341 close(bsdtar->fd);
342 bsdtar->fd = -1;
346 tar_mode_u(struct bsdtar *bsdtar)
355 bsdtar->archive_dir = &archive_dir;
361 test_for_append(bsdtar);
363 bsdtar->fd = open(bsdtar->filename, O_RDWR | O_BINARY);
364 if (bsdtar->fd < 0)
366 "Cannot open %s", bsdtar->filename);
372 set_reader_options(bsdtar, a);
373 if (archive_read_open_fd(a, bsdtar->fd, bsdtar->bytes_per_block)
376 "Can't open %s: %s", bsdtar->filename,
384 close(bsdtar->fd);
388 if (archive_match_exclude_entry(bsdtar->matching,
392 archive_error_string(bsdtar->matching));
407 archive_write_set_bytes_per_block(a, bsdtar->bytes_per_block);
408 archive_write_set_bytes_in_last_block(a, bsdtar->bytes_in_last_block);
410 if (lseek(bsdtar->fd, end_offset, SEEK_SET) < 0)
412 set_writer_options(bsdtar, a);
413 if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd))
416 write_archive(a, bsdtar);
418 close(bsdtar->fd);
419 bsdtar->fd = -1;
421 while (bsdtar->archive_dir->head != NULL) {
422 p = bsdtar->archive_dir->head->next;
423 free(bsdtar->archive_dir->head->name);
424 free(bsdtar->archive_dir->head);
425 bsdtar->archive_dir->head = p;
427 bsdtar->archive_dir->tail = NULL;
435 write_archive(struct archive *a, struct bsdtar *bsdtar)
441 bsdtar->buff_size = 64 * 1024;
442 while (bsdtar->buff_size < (size_t)bsdtar->bytes_per_block)
443 bsdtar->buff_size *= 2;
445 bsdtar->buff_size += 16 * 1024;
448 if ((bsdtar->buff = malloc(bsdtar->buff_size)) == NULL)
451 if ((bsdtar->resolver = archive_entry_linkresolver_new()) == NULL)
453 archive_entry_linkresolver_set_strategy(bsdtar->resolver,
457 if ((bsdtar->diskreader = archive_read_disk_new()) == NULL)
460 switch (bsdtar->symlink_mode) {
462 archive_read_disk_set_symlink_hybrid(bsdtar->diskreader);
465 archive_read_disk_set_symlink_logical(bsdtar->diskreader);
468 archive_read_disk_set_symlink_physical(bsdtar->diskreader);
472 archive_read_disk_set_matching(bsdtar->diskreader,
473 bsdtar->matching, excluded_callback, bsdtar);
475 bsdtar->diskreader, metadata_filter, bsdtar);
477 archive_read_disk_set_behavior(bsdtar->diskreader,
478 bsdtar->readdisk_flags);
479 archive_read_disk_set_standard_lookup(bsdtar->diskreader);
481 if (bsdtar->names_from_file != NULL)
482 archive_names_from_file(bsdtar, a);
484 while (*bsdtar->argv) {
485 arg = *bsdtar->argv;
489 bsdtar->argv++;
490 arg = *bsdtar->argv;
494 bsdtar->return_value = 1;
500 bsdtar->return_value = 1;
504 set_chdir(bsdtar, arg);
507 do_chdir(bsdtar); /* Handle a deferred -C */
509 if (append_archive_filename(bsdtar, a,
513 write_hierarchy(bsdtar, a, arg);
515 bsdtar->argv++;
518 archive_read_disk_set_matching(bsdtar->diskreader, NULL, NULL, NULL);
520 bsdtar->diskreader, NULL, NULL);
522 archive_entry_linkify(bsdtar->resolver, &entry, &sparse_entry);
526 struct archive *disk = bsdtar->diskreader;
530 * of the entry because the disk reader bsdtar->diskreader
542 bsdtar->return_value = 1;
558 bsdtar->return_value = 1;
563 write_file(bsdtar, a, entry);
568 archive_entry_linkify(bsdtar->resolver, &entry, &sparse_entry);
573 bsdtar->return_value = 1;
578 free(bsdtar->buff);
579 archive_entry_linkresolver_free(bsdtar->resolver);
580 bsdtar->resolver = NULL;
581 archive_read_free(bsdtar->diskreader);
582 bsdtar->diskreader = NULL;
584 if (bsdtar->flags & OPTFLAG_TOTALS) {
600 archive_names_from_file(struct bsdtar *bsdtar, struct archive *a)
605 bsdtar->next_line_is_dir = 0;
607 lr = lafe_line_reader(bsdtar->names_from_file,
608 (bsdtar->flags & OPTFLAG_NULL));
610 if (bsdtar->next_line_is_dir) {
612 set_chdir(bsdtar, line);
616 bsdtar->return_value = 1;
618 bsdtar->next_line_is_dir = 0;
619 } else if (((bsdtar->flags & OPTFLAG_NULL) == 0) &&
621 bsdtar->next_line_is_dir = 1;
624 do_chdir(bsdtar); /* Handle a deferred -C */
625 write_hierarchy(bsdtar, a, line);
629 if (bsdtar->next_line_is_dir)
639 * bsdtar->return_value but return zero, so the overall archiving
643 append_archive_filename(struct bsdtar *bsdtar, struct archive *a,
656 set_reader_options(bsdtar, ina);
658 if (bsdtar->passphrase != NULL)
659 rc = archive_read_add_passphrase(a, bsdtar->passphrase);
661 rc = archive_read_set_passphrase_callback(ina, bsdtar,
666 bsdtar->bytes_per_block)) {
668 bsdtar->return_value = 1;
672 rc = append_archive(bsdtar, a, ina);
677 bsdtar->return_value = 1;
685 append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina)
691 if (archive_match_excluded(bsdtar->matching, in_entry))
693 if ((bsdtar->flags & OPTFLAG_INTERACTIVE) &&
696 if (bsdtar->verbose > 1) {
698 list_item_verbose(bsdtar, stderr, in_entry);
699 } else if (bsdtar->verbose > 0)
703 report_write(bsdtar, a, in_entry, 0);
707 if (!bsdtar->verbose)
720 else if (copy_file_data_block(bsdtar, a, ina, in_entry))
724 if (bsdtar->verbose)
733 copy_file_data_block(struct bsdtar *bsdtar, struct archive *a,
746 report_write(bsdtar, a, entry, progress);
753 null_buff = bsdtar->buff;
754 memset(null_buff, 0, bsdtar->buff_size);
758 if (sparse > (int64_t)bsdtar->buff_size)
759 ns = bsdtar->buff_size;
810 struct bsdtar *bsdtar = (struct bsdtar *)_data;
812 if (bsdtar->flags & OPTFLAG_NO_SUBDIRS)
816 if ((bsdtar->flags & OPTFLAG_INTERACTIVE) &&
825 struct bsdtar *bsdtar = (struct bsdtar *)_data;
847 if ((bsdtar->flags & OPTFLAG_INTERACTIVE) &&
852 if (((bsdtar->flags & OPTFLAG_NO_SUBDIRS) == 0) &&
863 write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
865 struct archive *disk = bsdtar->diskreader;
873 bsdtar->return_value = 1;
876 bsdtar->first_fs = -1;
888 bsdtar->return_value = 1;
896 if (bsdtar->uid >= 0) {
897 archive_entry_set_uid(entry, bsdtar->uid);
898 if (!bsdtar->uname)
900 archive_read_disk_uname(bsdtar->diskreader,
901 bsdtar->uid));
903 if (bsdtar->gid >= 0) {
904 archive_entry_set_gid(entry, bsdtar->gid);
905 if (!bsdtar->gname)
907 archive_read_disk_gname(bsdtar->diskreader,
908 bsdtar->gid));
910 if (bsdtar->uname)
911 archive_entry_set_uname(entry, bsdtar->uname);
912 if (bsdtar->gname)
913 archive_entry_set_gname(entry, bsdtar->gname);
919 if (edit_pathname(bsdtar, entry))
923 if (bsdtar->verbose > 1) {
925 list_item_verbose(bsdtar, stderr, entry);
926 } else if (bsdtar->verbose > 0) {
936 archive_entry_linkify(bsdtar->resolver, &entry, &spare_entry);
939 write_file(bsdtar, a, entry);
945 if (bsdtar->verbose)
957 write_file(struct bsdtar *bsdtar, struct archive *a,
960 write_entry(bsdtar, a, entry);
967 write_entry(struct bsdtar *bsdtar, struct archive *a,
974 if (bsdtar->verbose > 1) {
976 list_item_verbose(bsdtar, stderr, entry);
978 } else if (bsdtar->verbose > 0) {
996 if (copy_file_data_block(bsdtar, a, bsdtar->diskreader, entry))
1002 report_write(struct bsdtar *bsdtar, struct archive *a,
1008 if (bsdtar->verbose)
1030 test_for_append(struct bsdtar *bsdtar)
1034 if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL)
1036 if (bsdtar->filename == NULL)
1039 if (stat(bsdtar->filename, &s) != 0)
1045 bsdtar->filename);