Module Name: src Committed By: haad Date: Thu Jan 13 22:28:37 UTC 2011
Modified Files: src/distrib/sets/lists/base: mi src/distrib/sets/lists/comp: mi src/sbin: Makefile src/usr.sbin: Makefile Added Files: src/sbin/chown: Makefile chgrp.1 chown.8 chown.c Removed Files: src/usr.sbin/chown: Makefile chgrp.1 chown.8 chown.c Log Message: Move chown from usr.sbin to sbin and chgrp from usr.bin to bin directories. This was discussed and oked on tech-userlevel I have run full build release, test anita cycle with this patch. To generate a diff of this commit: cvs rdiff -u -r1.914 -r1.915 src/distrib/sets/lists/base/mi cvs rdiff -u -r1.1565 -r1.1566 src/distrib/sets/lists/comp/mi cvs rdiff -u -r1.117 -r1.118 src/sbin/Makefile cvs rdiff -u -r0 -r1.5 src/sbin/chown/Makefile cvs rdiff -u -r0 -r1.4 src/sbin/chown/chgrp.1 src/sbin/chown/chown.8 \ src/sbin/chown/chown.c cvs rdiff -u -r1.249 -r1.250 src/usr.sbin/Makefile cvs rdiff -u -r1.9 -r0 src/usr.sbin/chown/Makefile cvs rdiff -u -r1.19 -r0 src/usr.sbin/chown/chgrp.1 cvs rdiff -u -r1.21 -r0 src/usr.sbin/chown/chown.8 cvs rdiff -u -r1.32 -r0 src/usr.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/distrib/sets/lists/base/mi diff -u src/distrib/sets/lists/base/mi:1.914 src/distrib/sets/lists/base/mi:1.915 --- src/distrib/sets/lists/base/mi:1.914 Wed Jan 12 16:18:57 2011 +++ src/distrib/sets/lists/base/mi Thu Jan 13 22:28:36 2011 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.914 2011/01/12 16:18:57 pooka Exp $ +# $NetBSD: mi,v 1.915 2011/01/13 22:28:36 haad Exp $ # # Note: Don't delete entries from here - mark them as "obsolete" instead, # unless otherwise stated below. @@ -21,6 +21,7 @@ ./bin/cp base-util-root ./bin/cpio base-util-root ./bin/csh base-util-root +./bin/chgrp base-util-root ./bin/date base-util-root ./bin/dd base-util-root ./bin/df base-util-root @@ -206,6 +207,7 @@ ./sbin/brconfig base-netutil-root ./sbin/ccdconfig base-sysutil-root ./sbin/cgdconfig base-sysutil-root crypto +./sbin/chown base-sysutil-root ./sbin/rump.cgdconfig base-sysutil-root crypto ./sbin/clri base-sysutil-root ./sbin/dhclient base-dhclient-root Index: src/distrib/sets/lists/comp/mi diff -u src/distrib/sets/lists/comp/mi:1.1565 src/distrib/sets/lists/comp/mi:1.1566 --- src/distrib/sets/lists/comp/mi:1.1565 Wed Jan 12 16:18:57 2011 +++ src/distrib/sets/lists/comp/mi Thu Jan 13 22:28:37 2011 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1565 2011/01/12 16:18:57 pooka Exp $ +# $NetBSD: mi,v 1.1566 2011/01/13 22:28:37 haad Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -2954,6 +2954,7 @@ ./usr/libdata/debug/sbin/brconfig.debug comp-netutil-debug debug ./usr/libdata/debug/sbin/ccdconfig.debug comp-sysutil-debug debug ./usr/libdata/debug/sbin/cgdconfig.debug comp-sysutil-debug crypto,debug +./usr/libdata/debug/sbin/chown.debug comp-sysutil-debug debug ./usr/libdata/debug/sbin/rump.cgdconfig.debug comp-sysutil-debug crypto,debug ./usr/libdata/debug/sbin/clri.debug comp-sysutil-debug debug ./usr/libdata/debug/sbin/dhclient.debug comp-dhclient-debug debug @@ -3597,7 +3598,6 @@ ./usr/libdata/debug/usr/sbin/btuartd.debug comp-obsolete obsolete ./usr/libdata/debug/usr/sbin/catman.debug comp-man-debug debug ./usr/libdata/debug/usr/sbin/chat.debug comp-ppp-debug debug -./usr/libdata/debug/usr/sbin/chown.debug comp-sysutil-debug debug ./usr/libdata/debug/usr/sbin/chroot.debug comp-sysutil-debug debug ./usr/libdata/debug/usr/sbin/chrtbl.debug comp-sysutil-debug debug ./usr/libdata/debug/usr/sbin/cnwctl.debug comp-netutil-debug debug Index: src/sbin/Makefile diff -u src/sbin/Makefile:1.117 src/sbin/Makefile:1.118 --- src/sbin/Makefile:1.117 Sat Oct 30 21:16:07 2010 +++ src/sbin/Makefile Thu Jan 13 22:28:36 2011 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.117 2010/10/30 21:16:07 haad Exp $ +# $NetBSD: Makefile,v 1.118 2011/01/13 22:28:36 haad Exp $ # @(#)Makefile 8.5 (Berkeley) 3/31/94 # Not ported: XNSrouted enpload scsiformat startslip @@ -7,7 +7,7 @@ .include <bsd.own.mk> SUBDIR= amrctl apmlabel atactl badsect bioctl brconfig ccdconfig \ - disklabel dkctl dkscan_bsdlabel dmesg \ + chown disklabel dkctl dkscan_bsdlabel dmesg \ drvctl fastboot fdisk fsck fsirand gpt ifconfig init ldconfig \ mbrlabel mknod modload modstat modunload mount newbtconf nologin \ pdisk ping pppoectl raidctl reboot rcorder rndctl route routed \ Index: src/usr.sbin/Makefile diff -u src/usr.sbin/Makefile:1.249 src/usr.sbin/Makefile:1.250 --- src/usr.sbin/Makefile:1.249 Wed Dec 8 07:20:14 2010 +++ src/usr.sbin/Makefile Thu Jan 13 22:28:35 2011 @@ -1,11 +1,11 @@ -# $NetBSD: Makefile,v 1.249 2010/12/08 07:20:14 kefren Exp $ +# $NetBSD: Makefile,v 1.250 2011/01/13 22:28:35 haad Exp $ # from: @(#)Makefile 5.20 (Berkeley) 6/12/93 .include <bsd.own.mk> SUBDIR= ac accton acpitools altq apm apmd arp bad144 bootp \ btattach btconfig btdevctl bthcid btpand catman \ - chown chroot chrtbl cnwctl cpuctl crash dev_mkdb \ + chroot chrtbl cnwctl cpuctl crash dev_mkdb \ dhcp diskpart dumpfs dumplfs edquota eeprom \ envstat eshconfig etcupdate extattrctl fssconfig fusermount fwctl \ gpioctl grfconfig grfinfo gspa hdaudioctl hilinfo ifwatchd inetd \ Added files: Index: src/sbin/chown/Makefile diff -u /dev/null src/sbin/chown/Makefile:1.5 --- /dev/null Thu Jan 13 22:28:37 2011 +++ src/sbin/chown/Makefile Thu Jan 13 22:28:36 2011 @@ -0,0 +1,12 @@ +# from: @(#)Makefile 8.1 (Berkeley) 6/6/93 +# $NetBSD: Makefile,v 1.5 2011/01/13 22:28:36 haad Exp $ + +PROG= chown +CPPFLAGS+=-DSUPPORT_DOT +MAN= chgrp.1 chown.8 +LINKS= ${BINDIR}/chown /bin/chgrp + +LINKS+= ${BINDIR}/chown /usr/bin/chgrp +LINKS+= ${BINDIR}/chown /usr/sbin/chown + +.include <bsd.prog.mk> Index: src/sbin/chown/chgrp.1 diff -u /dev/null src/sbin/chown/chgrp.1:1.4 --- /dev/null Thu Jan 13 22:28:37 2011 +++ src/sbin/chown/chgrp.1 Thu Jan 13 22:28:36 2011 @@ -0,0 +1,155 @@ +.\" Copyright (c) 1983, 1990, 1993, 1994, 2003 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" the Institute of Electrical and Electronics Engineers, Inc. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" 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 $ +.\" +.Dd September 25, 2003 +.Dt CHGRP 1 +.Os +.Sh NAME +.Nm chgrp +.Nd change group +.Sh SYNOPSIS +.Nm +.Oo +.Fl R +.Op Fl H | Fl L | Fl P +.Oc +.Op Fl fhv +.Ar group +.Ar file ... +.Sh DESCRIPTION +The +.Nm +utility sets the group ID of the file named by each +.Ar file +operand to the +.Ar group +ID specified by the group operand. +.Pp +Options: +.Bl -tag -width Ds +.It Fl H +If the +.Fl R +option is specified, symbolic links on the command line are followed. +(Symbolic links encountered in the tree traversal are not followed.) +.It Fl L +If the +.Fl R +option is specified, all symbolic links are followed. +.It Fl P +If the +.Fl R +option is specified, no symbolic links are followed. +.It Fl R +Change the group ID for the file hierarchies rooted +in the files instead of just the files themselves. +.It Fl f +The force option ignores errors, except for usage errors and doesn't +query about strange modes (unless the user does not have proper permissions). +.It Fl h +If +.Ar file +is a symbolic link, the group of the link is changed. +.It Fl v +Cause +.Nm +to be verbose, showing files as they are processed. +.El +.Pp +If +.Fl h +is not given, unless the +.Fl H +or +.Fl L +option is set, +.Nm +on a symbolic link always succeeds and has no effect. +The +.Fl H , +.Fl L +and +.Fl P +options are ignored unless the +.Fl R +option is specified. +In addition, these options override each other and the +command's actions are determined by the last one specified. +.Pp +The +.Ar group +operand can be either a group name from the group database, +or a numeric group ID. +Since it is valid to have a group name that is numeric (and +doesn't have the numeric ID that matches its name) the name lookup +is always done first. +Preceding the ID with a ``#'' character will force it to be taken +as a number. +.Pp +The user invoking +.Nm +must belong to the specified group and be the owner of the file, +or be the super-user. +.Pp +Unless invoked by the super-user, +.Nm +clears the set-user-id and set-group-id bits on a file to prevent +accidental or mischievous creation of set-user-id or set-group-id +programs. +.Pp +The +.Nm +utility exits 0 on success, and \*[Gt]0 if an error occurs. +.Sh FILES +.Bl -tag -width /etc/group -compact +.It Pa /etc/group +Group ID file +.El +.Sh SEE ALSO +.Xr chown 2 , +.Xr lchown 2 , +.Xr fts 3 , +.Xr group 5 , +.Xr passwd 5 , +.Xr symlink 7 , +.Xr chown 8 +.Sh STANDARDS +The +.Nm +utility is expected to be POSIX 1003.2 compatible. +.Pp +The +.Fl v +option and the use of ``#'' to force a numeric group ID +are extensions to +.St -p1003.2 . Index: src/sbin/chown/chown.8 diff -u /dev/null src/sbin/chown/chown.8:1.4 --- /dev/null Thu Jan 13 22:28:37 2011 +++ src/sbin/chown/chown.8 Thu Jan 13 22:28:36 2011 @@ -0,0 +1,162 @@ +.\" Copyright (c) 1990, 1991, 1993, 1994, 2003 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" 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 $ +.\" +.Dd December 9, 2005 +.Dt CHOWN 8 +.Os +.Sh NAME +.Nm chown +.Nd change file owner and group +.Sh SYNOPSIS +.Nm +.Oo +.Fl R +.Op Fl H | Fl L | Fl P +.Oc +.Op Fl fhv +.Ar owner Ns Op Ar :group +.Ar file ... +.Nm +.Oo +.Fl R +.Op Fl H | Fl L | Fl P +.Oc +.Op Fl fhv +.Ar :group +.Ar file ... +.Sh DESCRIPTION +.Nm +sets the user ID and/or the group ID of the specified files. +.Pp +The options are as follows: +.Bl -tag -width Ds +.It Fl H +If the +.Fl R +option is specified, symbolic links on the command line are followed. +(Symbolic links encountered in the tree traversal are not followed.) +.It Fl L +If the +.Fl R +option is specified, all symbolic links are followed. +.It Fl P +If the +.Fl R +option is specified, no symbolic links are followed. +.It Fl R +Change the user ID and/or the group ID for the file hierarchies rooted +in the files instead of just the files themselves. +.It Fl f +Don't report any failure to change file owner or group, nor modify +the exit status to reflect such failures. +.It Fl h +If +.Ar file +is a symbolic link, the owner and/or group of the link is changed. +.It Fl v +Cause +.Nm +to be verbose, showing files as they are processed. +.El +.Pp +The +.Fl H , +.Fl L +and +.Fl P +options are ignored unless the +.Fl R +option is specified. +In addition, these options override each other and the +command's actions are determined by the last one specified. +.Pp +The +.Fl L +option cannot be used together with the +.Fl h +option. +.Pp +The +.Ar owner +and +.Ar group +operands are both optional, however, one must be specified. +If the +.Ar group +operand is specified, it must be preceded by a colon (``:'') character. +.Pp +The +.Ar owner +may be either a user name or a numeric user ID. +The +.Ar group +may be either a group name or a numeric group ID. +Since it is valid to have a user or group name that is numeric (and +doesn't have the numeric ID that matches its name) the name lookup +is always done first. +Preceding an ID with a ``#'' character will force it to be taken +as a number. +.Pp +The ownership of a file may only be altered by a super-user for +obvious security reasons. +.Pp +Unless invoked by the super-user, +.Nm +clears the set-user-id and set-group-id bits on a file to prevent +accidental or mischievous creation of set-user-id and set-group-id +programs. +.Pp +The +.Nm +utility exits 0 on success, and \*[Gt]0 if an error occurs. +.Sh COMPATIBILITY +Previous versions of the +.Nm +utility used the dot (``.'') character to distinguish the group name. +This has been changed to be a colon (``:'') character so that user and +group names may contain the dot character. +.Sh SEE ALSO +.Xr chflags 1 , +.Xr chgrp 1 , +.Xr find 1 , +.Xr chown 2 , +.Xr lchown 2 , +.Xr fts 3 , +.Xr symlink 7 +.Sh STANDARDS +The +.Nm +command is expected to be POSIX 1003.2 compliant. +.Pp +The +.Fl v +option and the use of ``#'' to force a numeric lookup +are extensions to +.St -p1003.2 . Index: src/sbin/chown/chown.c diff -u /dev/null src/sbin/chown/chown.c:1.4 --- /dev/null Thu Jan 13 22:28:37 2011 +++ src/sbin/chown/chown.c Thu Jan 13 22:28:36 2011 @@ -0,0 +1,274 @@ +/* $NetBSD: chown.c,v 1.4 2011/01/13 22:28:36 haad Exp $ */ + +/* + * Copyright (c) 1988, 1993, 1994, 2003 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +#ifndef lint +__COPYRIGHT("@(#) Copyright (c) 1988, 1993, 1994, 2003\ + The Regents of the University of California. All rights reserved."); +#endif /* not lint */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)chown.c 8.8 (Berkeley) 4/4/94"; +#else +__RCSID("$NetBSD: chown.c,v 1.4 2011/01/13 22:28:36 haad Exp $"); +#endif +#endif /* not lint */ + +#include <sys/types.h> +#include <sys/stat.h> + +#include <ctype.h> +#include <dirent.h> +#include <err.h> +#include <errno.h> +#include <locale.h> +#include <fts.h> +#include <grp.h> +#include <pwd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +static void a_gid(const char *); +static void a_uid(const char *); +static id_t id(const char *, const char *); +static void usage(void); + +static uid_t uid; +static gid_t gid; +static int ischown; +static char *myname; + +int +main(int argc, char **argv) +{ + FTS *ftsp; + FTSENT *p; + int Hflag, Lflag, Rflag, ch, fflag, fts_options, hflag, rval, vflag; + char *cp; + int (*change_owner)(const char *, uid_t, gid_t); + + (void)setlocale(LC_ALL, ""); + + myname = (cp = strrchr(*argv, '/')) ? cp + 1 : *argv; + ischown = (myname[2] == 'o'); + + Hflag = Lflag = Rflag = fflag = hflag = vflag = 0; + while ((ch = getopt(argc, argv, "HLPRfhv")) != -1) + switch (ch) { + case 'H': + Hflag = 1; + Lflag = 0; + break; + case 'L': + Lflag = 1; + Hflag = 0; + break; + case 'P': + Hflag = Lflag = 0; + break; + case 'R': + Rflag = 1; + break; + case 'f': + fflag = 1; + break; + case 'h': + /* + * In System V the -h option causes chown/chgrp to + * change the owner/group of the symbolic link. + * 4.4BSD's symbolic links didn't have owners/groups, + * so it was an undocumented noop. + * In NetBSD 1.3, lchown(2) is introduced. + */ + hflag = 1; + break; + case 'v': + vflag = 1; + break; + case '?': + default: + usage(); + } + argv += optind; + argc -= optind; + + if (argc < 2) + usage(); + + fts_options = FTS_PHYSICAL; + if (Rflag) { + if (Hflag) + fts_options |= FTS_COMFOLLOW; + if (Lflag) { + if (hflag) + errx(EXIT_FAILURE, + "the -L and -h options " + "may not be specified together."); + fts_options &= ~FTS_PHYSICAL; + fts_options |= FTS_LOGICAL; + } + } else if (!hflag) + fts_options |= FTS_COMFOLLOW; + + 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) { + *cp++ = '\0'; + a_gid(cp); + } + } +#endif + a_uid(*argv); + } else + a_gid(*argv); + + if ((ftsp = fts_open(++argv, fts_options, NULL)) == NULL) + err(EXIT_FAILURE, "fts_open"); + + for (rval = EXIT_SUCCESS; (p = fts_read(ftsp)) != NULL;) { + change_owner = chown; + switch (p->fts_info) { + case FTS_D: + if (!Rflag) /* Change it at FTS_DP. */ + fts_set(ftsp, p, FTS_SKIP); + continue; + case FTS_DNR: /* Warn, chown, continue. */ + warnx("%s: %s", p->fts_path, strerror(p->fts_errno)); + rval = EXIT_FAILURE; + break; + case FTS_ERR: /* Warn, continue. */ + case FTS_NS: + warnx("%s: %s", p->fts_path, strerror(p->fts_errno)); + rval = EXIT_FAILURE; + continue; + case FTS_SL: /* Ignore unless -h. */ + /* + * All symlinks we found while doing a physical + * walk end up here. + */ + if (!hflag) + continue; + /* + * Note that if we follow a symlink, fts_info is + * not FTS_SL but FTS_F or whatever. And we should + * use lchown only for FTS_SL and should use chown + * for others. + */ + change_owner = lchown; + break; + case FTS_SLNONE: /* Ignore. */ + /* + * The only symlinks that end up here are ones that + * don't point to anything. Note that if we are + * doing a phisycal walk, we never reach here unless + * we asked to follow explicitly. + */ + continue; + default: + break; + } + + if ((*change_owner)(p->fts_accpath, uid, gid) && !fflag) { + warn("%s", p->fts_path); + rval = EXIT_FAILURE; + } else { + if (vflag) + printf("%s\n", p->fts_path); + } + } + if (errno) + err(EXIT_FAILURE, "fts_read"); + exit(rval); + /* NOTREACHED */ +} + +static void +a_gid(const char *s) +{ + struct group *gr; + + if (*s == '\0') /* Argument was "uid[:.]". */ + return; + gr = *s == '#' ? NULL : getgrnam(s); + if (gr == NULL) + gid = id(s, "group"); + else + gid = gr->gr_gid; + return; +} + +static void +a_uid(const char *s) +{ + if (*s == '\0') /* Argument was "[:.]gid". */ + return; + if (*s == '#' || uid_from_user(s, &uid) == -1) { + uid = id(s, "user"); + } + return; +} + +static id_t +id(const char *name, const char *type) +{ + id_t val; + char *ep; + + errno = 0; + if (*name == '#') + name++; + val = (id_t)strtoul(name, &ep, 10); + if (errno) + err(EXIT_FAILURE, "%s", name); + if (*ep != '\0') + errx(EXIT_FAILURE, "%s: invalid %s name", name, type); + return (val); +} + +static void +usage(void) +{ + + (void)fprintf(stderr, + "usage: %s [-R [-H | -L | -P]] [-fhv] %s file ...\n", + myname, ischown ? "[owner][:group]" : "group"); + exit(EXIT_FAILURE); +}