1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-20 15:43:16 +00:00

Bring in the --gid --gname --uid and --uname implementation

from libarchive.googlecode.com.

MFC after:	3 days
This commit is contained in:
Tim Kientzle 2011-10-22 16:52:04 +00:00
parent 6122f3e60d
commit 431595df6c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=226635
5 changed files with 68 additions and 8 deletions

View File

@ -147,6 +147,8 @@ main(int argc, char **argv)
_bsdtar = bsdtar = &bsdtar_storage;
memset(bsdtar, 0, sizeof(*bsdtar));
bsdtar->fd = -1; /* Mark as "unused" */
bsdtar->gid = -1;
bsdtar->uid = -1;
option_o = 0;
#if defined(HAVE_SIGACTION) && (defined(SIGINFO) || defined(SIGUSR1))
@ -262,14 +264,21 @@ main(int argc, char **argv)
case OPTION_FORMAT: /* GNU tar, others */
bsdtar->create_format = bsdtar->optarg;
break;
case OPTION_OPTIONS:
bsdtar->option_options = bsdtar->optarg;
break;
case 'f': /* SUSv2 */
bsdtar->filename = bsdtar->optarg;
if (strcmp(bsdtar->filename, "-") == 0)
bsdtar->filename = NULL;
break;
case OPTION_GID: /* cpio */
t = atoi(bsdtar->optarg);
if (t < 0)
lafe_errc(1, 0,
"Argument to --gid must be positive");
bsdtar->gid = t;
break;
case OPTION_GNAME: /* cpio */
bsdtar->gname = bsdtar->optarg;
break;
case 'H': /* BSD convention */
bsdtar->symlink_mode = 'H';
break;
@ -397,7 +406,8 @@ main(int argc, char **argv)
bsdtar->option_null++;
break;
case OPTION_NUMERIC_OWNER: /* GNU tar */
bsdtar->option_numeric_owner++;
bsdtar->uname = "";
bsdtar->gname = "";
break;
case 'O': /* GNU tar */
bsdtar->option_stdout = 1;
@ -408,6 +418,9 @@ main(int argc, char **argv)
case OPTION_ONE_FILE_SYSTEM: /* GNU tar */
bsdtar->option_dont_traverse_mounts = 1;
break;
case OPTION_OPTIONS:
bsdtar->option_options = bsdtar->optarg;
break;
#if 0
/*
* The common BSD -P option is not necessary, since
@ -473,6 +486,16 @@ main(int argc, char **argv)
case 'u': /* SUSv2 */
set_mode(bsdtar, opt);
break;
case OPTION_UID: /* cpio */
t = atoi(bsdtar->optarg);
if (t < 0)
lafe_errc(1, 0,
"Argument to --uid must be positive");
bsdtar->uid = t;
break;
case OPTION_UNAME: /* cpio */
bsdtar->uname = bsdtar->optarg;
break;
case 'v': /* SUSv2 */
bsdtar->verbose++;
break;

View File

@ -54,6 +54,10 @@ struct bsdtar {
int verbose; /* -v */
int extract_flags; /* Flags for extract operation */
int strip_components; /* Remove this many leading dirs */
int gid; /* --gid */
const char *gname; /* --gname */
int uid; /* --uid */
const char *uname; /* --uname */
char mode; /* Program mode: 'c', 't', 'r', 'u', 'x' */
char symlink_mode; /* H or L, per BSD conventions */
char create_compression; /* j, y, or z */
@ -68,7 +72,6 @@ struct bsdtar {
char option_no_owner; /* -o */
char option_no_subdirs; /* -n */
char option_null; /* --null */
char option_numeric_owner; /* --numeric-owner */
char option_stdout; /* -O */
char option_totals; /* --totals */
char option_unlink_first; /* -U */
@ -111,7 +114,8 @@ enum {
OPTION_CHROOT,
OPTION_EXCLUDE,
OPTION_FORMAT,
OPTION_OPTIONS,
OPTION_GID,
OPTION_GNAME,
OPTION_HELP,
OPTION_INCLUDE,
OPTION_KEEP_NEWER_FILES,
@ -126,10 +130,13 @@ enum {
OPTION_NULL,
OPTION_NUMERIC_OWNER,
OPTION_ONE_FILE_SYSTEM,
OPTION_OPTIONS,
OPTION_POSIX,
OPTION_SAME_OWNER,
OPTION_STRIP_COMPONENTS,
OPTION_TOTALS,
OPTION_UID,
OPTION_UNAME,
OPTION_USE_COMPRESS_PROGRAM,
OPTION_VERSION
};

View File

@ -84,7 +84,8 @@ static struct option {
{ "file", 1, 'f' },
{ "files-from", 1, 'T' },
{ "format", 1, OPTION_FORMAT },
{ "options", 1, OPTION_OPTIONS },
{ "gid", 1, OPTION_GID },
{ "gname", 1, OPTION_GNAME },
{ "gunzip", 0, 'z' },
{ "gzip", 0, 'z' },
{ "help", 0, OPTION_HELP },
@ -110,6 +111,7 @@ static struct option {
{ "null", 0, OPTION_NULL },
{ "numeric-owner", 0, OPTION_NUMERIC_OWNER },
{ "one-file-system", 0, OPTION_ONE_FILE_SYSTEM },
{ "options", 1, OPTION_OPTIONS },
{ "posix", 0, OPTION_POSIX },
{ "preserve-permissions", 0, 'p' },
{ "read-full-blocks", 0, 'B' },
@ -118,6 +120,8 @@ static struct option {
{ "strip-components", 1, OPTION_STRIP_COMPONENTS },
{ "to-stdout", 0, 'O' },
{ "totals", 0, OPTION_TOTALS },
{ "uid", 1, OPTION_UID },
{ "uname", 1, OPTION_UNAME },
{ "uncompress", 0, 'Z' },
{ "unlink", 0, 'U' },
{ "unlink-first", 0, 'U' },

View File

@ -209,10 +209,18 @@ read_archive(struct bsdtar *bsdtar, char mode)
if (r == ARCHIVE_FATAL)
break;
if (bsdtar->option_numeric_owner) {
if (bsdtar->uid >= 0) {
archive_entry_set_uid(entry, bsdtar->uid);
archive_entry_set_uname(entry, NULL);
}
if (bsdtar->gid >= 0) {
archive_entry_set_gid(entry, bsdtar->gid);
archive_entry_set_gname(entry, NULL);
}
if (bsdtar->uname)
archive_entry_set_uname(entry, bsdtar->uname);
if (bsdtar->gname >= 0)
archive_entry_set_gname(entry, bsdtar->gname);
/*
* Exclude entries that are too old.

View File

@ -833,6 +833,24 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
#endif
r = archive_read_disk_entry_from_file(bsdtar->diskreader,
entry, -1, st);
if (bsdtar->uid >= 0) {
archive_entry_set_uid(entry, bsdtar->uid);
if (!bsdtar->uname)
archive_entry_set_uname(entry,
archive_read_disk_uname(bsdtar->diskreader,
bsdtar->uid));
}
if (bsdtar->gid >= 0) {
archive_entry_set_gid(entry, bsdtar->gid);
if (!bsdtar->gname)
archive_entry_set_gname(entry,
archive_read_disk_gname(bsdtar->diskreader,
bsdtar->gid));
}
if (bsdtar->uname)
archive_entry_set_uname(entry, bsdtar->uname);
if (bsdtar->gname)
archive_entry_set_gname(entry, bsdtar->gname);
if (r != ARCHIVE_OK)
lafe_warnc(archive_errno(bsdtar->diskreader),
"%s", archive_error_string(bsdtar->diskreader));