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:
parent
6122f3e60d
commit
431595df6c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=226635
@ -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;
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -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' },
|
||||
|
@ -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.
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user