- Add new -vv option. If the -v flag is specified more than once,
authorLiam J. Foy <liamfoy@dragonflybsd.org>
Thu, 25 Nov 2004 19:45:30 +0000 (19:45 +0000)
committerLiam J. Foy <liamfoy@dragonflybsd.org>
Thu, 25 Nov 2004 19:45:30 +0000 (19:45 +0000)
  chown will print the filename, followed by the old and new numeric
  user/group ID. (Obtained from FreeBSD with my modifications)
- Static functions and globals
- Remove global hflag
- Fix some casts
- Make WARNS?= 6 clean
- Add WARNS?= 6
- Constify id()
- Remove '?' case
- Update chown.8 for the addition of +vv

Ok'ed: Joerg@

usr.sbin/chown/Makefile
usr.sbin/chown/chown.8
usr.sbin/chown/chown.c

index 95d754c..02e24e2 100644 (file)
@@ -1,10 +1,11 @@
 #      @(#)Makefile    8.1 (Berkeley) 6/6/93
 # $FreeBSD: src/usr.sbin/chown/Makefile,v 1.5.2.1 2001/04/25 12:09:22 ru Exp $
-# $DragonFly: src/usr.sbin/chown/Makefile,v 1.2 2003/06/17 04:29:52 dillon Exp $
+# $DragonFly: src/usr.sbin/chown/Makefile,v 1.3 2004/11/25 19:45:30 liamfoy Exp $
 
 PROG=  chown
 CFLAGS+=-DSUPPORT_DOT
 MAN=   chgrp.1 chown.8
 LINKS= ${BINDIR}/chown /usr/bin/chgrp
 
+WARNS?=        6
 .include <bsd.prog.mk>
index fdf2d05..7e85516 100644 (file)
@@ -31,9 +31,9 @@
 .\"
 .\"     @(#)chown.8    8.3 (Berkeley) 3/31/94
 .\" $FreeBSD: src/usr.sbin/chown/chown.8,v 1.10.2.7 2003/03/12 22:08:13 trhodes Exp $
-.\" $DragonFly: src/usr.sbin/chown/chown.8,v 1.2 2003/06/17 04:29:52 dillon Exp $
+.\" $DragonFly: src/usr.sbin/chown/chown.8,v 1.3 2004/11/25 19:45:30 liamfoy Exp $
 .\"
-.Dd March 31, 1994
+.Dd November 24, 2004 
 .Dt CHOWN 8
 .Os
 .Sh NAME
@@ -97,6 +97,11 @@ group ID of the link itself.
 Cause
 .Nm
 to be verbose, showing files as the owner is modified.
+If the
+.Fl v
+flag is specified more than once,
+.Nm
+will print the filename, followed by the old and new numeric user/group ID.
 .El
 .Pp
 The
index d5d3696..f88073f 100644 (file)
@@ -33,7 +33,7 @@
  * @(#) Copyright (c) 1988, 1993, 1994 The Regents of the University of California.  All rights reserved.
  * @(#)chown.c 8.8 (Berkeley) 4/4/94
  * $FreeBSD: src/usr.sbin/chown/chown.c,v 1.15.2.3 2002/08/07 21:24:33 schweikh Exp $
- * $DragonFly: src/usr.sbin/chown/chown.c,v 1.5 2004/08/30 19:27:21 eirikn Exp $
+ * $DragonFly: src/usr.sbin/chown/chown.c,v 1.6 2004/11/25 19:45:30 liamfoy Exp $
  */
 
 #include <sys/param.h>
 #include <string.h>
 #include <unistd.h>
 
-void   a_gid(char *);
-void   a_uid(char *);
-void   chownerr(char *);
-u_long id(char *, char *);
-void   usage(void);
+static void    a_gid(char *);
+static void    a_uid(char *);
+static void    chownerr(const char *);
+static uid_t   id(const char *, const char *);
+static void    usage(void);
 
-uid_t uid;
-gid_t gid;
-int Rflag, ischown, fflag, hflag, vflag;
-char *gname, *myname;
+static uid_t    uid;
+static gid_t    gid;
+static int      Rflag, ischown, fflag, vflag;
+static char     *gname, *myname;
 
 int
 main(int argc, char **argv)
@@ -98,9 +98,8 @@ main(int argc, char **argv)
                        hflag = 1;
                        break;
                case 'v':
-                       vflag = 1;
+                       vflag++;
                        break;
-               case '?':
                default:
                        usage();
                }
@@ -171,8 +170,8 @@ main(int argc, char **argv)
                default:
                        break;
                }
