--- trunk/mkinitrd-magellan/busybox/coreutils/chmod.c 2009/04/24 18:32:46 815 +++ trunk/mkinitrd-magellan/busybox/coreutils/chmod.c 2009/04/24 18:33:46 816 @@ -14,7 +14,10 @@ /* BB_AUDIT GNU defects - unsupported long options. */ /* http://www.opengroup.org/onlinepubs/007904975/utilities/chmod.html */ -#include "busybox.h" +#include "libbb.h" + +/* This is a NOEXEC applet. Be very careful! */ + #define OPT_RECURSE (option_mask32 & 1) #define OPT_VERBOSE (USE_DESKTOP(option_mask32 & 2) SKIP_DESKTOP(0)) @@ -31,7 +34,7 @@ * symbolic links encountered during recursive directory traversals. */ -static int fileAction(const char *fileName, struct stat *statbuf, void* junk, int depth) +static int FAST_FUNC fileAction(const char *fileName, struct stat *statbuf, void* param, int depth) { mode_t newmode; @@ -46,8 +49,8 @@ } newmode = statbuf->st_mode; - if (!bb_parse_mode((char *)junk, &newmode)) - bb_error_msg_and_die("invalid mode: %s", (char *)junk); + if (!bb_parse_mode((char *)param, &newmode)) + bb_error_msg_and_die("invalid mode: %s", (char *)param); if (chmod(fileName, newmode) == 0) { if (OPT_VERBOSE @@ -60,11 +63,12 @@ } err: if (!OPT_QUIET) - bb_perror_msg("%s", fileName); + bb_simple_perror_msg(fileName); return FALSE; } -int chmod_main(int argc, char **argv) +int chmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int chmod_main(int argc UNUSED_PARAM, char **argv) { int retval = EXIT_SUCCESS; char *arg, **argp; @@ -89,7 +93,7 @@ /* Parse options */ opt_complementary = "-2"; - getopt32(argc, argv, ("-"OPT_STR) + 1); /* Reuse string */ + getopt32(argv, ("-"OPT_STR) + 1); /* Reuse string */ argv += optind; /* Restore option-like mode if needed */ @@ -100,8 +104,6 @@ do { if (!recursive_action(*argv, OPT_RECURSE, // recurse - FALSE, // follow links: coreutils doesn't - FALSE, // depth first fileAction, // file action fileAction, // dir action smode, // user data @@ -117,10 +119,12 @@ /* Security: chmod is too important and too subtle. This is a test script (busybox chmod versus coreutils). -Run it in empty dir. Probably requires bash. +Run it in empty directory. #!/bin/sh -function create() { +t1="/tmp/busybox chmod" +t2="/usr/bin/chmod" +create() { rm -rf $1; mkdir $1 ( cd $1 || exit 1 @@ -133,17 +137,16 @@ ln -s ../up dir/up ) } -function tst() { +tst() { (cd test1; $t1 $1) (cd test2; $t2 $1) (cd test1; ls -lR) >out1 (cd test2; ls -lR) >out2 echo "chmod $1" >out.diff if ! diff -u out1 out2 >>out.diff; then exit 1; fi - mv out.diff out1.diff + rm out.diff } -t1="/tmp/busybox chmod" -t2="/usr/bin/chmod" +echo "If script produced 'out.diff' file, then at least one testcase failed" create test1; create test2 tst "a+w file" tst "a-w dir"