2 * Copyright (c) 2003-2007 Tim Kientzle
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer
10 * in this position and unchanged.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "cpio_platform.h"
29 __FBSDID("$FreeBSD: src/usr.bin/cpio/cpio.c,v 1.15 2008/12/06 07:30:40 kientzle Exp $");
31 #include <sys/types.h>
33 #include <archive_entry.h>
35 #ifdef HAVE_SYS_MKDEV_H
36 #include <sys/mkdev.h>
38 #ifdef HAVE_SYS_STAT_H
41 #ifdef HAVE_SYS_TIME_H
72 #ifdef HAVE_SYS_TIME_H
81 #include "line_reader.h"
84 /* Fixed size of uname/gname caches. */
85 #define name_cache_size 101
98 } cache
[name_cache_size
];
101 static int extract_data(struct archive
*, struct archive
*);
102 const char * cpio_i64toa(int64_t);
103 static const char *cpio_rename(const char *name
);
104 static int entry_to_archive(struct cpio
*, struct archive_entry
*);
105 static int file_to_archive(struct cpio
*, const char *);
106 static void free_cache(struct name_cache
*cache
);
107 static void list_item_verbose(struct cpio
*, struct archive_entry
*);
108 static void long_help(void);
109 static const char *lookup_gname(struct cpio
*, gid_t gid
);
110 static int lookup_gname_helper(struct cpio
*,
111 const char **name
, id_t gid
);
112 static const char *lookup_uname(struct cpio
*, uid_t uid
);
113 static int lookup_uname_helper(struct cpio
*,
114 const char **name
, id_t uid
);
115 static void mode_in(struct cpio
*);
116 static void mode_list(struct cpio
*);
117 static void mode_out(struct cpio
*);
118 static void mode_pass(struct cpio
*, const char *);
119 static int restore_time(struct cpio
*, struct archive_entry
*,
120 const char *, int fd
);
121 static void usage(void);
122 static void version(void);
125 main(int argc
, char *argv
[])
127 static char buff
[16384];
128 struct cpio _cpio
; /* Allocated on stack. */
135 memset(cpio
, 0, sizeof(*cpio
));
137 cpio
->buff_size
= sizeof(buff
);
139 /* Need lafe_progname before calling lafe_warnc. */
141 lafe_progname
= "bsdcpio";
143 #if defined(_WIN32) && !defined(__CYGWIN__)
144 lafe_progname
= strrchr(*argv
, '\\');
146 lafe_progname
= strrchr(*argv
, '/');
148 if (lafe_progname
!= NULL
)
151 lafe_progname
= *argv
;
154 cpio
->uid_override
= -1;
155 cpio
->gid_override
= -1;
160 cpio
->compress
= '\0';
161 cpio
->extract_flags
= ARCHIVE_EXTRACT_NO_AUTODIR
;
162 cpio
->extract_flags
|= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER
;
163 cpio
->extract_flags
|= ARCHIVE_EXTRACT_SECURE_SYMLINKS
;
164 cpio
->extract_flags
|= ARCHIVE_EXTRACT_SECURE_NODOTDOT
;
165 cpio
->extract_flags
|= ARCHIVE_EXTRACT_PERM
;
166 cpio
->extract_flags
|= ARCHIVE_EXTRACT_FFLAGS
;
167 cpio
->extract_flags
|= ARCHIVE_EXTRACT_ACL
;
168 #if !defined(_WIN32) && !defined(__CYGWIN__)
170 cpio
->extract_flags
|= ARCHIVE_EXTRACT_OWNER
;
172 cpio
->bytes_per_block
= 512;
173 cpio
->filename
= NULL
;
175 while ((opt
= cpio_getopt(cpio
)) != -1) {
177 case '0': /* GNU convention: --null, -0 */
178 cpio
->option_null
= 1;
180 case 'A': /* NetBSD/OpenBSD */
181 cpio
->option_append
= 1;
183 case 'a': /* POSIX 1997 */
184 cpio
->option_atime_restore
= 1;
186 case 'B': /* POSIX 1997 */
187 cpio
->bytes_per_block
= 5120;
189 case 'C': /* NetBSD/OpenBSD */
190 cpio
->bytes_per_block
= atoi(cpio
->optarg
);
191 if (cpio
->bytes_per_block
<= 0)
192 lafe_errc(1, 0, "Invalid blocksize %s", cpio
->optarg
);
194 case 'c': /* POSIX 1997 */
195 cpio
->format
= "odc";
197 case 'd': /* POSIX 1997 */
198 cpio
->extract_flags
&= ~ARCHIVE_EXTRACT_NO_AUTODIR
;
200 case 'E': /* NetBSD/OpenBSD */
201 lafe_include_from_file(&cpio
->matching
,
202 cpio
->optarg
, cpio
->option_null
);
204 case 'F': /* NetBSD/OpenBSD/GNU cpio */
205 cpio
->filename
= cpio
->optarg
;
207 case 'f': /* POSIX 1997 */
208 lafe_exclude(&cpio
->matching
, cpio
->optarg
);
210 case 'H': /* GNU cpio (also --format) */
211 cpio
->format
= cpio
->optarg
;
216 case 'I': /* NetBSD/OpenBSD */
217 cpio
->filename
= cpio
->optarg
;
219 case 'i': /* POSIX 1997 */
220 if (cpio
->mode
!= '\0')
222 "Cannot use both -i and -%c", cpio
->mode
);
225 case 'J': /* GNU tar, others */
226 cpio
->compress
= opt
;
228 case 'j': /* GNU tar, others */
229 cpio
->compress
= opt
;
231 case OPTION_INSECURE
:
232 cpio
->extract_flags
&= ~ARCHIVE_EXTRACT_SECURE_SYMLINKS
;
233 cpio
->extract_flags
&= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT
;
235 case 'L': /* GNU cpio */
236 cpio
->option_follow_links
= 1;
238 case 'l': /* POSIX 1997 */
239 cpio
->option_link
= 1;
241 case OPTION_LZMA
: /* GNU tar, others */
242 cpio
->compress
= opt
;
244 case 'm': /* POSIX 1997 */
245 cpio
->extract_flags
|= ARCHIVE_EXTRACT_TIME
;
247 case 'n': /* GNU cpio */
248 cpio
->option_numeric_uid_gid
= 1;
250 case OPTION_NO_PRESERVE_OWNER
: /* GNU cpio */
251 cpio
->extract_flags
&= ~ARCHIVE_EXTRACT_OWNER
;
253 case 'O': /* GNU cpio */
254 cpio
->filename
= cpio
->optarg
;
256 case 'o': /* POSIX 1997 */
257 if (cpio
->mode
!= '\0')
259 "Cannot use both -o and -%c", cpio
->mode
);
262 case 'p': /* POSIX 1997 */
263 if (cpio
->mode
!= '\0')
265 "Cannot use both -p and -%c", cpio
->mode
);
267 cpio
->extract_flags
&= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT
;
269 case OPTION_PRESERVE_OWNER
:
270 cpio
->extract_flags
|= ARCHIVE_EXTRACT_OWNER
;
272 case OPTION_QUIET
: /* GNU cpio */
275 case 'R': /* GNU cpio, also --owner */
276 errmsg
= owner_parse(cpio
->optarg
, &uid
, &gid
);
278 lafe_warnc(-1, "%s", errmsg
);
282 cpio
->uid_override
= uid
;
284 cpio
->gid_override
= gid
;
286 case 'r': /* POSIX 1997 */
287 cpio
->option_rename
= 1;
289 case 't': /* POSIX 1997 */
290 cpio
->option_list
= 1;
292 case 'u': /* POSIX 1997 */
294 &= ~ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER
;
296 case 'v': /* POSIX 1997 */
299 case OPTION_VERSION
: /* GNU convention */
304 * cpio_getopt() handles -W specially, so it's not
307 case 'W': /* Obscure, but useful GNU convention. */
310 case 'y': /* tar convention */
311 cpio
->compress
= opt
;
313 case 'Z': /* tar convention */
314 cpio
->compress
= opt
;
316 case 'z': /* tar convention */
317 cpio
->compress
= opt
;
325 * Sanity-check args, error out on nonsensical combinations.
327 /* -t implies -i if no mode was specified. */
328 if (cpio
->option_list
&& cpio
->mode
== '\0')
331 if (cpio
->option_list
&& cpio
->mode
!= 'i')
332 lafe_errc(1, 0, "Option -t requires -i");
333 /* -n requires -it */
334 if (cpio
->option_numeric_uid_gid
&& !cpio
->option_list
)
335 lafe_errc(1, 0, "Option -n requires -it");
336 /* Can only specify format when writing */
337 if (cpio
->format
!= NULL
&& cpio
->mode
!= 'o')
338 lafe_errc(1, 0, "Option --format requires -o");
340 if (cpio
->option_link
&& cpio
->mode
!= 'p')
341 lafe_errc(1, 0, "Option -l requires -p");
342 /* TODO: Flag other nonsensical combinations. */
344 switch (cpio
->mode
) {
346 /* TODO: Implement old binary format in libarchive,
348 if (cpio
->format
== NULL
)
349 cpio
->format
= "odc"; /* Default format */
354 while (*cpio
->argv
!= NULL
) {
355 lafe_include(&cpio
->matching
, *cpio
->argv
);
359 if (cpio
->option_list
)
365 if (*cpio
->argv
== NULL
|| **cpio
->argv
== '\0')
367 "-p mode requires a target directory");
368 mode_pass(cpio
, *cpio
->argv
);
372 "Must specify at least one of -i, -o, or -p");
375 free_cache(cpio
->gname_cache
);
376 free_cache(cpio
->uname_cache
);
377 return (cpio
->return_value
);
387 fprintf(stderr
, "Brief Usage:\n");
388 fprintf(stderr
, " List: %s -it < archive\n", p
);
389 fprintf(stderr
, " Extract: %s -i < archive\n", p
);
390 fprintf(stderr
, " Create: %s -o < filenames > archive\n", p
);
391 fprintf(stderr
, " Help: %s --help\n", p
);
395 static const char *long_help_msg
=
396 "First option must be a mode specifier:\n"
397 " -i Input -o Output -p Pass\n"
400 "Create: %p -o [options] < [list of files] > [archive]\n"
401 " -J,-y,-z,--lzma Compress archive with xz/bzip2/gzip/lzma\n"
402 " --format {odc|newc|ustar} Select archive format\n"
403 "List: %p -it < [archive]\n"
404 "Extract: %p -i [options] < [archive]\n";
408 * Note that the word 'bsdcpio' will always appear in the first line
411 * In particular, /bin/sh scripts that need to test for the presence
412 * of bsdcpio can use the following template:
414 * if (cpio --help 2>&1 | grep bsdcpio >/dev/null 2>&1 ) then \
415 * echo bsdcpio; else echo not bsdcpio; fi
423 prog
= lafe_progname
;
427 p
= (strcmp(prog
,"bsdcpio") != 0) ? "(bsdcpio)" : "";
428 printf("%s%s: manipulate archive files\n", prog
, p
);
430 for (p
= long_help_msg
; *p
!= '\0'; p
++) {
446 fprintf(stdout
,"bsdcpio %s -- %s\n",
447 BSDCPIO_VERSION_STRING
,
453 mode_out(struct cpio
*cpio
)
455 struct archive_entry
*entry
, *spare
;
456 struct lafe_line_reader
*lr
;
460 if (cpio
->option_append
)
461 lafe_errc(1, 0, "Append mode not yet supported.");
463 cpio
->archive_read_disk
= archive_read_disk_new();
464 if (cpio
->archive_read_disk
== NULL
)
465 lafe_errc(1, 0, "Failed to allocate archive object");
466 if (cpio
->option_follow_links
)
467 archive_read_disk_set_symlink_logical(cpio
->archive_read_disk
);
469 archive_read_disk_set_symlink_physical(cpio
->archive_read_disk
);
470 archive_read_disk_set_standard_lookup(cpio
->archive_read_disk
);
472 cpio
->archive
= archive_write_new();
473 if (cpio
->archive
== NULL
)
474 lafe_errc(1, 0, "Failed to allocate archive object");
475 switch (cpio
->compress
) {
477 r
= archive_write_set_compression_xz(cpio
->archive
);
480 r
= archive_write_set_compression_lzma(cpio
->archive
);
483 r
= archive_write_set_compression_bzip2(cpio
->archive
);
486 r
= archive_write_set_compression_gzip(cpio
->archive
);
489 r
= archive_write_set_compression_compress(cpio
->archive
);
492 r
= archive_write_set_compression_none(cpio
->archive
);
495 if (r
< ARCHIVE_WARN
)
496 lafe_errc(1, 0, "Requested compression not available");
497 r
= archive_write_set_format_by_name(cpio
->archive
, cpio
->format
);
499 lafe_errc(1, 0, "%s", archive_error_string(cpio
->archive
));
500 archive_write_set_bytes_per_block(cpio
->archive
, cpio
->bytes_per_block
);
501 cpio
->linkresolver
= archive_entry_linkresolver_new();
502 archive_entry_linkresolver_set_strategy(cpio
->linkresolver
,
503 archive_format(cpio
->archive
));
506 * The main loop: Copy each file into the output archive.
508 r
= archive_write_open_file(cpio
->archive
, cpio
->filename
);
510 lafe_errc(1, 0, "%s", archive_error_string(cpio
->archive
));
511 lr
= lafe_line_reader("-", cpio
->option_null
);
512 while ((p
= lafe_line_reader_next(lr
)) != NULL
)
513 file_to_archive(cpio
, p
);
514 lafe_line_reader_free(lr
);
517 * The hardlink detection may have queued up a couple of entries
518 * that can now be flushed.
521 archive_entry_linkify(cpio
->linkresolver
, &entry
, &spare
);
522 while (entry
!= NULL
) {
523 entry_to_archive(cpio
, entry
);
524 archive_entry_free(entry
);
526 archive_entry_linkify(cpio
->linkresolver
, &entry
, &spare
);
529 r
= archive_write_close(cpio
->archive
);
531 lafe_errc(1, 0, "%s", archive_error_string(cpio
->archive
));
535 (archive_position_uncompressed(cpio
->archive
) + 511)
537 fprintf(stderr
, "%lu %s\n", (unsigned long)blocks
,
538 blocks
== 1 ? "block" : "blocks");
540 archive_write_finish(cpio
->archive
);
544 * This is used by both out mode (to copy objects from disk into
545 * an archive) and pass mode (to copy objects from disk to
546 * an archive_write_disk "archive").
549 file_to_archive(struct cpio
*cpio
, const char *srcpath
)
551 const char *destpath
;
552 struct archive_entry
*entry
, *spare
;
558 * Create an archive_entry describing the source file.
561 entry
= archive_entry_new();
563 lafe_errc(1, 0, "Couldn't allocate entry");
564 archive_entry_copy_sourcepath(entry
, srcpath
);
565 r
= archive_read_disk_entry_from_file(cpio
->archive_read_disk
,
567 if (r
< ARCHIVE_FAILED
)
568 lafe_errc(1, 0, "%s",
569 archive_error_string(cpio
->archive_read_disk
));
572 archive_error_string(cpio
->archive_read_disk
));
573 if (r
<= ARCHIVE_FAILED
) {
574 cpio
->return_value
= 1;
578 if (cpio
->uid_override
>= 0)
579 archive_entry_set_uid(entry
, cpio
->uid_override
);
580 if (cpio
->gid_override
>= 0)
581 archive_entry_set_gid(entry
, cpio
->gid_override
);
584 * Generate a destination path for this entry.
585 * "destination path" is the name to which it will be copied in
586 * pass mode or the name that will go into the archive in
591 len
= strlen(cpio
->destdir
) + strlen(srcpath
) + 8;
592 if (len
>= cpio
->pass_destpath_alloc
) {
593 while (len
>= cpio
->pass_destpath_alloc
) {
594 cpio
->pass_destpath_alloc
+= 512;
595 cpio
->pass_destpath_alloc
*= 2;
597 free(cpio
->pass_destpath
);
598 cpio
->pass_destpath
= malloc(cpio
->pass_destpath_alloc
);
599 if (cpio
->pass_destpath
== NULL
)
601 "Can't allocate path buffer");
603 strcpy(cpio
->pass_destpath
, cpio
->destdir
);
607 strcat(cpio
->pass_destpath
, p
);
608 destpath
= cpio
->pass_destpath
;
610 if (cpio
->option_rename
)
611 destpath
= cpio_rename(destpath
);
612 if (destpath
== NULL
)
614 archive_entry_copy_pathname(entry
, destpath
);
617 * If we're trying to preserve hardlinks, match them here.
620 if (cpio
->linkresolver
!= NULL
621 && archive_entry_filetype(entry
) != AE_IFDIR
) {
622 archive_entry_linkify(cpio
->linkresolver
, &entry
, &spare
);
626 r
= entry_to_archive(cpio
, entry
);
627 archive_entry_free(entry
);
630 r
= entry_to_archive(cpio
, spare
);
631 archive_entry_free(spare
);
638 entry_to_archive(struct cpio
*cpio
, struct archive_entry
*entry
)
640 const char *destpath
= archive_entry_pathname(entry
);
641 const char *srcpath
= archive_entry_sourcepath(entry
);
646 /* Print out the destination name to the user. */
648 fprintf(stderr
,"%s", destpath
);
651 * Option_link only makes sense in pass mode and for
652 * regular files. Also note: if a link operation fails
653 * because of cross-device restrictions, we'll fall back
654 * to copy mode for that entry.
656 * TODO: Test other cpio implementations to see if they
657 * hard-link anything other than regular files here.
659 if (cpio
->option_link
660 && archive_entry_filetype(entry
) == AE_IFREG
)
662 struct archive_entry
*t
;
663 /* Save the original entry in case we need it later. */
664 t
= archive_entry_clone(entry
);
666 lafe_errc(1, ENOMEM
, "Can't create link");
667 /* Note: link(2) doesn't create parent directories,
668 * so we use archive_write_header() instead as a
670 archive_entry_set_hardlink(t
, srcpath
);
671 /* This is a straight link that carries no data. */
672 archive_entry_set_size(t
, 0);
673 r
= archive_write_header(cpio
->archive
, t
);
674 archive_entry_free(t
);
676 lafe_warnc(archive_errno(cpio
->archive
),
677 "%s", archive_error_string(cpio
->archive
));
678 if (r
== ARCHIVE_FATAL
)
681 if (r
!= ARCHIVE_OK
&& archive_errno(cpio
->archive
) == EXDEV
) {
682 /* Cross-device link: Just fall through and use
683 * the original entry to copy the file over. */
684 lafe_warnc(0, "Copying file instead");
691 * Make sure we can open the file (if necessary) before
692 * trying to write the header.
694 if (archive_entry_filetype(entry
) == AE_IFREG
) {
695 if (archive_entry_size(entry
) > 0) {
696 fd
= open(srcpath
, O_RDONLY
| O_BINARY
);
699 "%s: could not open file", srcpath
);
704 archive_entry_set_size(entry
, 0);
707 r
= archive_write_header(cpio
->archive
, entry
);
710 lafe_warnc(archive_errno(cpio
->archive
),
713 archive_error_string(cpio
->archive
));
715 if (r
== ARCHIVE_FATAL
)
718 if (r
>= ARCHIVE_WARN
&& fd
>= 0) {
719 bytes_read
= read(fd
, cpio
->buff
, cpio
->buff_size
);
720 while (bytes_read
> 0) {
721 r
= archive_write_data(cpio
->archive
,
722 cpio
->buff
, bytes_read
);
724 lafe_errc(1, archive_errno(cpio
->archive
),
725 "%s", archive_error_string(cpio
->archive
));
726 if (r
< bytes_read
) {
728 "Truncated write; file may have grown while being archived.");
730 bytes_read
= read(fd
, cpio
->buff
, cpio
->buff_size
);
734 fd
= restore_time(cpio
, entry
, srcpath
, fd
);
738 fprintf(stderr
,"\n");
745 restore_time(struct cpio
*cpio
, struct archive_entry
*entry
,
746 const char *name
, int fd
)
749 static int warned
= 0;
751 (void)cpio
; /* UNUSED */
752 (void)entry
; /* UNUSED */
753 (void)name
; /* UNUSED */
756 lafe_warnc(0, "Can't restore access times on this platform");
760 #if defined(_WIN32) && !defined(__CYGWIN__)
761 struct __timeval times
[2];
763 struct timeval times
[2];
766 if (!cpio
->option_atime_restore
)
769 times
[1].tv_sec
= archive_entry_mtime(entry
);
770 times
[1].tv_usec
= archive_entry_mtime_nsec(entry
) / 1000;
772 times
[0].tv_sec
= archive_entry_atime(entry
);
773 times
[0].tv_usec
= archive_entry_atime_nsec(entry
) / 1000;
775 #if defined(HAVE_FUTIMES) && !defined(__CYGWIN__)
776 if (fd
>= 0 && futimes(fd
, times
) == 0)
780 * Some platform cannot restore access times if the file descriptor
789 if (lutimes(name
, times
) != 0)
791 if ((AE_IFLNK
!= archive_entry_filetype(entry
))
792 && utimes(name
, times
) != 0)
794 lafe_warnc(errno
, "Can't update time for %s", name
);
801 mode_in(struct cpio
*cpio
)
804 struct archive_entry
*entry
;
806 const char *destpath
;
809 ext
= archive_write_disk_new();
811 lafe_errc(1, 0, "Couldn't allocate restore object");
812 r
= archive_write_disk_set_options(ext
, cpio
->extract_flags
);
814 lafe_errc(1, 0, "%s", archive_error_string(ext
));
815 a
= archive_read_new();
817 lafe_errc(1, 0, "Couldn't allocate archive object");
818 archive_read_support_compression_all(a
);
819 archive_read_support_format_all(a
);
821 if (archive_read_open_file(a
, cpio
->filename
, cpio
->bytes_per_block
))
822 lafe_errc(1, archive_errno(a
),
823 "%s", archive_error_string(a
));
825 r
= archive_read_next_header(a
, &entry
);
826 if (r
== ARCHIVE_EOF
)
828 if (r
!= ARCHIVE_OK
) {
829 lafe_errc(1, archive_errno(a
),
830 "%s", archive_error_string(a
));
832 if (lafe_excluded(cpio
->matching
, archive_entry_pathname(entry
)))
834 if (cpio
->option_rename
) {
835 destpath
= cpio_rename(archive_entry_pathname(entry
));
836 archive_entry_set_pathname(entry
, destpath
);
838 destpath
= archive_entry_pathname(entry
);
839 if (destpath
== NULL
)
842 fprintf(stdout
, "%s\n", destpath
);
843 if (cpio
->uid_override
>= 0)
844 archive_entry_set_uid(entry
, cpio
->uid_override
);
845 if (cpio
->gid_override
>= 0)
846 archive_entry_set_gid(entry
, cpio
->gid_override
);
847 r
= archive_write_header(ext
, entry
);
848 if (r
!= ARCHIVE_OK
) {
849 fprintf(stderr
, "%s: %s\n",
850 archive_entry_pathname(entry
),
851 archive_error_string(ext
));
852 } else if (archive_entry_size(entry
) > 0) {
853 r
= extract_data(a
, ext
);
855 cpio
->return_value
= 1;
858 r
= archive_read_close(a
);
860 lafe_errc(1, 0, "%s", archive_error_string(a
));
861 r
= archive_write_close(ext
);
863 lafe_errc(1, 0, "%s", archive_error_string(ext
));
865 int64_t blocks
= (archive_position_uncompressed(a
) + 511)
867 fprintf(stderr
, "%lu %s\n", (unsigned long)blocks
,
868 blocks
== 1 ? "block" : "blocks");
870 archive_read_finish(a
);
871 archive_write_finish(ext
);
872 exit(cpio
->return_value
);
876 * Exits if there's a fatal error. Returns ARCHIVE_OK
877 * if everything is kosher.
880 extract_data(struct archive
*ar
, struct archive
*aw
)
888 r
= archive_read_data_block(ar
, &block
, &size
, &offset
);
889 if (r
== ARCHIVE_EOF
)
891 if (r
!= ARCHIVE_OK
) {
892 lafe_warnc(archive_errno(ar
),
893 "%s", archive_error_string(ar
));
896 r
= archive_write_data_block(aw
, block
, size
, offset
);
897 if (r
!= ARCHIVE_OK
) {
898 lafe_warnc(archive_errno(aw
),
899 "%s", archive_error_string(aw
));
906 mode_list(struct cpio
*cpio
)
909 struct archive_entry
*entry
;
912 a
= archive_read_new();
914 lafe_errc(1, 0, "Couldn't allocate archive object");
915 archive_read_support_compression_all(a
);
916 archive_read_support_format_all(a
);
918 if (archive_read_open_file(a
, cpio
->filename
, cpio
->bytes_per_block
))
919 lafe_errc(1, archive_errno(a
),
920 "%s", archive_error_string(a
));
922 r
= archive_read_next_header(a
, &entry
);
923 if (r
== ARCHIVE_EOF
)
925 if (r
!= ARCHIVE_OK
) {
926 lafe_errc(1, archive_errno(a
),
927 "%s", archive_error_string(a
));
929 if (lafe_excluded(cpio
->matching
, archive_entry_pathname(entry
)))
932 list_item_verbose(cpio
, entry
);
934 fprintf(stdout
, "%s\n", archive_entry_pathname(entry
));
936 r
= archive_read_close(a
);
938 lafe_errc(1, 0, "%s", archive_error_string(a
));
940 int64_t blocks
= (archive_position_uncompressed(a
) + 511)
942 fprintf(stderr
, "%lu %s\n", (unsigned long)blocks
,
943 blocks
== 1 ? "block" : "blocks");
945 archive_read_finish(a
);
950 * Display information about the current file.
952 * The format here roughly duplicates the output of 'ls -l'.
953 * This is based on SUSv2, where 'tar tv' is documented as
954 * listing additional information in an "unspecified format,"
955 * and 'pax -l' is documented as using the same format as 'ls -l'.
958 list_item_verbose(struct cpio
*cpio
, struct archive_entry
*entry
)
962 char uids
[16], gids
[16];
963 const char *uname
, *gname
;
972 if (cpio
->option_numeric_uid_gid
) {
973 /* Format numeric uid/gid for display. */
974 strcpy(uids
, cpio_i64toa(archive_entry_uid(entry
)));
976 strcpy(gids
, cpio_i64toa(archive_entry_gid(entry
)));
979 /* Use uname if it's present, else lookup name from uid. */
980 uname
= archive_entry_uname(entry
);
982 uname
= lookup_uname(cpio
, archive_entry_uid(entry
));
983 /* Use gname if it's present, else lookup name from gid. */
984 gname
= archive_entry_gname(entry
);
986 gname
= lookup_gname(cpio
, archive_entry_gid(entry
));
989 /* Print device number or file size. */
990 if (archive_entry_filetype(entry
) == AE_IFCHR
991 || archive_entry_filetype(entry
) == AE_IFBLK
) {
992 snprintf(size
, sizeof(size
), "%lu,%lu",
993 (unsigned long)archive_entry_rdevmajor(entry
),
994 (unsigned long)archive_entry_rdevminor(entry
));
996 strcpy(size
, cpio_i64toa(archive_entry_size(entry
)));
999 /* Format the time using 'ls -l' conventions. */
1000 mtime
= archive_entry_mtime(entry
);
1001 #if defined(_WIN32) && !defined(__CYGWIN__)
1002 /* Windows' strftime function does not support %e format. */
1003 if (mtime
- now
> 365*86400/2
1004 || mtime
- now
< -365*86400/2)
1005 fmt
= cpio
->day_first
? "%d %b %Y" : "%b %d %Y";
1007 fmt
= cpio
->day_first
? "%d %b %H:%M" : "%b %d %H:%M";
1009 if (abs(mtime
- now
) > (365/2)*86400)
1010 fmt
= cpio
->day_first
? "%e %b %Y" : "%b %e %Y";
1012 fmt
= cpio
->day_first
? "%e %b %H:%M" : "%b %e %H:%M";
1014 strftime(date
, sizeof(date
), fmt
, localtime(&mtime
));
1016 fprintf(out
, "%s%3d %-8s %-8s %8s %12s %s",
1017 archive_entry_strmode(entry
),
1018 archive_entry_nlink(entry
),
1019 uname
, gname
, size
, date
,
1020 archive_entry_pathname(entry
));
1022 /* Extra information for links. */
1023 if (archive_entry_hardlink(entry
)) /* Hard link */
1024 fprintf(out
, " link to %s", archive_entry_hardlink(entry
));
1025 else if (archive_entry_symlink(entry
)) /* Symbolic link */
1026 fprintf(out
, " -> %s", archive_entry_symlink(entry
));
1031 mode_pass(struct cpio
*cpio
, const char *destdir
)
1033 struct lafe_line_reader
*lr
;
1037 /* Ensure target dir has a trailing '/' to simplify path surgery. */
1038 cpio
->destdir
= malloc(strlen(destdir
) + 8);
1039 strcpy(cpio
->destdir
, destdir
);
1040 if (destdir
[strlen(destdir
) - 1] != '/')
1041 strcat(cpio
->destdir
, "/");
1043 cpio
->archive
= archive_write_disk_new();
1044 if (cpio
->archive
== NULL
)
1045 lafe_errc(1, 0, "Failed to allocate archive object");
1046 r
= archive_write_disk_set_options(cpio
->archive
, cpio
->extract_flags
);
1047 if (r
!= ARCHIVE_OK
)
1048 lafe_errc(1, 0, "%s", archive_error_string(cpio
->archive
));
1049 cpio
->linkresolver
= archive_entry_linkresolver_new();
1050 archive_write_disk_set_standard_lookup(cpio
->archive
);
1052 cpio
->archive_read_disk
= archive_read_disk_new();
1053 if (cpio
->archive_read_disk
== NULL
)
1054 lafe_errc(1, 0, "Failed to allocate archive object");
1055 if (cpio
->option_follow_links
)
1056 archive_read_disk_set_symlink_logical(cpio
->archive_read_disk
);
1058 archive_read_disk_set_symlink_physical(cpio
->archive_read_disk
);
1059 archive_read_disk_set_standard_lookup(cpio
->archive_read_disk
);
1061 lr
= lafe_line_reader("-", cpio
->option_null
);
1062 while ((p
= lafe_line_reader_next(lr
)) != NULL
)
1063 file_to_archive(cpio
, p
);
1064 lafe_line_reader_free(lr
);
1066 archive_entry_linkresolver_free(cpio
->linkresolver
);
1067 r
= archive_write_close(cpio
->archive
);
1068 if (r
!= ARCHIVE_OK
)
1069 lafe_errc(1, 0, "%s", archive_error_string(cpio
->archive
));
1073 (archive_position_uncompressed(cpio
->archive
) + 511)
1075 fprintf(stderr
, "%lu %s\n", (unsigned long)blocks
,
1076 blocks
== 1 ? "block" : "blocks");
1079 archive_write_finish(cpio
->archive
);
1083 * Prompt for a new name for this entry. Returns a pointer to the
1084 * new name or NULL if the entry should not be copied. This
1085 * implements the semantics defined in POSIX.1-1996, which specifies
1086 * that an input of '.' means the name should be unchanged. GNU cpio
1087 * treats '.' as a literal new name.
1090 cpio_rename(const char *name
)
1092 static char buff
[1024];
1096 t
= fopen("/dev/tty", "r+");
1099 fprintf(t
, "%s (Enter/./(new name))? ", name
);
1102 p
= fgets(buff
, sizeof(buff
), t
);
1105 /* End-of-file is a blank line. */
1108 while (*p
== ' ' || *p
== '\t')
1110 if (*p
== '\n' || *p
== '\0')
1113 if (*p
== '.' && p
[1] == '\n')
1114 /* Single period preserves original name. */
1117 /* Trim the final newline. */
1118 while (*p
!= '\0' && *p
!= '\n')
1120 /* Overwrite the final \n with a null character. */
1126 free_cache(struct name_cache
*cache
)
1130 if (cache
!= NULL
) {
1131 for (i
= 0; i
< cache
->size
; i
++)
1132 free(cache
->cache
[i
].name
);
1138 * Lookup uname/gname from uid/gid, return NULL if no match.
1141 lookup_name(struct cpio
*cpio
, struct name_cache
**name_cache_variable
,
1142 int (*lookup_fn
)(struct cpio
*, const char **, id_t
), id_t id
)
1145 struct name_cache
*cache
;
1150 if (*name_cache_variable
== NULL
) {
1151 *name_cache_variable
= malloc(sizeof(struct name_cache
));
1152 if (*name_cache_variable
== NULL
)
1153 lafe_errc(1, ENOMEM
, "No more memory");
1154 memset(*name_cache_variable
, 0, sizeof(struct name_cache
));
1155 (*name_cache_variable
)->size
= name_cache_size
;
1158 cache
= *name_cache_variable
;
1161 slot
= id
% cache
->size
;
1162 if (cache
->cache
[slot
].name
!= NULL
) {
1163 if (cache
->cache
[slot
].id
== id
) {
1165 return (cache
->cache
[slot
].name
);
1167 free(cache
->cache
[slot
].name
);
1168 cache
->cache
[slot
].name
= NULL
;
1171 if (lookup_fn(cpio
, &name
, id
) == 0) {
1172 if (name
== NULL
|| name
[0] == '\0') {
1173 /* If lookup failed, format it as a number. */
1174 snprintf(asnum
, sizeof(asnum
), "%u", (unsigned)id
);
1177 cache
->cache
[slot
].name
= strdup(name
);
1178 if (cache
->cache
[slot
].name
!= NULL
) {
1179 cache
->cache
[slot
].id
= id
;
1180 return (cache
->cache
[slot
].name
);
1183 * Conveniently, NULL marks an empty slot, so
1184 * if the strdup() fails, we've just failed to
1185 * cache it. No recovery necessary.
1192 lookup_uname(struct cpio
*cpio
, uid_t uid
)
1194 return (lookup_name(cpio
, &cpio
->uname_cache
,
1195 &lookup_uname_helper
, (id_t
)uid
));
1199 lookup_uname_helper(struct cpio
*cpio
, const char **name
, id_t id
)
1201 struct passwd
*pwent
;
1203 (void)cpio
; /* UNUSED */
1206 pwent
= getpwuid((uid_t
)id
);
1207 if (pwent
== NULL
) {
1209 if (errno
!= 0 && errno
!= ENOENT
)
1210 lafe_warnc(errno
, "getpwuid(%d) failed", id
);
1214 *name
= pwent
->pw_name
;
1219 lookup_gname(struct cpio
*cpio
, gid_t gid
)
1221 return (lookup_name(cpio
, &cpio
->gname_cache
,
1222 &lookup_gname_helper
, (id_t
)gid
));
1226 lookup_gname_helper(struct cpio
*cpio
, const char **name
, id_t id
)
1228 struct group
*grent
;
1230 (void)cpio
; /* UNUSED */
1233 grent
= getgrgid((gid_t
)id
);
1234 if (grent
== NULL
) {
1237 lafe_warnc(errno
, "getgrgid(%d) failed", id
);
1241 *name
= grent
->gr_name
;
1246 * It would be nice to just use printf() for formatting large numbers,
1247 * but the compatibility problems are a big headache. Hence the
1248 * following simple utility function.
1251 cpio_i64toa(int64_t n0
)
1253 // 2^64 =~ 1.8 * 10^19, so 20 decimal digits suffice.
1254 // We also need 1 byte for '-' and 1 for '\0'.
1255 static char buff
[22];
1256 int64_t n
= n0
< 0 ? -n0
: n0
;
1257 char *p
= buff
+ sizeof(buff
);
1261 *--p
= '0' + (int)(n
% 10);