clean up install entry to use install script
[unix-history] / usr / src / usr.sbin / chown / chgrp.c
index 41dd18c..ea53806 100644 (file)
@@ -1,4 +1,7 @@
-static char *sccsid = "@(#)chgrp.c     4.1 (Berkeley) %G%";
+#ifndef lint
+static char *sccsid = "@(#)chgrp.c     4.4 83/01/20";
+#endif
+
 /*
  * chgrp gid file ...
  */
 /*
  * chgrp gid file ...
  */
@@ -8,47 +11,81 @@ static char *sccsid = "@(#)chgrp.c   4.1 (Berkeley) %G%";
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <grp.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <grp.h>
+#include <pwd.h>
 
 
-struct group   *gr,*getgrnam();
-struct stat    stbuf;
-int    gid;
+struct group *gr, *getgrnam(), *getgrgid();
+struct passwd *getpwuid(), *pwd;
+struct stat stbuf;
+int    gid, uid;
 int    status;
 int    status;
+/* VARARGS */
+int    fprintf();
 
 main(argc, argv)
 
 main(argc, argv)
-char *argv[];
+       int argc;
+       char *argv[];
 {
 {
-       register c;
+       register c, i;
 
 
-       if(argc < 3) {
+       argc--, argv++;
+       if (argc < 2) {
                printf("usage: chgrp gid file ...\n");
                printf("usage: chgrp gid file ...\n");
-               exit(4);
+               exit(2);
        }
        }
-       if(isnumber(argv[1])) {
-               gid = atoi(argv[1]);
+       uid = getuid();
+       if (isnumber(argv[0])) {
+               gid = atoi(argv[0]);
+               gr = getgrgid(gid);
+               if (uid && gr == NULL) {
+                       printf("%s: unknown group\n", argv[0]);
+                       exit(2);
+               }
        } else {
        } else {
-               if((gr=getgrnam(argv[1])) == NULL) {
-                       printf("unknown group: %s\n",argv[1]);
-                       exit(4);
+               gr = getgrnam(argv[0]);
+               if (gr == NULL) {
+                       printf("%s: unknown group\n", argv[0]);
+                       exit(2);
                }
                gid = gr->gr_gid;
        }
                }
                gid = gr->gr_gid;
        }
-       for(c=2; c<argc; c++) {
-               stat(argv[c], &stbuf);
-               if(chown(argv[c], stbuf.st_uid, gid) < 0) {
+       pwd = getpwuid(uid);
+       if (pwd == NULL) {
+               fprintf(stderr, "Who are you?\n");
+               exit(2);
+       }
+       if (uid && pwd->pw_gid != gid) {
+               for (i=0; gr->gr_mem[i]; i++)
+                       if (!(strcmp(pwd->pw_name, gr->gr_mem[i])))
+                               goto ok;
+               fprintf(stderr, "You are not a member of the %s group.\n",
+                   argv[0]);
+               exit(2);
+       }
+ok:
+       for (c = 1; c < argc; c++) {
+               if (stat(argv[c], &stbuf)) {
                        perror(argv[c]);
                        perror(argv[c]);
+                       continue;
+               }
+               if (uid && uid != stbuf.st_uid) {
+                       fprintf(stderr, "You are not the owner of %s\n",
+                           argv[c]);
                        status = 1;
                        status = 1;
+                       continue;
                }
                }
+               if (chown(argv[c], stbuf.st_uid, gid))
+                       perror(argv[c]);
        }
        exit(status);
 }
 
 isnumber(s)
        }
        exit(status);
 }
 
 isnumber(s)
-char *s;
+       char *s;
 {
 {
-       register c;
+       register int c;
 
 
-       while(c = *s++)
-               if(!isdigit(c))
-                       return(0);
-       return(1);
+       while (c = *s++)
+               if (!isdigit(c))
+                       return (0);
+       return (1);
 }
 }