#include #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; int leido=0; int escrito=0; 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; escrito++; 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; leido++; return ret; } struct file_operations fops = { .owner = THIS_MODULE, .read = midispositivo_read, .write = midispositivo_write }; int leer_proc (char * pagina,char** start,off_t offset, int count, int *eof,void *data){ int len=0; len+=sprintf(pagina+len,"He sido leido: %d veces\n",leido); len+=sprintf(pagina+len,"He sido escrito: %d veces\n",escrito); len+=sprintf(pagina+len,"Mi contenido es: %s\n",cadena); len+=sprintf(pagina+len,"Y mide: %d\n",entero); return len; } 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; } create_proc_read_entry("holamundo", 0 , NULL , leer_proc, NULL ); printk(KERN_INFO "Hola Mundo.entero=%d y cadena=%s.\n",entero, cadena); return 0; } void adios(void){ cdev_del(my_cdev); remove_proc_entry("holamundo",NULL); printk(KERN_INFO "Adios mundo cruel.entero=%d y cadena=%s.\n",entero, cadena); kfree(cadena); } module_init(hola); module_exit(adios);