projects
/
oweals
/
busybox.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
"insmod caches the symbolname in a variable before modifying it and uses
[oweals/busybox.git]
/
miscutils
/
makedevs.c
diff --git
a/miscutils/makedevs.c
b/miscutils/makedevs.c
index eed3968c831af5f2ed44fd6a7f253c711da3e3bb..308d651ae92e4433a397bc4140c83b254952c5f3 100644
(file)
--- a/
miscutils/makedevs.c
+++ b/
miscutils/makedevs.c
@@
-7,64
+7,61
@@
* known bugs: can't deal with alpha ranges
*/
* known bugs: can't deal with alpha ranges
*/
-#include "busybox.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#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)
{
int makedevs_main(int argc, char **argv)
{
+ mode_t mode;
+ char *basedev, *type, *nodname, buf[255];
+ int major, Sminor, S, E;
- const char *basedev = argv[1];
- const char *type = argv[2];
- int major = atoi(argv[3]);
- int Sminor = atoi(argv[4]);
- int S = atoi(argv[5]);
- int E = atoi(argv[6]);
- int sbase = argc == 8 ? 1 : 0;
+ if (argc < 7 || *argv[1]=='-')
+ bb_show_usage();
- mode_t mode = 0;
- dev_t dev = 0;
- char devname[255];
- char buf[255];
+ basedev = argv[1];
+ type = argv[2];
+ major = atoi(argv[3]) << 8; /* correcting param to mknod() */
+ Sminor = atoi(argv[4]);
+ S = atoi(argv[5]);
+ E = atoi(argv[6]);
+ nodname = argc == 8 ? basedev : buf;
- if (argc < 7 || *argv[1]=='-')
- show_usage();
+ mode = 0660;
switch (type[0]) {
case 'c':
switch (type[0]) {
case 'c':
- mode = S_IFCHR;
+ mode
|
= S_IFCHR;
break;
case 'b':
break;
case 'b':
- mode = S_IFBLK;
+ mode
|
= S_IFBLK;
break;
case 'f':
break;
case 'f':
- mode = S_IFIFO;
+ mode
|
= S_IFIFO;
break;
default:
break;
default:
- show_usage();
+
bb_
show_usage();
}
}
- mode |= 0660;
while (S <= E) {
while (S <= E) {
+ int sz;
- if (type[0] != 'f')
- dev = (major << 8) | Sminor;
-
strcpy(devname
, basedev);
+ sz = snprintf(buf, sizeof(buf), "%s%d", basedev, S);
+ if(sz<0 || sz>=sizeof(buf)) /* libc different */
+
bb_error_msg_and_die("%s too large"
, basedev);
- if (sbase == 0) {
- sprintf(buf, "%d", S);
- strcat(devname, buf);
- } else {
- sbase = 0;
- }
+ /* if mode != S_IFCHR and != S_IFBLK third param in mknod() ignored */
- if (mknod(
devname, mode, dev
))
-
printf("Failed to create: %s\n", dev
name);
+ if (mknod(
nodname, mode, major | Sminor
))
+
bb_error_msg("Failed to create: %s", nod
name);
+ if (nodname == basedev) /* ex. /dev/hda - to /dev/hda1 ... */
+ nodname = buf;
S++;
Sminor++;
}
S++;
Sminor++;
}