X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=chmod_chown_chgrp.c;h=d3e267827a15506f226fb97d3ad822c2e5dd4de1;hb=9ebccb289154aba69cc87990d63f8ad3280e0674;hp=d5e67b599b6863995db7cf7e88c20c41f665e49a;hpb=e49d5ecbbe51718fa925b6890a735e5937cc2aa2;p=oweals%2Fbusybox.git diff --git a/chmod_chown_chgrp.c b/chmod_chown_chgrp.c index d5e67b599..d3e267827 100644 --- a/chmod_chown_chgrp.c +++ b/chmod_chown_chgrp.c @@ -3,7 +3,7 @@ * Mini chown/chmod/chgrp implementation for busybox * * - * Copyright (C) 1999 by Lineo, inc. + * Copyright (C) 1999,2000 by Lineo, inc. * Written by Erik Andersen , * * This program is free software; you can redistribute it and/or modify @@ -25,6 +25,7 @@ #include "internal.h" #define BB_DECLARE_EXTERN #define bb_need_invalid_option +#define bb_need_too_few_args #include "messages.c" #include @@ -32,8 +33,8 @@ #include -static uid_t uid = -1; -static gid_t gid = -1; +static unsigned long uid = -1; +static unsigned long gid = -1; static int whichApp; static char *invocationName = NULL; static char *theMode = NULL; @@ -43,24 +44,30 @@ static char *theMode = NULL; #define CHOWN_APP 2 #define CHMOD_APP 3 -static const char chgrp_usage[] = "chgrp [OPTION]... GROUP FILE...\n\n" - "Change the group membership of each FILE to GROUP.\n" - - "\nOptions:\n\t-R\tchange files and directories recursively\n"; +static const char chgrp_usage[] = "chgrp [OPTION]... GROUP FILE...\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nChange the group membership of each FILE to GROUP.\n" + "\nOptions:\n\t-R\tChanges files and directories recursively.\n" +#endif + ; static const char chown_usage[] = - "chown [OPTION]... OWNER[.[GROUP] FILE...\n\n" - "Change the owner and/or group of each FILE to OWNER and/or GROUP.\n" - - "\nOptions:\n\t-R\tchange files and directories recursively\n"; + "chown [OPTION]... OWNER[<.|:>[GROUP] FILE...\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nChange the owner and/or group of each FILE to OWNER and/or GROUP.\n" + "\nOptions:\n\t-R\tChanges files and directories recursively.\n" +#endif + ; static const char chmod_usage[] = - "chmod [-R] MODE[,MODE]... FILE...\n\n" - "Each MODE is one or more of the letters ugoa, one of the symbols +-= and\n" - + "chmod [-R] MODE[,MODE]... FILE...\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nEach MODE is one or more of the letters ugoa, one of the symbols +-= and\n" "one or more of the letters rwxst.\n\n" - "\nOptions:\n\t-R\tchange files and directories recursively.\n"; + "\nOptions:\n\t-R\tChanges files and directories recursively.\n" +#endif + ; -static int fileAction(const char *fileName, struct stat *statbuf) +static int fileAction(const char *fileName, struct stat *statbuf, void* junk) { switch (whichApp) { case CHGRP_APP: @@ -81,9 +88,7 @@ static int fileAction(const char *fileName, struct stat *statbuf) case CHMOD_APP: /* Parse the specified modes */ if (parse_mode(theMode, &(statbuf->st_mode)) == FALSE) { - fprintf(stderr, "%s: unknown mode: %s\n", invocationName, - theMode); - exit(FALSE); + fatalError( "%s: unknown mode: %s\n", invocationName, theMode); } if (chmod(fileName, statbuf->st_mode) == 0) return (TRUE); @@ -96,41 +101,42 @@ static int fileAction(const char *fileName, struct stat *statbuf) int chmod_chown_chgrp_main(int argc, char **argv) { int recursiveFlag = FALSE; - char *groupName; - char *p; + char *groupName=NULL; + char *p=NULL; const char *appUsage; - whichApp = - (strcmp(*argv, "chown") == - 0) ? CHOWN_APP : (strcmp(*argv, - "chmod") == 0) ? CHMOD_APP : CHGRP_APP; + whichApp = (strcmp(*argv, "chown") == 0)? + CHOWN_APP : (strcmp(*argv, "chmod") == 0)? + CHMOD_APP : CHGRP_APP; - appUsage = - (whichApp == CHOWN_APP) ? chown_usage : (whichApp == - CHMOD_APP) ? chmod_usage : - chgrp_usage; + appUsage = (whichApp == CHOWN_APP)? + chown_usage : (whichApp == CHMOD_APP) ? chmod_usage : chgrp_usage; if (argc < 2) usage(appUsage); invocationName = *argv; - argc--; argv++; /* Parse options */ - while (**argv == '-') { - while (*++(*argv)) + while (--argc >= 0 && *argv && (**argv == '-')) { + while (*++(*argv)) { switch (**argv) { - case 'R': - recursiveFlag = TRUE; - break; - default: - fprintf(stderr, invalid_option, invocationName, **argv); - usage(appUsage); + case 'R': + recursiveFlag = TRUE; + break; + default: + fprintf(stderr, invalid_option, invocationName, **argv); + usage(appUsage); } - argc--; + } argv++; } + if (argc == 0 || *argv == NULL) { + fprintf(stderr, too_few_args, invocationName); + usage(appUsage); + } + if (whichApp == CHMOD_APP) { theMode = *argv; } else { @@ -145,6 +151,8 @@ int chmod_chown_chgrp_main(int argc, char **argv) goto bad_group; } else { groupName = strchr(*argv, '.'); + if (groupName == NULL) + groupName = strchr(*argv, ':'); if (groupName) { *groupName++ = '\0'; gid = strtoul(groupName, &p, 10); @@ -163,28 +171,31 @@ int chmod_chown_chgrp_main(int argc, char **argv) if (*argv == p) uid = my_getpwnam(*argv); if (uid == -1) { - fprintf(stderr, "%s: unknown user name: %s\n", + fatalError( "%s: unknown user name: %s\n", invocationName, *argv); - exit(FALSE); } } } /* Ok, ready to do the deed now */ if (argc <= 1) { - fprintf(stderr, "%s: too few arguments\n", invocationName); - exit(FALSE); + fatalError( "%s: too few arguments\n", invocationName); } while (argc-- > 1) { - if (recursiveAction - (*(++argv), recursiveFlag, TRUE, FALSE, fileAction, - fileAction) == FALSE) + if (recursiveAction (*(++argv), recursiveFlag, FALSE, FALSE, + fileAction, fileAction, NULL) == FALSE) exit(FALSE); } exit(TRUE); bad_group: - fprintf(stderr, "%s: unknown group name: %s\n", invocationName, - groupName); - exit(FALSE); + fatalError( "%s: unknown group name: %s\n", invocationName, groupName); } + +/* +Local Variables: +c-file-style: "linux" +c-basic-offset: 4 +tab-width: 4 +End: +*/