2 * Copyright (C) 2013 Felix Fietkau <nbd@openwrt.org>
3 * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License version 2.1
7 * as published by the Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
18 #include <sys/types.h>
31 static char **patterns
;
32 static int n_patterns
;
33 static char buf
[PATH_MAX
];
34 static char buf2
[PATH_MAX
];
35 static unsigned int mode
= 0600;
37 static bool find_pattern(const char *name
)
41 for (i
= 0; i
< n_patterns
; i
++)
42 if (!fnmatch(patterns
[i
], name
, 0))
48 static void make_dev(const char *path
, bool block
, int major
, int minor
)
50 unsigned int oldumask
= umask(0);
51 unsigned int _mode
= mode
| (block
? S_IFBLK
: S_IFCHR
);
53 DEBUG(2, "Creating %s device %s(%d,%d)\n",
54 block
? "block" : "character",
57 mknod(path
, _mode
, makedev(major
, minor
));
61 static void find_devs(bool block
)
63 char *path
= block
? "/sys/dev/block" : "/sys/dev/char";
71 path
= buf2
+ sprintf(buf2
, "%s/", path
);
72 while ((dp
= readdir(dir
)) != NULL
) {
74 int major
= 0, minor
= 0;
77 if (dp
->d_type
!= DT_LNK
)
80 if (sscanf(dp
->d_name
, "%d:%d", &major
, &minor
) != 2)
83 strcpy(path
, dp
->d_name
);
84 len
= readlink(buf2
, buf
, sizeof(buf
));
89 if (!find_pattern(buf
))
92 c
= strrchr(buf
, '/');
97 make_dev(c
, block
, major
, minor
);
102 static char *add_pattern(const char *name
)
104 char *str
= malloc(strlen(name
) + 2);
107 strcpy(str
+ 1, name
);
111 int mkdev(const char *name
, int _mode
)
118 pattern
= add_pattern(name
);