Module Name:    src
Committed By:   christos
Date:           Mon Oct 22 18:02:26 UTC 2012

Modified Files:
        src/sbin/chown: chgrp.1 chown.8 chown.c

Log Message:
support --reference=rfile


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sbin/chown/chgrp.1 src/sbin/chown/chown.8
cvs rdiff -u -r1.5 -r1.6 src/sbin/chown/chown.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/chown/chgrp.1
diff -u src/sbin/chown/chgrp.1:1.4 src/sbin/chown/chgrp.1:1.5
--- src/sbin/chown/chgrp.1:1.4	Thu Jan 13 17:28:36 2011
+++ src/sbin/chown/chgrp.1	Mon Oct 22 14:02:26 2012
@@ -29,9 +29,9 @@
 .\" SUCH DAMAGE.
 .\"
 .\"     from: @(#)chgrp.1	8.3 (Berkeley) 3/31/94
-.\"	$NetBSD: chgrp.1,v 1.4 2011/01/13 22:28:36 haad Exp $
+.\"	$NetBSD: chgrp.1,v 1.5 2012/10/22 18:02:26 christos Exp $
 .\"
-.Dd September 25, 2003
+.Dd October 22, 2012
 .Dt CHGRP 1
 .Os
 .Sh NAME
@@ -45,7 +45,15 @@
 .Oc
 .Op Fl fhv
 .Ar group
-.Ar file ...
+.Ar
+.Nm
+.Oo
+.Fl R
+.Op Fl H | Fl L | Fl P
+.Oc
+.Op Fl fhv
+.Fl Fl reference=rfile
+.Ar
 .Sh DESCRIPTION
 The
 .Nm
@@ -53,7 +61,12 @@ utility sets the group ID of the file na
 .Ar file
 operand to the
 .Ar group
-ID specified by the group operand.
+ID specified by the group operand,
+or to the group of the given
+.Ar rfile ,
+specified by the
+.Fl Fl reference
+argument.
 .Pp
 Options:
 .Bl -tag -width Ds
Index: src/sbin/chown/chown.8
diff -u src/sbin/chown/chown.8:1.4 src/sbin/chown/chown.8:1.5
--- src/sbin/chown/chown.8:1.4	Thu Jan 13 17:28:36 2011
+++ src/sbin/chown/chown.8	Mon Oct 22 14:02:26 2012
@@ -26,9 +26,9 @@
 .\" SUCH DAMAGE.
 .\"
 .\"     from: @(#)chown.8	8.3 (Berkeley) 3/31/94
-.\"	$NetBSD: chown.8,v 1.4 2011/01/13 22:28:36 haad Exp $
+.\"	$NetBSD: chown.8,v 1.5 2012/10/22 18:02:26 christos Exp $
 .\"
-.Dd December 9, 2005
+.Dd October 22, 2012
 .Dt CHOWN 8
 .Os
 .Sh NAME
@@ -42,7 +42,7 @@
 .Oc
 .Op Fl fhv
 .Ar owner Ns Op Ar :group
-.Ar file ...
+.Ar
 .Nm
 .Oo
 .Fl R
@@ -50,7 +50,15 @@
 .Oc
 .Op Fl fhv
 .Ar :group
-.Ar file ...
+.Ar
+.Nm
+.Oo
+.Fl R
+.Op Fl H | Fl L | Fl P
+.Oc
+.Op Fl fhv
+.Fl Fl reference=rfile
+.Ar
 .Sh DESCRIPTION
 .Nm
 sets the user ID and/or the group ID of the specified files.
@@ -107,7 +115,12 @@ The
 .Ar owner
 and
 .Ar group
-operands are both optional, however, one must be specified.
+operands are both optional, however, one must be specified; alternative
+both the owner and group may be specified using a reference
+.Ar rfile
+specified using the
+.Fl Fl reference
+argument.
 If the
 .Ar group
 operand is specified, it must be preceded by a colon (``:'') character.

