Home | History | Annotate | Download | only in cpio

Lines Matching defs:cpio

67 #include "cpio.h"
92 static int entry_to_archive(struct cpio *, struct archive_entry *);
93 static int file_to_archive(struct cpio *, const char *);
95 static void list_item_verbose(struct cpio *, struct archive_entry *);
97 static const char *lookup_gname(struct cpio *, gid_t gid);
98 static int lookup_gname_helper(struct cpio *,
100 static const char *lookup_uname(struct cpio *, uid_t uid);
101 static int lookup_uname_helper(struct cpio *,
103 static __LA_NORETURN void mode_in(struct cpio *);
104 static __LA_NORETURN void mode_list(struct cpio *);
105 static void mode_out(struct cpio *);
106 static void mode_pass(struct cpio *, const char *);
108 static int restore_time(struct cpio *, struct archive_entry *,
118 struct cpio _cpio; /* Allocated on stack. */
119 struct cpio *cpio;
126 cpio = &_cpio;
127 memset(cpio, 0, sizeof(*cpio));
155 cpio->uid_override = -1;
156 cpio->uname_override = NULL;
157 cpio->gid_override = -1;
158 cpio->gname_override = NULL;
159 cpio->argv = argv;
160 cpio->argc = argc;
161 cpio->mode = '\0';
162 cpio->verbose = 0;
163 cpio->compress = '\0';
164 cpio->extract_flags = ARCHIVE_EXTRACT_NO_AUTODIR;
165 cpio->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
166 cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_SYMLINKS;
167 cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NODOTDOT;
168 cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS;
169 cpio->extract_flags |= ARCHIVE_EXTRACT_PERM;
170 cpio->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
171 cpio->extract_flags |= ARCHIVE_EXTRACT_ACL;
174 cpio->extract_flags |= ARCHIVE_EXTRACT_OWNER;
176 cpio->bytes_per_block = 512;
177 cpio->filename = NULL;
179 cpio->matching = archive_match_new();
180 if (cpio->matching == NULL)
183 while ((opt = cpio_getopt(cpio)) != -1) {
186 cpio->option_null = 1;
189 cpio->option_pwb = 1;
192 cpio->format = "bin";
195 cpio->option_append = 1;
198 cpio->option_atime_restore = 1;
201 cpio->bytes_per_block = 5120;
204 cpio->add_filter = opt;
209 t = strtol(cpio->argument, &tptr, 10);
210 if (errno || t <= 0 || t > INT_MAX || *(cpio->argument) == '\0' ||
213 cpio->argument);
215 cpio->bytes_per_block = (int)t;
218 cpio->format = "odc";
221 cpio->extract_flags &= ~ARCHIVE_EXTRACT_NO_AUTODIR;
225 cpio->matching, cpio->argument,
226 cpio->option_null) != ARCHIVE_OK)
228 archive_error_string(cpio->matching));
230 case 'F': /* NetBSD/OpenBSD/GNU cpio */
231 cpio->filename = cpio->argument;
234 if (archive_match_exclude_pattern(cpio->matching,
235 cpio->argument) != ARCHIVE_OK)
237 archive_error_string(cpio->matching));
240 cpio->compress = opt;
242 case 'H': /* GNU cpio (also --format) */
243 cpio->format = cpio->argument;
249 cpio->filename = cpio->argument;
252 if (cpio->mode != '\0' && cpio->mode != opt)
254 "Cannot use both -i and -%c", cpio->mode);
255 cpio->mode = opt;
258 cpio->compress = opt;
261 cpio->compress = opt;
264 cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_SYMLINKS;
265 cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT;
266 cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS;
268 case 'L': /* GNU cpio */
269 cpio->option_follow_links = 1;
272 cpio->option_link = 1;
279 cpio->compress = opt;
282 cpio->extract_flags |= ARCHIVE_EXTRACT_TIME;
284 case 'n': /* GNU cpio */
285 cpio->option_numeric_uid_gid = 1;
287 case OPTION_NO_PRESERVE_OWNER: /* GNU cpio */
288 cpio->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;
290 case 'O': /* GNU cpio */
291 cpio->filename = cpio->argument;
294 if (cpio->mode != '\0' && cpio->mode != opt)
296 "Cannot use both -o and -%c", cpio->mode);
297 cpio->mode = opt;
300 if (cpio->mode != '\0' && cpio->mode != opt)
302 "Cannot use both -p and -%c", cpio->mode);
303 cpio->mode = opt;
304 cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT;
305 cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS;
308 cpio->passphrase = cpio->argument;
311 cpio->extract_flags |= ARCHIVE_EXTRACT_OWNER;
313 case OPTION_QUIET: /* GNU cpio */
314 cpio->quiet = 1;
316 case 'R': /* GNU cpio, also --owner */
318 if (owner_parse(cpio->argument, &owner, &errmsg) != 0) {
325 cpio->uid_override = owner.uid;
327 free(cpio->uname_override);
328 cpio->uname_override = owner.uname;
331 cpio->gid_override = owner.gid;
333 free(cpio->gname_override);
334 cpio->gname_override = owner.gname;
338 cpio->option_rename = 1;
341 cpio->option_list = 1;
344 cpio->extract_flags
348 cpio->add_filter = opt;
351 cpio->verbose++;
353 case 'V': /* GNU cpio */
354 cpio->dot++;
368 cpio->compress = opt;
371 cpio->compress = opt;
374 cpio->compress = opt;
385 if (cpio->option_list && cpio->mode == '\0')
386 cpio->mode = 'i';
388 if (cpio->option_list && cpio->mode != 'i')
391 if (cpio->option_numeric_uid_gid && !cpio->option_list)
394 if (cpio->format != NULL && cpio->mode != 'o')
397 if (cpio->option_link && cpio->mode != 'p')
400 if (cpio->dot && cpio->verbose)
401 cpio->dot = 0;
404 switch (cpio->mode) {
406 if (cpio->format == NULL) {
407 if (cpio->option_pwb)
408 cpio->format = "pwb";
410 cpio->format = "cpio";
412 mode_out(cpio);
415 while (*cpio->argv != NULL) {
416 if (archive_match_include_pattern(cpio->matching,
417 *cpio->argv) != ARCHIVE_OK)
419 archive_error_string(cpio->matching));
420 --cpio->argc;
421 ++cpio->argv;
423 if (cpio->option_list)
424 mode_list(cpio);
426 mode_in(cpio);
429 if (*cpio->argv == NULL || **cpio->argv == '\0')
432 mode_pass(cpio, *cpio->argv);
439 archive_match_free(cpio->matching);
440 free_cache(cpio->uname_cache);
441 free(cpio->uname_override);
442 free_cache(cpio->gname_cache);
443 free(cpio->gname_override);
444 archive_read_close(cpio->archive_read_disk);
445 archive_read_free(cpio->archive_read_disk);
446 free(cpio->destdir);
448 passphrase_free(cpio->ppbuff);
449 return (cpio->return_value);
486 * if (cpio --help 2>&1 | grep bsdcpio >/dev/null 2>&1 ) then \
525 mode_out(struct cpio *cpio)
532 if (cpio->option_append)
535 cpio->archive_read_disk = archive_read_disk_new();
536 if (cpio->archive_read_disk == NULL)
538 if (cpio->option_follow_links)
539 archive_read_disk_set_symlink_logical(cpio->archive_read_disk);
541 archive_read_disk_set_symlink_physical(cpio->archive_read_disk);
542 archive_read_disk_set_standard_lookup(cpio->archive_read_disk);
544 cpio->archive = archive_write_new();
545 if (cpio->archive == NULL)
547 switch (cpio->compress) {
549 r = archive_write_add_filter_grzip(cpio->archive);
552 r = archive_write_add_filter_xz(cpio->archive);
555 r = archive_write_add_filter_lrzip(cpio->archive);
558 r = archive_write_add_filter_lz4(cpio->archive);
561 r = archive_write_add_filter_lzma(cpio->archive);
564 r = archive_write_add_filter_lzop(cpio->archive);
567 r = archive_write_add_filter_zstd(cpio->archive);
570 r = archive_write_add_filter_bzip2(cpio->archive);
573 r = archive_write_add_filter_gzip(cpio->archive);
576 r = archive_write_add_filter_compress(cpio->archive);
579 r = archive_write_add_filter_none(cpio->archive);
584 switch (cpio->add_filter) {
589 r = archive_write_add_filter_b64encode(cpio->archive);
592 r = archive_write_add_filter_uuencode(cpio->archive);
597 r = archive_write_set_format_by_name(cpio->archive, cpio->format);
599 lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
600 archive_write_set_bytes_per_block(cpio->archive, cpio->bytes_per_block);
601 cpio->linkresolver = archive_entry_linkresolver_new();
602 archive_entry_linkresolver_set_strategy(cpio->linkresolver,
603 archive_format(cpio->archive));
604 if (cpio->passphrase != NULL)
605 r = archive_write_set_passphrase(cpio->archive,
606 cpio->passphrase);
608 r = archive_write_set_passphrase_callback(cpio->archive, cpio,
611 lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
616 r = archive_write_open_filename(cpio->archive, cpio->filename);
618 lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
619 lr = lafe_line_reader("-", cpio->option_null);
621 file_to_archive(cpio, p);
629 archive_entry_linkify(cpio->linkresolver, &entry, &spare);
631 entry_to_archive(cpio, entry);
634 archive_entry_linkify(cpio->linkresolver, &entry, &spare);
637 r = archive_write_close(cpio->archive);
638 if (cpio->dot)
641 lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
643 if (!cpio->quiet) {
645 (archive_filter_bytes(cpio->archive, 0) + 511)
650 archive_write_free(cpio->archive);
651 archive_entry_linkresolver_free(cpio->linkresolver);
703 file_to_archive(struct cpio *cpio, const char *srcpath)
717 r = archive_read_disk_entry_from_file(cpio->archive_read_disk,
721 archive_error_string(cpio->archive_read_disk));
724 archive_error_string(cpio->archive_read_disk));
727 cpio->return_value = 1;
731 if (cpio->uid_override >= 0)
732 archive_entry_set_uid(entry, cpio->uid_override);
733 if (cpio->uname_override != NULL)
734 archive_entry_set_uname(entry, cpio->uname_override);
735 if (cpio->gid_override >= 0)
736 archive_entry_set_gid(entry, cpio->gid_override);
737 if (cpio->gname_override != NULL)
738 archive_entry_set_gname(entry, cpio->gname_override);
746 if (cpio->destdir) {
747 len = cpio->destdir_len + strlen(srcpath) + 8;
748 if (len >= cpio->pass_destpath_alloc) {
749 while (len >= cpio->pass_destpath_alloc) {
750 cpio->pass_destpath_alloc += 512;
751 cpio->pass_destpath_alloc *= 2;
753 free(cpio->pass_destpath);
754 cpio->pass_destpath = malloc(cpio->pass_destpath_alloc);
755 if (cpio->pass_destpath == NULL)
759 strcpy(cpio->pass_destpath, cpio->destdir);
760 strcat(cpio->pass_destpath, remove_leading_slash(srcpath));
761 archive_entry_set_pathname(entry, cpio->pass_destpath);
765 if (cpio->option_rename)
777 if (cpio->linkresolver != NULL
779 archive_entry_linkify(cpio->linkresolver, &entry, &spare);
783 r = entry_to_archive(cpio, entry);
787 r = entry_to_archive(cpio, spare);
795 entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
803 if (cpio->verbose)
805 if (cpio->dot)
814 * TODO: Test other cpio implementations to see if they
817 if (cpio->option_link
831 r = archive_write_header(cpio->archive, t);
834 lafe_warnc(archive_errno(cpio->archive),
835 "%s", archive_error_string(cpio->archive));
839 if (r != ARCHIVE_OK && archive_errno(cpio->archive) == EXDEV) {
865 r = archive_write_header(cpio->archive, entry);
868 lafe_warnc(archive_errno(cpio->archive),
871 archive_error_string(cpio->archive));
883 bytes_write = archive_write_data(cpio->archive,
886 lafe_errc(1, archive_errno(cpio->archive),
887 "%s", archive_error_string(cpio->archive));
897 fd = restore_time(cpio, entry, srcpath, fd);
900 if (cpio->verbose)
908 restore_time(struct cpio *cpio, struct archive_entry *entry,
914 (void)cpio; /* UNUSED */
929 if (!cpio->option_atime_restore)
964 mode_in(struct cpio *cpio)
975 r = archive_write_disk_set_options(ext, cpio->extract_flags);
983 if (cpio->option_pwb)
985 if (cpio->passphrase != NULL)
986 r = archive_read_add_passphrase(a, cpio->passphrase);
988 r = archive_read_set_passphrase_callback(a, cpio,
993 if (archive_read_open_filename(a, cpio->filename,
994 cpio->bytes_per_block))
1005 if (archive_match_path_excluded(cpio->matching, entry))
1007 if (cpio->option_rename)
1012 if (cpio->verbose)
1014 if (cpio->dot)
1016 if (cpio->uid_override >= 0)
1017 archive_entry_set_uid(entry, cpio->uid_override);
1018 if (cpio->uname_override != NULL)
1019 archive_entry_set_uname(entry, cpio->uname_override);
1020 if (cpio->gid_override >= 0)
1021 archive_entry_set_gid(entry, cpio->gid_override);
1022 if (cpio->gname_override != NULL)
1023 archive_entry_set_gname(entry, cpio->gname_override);
1029 cpio->return_value = 1;
1034 cpio->return_value = 1;
1038 if (cpio->dot)
1045 if (!cpio->quiet) {
1053 exit(cpio->return_value);
1087 mode_list(struct cpio *cpio)
1098 if (cpio->option_pwb)
1100 if (cpio->passphrase != NULL)
1101 r = archive_read_add_passphrase(a, cpio->passphrase);
1103 r = archive_read_set_passphrase_callback(a, cpio,
1108 if (archive_read_open_filename(a, cpio->filename,
1109 cpio->bytes_per_block))
1120 if (archive_match_path_excluded(cpio->matching, entry))
1122 if (cpio->verbose)
1123 list_item_verbose(cpio, entry);
1130 if (!cpio->quiet) {
1149 list_item_verbose(struct cpio *cpio, struct archive_entry *entry)
1167 if (cpio->option_numeric_uid_gid) {
1177 uname = lookup_uname(cpio, (uid_t)archive_entry_uid(entry));
1181 gname = lookup_gname(cpio, (uid_t)archive_entry_gid(entry));
1200 fmt = cpio->day_first ? "%d %b %Y" : "%b %d %Y";
1202 fmt = cpio->day_first ? "%d %b %H:%M" : "%b %d %H:%M";
1206 fmt = cpio->day_first ? "%e %b %Y" : "%b %e %Y";
1208 fmt = cpio->day_first ? "%e %b %H:%M" : "%b %e %H:%M";
1237 mode_pass(struct cpio *cpio, const char *destdir)
1244 cpio->destdir_len = strlen(destdir);
1245 cpio->destdir = malloc(cpio->destdir_len + 8);
1246 memcpy(cpio->destdir, destdir, cpio->destdir_len);
1247 if (cpio->destdir_len == 0 || destdir[cpio->destdir_len - 1] != '/')
1248 cpio->destdir[cpio->destdir_len++] = '/';
1249 cpio->destdir[cpio->destdir_len] = '\0';
1251 cpio->archive = archive_write_disk_new();
1252 if (cpio->archive == NULL)
1254 r = archive_write_disk_set_options(cpio->archive, cpio->extract_flags);
1256 lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
1257 cpio->linkresolver = archive_entry_linkresolver_new();
1258 archive_write_disk_set_standard_lookup(cpio->archive);
1260 cpio->archive_read_disk = archive_read_disk_new();
1261 if (cpio->archive_read_disk == NULL)
1263 if (cpio->option_follow_links)
1264 archive_read_disk_set_symlink_logical(cpio->archive_read_disk);
1266 archive_read_disk_set_symlink_physical(cpio->archive_read_disk);
1267 archive_read_disk_set_standard_lookup(cpio->archive_read_disk);
1269 lr = lafe_line_reader("-", cpio->option_null);
1271 file_to_archive(cpio, p);
1274 archive_entry_linkresolver_free(cpio->linkresolver);
1275 r = archive_write_close(cpio->archive);
1276 if (cpio->dot)
1279 lafe_errc(1, 0, "%s", archive_error_string(cpio->archive));
1281 if (!cpio->quiet) {
1283 (archive_filter_bytes(cpio->archive, 0) + 511)
1289 archive_write_free(cpio->archive);
1290 free(cpio->pass_destpath);
1297 * that an input of '.' means the name should be unchanged. GNU cpio
1372 lookup_name(struct cpio *cpio, struct name_cache **name_cache_variable,
1373 int (*lookup_fn)(struct cpio *, const char **, id_t), id_t id)
1401 if (lookup_fn(cpio, &name, id)) {
1422 lookup_uname(struct cpio *cpio, uid_t uid)
1424 return (lookup_name(cpio, &cpio->uname_cache,
1429 lookup_uname_helper(struct cpio *cpio, const char **name, id_t id)
1433 (void)cpio; /* UNUSED */
1449 lookup_gname(struct cpio *cpio, gid_t gid)
1451 return (lookup_name(cpio, &cpio->gname_cache,
1456 lookup_gname_helper(struct cpio *cpio, const char **name, id_t id)
1460 (void)cpio; /* UNUSED */
1504 struct cpio *cpio = (struct cpio *)_client_data;
1507 if (cpio->ppbuff == NULL) {
1508 cpio->ppbuff = malloc(PPBUFF_SIZE);
1509 if (cpio->ppbuff == NULL)
1513 cpio->ppbuff, PPBUFF_SIZE);