From c1591a877aa61023fc7f5f5d2c46d355ccf00686 Mon Sep 17 00:00:00 2001 From: reo Date: Wed, 4 Jan 2023 23:37:42 +0100 Subject: initial commit --- kworm.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 kworm.c (limited to 'kworm.c') diff --git a/kworm.c b/kworm.c new file mode 100644 index 0000000..7709a05 --- /dev/null +++ b/kworm.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include + +#define NAME "worm" + +MODULE_DESCRIPTION("worm"); +MODULE_LICENSE("BSD-3-Clause"); +MODULE_VERSION("1.0"); + +int worm_phase = 0; +static int major; + +static int dev_open(struct inode*, struct file*); +static int dev_release(struct inode*, struct file*); +static ssize_t dev_read(struct file*, char*, size_t, loff_t*); +static ssize_t dev_write(struct file*, const char*, size_t, loff_t*); + +static struct file_operations fops = { + .open = dev_open, + .read = dev_read, + .write = dev_write, + .release = dev_release +}; + +static int __init kworm_init(void) +{ + major = register_chrdev(0, NAME, &fops); + + if(major < 0) + { + printk(KERN_ALERT "kworm init failed\n"); + return major; + } + + printk(KERN_INFO "kworm init (%d)\n", major); + return 0; +} + +static void __exit kworm_exit(void) +{ + unregister_chrdev(major, NAME); + printk(KERN_INFO "kworm exit\n"); +} + +static int dev_open(struct inode* inodep, struct file* filep) +{ + printk(KERN_INFO "kworm opened\n"); + return 0; +} + + +static ssize_t dev_write(struct file* filep, const char* buffer, size_t len, loff_t* offset) +{ + printk(KERN_INFO "kworm read-only\n"); + return -EFAULT; +} + +static int dev_release(struct inode* inodep, struct file* filep) +{ + printk(KERN_INFO "kworm closed\n"); + return 0; +} + +static ssize_t dev_read(struct file* filep, char* buffer, size_t len, loff_t* offset) +{ + int errors = 0; + char *worm = "|\r(\r|\r)\r"; + int worm_len = 2; + worm_phase = (worm_phase % 4) + 1; + + mdelay(100); + + errors = copy_to_user(buffer, worm + ((worm_phase - 1) * 2), worm_len); + + return errors == 0 ? worm_len : -EFAULT; +} + +module_init(kworm_init); +module_exit(kworm_exit); + -- cgit v1.2.3