Index: src/sbin/chown/chown.c
diff -u src/sbin/chown/chown.c:1.5 src/sbin/chown/chown.c:1.6
--- src/sbin/chown/chown.c:1.5	Mon Aug 29 10:34:59 2011
+++ src/sbin/chown/chown.c	Mon Oct 22 14:02:26 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: chown.c,v 1.5 2011/08/29 14:34:59 joerg Exp $	*/
+/*	$NetBSD: chown.c,v 1.6 2012/10/22 18:02:26 christos Exp $	*/
 
 /*
  * Copyright (c) 1988, 1993, 1994, 2003
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19
 #if 0
 static char sccsid[] = "@(#)chown.c	8.8 (Berkeley) 4/4/94";
 #else
-__RCSID("$NetBSD: chown.c,v 1.5 2011/08/29 14:34:59 joerg Exp $");
+__RCSID("$NetBSD: chown.c,v 1.6 2012/10/22 18:02:26 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -58,6 +58,7 @@ __RCSID("$NetBSD: chown.c,v 1.5 2011/08/
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <getopt.h>
 
 static void	a_gid(const char *);
 static void	a_uid(const char *);
@@ -69,23 +70,35 @@ static gid_t gid;
 static int ischown;
 static char *myname;
 
+struct option chown_longopts[] = {
+	{ "reference",		required_argument,	0,
+						1 },
+	{ NULL,			0,			0,
+						0 },
+};
+
 int
 main(int argc, char **argv)
 {
 	FTS *ftsp;
 	FTSENT *p;
 	int Hflag, Lflag, Rflag, ch, fflag, fts_options, hflag, rval, vflag;
-	char *cp;
+	char *cp, *reference;
 	int (*change_owner)(const char *, uid_t, gid_t);
 
 	(void)setlocale(LC_ALL, "");
 
 	myname = (cp = strrchr(*argv, '/')) ? cp + 1 : *argv;
 	ischown = (myname[2] == 'o');
+	reference = NULL;
 
 	Hflag = Lflag = Rflag = fflag = hflag = vflag = 0;
-	while ((ch = getopt(argc, argv, "HLPRfhv")) != -1)
+	while ((ch = getopt_long(argc, argv, "HLPRfhv",
+	    chown_longopts, NULL)) != -1)
 		switch (ch) {
+		case 1:
+			reference = optarg;
+			break;
 		case 'H':
 			Hflag = 1;
 			Lflag = 0;
@@ -123,7 +136,7 @@ main(int argc, char **argv)
 	argv += optind;
 	argc -= optind;
 
-	if (argc < 2)
+	if (argc == 0 || (argc == 1 && reference == NULL))
 		usage();
 
 	fts_options = FTS_PHYSICAL;
@@ -143,24 +156,35 @@ main(int argc, char **argv)
 
 	uid = (uid_t)-1;
 	gid = (gid_t)-1;
-	if (ischown) {
-		if ((cp = strchr(*argv, ':')) != NULL) {
-			*cp++ = '\0';
-			a_gid(cp);
-		}
-#ifdef SUPPORT_DOT
-		else if ((cp = strrchr(*argv, '.')) != NULL) {
-			if (uid_from_user(*argv, &uid) == -1) {
+	if (reference == NULL) {
+		if (ischown) {
+			if ((cp = strchr(*argv, ':')) != NULL) {
 				*cp++ = '\0';
 				a_gid(cp);
 			}
-		}
+#ifdef SUPPORT_DOT
+			else if ((cp = strrchr(*argv, '.')) != NULL) {
+				if (uid_from_user(*argv, &uid) == -1) {
+					*cp++ = '\0';
+					a_gid(cp);
+				}
+			}
 #endif
-		a_uid(*argv);
-	} else
-		a_gid(*argv);
+			a_uid(*argv);
+		} else
+			a_gid(*argv);
+		argv++;
+	} else {
+		struct stat st;
+
+		if (stat(reference, &st) == -1)
+			err(EXIT_FAILURE, "Cannot stat `%s'", reference);
+		uid = st.st_uid;
+		if (ischown)
+			gid = st.st_gid;
+	}
 
-	if ((ftsp = fts_open(++argv, fts_options, NULL)) == NULL)
+	if ((ftsp = fts_open(argv, fts_options, NULL)) == NULL)
 		err(EXIT_FAILURE, "fts_open");
 
 	for (rval = EXIT_SUCCESS; (p = fts_read(ftsp)) != NULL;) {

Reply via email to