]>
Commit | Line | Data |
---|---|---|
d00216b1 MM |
1 | diff -ur mdctl/util.c mdctl-/util.c |
2 | --- mdctl/util.c Thu Jul 26 07:30:28 2001 | |
3 | +++ mdctl-/util.c Mon Aug 6 19:01:03 2001 | |
4 | @@ -30,6 +30,7 @@ | |
5 | #include "mdctl.h" | |
6 | #include "md_p.h" | |
7 | #include <sys/utsname.h> | |
8 | +#include <dirent.h> | |
9 | ||
10 | /* | |
11 | * Parse a 128 bit uuid in 4 integers | |
12 | @@ -364,51 +365,78 @@ | |
13 | /* | |
14 | * convert a major/minor pair for a block device into a name in /dev, if possible. | |
15 | * On the first call, walk /dev collecting name. | |
16 | - * Put them in a simple linked listfor now. | |
17 | */ | |
18 | -struct devmap { | |
19 | - int major, minor; | |
20 | - char *name; | |
21 | - struct devmap *next; | |
22 | -} *devlist = NULL; | |
23 | -int devlist_ready = 0; | |
24 | - | |
25 | -#define __USE_XOPEN_EXTENDED | |
26 | -#include <ftw.h> | |
27 | ||
28 | +int devlist_ready = 0; | |
29 | +char **devlist[256]; | |
30 | ||
31 | -int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s) | |
32 | +void collect_devs(const char *name) | |
33 | { | |
34 | - if ((stb->st_mode&S_IFMT)== S_IFBLK) { | |
35 | - char *n = strdup(name); | |
36 | - struct devmap *dm = malloc(sizeof(*dm)); | |
37 | - if (dm) { | |
38 | - dm->major = MAJOR(stb->st_rdev); | |
39 | - dm->minor = MINOR(stb->st_rdev); | |
40 | - dm->name = n; | |
41 | - dm->next = devlist; | |
42 | - devlist = dm; | |
43 | + DIR *d; | |
44 | + struct dirent *e; | |
45 | + int n = strlen(name); | |
46 | + char *cur; | |
47 | + int major, minor; | |
48 | + struct stat st; | |
49 | + | |
50 | + chdir(name); | |
51 | + d = opendir("."); | |
52 | + if (d == NULL) | |
53 | + return; | |
54 | + | |
55 | + while ((e = readdir(d))) { | |
56 | + stat(e->d_name, &st); | |
57 | + if (strcmp(e->d_name, ".") == 0 || strcmp(e->d_name, "..") == 0) | |
58 | + continue; | |
59 | + if (!S_ISDIR(st.st_mode) && !S_ISBLK(st.st_mode)) | |
60 | + continue; | |
61 | + cur = malloc(n + strlen(e->d_name) + 2); | |
62 | + strcpy(cur, name); | |
63 | + cur[n] = '/'; | |
64 | + strcpy(cur + n + 1, e->d_name); | |
65 | + if (S_ISDIR(st.st_mode)) { | |
66 | + lstat(name, &st); | |
67 | + if (!S_ISLNK(st.st_mode)) | |
68 | + collect_devs(cur); | |
69 | + free(cur); | |
70 | + chdir(name); | |
71 | + } else { | |
72 | + major = MAJOR(st.st_rdev) & 0xff; | |
73 | + minor = MINOR(st.st_rdev) & 0xff; | |
74 | + | |
75 | + if (devlist[major] == NULL) | |
76 | + devlist[major] = calloc(sizeof(char*), 256); | |
77 | + /* shortest name wins, this can be quite usable | |
78 | + * with devfs and devfsd (/dev/hdaX links) | |
79 | + */ | |
80 | + if (devlist[major][minor] && | |
81 | + strlen(devlist[major][minor]) < strlen(cur)) | |
82 | + free(cur); | |
83 | + else { | |
84 | + free(devlist[major][minor]); | |
85 | + devlist[major][minor] = cur; | |
86 | + } | |
87 | + } | |
88 | } | |
89 | - } | |
90 | - return 0; | |
91 | + | |
92 | + closedir(d); | |
93 | } | |
94 | ||
95 | char *map_dev(int major, int minor) | |
96 | { | |
97 | - struct devmap *p; | |
98 | if (!devlist_ready) { | |
99 | - nftw("/dev", add_dev, 10, FTW_PHYS); | |
100 | + collect_devs("/dev"); | |
101 | devlist_ready=1; | |
102 | } | |
103 | ||
104 | - for (p=devlist; p; p=p->next) | |
105 | - if (p->major == major && | |
106 | - p->minor == minor) | |
107 | - return p->name; | |
108 | - return NULL; | |
109 | + major &= 0xff; | |
110 | + minor &= 0xff; | |
111 | + if (devlist[major]) | |
112 | + return devlist[major][minor]; | |
113 | + else | |
114 | + return NULL; | |
115 | } | |
116 | ||
117 | - | |
118 | int calc_sb_csum(mdp_super_t *super) | |
119 | { | |
120 | unsigned int oldcsum = super->sb_csum; | |
121 | @@ -424,3 +452,14 @@ | |
122 | super->sb_csum = oldcsum; | |
123 | return csum; | |
124 | } | |
125 | + | |
126 | +#ifdef __UCLIBC__ | |
127 | +long long lseek64(int fd, long long off, int w) | |
128 | +{ | |
129 | + long long res; | |
130 | + | |
131 | + llseek(fd, off >> 32, off & 0xffffffff, &res, w); | |
132 | + | |
133 | + return res; | |
134 | +} | |
135 | +#endif | |
136 | diff -ur mdctl/mdctl.h mdctl-/mdctl.h | |
137 | --- mdctl/mdadm.h Tue Jun 19 01:56:53 2001 | |
138 | +++ mdctl-/mdadm.h Fri Mar 15 14:01:40 2002 | |
139 | @@ -29,7 +29,6 @@ | |
140 | ||
141 | #define __USE_LARGEFILE64 | |
142 | #include <unistd.h> | |
143 | -extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence)); | |
144 | ||
145 | #include <sys/types.h> | |
146 | #include <sys/stat.h> | |
147 | @@ -41,6 +40,8 @@ | |
148 | #include <errno.h> | |
149 | #include <string.h> | |
150 | ||
151 | +#define __KERNEL_STRICT_NAMES | |
152 | + | |
153 | #include <linux/kdev_t.h> | |
154 | #include <linux/fs.h> | |
155 | #include <sys/ioctl.h> |