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);
20 /* UMKA: This stuff inlined here instead of using appropriate header
21 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.). */
26 __gnu_dev_major (unsigned long long int __dev)
28 return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff);
32 __gnu_dev_minor (unsigned long long int __dev)
34 return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff);
37 inline unsigned long long int
38 __gnu_dev_makedev (unsigned int __major, unsigned int __minor)
40 return ((__minor & 0xff) | ((__major & 0xfff) << 8)
41 | (((unsigned long long int) (__minor & ~0xff)) << 12)
42 | (((unsigned long long int) (__major & ~0xfff)) << 32));
45 #define __minor(dev) __gnu_dev_minor(dev)
46 #define __major(dev) __gnu_dev_major(dev)
47 #define __makedev(maj, min) __gnu_dev_makedev(maj, min)
49 int main( int argc, char **argv)
52 char *filename = argv[1];
55 dev_t device = __makedev(TEST_MAJOR, TEST_MINOR);
62 /* First try block devices */
63 rc = mknod(filename, 0700 | S_IFBLK, device);
65 fprintf(stderr, "%s: mknod(%s) failed: rc %d: %s\n",
66 prog, filename, errno, strerror(errno));
70 rc = stat(filename, &st);
72 fprintf(stderr, "%s: stat(%s) failed: rc %d: %s\n",
73 prog, filename, errno, strerror(errno));
77 if ( st.st_rdev != device) {
78 fprintf(stderr, "%s: created device other than requested: (%u,%u) instead of (%u,%u)\n",
79 prog, __major(st.st_rdev),__minor(st.st_rdev),__major(device),__minor(device));
82 if (!S_ISBLK(st.st_mode)) {
83 fprintf(stderr, "%s: created device of different type. Requested block device, got mode %o\n", prog, st.st_mode);
87 rc = unlink(filename);
89 fprintf(stderr, "%s: Cannot unlink created device %s, rc %d: %s\n",
90 prog, filename, errno, strerror(errno));
94 /* Second try char devices */
95 rc = mknod(filename, 0700 | S_IFCHR, device);
97 fprintf(stderr, "%s: mknod(%s) failed: rc %d: %s\n",
98 prog, filename, errno, strerror(errno));
102 rc = stat(filename, &st);
104 fprintf(stderr, "%s: stat(%s) failed: rc %d: %s\n",
105 prog, filename, errno, strerror(errno));
108 if ( st.st_rdev != device) {
109 fprintf(stderr, "%s: created device other than requested: (%u,%u) instead of (%u,%u)\n",
110 prog, __major(st.st_rdev),__minor(st.st_rdev),__major(device),__minor(device));
113 if (!S_ISCHR(st.st_mode)) {
114 fprintf(stderr, "%s: created device of different type. Requested char device, got mode %o\n", prog, st.st_mode);
118 rc = unlink(filename);
120 fprintf(stderr, "%s: Cannot unlink created device %s, rc %d: %s\n",
121 prog, filename, errno, strerror(errno));
125 printf("%s: device nodes created correctly\n", prog);