Support -V option to print a dot for each file processed.

Also, change the existing -vi behavior to send the filenames to
stderr rather than stdout, as GNU cpio does.

PR:             bin/141175
Submitted by:	Philip Kizer
MFC after:	14 days
This commit is contained in:
Tim Kientzle 2010-01-30 06:49:18 +00:00
parent eb0a7e4130
commit 378b2ffde5
3 changed files with 21 additions and 3 deletions

View File

@ -50,7 +50,7 @@ __FBSDID("$FreeBSD$");
/* /*
* Short options for cpio. Please keep this sorted. * Short options for cpio. Please keep this sorted.
*/ */
static const char *short_options = "0AaBC:F:O:cdE:f:H:hijLlmnopR:rtuvW:yZz"; static const char *short_options = "0AaBC:F:O:cdE:f:H:hijLlmnopR:rtuvVW:yZz";
/* /*
* Long options for cpio. Please keep this sorted. * Long options for cpio. Please keep this sorted.
@ -61,6 +61,7 @@ static const struct option {
int equivalent; /* Equivalent short option. */ int equivalent; /* Equivalent short option. */
} cpio_longopts[] = { } cpio_longopts[] = {
{ "create", 0, 'o' }, { "create", 0, 'o' },
{ "dot", 0, 'V' },
{ "extract", 0, 'i' }, { "extract", 0, 'i' },
{ "file", 1, 'F' }, { "file", 1, 'F' },
{ "format", 1, 'H' }, { "format", 1, 'H' },

View File

@ -278,6 +278,9 @@ main(int argc, char *argv[])
case 'v': /* POSIX 1997 */ case 'v': /* POSIX 1997 */
cpio->verbose++; cpio->verbose++;
break; break;
case 'V': /* GNU cpio */
cpio->dot++;
break;
case OPTION_VERSION: /* GNU convention */ case OPTION_VERSION: /* GNU convention */
version(); version();
break; break;
@ -331,6 +334,9 @@ main(int argc, char *argv[])
/* -l requires -p */ /* -l requires -p */
if (cpio->option_link && cpio->mode != 'p') if (cpio->option_link && cpio->mode != 'p')
cpio_errc(1, 0, "Option -l requires -p"); cpio_errc(1, 0, "Option -l requires -p");
/* -v overrides -V */
if (cpio->dot && cpio->verbose)
cpio->dot = 0;
/* TODO: Flag other nonsensical combinations. */ /* TODO: Flag other nonsensical combinations. */
switch (cpio->mode) { switch (cpio->mode) {
@ -388,7 +394,7 @@ static const char *long_help_msg =
"First option must be a mode specifier:\n" "First option must be a mode specifier:\n"
" -i Input -o Output -p Pass\n" " -i Input -o Output -p Pass\n"
"Common Options:\n" "Common Options:\n"
" -v Verbose\n" " -v Verbose filenames -V one dot per file\n"
"Create: %p -o [options] < [list of files] > [archive]\n" "Create: %p -o [options] < [list of files] > [archive]\n"
#ifdef HAVE_BZLIB_H #ifdef HAVE_BZLIB_H
" -y Compress archive with bzip2\n" " -y Compress archive with bzip2\n"
@ -521,6 +527,8 @@ mode_out(struct cpio *cpio)
} }
r = archive_write_close(cpio->archive); r = archive_write_close(cpio->archive);
if (cpio->dot)
fprintf(stderr, "\n");
if (r != ARCHIVE_OK) if (r != ARCHIVE_OK)
cpio_errc(1, 0, archive_error_string(cpio->archive)); cpio_errc(1, 0, archive_error_string(cpio->archive));
@ -659,6 +667,8 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry)
/* Print out the destination name to the user. */ /* Print out the destination name to the user. */
if (cpio->verbose) if (cpio->verbose)
fprintf(stderr,"%s", destpath); fprintf(stderr,"%s", destpath);
if (cpio->dot)
fprintf(stderr, ".");
/* /*
* Option_link only makes sense in pass mode and for * Option_link only makes sense in pass mode and for
@ -857,7 +867,9 @@ mode_in(struct cpio *cpio)
if (destpath == NULL) if (destpath == NULL)
continue; continue;
if (cpio->verbose) if (cpio->verbose)
fprintf(stdout, "%s\n", destpath); fprintf(stderr, "%s\n", destpath);
if (cpio->dot)
fprintf(stderr, ".");
if (cpio->uid_override >= 0) if (cpio->uid_override >= 0)
archive_entry_set_uid(entry, cpio->uid_override); archive_entry_set_uid(entry, cpio->uid_override);
if (cpio->gid_override >= 0) if (cpio->gid_override >= 0)
@ -872,6 +884,8 @@ mode_in(struct cpio *cpio)
} }
} }
r = archive_read_close(a); r = archive_read_close(a);
if (cpio->dot)
fprintf(stderr, "\n");
if (r != ARCHIVE_OK) if (r != ARCHIVE_OK)
cpio_errc(1, 0, archive_error_string(a)); cpio_errc(1, 0, archive_error_string(a));
r = archive_write_close(ext); r = archive_write_close(ext);
@ -1078,6 +1092,8 @@ mode_pass(struct cpio *cpio, const char *destdir)
archive_entry_linkresolver_free(cpio->linkresolver); archive_entry_linkresolver_free(cpio->linkresolver);
r = archive_write_close(cpio->archive); r = archive_write_close(cpio->archive);
if (cpio->dot)
fprintf(stderr, "\n");
if (r != ARCHIVE_OK) if (r != ARCHIVE_OK)
cpio_errc(1, 0, archive_error_string(cpio->archive)); cpio_errc(1, 0, archive_error_string(cpio->archive));

View File

@ -52,6 +52,7 @@ struct cpio {
const char *format; /* -H format */ const char *format; /* -H format */
int bytes_per_block; /* -b block_size */ int bytes_per_block; /* -b block_size */
int verbose; /* -v */ int verbose; /* -v */
int dot; /* -V */
int quiet; /* --quiet */ int quiet; /* --quiet */
int extract_flags; /* Flags for extract operation */ int extract_flags; /* Flags for extract operation */
char symlink_mode; /* H or L, per BSD conventions */ char symlink_mode; /* H or L, per BSD conventions */