3.3. Una simple retrollamada para varios archivos

Cuando es usado un gran número de archivos casi idénticos, es bastante conveniente usar una función de retrollamada separada para cada archivo. Una mejor aproximación es tener una función simple de retrollamada que distinga entre los archivos usando el campo data en struct proc_dir_entry. Lo primero de todo, el campo data tiene que estar inicializado:


struct proc_dir_entry* entry;
struct my_file_data *file_data;

file_data = kmalloc(sizeof(struct my_file_data), GFP_KERNEL);
entry->data = file_data;
      

El campo data es un void *, por lo tanto puede ser inicializado con cualquier cosa.

Ahora que el campo data está establecido, read_proc y write_proc pueden utilizarlo para distinguir entre archivos, porque ellos son pasados en sus parámetros data:


int foo_read_func(char *page, char **start, off_t off,
                  int count, int *eof, void *data)
{
        int len;

        if(data == file_data) {
                /* caso especial para este archivo */
        } else {
                /* procesamiento normal */
        }

        return len;
}
      

Asegúrate de liberar el campo de datos data cuando quites la entrada procfs.