Home | History | Annotate | Download | only in nls
      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 "nlsTest.h"
     34 
     35 int open_block_device(void);
     36 
     37 int block_dev_handle = 0;	/* handle to nls test block device */
     38 
     39 int main(int argc, char **argv)
     40 {
     41 
     42 	nlsdev_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, NLSDEV_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 
     68 int open_block_device()
     69 {
     70 	dev_t devt;
     71 	struct stat statbuf;
     72 	int rc;
     73 
     74 	if (block_dev_handle == 0) {
     75 
     76 		/* check for the /dev/ subdir, and create if it does not exist.
     77 		 *
     78 		 * If devfs is running and mounted on /dev, these checks will all pass,
     79 		 * so a new node will not be created.
     80 		 */
     81 
     82 		devt = makedev(NLSMAJOR, 0);
     83 
     84 		rc = stat(NLS_DEVICE_PATH, &statbuf);
     85 
     86 		if (rc) {
     87 			if (errno == ENOENT) {
     88 				/* dev node does not exist. */
     89 				rc = mkdir(NLS_DEVICE_PATH, (S_IFDIR | S_IRWXU |
     90 							     S_IRGRP | S_IXGRP |
     91 							     S_IROTH |
     92 							     S_IXOTH));
     93 
     94 			} else {
     95 				printf
     96 				    ("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(NLS_DEVICE_PATH);
    102 				if (!rc) {
    103 					rc = mkdir(NLS_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