#include #include #include #include #include #include #include /* Module information */ MODULE_AUTHOR( "Gul-uc3m" ); MODULE_DESCRIPTION( "Modulo de ejemplo" ); MODULE_LICENSE("GPL"); int entero=0; int major=250; char * cadena; module_param(major,int,S_IRUGO); struct cdev *my_cdev; ssize_t midispositivo_write (struct file *fichero, const char __user * datos, size_t tamano, loff_t * offset){ kfree(cadena); cadena=kmalloc(tamano+1,GFP_KERNEL); cadena[tamano]=0x00; if (cadena<=0){ printk(KERN_INFO "Error en kmalloc\n"); cadena=NULL; entero=0; return -1; } if(copy_from_user(cadena,datos,tamano)){ printk(KERN_INFO "Falla el copy_from_user.\n"); kfree(cadena); cadena=NULL; entero=0; return -1; } entero=tamano; printk(KERN_INFO "He escrito entero=%d y cadena=%s.\n",entero, cadena); return tamano; } ssize_t midispositivo_read (struct file *fichero , char __user * destino, size_t tamano, loff_t * offset){ int ret = tamano>entero?entero:tamano; if (*offset>0) return 0; if (cadena==NULL){ printk(KERN_INFO "CADENA es NULL\n"); return 0; } if (copy_to_user(destino,cadena,ret)){ printk(KERN_INFO "Falla el copy_to_user.\n"); return 0; } *offset+=ret; return ret; } struct file_operations fops = { .owner = THIS_MODULE, .read = midispositivo_read, .write = midispositivo_write }; int hola(void){ entero=4; cadena=kmalloc(entero+1,GFP_KERNEL); memcpy(cadena,"hola",entero); cadena[entero]=0x00; my_cdev = cdev_alloc(); my_cdev->owner = THIS_MODULE; my_cdev->ops = &fops; if(cdev_add(my_cdev, MKDEV(major,0), 1)){ printk(KERN_INFO "ERROR CARGANDO\n"); return -1; } printk(KERN_INFO "Hola Mundo.entero=%d y cadena=%s.\n",entero, cadena); return 0; } void adios(void){ cdev_del(my_cdev); printk(KERN_INFO "Adios mundo cruel.entero=%d y cadena=%s.\n",entero, cadena); kfree(cadena); } module_init(hola); module_exit(adios);