1 /* vi: set sw=4 ts=4: */
10 #include <sys/types.h>
11 #include <sys/sysmacros.h> /* major() and minor() */
14 #ifdef CONFIG_FEATURE_MAKEDEVS_LEAF
16 * public domain -- Dave 'Kill a Cop' Cinege <dcinege@psychosis.com>
19 * Make ranges of device files quickly.
20 * known bugs: can't deal with alpha ranges
22 int makedevs_main(int argc, char **argv)
25 char *basedev, *type, *nodname, buf[255];
26 int Smajor, Sminor, S, E;
28 if (argc < 7 || *argv[1]=='-')
33 Smajor = atoi(argv[3]);
34 Sminor = atoi(argv[4]);
37 nodname = argc == 8 ? basedev : buf;
58 sz = snprintf(buf, sizeof(buf), "%s%d", basedev, S);
59 if(sz<0 || sz>=sizeof(buf)) /* libc different */
60 bb_error_msg_and_die("%s too large", basedev);
62 /* if mode != S_IFCHR and != S_IFBLK third param in mknod() ignored */
64 if (mknod(nodname, mode, makedev(Smajor, Sminor)))
65 bb_error_msg("Failed to create: %s", nodname);
67 if (nodname == basedev) /* ex. /dev/hda - to /dev/hda1 ... */
76 #elif defined CONFIG_FEATURE_MAKEDEVS_TABLE
79 * This program is free software; you can redistribute it and/or modify
80 * it under the terms of the GNU General Public License version 2 as
81 * published by the Free Software Foundation.
83 * This program is distributed in the hope that it will be useful,
84 * but WITHOUT ANY WARRANTY; without even the implied warranty of
85 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
86 * GNU Library General Public License for more details.
88 * You should have received a copy of the GNU General Public License
89 * along with this program; if not, write to the Free Software
90 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
94 static const struct option makedevs_long_options[] = {
95 {"root", 1, NULL, 'r'},
99 extern int makedevs_main(int argc, char **argv)
103 char *rootdir = "./";
105 int ret = EXIT_SUCCESS;
107 bb_opt_complementaly = "d~r";
108 bb_applet_long_options = makedevs_long_options;
109 opt = bb_getopt_ulflags(argc, argv, "d:r:", &rootdir, &rootdir);
111 if (optind + 1 == argc) {
112 table = bb_xfopen(argv[optind], "r");
117 if (chdir(rootdir) == -1) {
118 bb_perror_msg_and_die("Couldnt chdor to %s", rootdir);
123 while ((line = bb_get_chomped_line_from_file(table))) {
125 unsigned int mode = 0755;
126 unsigned int major = 0;
127 unsigned int minor = 0;
128 unsigned int count = 0;
129 unsigned int increment = 0;
130 unsigned int start = 0;
138 if ((2 > sscanf(line, "%40s %c %o %40s %40s %u %u %u %u %u", name,
139 &type, &mode, user, group, &major,
140 &minor, &start, &increment, &count)) ||
141 ((major | minor | start | count | increment) > 255)) {
142 bb_error_msg("Ignoring invalid line\n%s\n", line);
146 if (name[0] == '#') {
150 gid = get_ug_id(group, my_getgrnam);
155 uid = get_ug_id(user, my_getpwnam);
159 full_name = concat_path_file(rootdir, name);
162 bb_make_directory(full_name, mode | S_IFDIR, 0);
163 if (chown(full_name, uid, gid) == -1) {
164 bb_perror_msg("chown failed for %s", full_name);
174 else if (type == 'c') {
177 else if (type == 'b') {
180 bb_error_msg("Unsupported file type %c", type);
189 full_name_inc = xmalloc(strlen(full_name) + 4);
190 for (i = start; i < count; i++) {
191 sprintf(full_name_inc, "%s%d", full_name, i);
192 rdev = (major << 8) + minor + (i * increment - start);
193 if (mknod(full_name_inc, mode, rdev) == -1) {
194 bb_perror_msg("Couldnt create node %s", full_name_inc);
197 else if (chown(full_name_inc, uid, gid) == -1) {
198 bb_perror_msg("chown failed for %s", full_name_inc);
204 rdev = (major << 8) + minor;
205 if (mknod(full_name, mode, rdev) == -1) {
206 bb_perror_msg("Couldnt create node %s", full_name);
209 else if (chown(full_name, uid, gid) == -1) {
210 bb_perror_msg("chown failed for %s", full_name);
224 # error makdedevs configuration error, either leaf or table must be selected