summaryrefslogtreecommitdiffstats
path: root/usr.bin/tar
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2011-10-22 16:52:04 +0000
committerkientzle <kientzle@FreeBSD.org>2011-10-22 16:52:04 +0000
commit3c7e934d288476ef4b9a9d1c6d6f3cb8c21ce7a0 (patch)
tree419d9c1e235c956b9cfbfd4f1a96e058daf36547 /usr.bin/tar
parent99b00e570ca8c577be501a01a24fc38d55801780 (diff)
downloadFreeBSD-src-3c7e934d288476ef4b9a9d1c6d6f3cb8c21ce7a0.zip
FreeBSD-src-3c7e934d288476ef4b9a9d1c6d6f3cb8c21ce7a0.tar.gz
Bring in the --gid --gname --uid and --uname implementation
from libarchive.googlecode.com. MFC after: 3 days
Diffstat (limited to 'usr.bin/tar')
-rw-r--r--usr.bin/tar/bsdtar.c31
-rw-r--r--usr.bin/tar/bsdtar.h11
-rw-r--r--usr.bin/tar/cmdline.c6
-rw-r--r--usr.bin/tar/read.c10
-rw-r--r--usr.bin/tar/write.c18
5 files changed, 68 insertions, 8 deletions
diff --git a/usr.bin/tar/bsdtar.c b/usr.bin/tar/bsdtar.c
index 0bb6a7f..1f250b6 100644
--- a/usr.bin/tar/bsdtar.c
+++ b/usr.bin/tar/bsdtar.c
@@ -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;
diff --git a/usr.bin/tar/bsdtar.h b/usr.bin/tar/bsdtar.h
index 919156a..ede96d9 100644
--- a/usr.bin/tar/bsdtar.h
+++ b/usr.bin/tar/bsdtar.h
@@ -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
};
diff --git a/usr.bin/tar/cmdline.c b/usr.bin/tar/cmdline.c
index ba3e8a1..f043155 100644
--- a/usr.bin/tar/cmdline.c
+++ b/usr.bin/tar/cmdline.c
@@ -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' },
diff --git a/usr.bin/tar/read.c b/usr.bin/tar/read.c
index b1616ec..6a4ff13 100644
--- a/usr.bin/tar/read.c
+++ b/usr.bin/tar/read.c
@@ -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.
diff --git a/usr.bin/tar/write.c b/usr.bin/tar/write.c
index 32e43c6..a0a9b75 100644
--- a/usr.bin/tar/write.c
+++ b/usr.bin/tar/write.c
@@ -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));
OpenPOWER on IntegriCloud