1 /*
2  *
3  *   Copyright (c) International Business Machines  Corp., 2001
4  *
5  *   This program is free software;  you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation; either version 2 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13  *   the GNU General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program;  if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23 #include <string.h>
24 #include <ctype.h>
25 #include <errno.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <fcntl.h>
29 #include <sys/ioctl.h>
30 #include <linux/kd.h>
31 #include <linux/errno.h>
32 
33 #include "includeTest.h"
34 
35 int open_block_device(void);
36 
37 int block_dev_handle = 0;	/* handle to INC test block device */
38 
main(int argc,char ** argv)39 int main(int argc, char **argv)
40 {
41 
42 	incdev_cmd_t cmd = { 0, 0 };
43 	int rc;
44 
45 	rc = open_block_device();
46 
47 	if (!rc) {
48 
49 		block_dev_handle = open(DEVICE_NAME, O_RDWR);
50 
51 		if (block_dev_handle < 0) {
52 			printf
53 			    ("ERROR: Open of device %s failed %d errno = %d\n",
54 			     DEVICE_NAME, block_dev_handle, errno);
55 		} else {
56 			rc = ioctl(block_dev_handle, INCDEV_CMD, &cmd);
57 
58 			printf("return from ioctl %d \n", rc);
59 		}
60 
61 	} else {
62 		printf("ERROR: Create/open block device failed\n");
63 	}
64 
65 	return 0;
66 
67 	printf("Block Include Test complete.\n");
68 }
69 
open_block_device()70 int open_block_device()
71 {
72 	dev_t devt;
73 	struct stat statbuf;
74 	int rc;
75 
76 	if (block_dev_handle == 0) {
77 
78 		/* check for the /dev/ subdir, and create if it does not exist.
79 		 *
80 		 * If devfs is running and mounted on /dev, these checks will all pass,
81 		 * so a new node will not be created.
82 		 */
83 
84 		devt = makedev(INCLUDEMAJOR, 0);
85 
86 		rc = stat(INCLUDE_DEVICE_PATH, &statbuf);
87 
88 		if (rc) {
89 			if (errno == ENOENT) {
90 				/* dev node does not exist. */
91 				rc = mkdir(INCLUDE_DEVICE_PATH,
92 					   (S_IFDIR | S_IRWXU | S_IRGRP |
93 					    S_IXGRP | S_IROTH | S_IXOTH));
94 
95 			} else {
96 				printf("ERROR: Problem with INC dev directory.  Error code from stat(
97 			) is %d\n\n", errno);
98 			}
99 		} else {
100 			if (!(statbuf.st_mode & S_IFDIR)) {
101 				rc = unlink(INCLUDE_DEVICE_PATH);
102 				if (!rc) {
103 					rc = mkdir(INCLUDE_DEVICE_PATH,
104 						   (S_IFDIR | S_IRWXU | S_IRGRP
105 						    | S_IXGRP | S_IROTH |
106 						    S_IXOTH));
107 				}
108 			}
109 		}
110 
111 		/*
112 		 * Check for the block_device node, and create if it does not
113 		 * exist.
114 		 */
115 
116 		rc = stat(DEVICE_NAME, &statbuf);
117 		if (rc) {
118 			if (errno == ENOENT) {
119 				/* dev node does not exist */
120 				rc = mknod(DEVICE_NAME,
121 					   (S_IFBLK | S_IRUSR | S_IWUSR |
122 					    S_IRGRP | S_IWGRP), devt);
123 			} else {
124 				printf
125 				    ("ERROR:Problem with block device node directory.  Error code form stat() is %d\n\n",
126 				     errno);
127 			}
128 
129 		} else {
130 			/*
131 			 * Device exists. Check to make sure it is for a
132 			 * block device and that it has the right major and minor.
133 			 */
134 
135 			if ((!(statbuf.st_mode & S_IFBLK)) ||
136 			    (statbuf.st_rdev != devt)) {
137 				/* Recreate the dev node. */
138 				rc = unlink(DEVICE_NAME);
139 				if (!rc) {
140 					rc = mknod(DEVICE_NAME,
141 						   (S_IFBLK | S_IRUSR | S_IWUSR
142 						    | S_IRGRP | S_IWGRP), devt);
143 				}
144 			}
145 		}
146 
147 	}
148 	return rc;
149 }
150