Whamcloud - gitweb
- landing b_fid.
[fs/lustre-release.git] / lustre / tests / cmknod.c
1 /* Simple test to check that device nodes are correctly created and visible */
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <unistd.h>
9 #include <errno.h>
10
11 #define TEST_MINOR 120
12 #define TEST_MAJOR 25
13
14 void usage(char *prog)
15 {
16         fprintf(stderr, "usage: %s <filename>\n", prog);
17         exit(1);
18 }
19
20 /* 
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
25  */
26 inline unsigned int
27 __gnu_dev_major (unsigned long long int __dev)
28 {
29         return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff);
30 }
31
32 inline unsigned int
33 __gnu_dev_minor (unsigned long long int __dev)
34 {
35         return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff);
36 }
37
38 inline unsigned long long int
39 __gnu_dev_makedev (unsigned int __major, unsigned int __minor)
40 {
41         return ((__minor & 0xff) | ((__major & 0xfff) << 8)
42                 | (((unsigned long long int) (__minor & ~0xff)) << 12)
43                 | (((unsigned long long int) (__major & ~0xfff)) << 32));
44 }
45
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)
49
50 int main( int argc, char **argv)
51 {
52         char *prog = argv[0];
53         char *filename = argv[1];
54
55         struct stat st;
56         int rq_rdev;
57         int rc;
58
59         if (argc != 2) 
60                 usage(prog);
61
62         unlink(filename);
63         
64         /* first try block devices */
65         rq_rdev = __makedev(TEST_MAJOR, TEST_MINOR);
66         rc = mknod(filename, 0700 | S_IFBLK, rq_rdev);
67         if (rc < 0) {
68                 fprintf(stderr, "%s: mknod(%s) failed: rc %d: %s\n",
69                         prog, filename, errno, strerror(errno));
70                 return 2;
71         }
72
73         rc = stat(filename, &st);
74         if (rc < 0) {
75                 fprintf(stderr, "%s: stat(%s) failed: rc %d: %s\n",
76                         prog, filename, errno, strerror(errno));
77                 return 3;
78         }
79
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));
83                 return 4;
84         }
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);
87                 return 5;
88         }
89
90         rc = unlink(filename);
91         if ( rc < 0 ) {
92                 fprintf(stderr, "%s: Cannot unlink created device %s, rc %d: %s\n",
93                         prog, filename, errno, strerror(errno));
94                 return 6;
95         }
96
97         /* Second try char devices */
98         rc = mknod(filename, 0700 | S_IFCHR, rq_rdev);
99         if ( rc < 0 ) {
100                 fprintf(stderr, "%s: mknod(%s) failed: rc %d: %s\n",
101                         prog, filename, errno, strerror(errno));
102                 return 7;
103         }
104
105         rc = stat(filename, &st);
106         if ( rc < 0 ) {
107                 fprintf(stderr, "%s: stat(%s) failed: rc %d: %s\n",
108                         prog, filename, errno, strerror(errno));
109                 return 8;
110         }
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));
114                 return 9;
115         }
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);
118                 return 10;
119         }
120
121         rc = unlink(filename);
122         if ( rc < 0 ) {
123                 fprintf(stderr, "%s: Cannot unlink created device %s, rc %d: %s\n",
124                         prog, filename, errno, strerror(errno));
125                 return 11;
126         }
127
128         printf("%s: device nodes created correctly\n", prog);
129
130         return 0;
131 }