aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/cpio.c
diff options
context:
space:
mode:
authorMike Moreton <Mike.Moreton@frontier-silicon.com>2015-12-02 13:24:40 +0000
committerRob Landley <rob@landley.net>2015-12-06 14:40:39 -0600
commitecae7831e88f52b0ec1d9e1890a4b8d67b9ac8fa (patch)
tree8ef672e712130606ec4b0b77f213d775874983a3 /toys/posix/cpio.c
parent83250d1f0a87fd184e5b9a5bba8618c3e8ed2c7a (diff)
downloadtoybox-ecae7831e88f52b0ec1d9e1890a4b8d67b9ac8fa.tar.gz
CPIO: Add --no-preserve-owner option.
Diffstat (limited to 'toys/posix/cpio.c')
-rw-r--r--toys/posix/cpio.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/toys/posix/cpio.c b/toys/posix/cpio.c
index 2eb6002f..64d597b7 100644
--- a/toys/posix/cpio.c
+++ b/toys/posix/cpio.c
@@ -16,13 +16,13 @@
* rdevmajor rdevminor namesize check
* This is the equiavlent of mode -H newc when using GNU CPIO.
-USE_CPIO(NEWTOY(cpio, "mduH:p:|i|t|F:v(verbose)o|[!pio][!pot][!pF]", TOYFLAG_BIN))
+USE_CPIO(NEWTOY(cpio, "(no-preserve-owner)mduH:p:|i|t|F:v(verbose)o|[!pio][!pot][!pF]", TOYFLAG_BIN))
config CPIO
bool "cpio"
default y
help
- usage: cpio -{o|t|i|p DEST} [-v] [--verbose] [-F FILE] [ignored: -mdu -H newc]
+ usage: cpio -{o|t|i|p DEST} [-v] [--verbose] [-F FILE] [--no-preserve-owner] [ignored: -mdu -H newc]
copy files into and out of a "newc" format cpio archive
@@ -32,6 +32,7 @@ config CPIO
-o create archive (stdin=list of files, stdout=archive)
-t test files (list only, stdin=archive, stdout=list of files)
-v verbose (list files during create/extract)
+ --no-preserve-owner (don't set ownership during extract)
*/
#define FOR_cpio
@@ -145,7 +146,7 @@ void cpio_main(void)
if (!test) err = symlink(data, name);
free(data);
// Can't get a filehandle to a symlink, so do special chown
- if (!err && !geteuid()) err = lchown(name, uid, gid);
+ if (!err && !geteuid() && !(toys.optflags & FLAG_no_preserve_owner)) err = lchown(name, uid, gid);
} else if (S_ISREG(mode)) {
int fd = test ? 0 : open(name, O_CREAT|O_WRONLY|O_TRUNC|O_NOFOLLOW, mode);
@@ -170,7 +171,7 @@ void cpio_main(void)
if (!test) {
// set owner, restore dropped suid bit
- if (!geteuid()) {
+ if (!geteuid() && !(toys.optflags & FLAG_no_preserve_owner)) {
err = fchown(fd, uid, gid);
if (!err) err = fchmod(fd, mode);
}
@@ -185,7 +186,7 @@ void cpio_main(void)
// by name to chown/utime, but how do we know it's the same item?
// Check that we at least have the right type of entity open, and do
// NOT restore dropped suid bit in this case.
- if (!S_ISREG(mode) && !S_ISLNK(mode) && !geteuid()) {
+ if (!S_ISREG(mode) && !S_ISLNK(mode) && !geteuid() && !(toys.optflags & FLAG_no_preserve_owner)) {
int fd = open(name, O_RDONLY|O_NOFOLLOW);
struct stat st;