Ha! Got init working.
[oweals/busybox.git] / chmod_chown_chgrp.c
index cac09e71dfbc5961fe89c455b6e321c29a47464f..da3ba8d5020c0f81808d83f697a219fd39cd3916 100644 (file)
@@ -1,7 +1,9 @@
 /*
  * Mini chown/chmod/chgrp implementation for busybox
  *
- * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * Copyright (C) 1999 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,8 +27,8 @@
 #include "internal.h"
 
 
-static int uid=-1;
-static int gid=0;
+static uid_t uid=-1;
+static gid_t gid=-1;
 static int whichApp;
 static char* invocationName=NULL;
 static mode_t mode=0644;
@@ -48,18 +50,20 @@ static const char chmod_usage[] = "[-R] MODE[,MODE]... FILE...\n"
  "\t-R\tchange files and directories recursively.\n";
 
 
-
 static int fileAction(const char *fileName, struct stat* statbuf)
 {
     switch (whichApp) {
        case CHGRP_APP:
        case CHOWN_APP:
-           if (chown(fileName, ((whichApp==CHOWN_APP)? uid: statbuf->st_uid), gid) < 0)
+           if (chown(fileName, (whichApp==CHOWN_APP)? uid : statbuf->st_uid, 
+                       (gid==-1)? statbuf->st_gid : gid) == 0) {
                return( TRUE);
+           }
+           break;
        case CHMOD_APP:
-           fprintf(stderr, "%s, %d\n", fileName, mode);
-           if (chmod(fileName, mode))
+           if (chmod(fileName, mode) == 0)
                return( TRUE);
+           break;
     }
     perror(fileName);
     return( FALSE);
@@ -67,8 +71,6 @@ static int fileAction(const char *fileName, struct stat* statbuf)
 
 int chmod_chown_chgrp_main(int argc, char **argv)
 {
-    struct group *grp;
-    struct passwd *pwd;
     int recursiveFlag=FALSE;
     char *groupName;
 
@@ -99,36 +101,38 @@ int chmod_chown_chgrp_main(int argc, char **argv)
     
     if ( whichApp == CHMOD_APP ) {
        /* Find the specified modes */
-       mode &= S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
+       mode = 0;
        if ( parse_mode(*argv, &mode) == FALSE ) {
            fprintf(stderr, "%s: Unknown mode: %s\n", invocationName, *argv);
            exit( FALSE);
        }
-       //mode &= andWithMode;
-       fprintf(stderr, "mode %d\n", mode);
     } else {
 
        /* Find the selected group */
-       groupName = strchr(*argv, '.');
-       if ( whichApp==TRUE && groupName )
-           *groupName++ = '\0';
-       else
+       if ( whichApp==CHGRP_APP ) {
            groupName = *argv;
-       grp = getgrnam(groupName);
-       if (grp == NULL) {
-           fprintf(stderr, "%s: Unknown group name: %s\n", invocationName, groupName);
-           exit( FALSE);
+           gid = my_getgrnam(groupName);
+           if (gid == -1)
+               goto bad_group;
+       } else {
+           groupName = strchr(*argv, '.');
+           if (groupName) {
+               *groupName++ = '\0';
+               gid = my_getgrnam(groupName);
+               if (gid == -1)
+                   goto bad_group;
+           } else
+               gid = -1;
        }
-       gid = grp->gr_gid;
+
 
        /* Find the selected user (if appropriate)  */
-       if (whichApp==TRUE) {
-           pwd = getpwnam(*argv);
-           if (pwd == NULL) {
+       if (whichApp==CHOWN_APP) {
+           uid = my_getpwnam(*argv);
+           if (uid == -1) {
                fprintf(stderr, "%s: Unknown user name: %s\n", invocationName, *argv);
                exit( FALSE);
            }
-           uid = pwd->pw_uid;
        }
     }
     
@@ -142,5 +146,10 @@ int chmod_chown_chgrp_main(int argc, char **argv)
            exit( FALSE);
     }
     exit(TRUE);
+
+bad_group:
+    fprintf(stderr, "%s: Unknown group name: %s\n", invocationName, groupName);
+    exit( FALSE);
 }
 
+