-               if ((uid == -1 || uid == p->fts_statp->st_uid) &&
-                   (gid == -1 || gid == p->fts_statp->st_gid))
+               if ((uid == (uid_t)(-1) || uid == p->fts_statp->st_uid) &&
+                   (gid == (gid_t)(-1) || gid == p->fts_statp->st_gid))
                        continue;
                if (hflag) {
                        if (lchown(p->fts_accpath, uid, gid) && !fflag) {
@@ -188,7 +187,27 @@ main(int argc, char **argv)
                                rval = 1;
                        } else {
                                if (vflag)
-                                       (void)printf("%s\n", p->fts_accpath);
+                                       (void)printf("%s", p->fts_accpath);
+                                        if (vflag > 1) {
+                                               if (ischown) {
+                                                       printf(": %d:%d -> %d:%d",
+                                                               (int)p->fts_statp->st_uid,
+                                                               (int)p->fts_statp->st_gid,
+                                                               (uid == (uid_t)-1) ?
+                                                               (int)p->fts_statp->st_uid :
+                                                               (int)uid,
+                                                               (gid == (gid_t)-1) ?
+                                                               (int) p->fts_statp->st_gid :
+                                                               (int)gid);
+                                               } else {
+                                                       printf(": %d -> %d",
+                                                               (int)p->fts_statp->st_gid,
+                                                               (gid == (gid_t)-1) ?
+                                                               (int)p->fts_statp->st_gid :
+                                                               (int)gid);
+                                                }
+                                        }
+                                        printf("\n");
                        }
                }
        }
@@ -197,7 +216,7 @@ main(int argc, char **argv)
        exit(rval);
 }
 
-void
+static void
 a_gid(char *s)
 {
        struct group *gr;
@@ -208,7 +227,7 @@ a_gid(char *s)
        gid = ((gr = getgrnam(s)) == NULL) ? id(s, "group") : gr->gr_gid;
 }
 
-void
+static void
 a_uid(char *s)
 {
        struct passwd *pw;
@@ -218,8 +237,8 @@ a_uid(char *s)
        uid = ((pw = getpwnam(s)) == NULL) ? id(s, "user") : pw->pw_uid;
 }
 
-u_long
-id(char *name, char *type)
+static uid_t
+id(const char *name, const char *type)
 {
        u_long val;
        char *ep;
@@ -237,20 +256,21 @@ id(char *name, char *type)
        return (val);
 }
 
-void
-chownerr(char *file)
+static void
+chownerr(const char *file)
 {
-       static int euid = -1, ngroups = -1;
+       static uid_t euid = -1;
+       static int ngroups = -1;
        gid_t groups[NGROUPS];
 
        /* Check for chown without being root. */
        if (errno != EPERM ||
-           (uid != -1 && euid == -1 && (euid = geteuid()) != 0))
+           (uid != (uid_t)(-1) && euid == (uid_t)(-1) && (euid = geteuid()) != 0))
                err(1, "%s", file);
 
        /* Check group membership; kernel just returns EPERM. */
-       if (gid != -1 && ngroups == -1 &&
-           euid == -1 && (euid = geteuid()) != 0) {
+       if (gid != (gid_t)(-1) && ngroups == -1 &&
+           euid == (uid_t)(-1) && (euid = geteuid()) != 0) {
                ngroups = getgroups(NGROUPS, groups);
                while (--ngroups >= 0 && gid != groups[ngroups]);
                if (ngroups < 0)
@@ -259,7 +279,7 @@ chownerr(char *file)
        warn("%s", file);
 }
 
-void
+static void
 usage(void)
 {
        (void)fprintf(stderr, "%s\n%s\n%s\n",