#include #include #include #include #include #include #include #include #include #define PROC_FILE_NAME "extra_iparrot" #define LENMAX 1024 char message[LENMAX] = "I have two cats in my garage, named Zeke and Tabby\n"; size_t mlen; ssize_t read_simple(struct file *filp, char *buf, size_t count, loff_t *offp ) { if(*offp < mlen) { // If we have data to deliver size_t quantity = mlen - *offp; if(count < quantity) quantity = count; memcpy(buf, message + *offp, quantity); *offp += quantity; return quantity; } else { return 0; } } ssize_t change_message(struct file *filp, const char* buf, size_t count, loff_t *offp){ size_t copy_size = count; char *i; if(copy_size > LENMAX - 1) copy_size = LENMAX - 1; mlen = copy_size; memcpy(message, buf, copy_size); for(i = message; *i; i++){ if(get_random_long() % 8 == 0){ *i += 1; } } return count; } struct file_operations proc_fops = { read: read_simple, write: change_message, }; int init_module (void) { mlen = strlen(message); message[LENMAX - 1] = 0; proc_create(PROC_FILE_NAME,0,NULL,&proc_fops); return 0; } void cleanup_module(void) { remove_proc_entry(PROC_FILE_NAME,NULL); } MODULE_LICENSE("GPL");