1 /* Simple test to check that device nodes are correctly created and visible */
11 #define TEST_MINOR 120
14 void usage(char *prog)
16 fprintf(stderr, "usage: %s <filename>\n", prog);
21 * this stuff inlined here instead of using appropriate header
22 * to avoid linking to symbols which is not present in newer libc.
23 * Currently this is the case, as UML image contains RedHat 9 and
24 * developers use something newer (Fedora, etc.) --umka
27 __gnu_dev_major (unsigned long long int __dev)
29 return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff);
33 __gnu_dev_minor (unsigned long long int __dev)
35 return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff);
38 inline unsigned long long int
39 __gnu_dev_makedev (unsigned int __major, unsigned int __minor)
41 return ((__minor & 0xff) | ((__major & 0xfff) << 8)
42 | (((unsigned long long int) (__minor & ~0xff)) << 12)
43 | (((unsigned long long int) (__major & ~0xfff)) << 32));
46 #define __minor(dev) __gnu_dev_minor(dev)
47 #define __major(dev) __gnu_dev_major(dev)
48 #define __makedev(maj, min) __gnu_dev_makedev(maj, min)
50 int main( int argc, char **argv)
53 char *filename = argv[1];
64 /* first try block devices */
65 rq_rdev = __makedev(TEST_MAJOR, TEST_MINOR);
66 rc = mknod(filename, 0700 | S_IFBLK, rq_rdev);
68 fprintf(stderr, "%s: mknod(%s) failed: rc %d: %s\n",
69 prog, filename, errno, strerror(errno));
73 rc = stat(filename, &st);
75 fprintf(stderr, "%s: stat(%s) failed: rc %d: %s\n",
76 prog, filename, errno, strerror(errno));
80 if (st.st_rdev != rq_rdev) {
81 fprintf(stderr, "%s: created device other than requested: (%u,%u) instead of (%u,%u)\n",
82 prog, __major(st.st_rdev),__minor(st.st_rdev),__major(rq_rdev),__minor(rq_rdev));
85 if (!S_ISBLK(st.st_mode)) {
86 fprintf(stderr, "%s: created device of different type. Requested block device, got mode %o\n", prog, st.st_mode);
90 rc = unlink(filename);
92 fprintf(stderr, "%s: Cannot unlink created device %s, rc %d: %s\n",
93 prog, filename, errno, strerror(errno));
97 /* Second try char devices */
98 rc = mknod(filename, 0700 | S_IFCHR, rq_rdev);
100 fprintf(stderr, "%s: mknod(%s) failed: rc %d: %s\n",
101 prog, filename, errno, strerror(errno));
105 rc = stat(filename, &st);
107 fprintf(stderr, "%s: stat(%s) failed: rc %d: %s\n",
108 prog, filename, errno, strerror(errno));
111 if (st.st_rdev != rq_rdev) {
112 fprintf(stderr, "%s: created device other than requested: (%u,%u) instead of (%u,%u)\n",
113 prog, __major(st.st_rdev),__minor(st.st_rdev),__major(rq_rdev),__minor(rq_rdev));
116 if (!S_ISCHR(st.st_mode)) {
117 fprintf(stderr, "%s: created device of different type. Requested char device, got mode %o\n", prog, st.st_mode);
121 rc = unlink(filename);
123 fprintf(stderr, "%s: Cannot unlink created device %s, rc %d: %s\n",
124 prog, filename, errno, strerror(errno));
128 printf("%s: device nodes created correctly\n", prog);