Added sfdisk. Ststic-ified a bunch of stuff.
[oweals/busybox.git] / chmod_chown_chgrp.c
index 5c2adab7872603fc5b1bf7a8e04bdb030966d61f..e76050022219141f6aa22d00c07f10752c788bde 100644 (file)
@@ -49,20 +49,17 @@ static const char chmod_usage[] = "[-R] MODE[,MODE]... FILE...\n"
 
 
 
-static int fileAction(const char *fileName)
+static int fileAction(const char *fileName, struct stat* statbuf)
 {
-    struct stat statBuf;
-    if (stat(fileName, &statBuf) < 0) {
-       switch (whichApp) {
-           case CHGRP_APP:
-           case CHOWN_APP:
-               if (chown(fileName, ((whichApp==CHOWN_APP)? uid: statBuf.st_uid), gid) < 0)
-                   return( TRUE);
-           case CHMOD_APP:
-               fprintf(stderr, "%s, %d\n", fileName, mode);
-               if (chmod(fileName, mode))
-                   return( TRUE);
-       }
+    switch (whichApp) {
+       case CHGRP_APP:
+       case CHOWN_APP:
+           if (chown(fileName, ((whichApp==CHOWN_APP)? uid: statbuf->st_uid), gid) < 0)
+               return( TRUE);
+       case CHMOD_APP:
+           fprintf(stderr, "%s, %d\n", fileName, mode);
+           if (chmod(fileName, mode))
+               return( TRUE);
     }
     perror(fileName);
     return( FALSE);
@@ -74,7 +71,6 @@ int chmod_chown_chgrp_main(int argc, char **argv)
     struct passwd *pwd;
     int recursiveFlag=FALSE;
     char *groupName;
-    mode_t andWithMode= S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
 
     whichApp = (strcmp(*argv, "chown")==0)? CHOWN_APP : (strcmp(*argv, "chmod")==0)? CHMOD_APP : CHGRP_APP; 
 
@@ -103,6 +99,7 @@ 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;
        if ( parse_mode(*argv, &mode) == FALSE ) {
            fprintf(stderr, "%s: Unknown mode: %s\n", invocationName, *argv);
            exit( FALSE);
@@ -141,9 +138,177 @@ int chmod_chown_chgrp_main(int argc, char **argv)
        exit( FALSE);
     }
     while (argc-- > 1) {
-       if (recursiveAction( *(++argv), recursiveFlag, TRUE, fileAction, fileAction)==FALSE)
+       if (recursiveAction( *(++argv), recursiveFlag, TRUE, FALSE, fileAction, fileAction)==FALSE)
            exit( FALSE);
     }
     exit(TRUE);
 }
 
+
+
+
+
+
+
+
+
+
+
+
+#ifdef fooo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "internal.h"
+#include <pwd.h>
+#include <grp.h>
+#include <string.h>
+#include <stdio.h>
+
+int my_getid(const char *filename, const char *name, uid_t *id) 
+{
+       FILE *stream;
+       uid_t rid;
+       char *rname, *start, *end, buf[128];
+
+       stream=fopen(filename,"r");
+
+       while (fgets (buf, 128, stream) != NULL) {
+               if (buf[0] == '#')
+                       continue;
+
+               start = buf;
+               end = strchr (start, ':');
+               if (end == NULL)
+                       continue;
+               *end = '\0';
+               rname = start;
+
+               start = end + 1;
+               end = strchr (start, ':');
+               if (end == NULL)
+                       continue;
+
+               start = end + 1;
+               rid = (uid_t) strtol (start, &end, 10);
+               if (end == start)
+                       continue;
+
+               if (name) {
+                       if (0 == strcmp(rname, name)) {
+                               *id=rid;
+                               return 0;
+                       }
+               } else {
+                       if ( *id == rid )
+                               return 0;
+               }
+       }
+       fclose(stream);
+       return -1;
+}
+
+int 
+my_getpwuid(uid_t *uid) 
+{
+       return my_getid("/etc/passwd", NULL, uid);
+}
+
+int 
+my_getpwnam(char *name, uid_t *uid) 
+{
+       return my_getid("/etc/passwd", name, uid);
+}
+
+int 
+my_getgrgid(gid_t *gid) 
+{
+       return my_getid("/etc/group", NULL, gid);
+}
+
+int 
+my_getgrnam(char *name, gid_t *gid) 
+{
+       return my_getid("/etc/group", name, gid);
+}
+
+const char     chown_usage[] = "chown [-R] user-name file [file ...]\n"
+"\n\tThe group list is kept in the file /etc/groups.\n\n"
+"\t-R:\tRecursively change the mode of all files and directories\n"
+"\t\tunder the argument directory.";
+
+int
+parse_user_name(const char * s, struct FileInfo * i)
+{
+       char *                          dot = strchr(s, '.');
+       char * end = NULL;
+       uid_t id = 0;
+
+       if (! dot )
+               dot = strchr(s, ':');
+
+       if ( dot )
+               *dot = '\0';
+
+       if ( my_getpwnam(s,&id) == -1 ) {
+               id = strtol(s,&end,10);
+               if ((*end != '\0') || ( my_getpwuid(&id) == -1 )) {
+                       fprintf(stderr, "%s: no such user.\n", s);
+                       return 1;
+               }
+       }
+       i->userID = id;
+
+       if ( dot ) {
+               if ( my_getgrnam(++dot,&id) == -1 ) {
+                       id = strtol(dot,&end,10);
+                       if ((*end != '\0') || ( my_getgrgid(&id) == -1 )) {
+                               fprintf(stderr, "%s: no such group.\n", dot);
+                               return 1;
+                       }
+               }
+               i->groupID = id;
+               i->changeGroupID = 1;
+       }
+       return 0;
+}
+
+extern int
+chown_main(struct FileInfo * i, int argc, char * * argv)
+{
+       int                                     status;
+
+       while ( argc >= 3 && strcmp("-R", argv[1]) == 0 ) {
+               i->recursive = 1;
+               argc--;
+               argv++;
+       }
+
+       if ( (status = parse_user_name(argv[1], i)) != 0 )
+               return status;
+
+       argv++;
+       argc--;
+
+       i->changeUserID = 1;
+       i->complainInPostProcess = 1;
+
+       return monadic_main(i, argc, argv);
+}
+
+
+
+
+#endif