Problemas con Proc en el kernel de linux

Iniciado por kaostias, 24 Octubre 2013, 19:16 PM

0 Miembros y 1 Visitante están viendo este tema.

kaostias

Buenas, estoy haciendo un módulo que sea una lista de enteros que se actualice cada vez que se actualiza una entrada en proc en concreto /proc/mimod. El caso es que compila y lo instalo en el kernel, y cuando quiero utilizar un comando, (Sólo acepta dos, add y remove), de la forma

echo add 10 > /proc/mimod

Estalla(NullPointerException). No sé muy bien cómo funciona aún. Aquí asigno los callback


static int addProcEditor(void){
   clipboard = (char *)vmalloc( BUFFER_LENGTH );
   if (!clipboard) {
     ret = -ENOMEM;
   } else {
     memset( clipboard, 0, BUFFER_LENGTH );
     proc_entry = create_proc_entry("mimod",0777, NULL);
     if (proc_entry == NULL) {
       ret = -ENOMEM;
       vfree(clipboard);
       printk(KERN_INFO "modlist: No puedo crear la entrada en proc\n");
     } else {
       posicionactual=0;
      [glow=red,2,300] proc_entry->read_proc = procWritten;
       proc_entry->write_proc = procIsRead;[/glow]
       printk(KERN_INFO "modlist: Cargado el Modulo.\n");
     }
   }
   return 0;
}


Aquí hago las lecturas y escrituras:


//Reconoce el cambio del proc y ejecuta este programa
int procWritten( struct file *punterofichero, const char __user *bufferusuario,
unsigned long longitud, void *data){
 char* str;
 int espaciodisponible = (BUFFER_LENGTH-posicionactual)+1;

 if (longitud > espaciodisponible) {
   printk(KERN_INFO "mimod: el buffer esta lleno!\n");
   return -ENOSPC;
 }
 if (copy_from_user( &str[0], bufferusuario, longitud )) {
   return -EFAULT;
 }
 clipboard[longitud] = 0;
 int num;
 int i = reconocedor(clipboard,&num);
 switch(i){
 case 1://add
 add(num);
 break;
 case 2://remove
 myremove(num);
 break;
 }

 return longitud;

}
//Escribe en proc lo que deseemos
int procIsRead( char *buffer, char **bufferlocation, off_t offset,
                  int buffer_lenghth, int *eof, void *data )

{
 int len;

 if (offset > 0) {
   /* hemos llegado al final */
   *eof = 1;
   len =0;
 } else {
 len = cats(buffer);
 int num;
 }
 return len;
}


Cuando va a utilizar cats (lo único que hace es copiar una lista al buffer, peta) y cuando tiene que añadir también. No sé muy bien qué falla. ¿Alguna idea? Lo que puedo suponer es que la cadena recibida no se pasa bien o algo así, pero no tengo ni idea.

Gracias
- ¡Éste código sin documentar es un galimatías!
- Es tuyo, de hace 3 semanas
- ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?

kaostias

Tenía un par de problemas con punteros, nada importante, gracias de todas formas. Si a alguien le interesa la resolución la cuelgo.
- ¡Éste código sin documentar es un galimatías!
- Es tuyo, de hace 3 semanas
- ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?