X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fchmod.c;h=b69cccdf1a20fcf23a01c8179b31fdd8a9e201d3;hb=1781188a9d6ee045a72f37b86102380909e04539;hp=9139b3f4dfb3832780b2319d82585672d2811387;hpb=6aabfd5e30087bb0ffdb6404aa6d650014de2dc0;p=oweals%2Fbusybox.git diff --git a/coreutils/chmod.c b/coreutils/chmod.c index 9139b3f4d..b69cccdf1 100644 --- a/coreutils/chmod.c +++ b/coreutils/chmod.c @@ -1,79 +1,93 @@ /* vi: set sw=4 ts=4: */ /* - * Mini chown/chmod/chgrp implementation for busybox + * Mini chmod implementation for busybox * + * Copyright (C) 1999-2004 by Erik Andersen * - * Copyright (C) 1999,2000,2001 by Lineo, inc. - * Written by Erik Andersen , - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Reworked by (C) 2002 Vladimir Oleynik + * to correctly parse '-rwxgoa' * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ +/* BB_AUDIT SUSv3 compliant */ +/* BB_AUDIT GNU defects - unsupported options -c, -f, -v, and long options. */ +/* http://www.opengroup.org/onlinepubs/007904975/utilities/chmod.html */ + #include #include #include #include -#include +#include #include "busybox.h" static int fileAction(const char *fileName, struct stat *statbuf, void* junk) { - if (!parse_mode((char *)junk, &(statbuf->st_mode))) - error_msg_and_die("internal error"); + if (!bb_parse_mode((char *)junk, &(statbuf->st_mode))) + bb_error_msg_and_die( "invalid mode: %s", (char *)junk); if (chmod(fileName, statbuf->st_mode) == 0) return (TRUE); - perror(fileName); + bb_perror_msg("%s", fileName); /* Avoid multibyte problems. */ return (FALSE); } -int chmod_main(int argc, char **argv) +int chmod_main(int ATTRIBUTE_UNUSED argc, char **argv) { - int i; - int opt; + int retval = EXIT_SUCCESS; int recursiveFlag = FALSE; + int count; + char *smode; + char **p; + char *p0; + char opt = '-'; + + ++argv; + count = 0; - /* do normal option parsing */ - while ((opt = getopt(argc, argv, "R")) > 0) { - switch (opt) { - case 'R': + for (p = argv ; *p ; p++) { + p0 = p[0]; + if (p0[0] == opt) { + if ((p0[1] == '-') && !p0[2]) { + opt = 0; /* Disable further option processing. */ + continue; + } + if (p0[1] == 'R') { + char *s = p0 + 2; + while (*s == 'R') { + ++s; + } + if (*s) { + bb_show_usage(); + } recursiveFlag = TRUE; - break; - default: - show_usage(); + continue; + } + if (count) { + bb_show_usage(); + } } + argv[count] = p0; + ++count; } - if (argc > optind && argc > 2 && argv[optind]) { - /* Parse the specified mode */ - mode_t mode; - if (parse_mode(argv[optind], &mode) == FALSE) { - error_msg_and_die( "unknown mode: %s", argv[optind]); - } - } else { - error_msg_and_die(too_few_args); + argv[count] = NULL; + + if (count < 2) { + bb_show_usage(); } + smode = *argv; + ++argv; + /* Ok, ready to do the deed now */ - for (i = optind + 1; i < argc; i++) { - if (recursive_action (argv[i], recursiveFlag, FALSE, FALSE, fileAction, - fileAction, argv[optind]) == FALSE) { - return EXIT_FAILURE; + do { + if (! recursive_action (*argv, recursiveFlag, TRUE, FALSE, + fileAction, fileAction, smode)) { + retval = EXIT_FAILURE; } - } - return EXIT_SUCCESS; + } while (*++argv); + + return retval; } /*