summaryrefslogtreecommitdiff
path: root/pidevice/pidevice.c
diff options
context:
space:
mode:
authorGuillermo Ramos2011-08-10 22:43:05 +0200
committerGuillermo Ramos2011-08-10 22:43:05 +0200
commita722d196c465bae07075819a8bdfb9e9376d2651 (patch)
tree560016efba95aff18637c5c7ee8ce7b623cb931f /pidevice/pidevice.c
parent00d5bce9f24e2114316bd1165ebdad05644b7365 (diff)
downloadlkm-a722d196c465bae07075819a8bdfb9e9376d2651.tar.gz
AƱadidos pidevice y hang
Diffstat (limited to 'pidevice/pidevice.c')
-rw-r--r--pidevice/pidevice.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/pidevice/pidevice.c b/pidevice/pidevice.c
new file mode 100644
index 0000000..3c5d3b4
--- /dev/null
+++ b/pidevice/pidevice.c
@@ -0,0 +1,104 @@
+#include <asm/uaccess.h>
+#include <linux/cdev.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <linux/kdev_t.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+
+static char devname[] = "pidevice";
+static char modname[] = "pidevice.ko";
+static dev_t mydev = 0;
+static struct cdev cdev;
+static struct task_struct *mytask;
+static struct task_struct *parent;
+
+static int count = 1;
+
+int pidev_open(struct inode *i, struct file *filp)
+{
+ count = 1;
+ printk(KERN_ALERT "Device (%d-%d) opened\n",
+ imajor(i), iminor(i));
+ printk(KERN_ALERT "Mode: %c%c\n", filp->f_mode & FMODE_READ ? 'R' : '-',
+ filp->f_mode & FMODE_WRITE ? 'W' : '-');
+ return 0;
+}
+
+ssize_t pidev_read(struct file *filp, char __user *buf,
+ size_t len, loff_t *off)
+{
+ if (count--) {
+ copy_to_user(buf, modname, 12);
+ return 12;
+ } else {
+ return 0;
+ }
+}
+
+ssize_t pidev_write(struct file *filp, const char __user *buf,
+ size_t len, loff_t *off)
+{
+ char localbuf[40];
+ copy_from_user(localbuf, buf, 40);
+ localbuf[len] = '\0';
+
+ printk(KERN_ALERT "Recibido: %s", localbuf);
+ return -EPERM;
+}
+
+struct file_operations fops = {
+ .owner = THIS_MODULE,
+ .open = pidev_open,
+ .read = pidev_read,
+ .write = pidev_write,
+};
+
+static void show_processes(void)
+{
+ mytask = current;
+ parent = mytask->parent;
+
+ while (mytask->pid != parent->pid) {
+ printk(KERN_ALERT "current: %s (%d) - parent: %s (%d)\n",
+ mytask->comm, mytask->pid, parent->comm, parent->pid);
+ mytask = mytask->parent;
+ parent = mytask->parent;
+ }
+}
+
+static int __init init(void)
+{
+ int err;
+
+ printk(KERN_ALERT "%s loaded by %s (%d)\n",
+ modname, current->comm, current->pid);
+
+ if ((err = alloc_chrdev_region(&mydev, 0, 1, devname)))
+ printk(KERN_ALERT "ERROR in alloc_chrdev_region: %d\n", err);
+ else
+ printk(KERN_ALERT "%s successfully registered with %d %d numbers\n",
+ devname, MAJOR(mydev), MINOR(mydev));
+
+ cdev_init(&cdev, &fops);
+ cdev.owner = THIS_MODULE;
+ if ((err = cdev_add(&cdev, mydev, 1)))
+ printk(KERN_ALERT "ERROR in cdev_add: %d\n", err);
+
+ return 0;
+}
+
+static void __exit exit(void)
+{
+ unregister_chrdev_region(mydev, 1);
+ cdev_del(&cdev);
+ printk(KERN_ALERT "%s unloaded\n", modname);
+}
+
+module_init(init);
+module_exit(exit);
+
+MODULE_LICENSE("GPL");