1 |
#include <stdio.h> |
#include <stdio.h> |
2 |
#include <stdlib.h> |
#include <stdlib.h> |
3 |
|
#include <string.h> |
4 |
#include <sys/stat.h> |
#include <sys/stat.h> |
5 |
|
|
6 |
char *progname; |
char *progname; |
7 |
|
|
8 |
static __noreturn usage(void) |
static __noreturn usage(void) |
9 |
{ |
{ |
10 |
fprintf(stderr, "Usage: %s name {b|c|p} major minor\n", progname); |
fprintf(stderr, "Usage: %s [-m mode] name {b|c|p} major minor\n", |
11 |
|
progname); |
12 |
exit(1); |
exit(1); |
13 |
} |
} |
14 |
|
|
15 |
int main(int argc, char *argv[]) |
int main(int argc, char *argv[]) |
16 |
{ |
{ |
17 |
char *name, *type, typec, *endp; |
char *name, *type, typec, *endp; |
18 |
unsigned int major, minor; |
unsigned int major_num, minor_num; |
19 |
mode_t mode; |
mode_t mode, mode_set = 0; |
20 |
dev_t dev; |
dev_t dev; |
21 |
|
|
22 |
progname = *argv++; |
progname = *argv++; |
23 |
|
|
24 |
|
if (argv[0][0] == '-' && argv[0][1] == 'm' && !argv[0][2]) { |
25 |
|
mode_set = strtoul(argv[1], &endp, 8); |
26 |
|
argv += 2; |
27 |
|
} |
28 |
|
|
29 |
name = *argv++; |
name = *argv++; |
30 |
if (!name) |
if (!name) |
31 |
usage(); |
usage(); |
56 |
if (!argv[0] || !argv[1]) |
if (!argv[0] || !argv[1]) |
57 |
usage(); |
usage(); |
58 |
|
|
59 |
major = strtol(*argv++, &endp, 0); |
major_num = strtol(*argv++, &endp, 0); |
60 |
if (*endp != '\0') |
if (*endp != '\0') |
61 |
usage(); |
usage(); |
62 |
minor = strtol(*argv++, &endp, 0); |
minor_num = strtol(*argv++, &endp, 0); |
63 |
if (*endp != '\0') |
if (*endp != '\0') |
64 |
usage(); |
usage(); |
65 |
dev = makedev(major, minor); |
dev = makedev(major_num, minor_num); |
66 |
} |
} |
67 |
|
|
68 |
if (*argv) |
if (*argv) |
73 |
exit(1); |
exit(1); |
74 |
} |
} |
75 |
|
|
76 |
|
if (mode_set && chmod(name, mode_set)) { |
77 |
|
perror("chmod"); |
78 |
|
exit(1); |
79 |
|
} |
80 |
|
|
81 |
exit(0); |
exit(0); |
82 |
} |
} |