/* * * Copyright (c) International Business Machines Corp., 2001 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * This is the main of your user space test program, * which will open the correct kernel module, find the * file descriptor value and use that value to make * ioctl calls to the system * * Use the ki_generic and other ki_testname functions * to abstract the calls from the main * * author: Sean Ruyle * date: 06/11/2003 * */ #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/kernel.h> #include <linux/errno.h> #include <errno.h> #include "user_tbase.h" #include "../tbase/tbase.h" static int tbase_fd = -1; /* file descriptor */ int tbaseopen() { dev_t devt; struct stat st; int rc = 0; devt = makedev(TBASEMAJOR, 0); if (rc) { if (errno == ENOENT) { /* dev node does not exist. */ rc = mkdir("/dev/tbase", (S_IFDIR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); } else { printf ("ERROR: Problem with Base dev directory. Error code from stat() is %d\n\n", errno); } } else { if (!(st.st_mode & S_IFDIR)) { rc = unlink("/dev/tbase"); if (!rc) { rc = mkdir("/dev/tbase", (S_IFDIR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); } } } /* * Check for the /dev/tbase node, and create if it does not * exist. */ rc = stat("/dev/tbase", &st); if (rc) { if (errno == ENOENT) { /* dev node does not exist */ rc = mknod("/dev/tbase", (S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP), devt); } else { printf ("ERROR:Problem with tbase device node directory. Error code form stat() is %d\n\n", errno); } } else { /* * /dev/tbase CHR device exists. Check to make sure it is for a * block device and that it has the right major and minor. */ if ((!(st.st_mode & S_IFCHR)) || (st.st_rdev != devt)) { /* Recreate the dev node. */ rc = unlink("/dev/tbase"); if (!rc) { rc = mknod("/dev/tbase", (S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP), devt); } } } tbase_fd = open("/dev/tbase", O_RDWR); if (tbase_fd < 0) { printf("ERROR: Open of device %s failed %d errno = %d\n", "/dev/tbase", tbase_fd, errno); return errno; } else { printf("Device opened successfully \n"); return 0; } } int tbaseclose() { if (tbase_fd != -1) { close(tbase_fd); tbase_fd = -1; } return 0; } int main() { int rc; /* open the module */ rc = tbaseopen(); if (rc) { printf("Test MOD Driver may not be loaded\n"); exit(1); } /* test bus rescan */ if (ki_generic(tbase_fd, BUS_RESCAN)) printf("Failed on bus rescan\n"); else printf("Success on bus rescan\n"); /* test get driver */ if (ki_generic(tbase_fd, GET_DRV)) printf("Failed on get driver\n"); else printf("Success on get driver\n"); /* test put driver */ if (ki_generic(tbase_fd, PUT_DRV)) printf("Failed on put driver\n"); else printf("Success on put driver\n"); /* test register firmware, should return not 0 */ if (ki_generic(tbase_fd, REG_FIRM)) printf ("Failed on register firmware\n\tPossibly because parent nodes already set\n"); else printf("Success on register firmware\n"); /* test create driver file sysfs */ if (ki_generic(tbase_fd, CREATE_FILE)) printf("Failed on creating driver file\n"); else printf("Success on creating driver file\n"); /* test device suspend and resume */ if (ki_generic(tbase_fd, DEV_SUSPEND)) printf("Failed on suspending device\n"); else printf("Success on suspending device\n"); /* test device create file sysfs */ if (ki_generic(tbase_fd, DEV_FILE)) printf("Failed on creating device file\n"); else printf("Success on creating device file\n"); /* test bus create file sysfs */ if (ki_generic(tbase_fd, BUS_FILE)) printf("Failed on creating bus file\n"); else printf("Success on creating bus file\n"); /* test register class */ if (ki_generic(tbase_fd, CLASS_REG)) printf("Failed on registering class\n"); else printf("Success on registering class\n"); /* test get class */ if (ki_generic(tbase_fd, CLASS_GET)) printf("Failed on get class\n"); else printf("Success on get class\n"); /* test class create file sysfs */ if (ki_generic(tbase_fd, CLASS_FILE)) printf("Failed on creating class file\n"); else printf("Success on creating class file\n"); /* test unregistering class */ if (ki_generic(tbase_fd, CLASS_UNREG)) printf("Failed on unregistering class\n"); else printf("Success on unregistering class\n"); /* test register class device */ if (ki_generic(tbase_fd, CLASSDEV_REG)) printf ("Failed on registering class device and creating sysfs file\n"); else printf ("Success on registering class device and creating sysfs file\n"); /* test register class interface */ if (ki_generic(tbase_fd, CLASSINT_REG)) printf("Failed on registering class interface\n"); else printf("Success on registering class interface\n"); /* test register sysdev_class */ if (ki_generic(tbase_fd, SYSDEV_CLS_REG)) printf("Failed on registering sysdev_class\n"); else printf("Success on registering sysdev_class\n"); /* test register sysdev */ if (ki_generic(tbase_fd, SYSDEV_REG)) printf("Failed on registering sysdev\n"); else printf("Success on registering sysdev\n"); /* test unregister sysdev */ if (ki_generic(tbase_fd, SYSDEV_UNREG)) printf("Failed on unregistering sysdev\n"); else printf("Success on unregistering sysdev\n"); /* test unregister sysdev_class */ if (ki_generic(tbase_fd, SYSDEV_CLS_UNREG)) printf("Failed on unregistering sysdev_class\n"); else printf("Success on unregistering sysdev_class\n"); /* close the module */ rc = tbaseclose(); if (rc) { printf("Test MOD Driver may not be closed\n"); exit(1); } return 0; }