diff options
Diffstat (limited to 'miscutils')
-rw-r--r-- | miscutils/Config.in | 30 | ||||
-rw-r--r-- | miscutils/makedevs.c | 192 |
2 files changed, 32 insertions, 190 deletions
diff --git a/miscutils/Config.in b/miscutils/Config.in index 320f4c2..7e18c16 100644 --- a/miscutils/Config.in +++ b/miscutils/Config.in @@ -143,32 +143,10 @@ config CONFIG_MAKEDEVS bool "makedevs" default n help - 'makedevs' is a utility used to create a batch of devices with - one command. - . - There are two choices for command line behaviour, the interface - as used by LEAF/Linux Router Project, or a device table file. - . - 'leaf' is traditionally what busybox follows, it allows multiple - devices of a particluar type to be created per command. - e.g. /dev/hda[0-9] - Device properties are passed as command line arguments. - . - 'table' reads device properties from a file or stdin, allowing - a batch of unrelated devices to be makde with one command. - User/group names are allowed as an alternative to uid/gid. - -choice - prompt "Choose makedevs behaviour" - default CONFIG_FEATURE_MAKDEVS_TABLE - -config CONFIG_FEATURE_MAKEDEVS_LEAF - bool "leaf" - -config CONFIG_FEATURE_MAKEDEVS_TABLE - bool "table" - -endchoice + 'makedevs' is a utility used and created by the Linux Router Project. + It creates a large number of device special files (/dev devices) + rather quickly, and can be considerably faster then running mknod a + zillion times. config CONFIG_MT bool "mt" diff --git a/miscutils/makedevs.c b/miscutils/makedevs.c index 57b2d6c..45498bb 100644 --- a/miscutils/makedevs.c +++ b/miscutils/makedevs.c @@ -1,19 +1,4 @@ /* vi: set sw=4 ts=4: */ - -#include <sys/types.h> - -#include <fcntl.h> -#include <getopt.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <unistd.h> - -#include "busybox.h" - -#ifdef CONFIG_FEATURE_MAKEDEVS_LEAF - /* * public domain -- Dave 'Kill a Cop' Cinege <dcinege@psychosis.com> * @@ -21,7 +6,15 @@ * Make ranges of device files quickly. * known bugs: can't deal with alpha ranges */ - + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include "busybox.h" + int makedevs_main(int argc, char **argv) { mode_t mode; @@ -76,153 +69,24 @@ int makedevs_main(int argc, char **argv) return 0; } -#elif defined CONFIG_FEATURE_MAKEDEVS_TABLE - /* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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 Library 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. - * - */ - -static const struct option makedevs_long_options[] = { - {"root", 1, NULL, 'r'}, - {0, 0, 0, 0} -}; - -extern int makedevs_main(int argc, char **argv) -{ - FILE *table; - int opt; - char *rootdir = "./"; - char *line; - int ret = EXIT_SUCCESS; - - bb_opt_complementaly = "d~r"; - bb_applet_long_options = makedevs_long_options; - opt = bb_getopt_ulflags(argc, argv, "d:r:", &rootdir, &rootdir); - - if (optind + 1 == argc) { - table = bb_xfopen(argv[optind], "r"); - } else { - table = stdin; - } - - if (chdir(rootdir) == -1) { - bb_perror_msg_and_die("Couldnt chdor to %s", rootdir); - } - - umask(0); - - while ((line = bb_get_chomped_line_from_file(table))) { - char type; - unsigned int mode = 0755; - unsigned int major = 0; - unsigned int minor = 0; - unsigned int count = 0; - unsigned int increment = 0; - unsigned int start = 0; - char name[41]; - char user[41]; - char group[41]; - char *full_name; - uid_t uid; - gid_t gid; - - if ((2 > sscanf(line, "%40s %c %o %40s %40s %u %u %u %u %u", name, - &type, &mode, user, group, &major, - &minor, &start, &increment, &count)) || - ((major | minor | start | count | increment) > 255)) { - bb_error_msg("Ignoring invalid line\n%s\n", line); - ret = EXIT_FAILURE; - continue; - } - if (name[0] == '#') { - continue; - } - if (group) { - gid = get_ug_id(group, my_getgrnam); - } else { - gid = getgid(); - } - if (user) { - uid = get_ug_id(user, my_getpwnam); - } else { - uid = getuid(); - } - full_name = concat_path_file(rootdir, name); - - if (type == 'd') { - bb_make_directory(full_name, mode | S_IFDIR, 0); - if (chown(full_name, uid, gid) == -1) { - bb_perror_msg("chown failed for %s", full_name); - ret = EXIT_FAILURE; - goto loop; - } - } else { - dev_t rdev; - - if (type == 'p') { - mode |= S_IFIFO; - } - else if (type == 'c') { - mode |= S_IFCHR; - } - else if (type == 'b') { - mode |= S_IFBLK; - } else { - bb_error_msg("Unsupported file type %c", type); - ret = EXIT_FAILURE; - goto loop; - } - - if (count > 0) { - int i; - char *full_name_inc; - - full_name_inc = xmalloc(strlen(full_name) + 4); - for (i = start; i < count; i++) { - sprintf(full_name_inc, "%s%d", full_name, i); - rdev = (major << 8) + minor + (i * increment - start); - if (mknod(full_name_inc, mode, rdev) == -1) { - bb_perror_msg("Couldnt create node %s", full_name_inc); - ret = EXIT_FAILURE; - } - else if (chown(full_name_inc, uid, gid) == -1) { - bb_perror_msg("chown failed for %s", full_name_inc); - ret = EXIT_FAILURE; - } - } - free(full_name_inc); - } else { - rdev = (major << 8) + minor; - if (mknod(full_name, mode, rdev) == -1) { - bb_perror_msg("Couldnt create node %s", full_name); - ret = EXIT_FAILURE; - } - else if (chown(full_name, uid, gid) == -1) { - bb_perror_msg("chown failed for %s", full_name); - ret = EXIT_FAILURE; - } - } - } -loop: - free(line); - free(full_name); - } - fclose(table); - - return 0; +And this is what this program replaces. The shell is too slow! + +makedev () { +local basedev=$1; local S=$2; local E=$3 +local major=$4; local Sminor=$5; local type=$6 +local sbase=$7 + + if [ ! "$sbase" = "" ]; then + mknod "$basedev" $type $major $Sminor + S=`expr $S + 1` + Sminor=`expr $Sminor + 1` + fi + + while [ $S -le $E ]; do + mknod "$basedev$S" $type $major $Sminor + S=`expr $S + 1` + Sminor=`expr $Sminor + 1` + done } -#else -# error makdedevs configuration error, either leaf or table must be selected -#endif +*/ |