Whamcloud - gitweb
b=15967
[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 /* UMKA: This stuff inlined here instead of using appropriate header 
21    to avoid linking to symbols which is not present in newer libc.
22    
23    Currently this is the case, as UML image contains RedHat 9 and 
24    developers use something newer (Fedora, etc.). */
25 inline unsigned int
26 __gnu_dev_major (unsigned long long int __dev)
27 {
28         return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff);
29 }
30
31 inline unsigned int
32 __gnu_dev_minor (unsigned long long int __dev)
33 {
34         return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff);
35 }
36
37 inline unsigned long long int
38 __gnu_dev_makedev (unsigned int __major, unsigned int __minor)
39 {
40         return ((__minor & 0xff) | ((__major & 0xfff) << 8)
41                 | (((unsigned long long int) (__minor & ~0xff)) << 12)
42                 | (((unsigned long long int) (__major & ~0xfff)) << 32));
43 }
44
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)
48
49 int main( int argc, char **argv)
50 {
51         char *prog = argv[0];
52         char *filename = argv[1];
53         int rc;
54         struct stat st;
55         dev_t device = __makedev(TEST_MAJOR, TEST_MINOR);
56
57         if (argc != 2) 
58                 usage(prog);
59
60         unlink(filename);
61         
62         /* First try block devices */
63         rc = mknod(filename, 0700 | S_IFBLK, device);
64         if ( rc < 0 ) {
65                 fprintf(stderr, "%s: mknod(%s) failed: rc %d: %s\n",
66                         prog, filename, errno, strerror(errno));
67                 return 2;
68         }
69
70         rc = stat(filename, &st);
71         if ( rc < 0 ) {
72                 fprintf(stderr, "%s: stat(%s) failed: rc %d: %s\n",
73                         prog, filename, errno, strerror(errno));
74                 return 3;
75         }
76         
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));
80                 return 4;
81         }
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);
84                 return 5;
85         }
86
87         rc = unlink(filename);
88         if ( rc < 0 ) {
89                 fprintf(stderr, "%s: Cannot unlink created device %s, rc %d: %s\n",
90                         prog, filename, errno, strerror(errno));
91                 return 6;
92         }
93
94         /* Second try char devices */
95         rc = mknod(filename, 0700 | S_IFCHR, device);
96         if ( rc < 0 ) {
97                 fprintf(stderr, "%s: mknod(%s) failed: rc %d: %s\n",
98                         prog, filename, errno, strerror(errno));
99                 return 7;
100         }
101
102         rc = stat(filename, &st);
103         if ( rc < 0 ) {
104                 fprintf(stderr, "%s: stat(%s) failed: rc %d: %s\n",
105                         prog, filename, errno, strerror(errno));
106                 return 8;
107         }
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));
111                 return 9;
112         }
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);
115                 return 10;
116         }
117
118         rc = unlink(filename);
119         if ( rc < 0 ) {
120                 fprintf(stderr, "%s: Cannot unlink created device %s, rc %d: %s\n",
121                         prog, filename, errno, strerror(errno));
122                 return 11;
123         }
124
125         printf("%s: device nodes created correctly\n", prog);
126
127         return 0;
128 }