svn commit: r211054 - head/usr.bin/cpio
Tim Kientzle
kientzle at FreeBSD.org
Sun Aug 8 01:25:33 UTC 2010
Author: kientzle
Date: Sun Aug 8 01:25:33 2010
New Revision: 211054
URL: http://svn.freebsd.org/changeset/base/211054
Log:
Fix -R when used with -p. Previously, the
uname and gname weren't overwritten, so the
disk restore would use those to lookup the
original uid/gid again. Clearing the uname
and gname prevents this.
Reported by: swell.k
MFC after: 7 days
Modified:
head/usr.bin/cpio/cmdline.c
head/usr.bin/cpio/cpio.c
head/usr.bin/cpio/cpio.h
Modified: head/usr.bin/cpio/cmdline.c
==============================================================================
--- head/usr.bin/cpio/cmdline.c Sun Aug 8 00:43:41 2010 (r211053)
+++ head/usr.bin/cpio/cmdline.c Sun Aug 8 01:25:33 2010 (r211054)
@@ -285,6 +285,8 @@ cpio_getopt(struct cpio *cpio)
* A period can be used instead of the colon.
*
* Sets uid/gid return as appropriate, -1 indicates uid/gid not specified.
+ * TODO: If the spec uses uname/gname, then return those to the caller
+ * as well. If the spec provides uid/gid, just return names as NULL.
*
* Returns NULL if no error, otherwise returns error string for display.
*
Modified: head/usr.bin/cpio/cpio.c
==============================================================================
--- head/usr.bin/cpio/cpio.c Sun Aug 8 00:43:41 2010 (r211053)
+++ head/usr.bin/cpio/cpio.c Sun Aug 8 01:25:33 2010 (r211054)
@@ -273,15 +273,21 @@ main(int argc, char *argv[])
cpio->quiet = 1;
break;
case 'R': /* GNU cpio, also --owner */
+ /* TODO: owner_parse should return uname/gname
+ * also; use that to set [ug]name_override. */
errmsg = owner_parse(cpio->optarg, &uid, &gid);
if (errmsg) {
warnc(-1, "%s", errmsg);
usage();
}
- if (uid != -1)
+ if (uid != -1) {
cpio->uid_override = uid;
- if (gid != -1)
+ cpio->uname_override = NULL;
+ }
+ if (gid != -1) {
cpio->gid_override = gid;
+ cpio->gname_override = NULL;
+ }
break;
case 'r': /* POSIX 1997 */
cpio->option_rename = 1;
@@ -575,10 +581,14 @@ file_to_archive(struct cpio *cpio, const
return (r);
}
- if (cpio->uid_override >= 0)
+ if (cpio->uid_override >= 0) {
archive_entry_set_uid(entry, cpio->uid_override);
- if (cpio->gid_override >= 0)
+ archive_entry_set_uname(entry, cpio->uname_override);
+ }
+ if (cpio->gid_override >= 0) {
archive_entry_set_gid(entry, cpio->gid_override);
+ archive_entry_set_gname(entry, cpio->gname_override);
+ }
/*
* Generate a destination path for this entry.
Modified: head/usr.bin/cpio/cpio.h
==============================================================================
--- head/usr.bin/cpio/cpio.h Sun Aug 8 00:43:41 2010 (r211053)
+++ head/usr.bin/cpio/cpio.h Sun Aug 8 01:25:33 2010 (r211054)
@@ -68,7 +68,9 @@ struct cpio {
size_t pass_destpath_alloc;
char *pass_destpath;
int uid_override;
+ char *uname_override;
int gid_override;
+ char *gname_override;
int day_first; /* true if locale prefers day/mon */
/* If >= 0, then close this when done. */
More information about the svn-src-head
mailing list