2012-08-07 11 views
5

He heredado recientemente algún código en el trabajo, esto es antiguo 2.4.x controladores de Linux kernel y me han encargado que funcionen en un kernel 2.6 o posterior. Me estoy ejecutando en OpenSUSE 12.1 con un kernel 3.1.10.¿Cómo puedo establecer permisos de programación en mi dispositivo char

He actualizado el código original de register_chrdev() para usar las llamadas de class_create()/device_create() y puedo ver que mis dispositivos se muestran correctamente en/dev. Mi problema actual es que los permisos para mi dispositivo se están estableciendo a r/w para el único usuario:

crw------- 1 root root 244, 0 Aug 7 07:57 gcanain 

sé que puedo "chmod" el archivo a través de línea de comandos, y o puedo configurar los permisos de udev. ... pero de todos modos hay que hacer esto programáticamente, de modo que cuando emita el comando insmod, el dev se montará con las reglas correctas en su lugar ya?

¿Hay alguna API que pueda existir que pueda llamar para hacer esto, alguna de las opciones que me faltan en una de estas API de creación?

Solo para aclarar, parte de la razón por la que no quiero usar las reglas de udev es que no sé los nombres de los controladores del dispositivo antes de tiempo. Los controladores de dispositivos son generados en un bucle y por lo que los nombres se anexan con un dígito, nNumDevs pueden ser casi cualquier cosa:

for (i = 0; i < nNumDevs; i++) { 
    strcpy(Modname,GC_ANAIN_MODULE_NAME); 
    strcat(Modname,"%d"); 
    device_create(c1, NULL, MKDEV(nMajor, GC_ANAIN_MINOR_VERSION+i), NULL, Modname, i); 
} 
+1

Creo que debería seguir adelante y usar 'udev'. Los permisos del dispositivo suelen ser los pervue del administrador local, que pueden tener diferentes ideas sobre el acceso que el autor del controlador del dispositivo. Puede soltar la configuración predeterminada en '/ etc/udev/rules.d' o algo así. – larsks

+0

Entendido, pero nosotros (mi grupo) somos los administradores del sistema, así que si quería que todo tuviera 777, podría hacerlo. Además, tengo un problema con el uso de rules.d (actualizado en la descripción original), ya que los nombres de los controladores del dispositivo se crean dinámicamente ... a menos que no entienda cómo usar udev. – Mike

+2

@Mike: Pero las reglas de udev pueden usar wildcars para que coincida con el nombre de los dispositivos ('KERNEL ==" foo * "') y también pueden coincidir con el nombre del controlador ('DRIVERS == 'bar' '). – rodrigo

Respuesta

3

Prueba esto: #include <sys/stat.h>

int chmod(const char *path, mode_t mode); O int fchmod(int fd, mode_t mode);

Fuente: man -s 2 chmod

1

udev tiene reglas para permisos, necesita crearlas bajo /etc/udev/rules.d

Primero intente esto:

En el archivo /etc/udev/udev.conf, añadir esta línea:

# My default permissions 
default_mode="0660" 

Si esto no funciona añadir una regla en /etc/udev/rules.d, más en que aquí: http://www.reactivated.net/writing_udev_rules.html

4

Este es el método utilizado para establecer by the TTY driver permiso para 0666 en la creación:

static char *tty_devnode(struct device *dev, umode_t *mode) 
{ 
     if (!mode) 
       return NULL; 
     if (dev->devt == MKDEV(TTYAUX_MAJOR, 0) || 
      dev->devt == MKDEV(TTYAUX_MAJOR, 2)) 
       *mode = 0666; 
     return NULL; 
} 

static int __init tty_class_init(void) 
{ 
     tty_class = class_create(THIS_MODULE, "tty"); 
     if (IS_ERR(tty_class)) 
       return PTR_ERR(tty_class); 
     tty_class->devnode = tty_devnode; 
     return 0; 
} 

El atributo devnode en struct class tiene un puntero de parámetro mode que le permitirá establecer permisos.

Cuidado, mode puede ser NULL cuando el dispositivo se destruye.

Cuestiones relacionadas