Comment puis-je définir par programme des permissions sur mon périphérique char

J’ai récemment hérité de certains codes au travail, il s’agit d’anciens pilotes de kernel Linux 2.4.X et j’ai été chargé de les faire fonctionner sur un kernel 2.6 ou plus récent. J’utilise OpenSUSE 12.1 avec un kernel 3.1.10.

J’ai mis à jour le code d’origine de register_chrdev () pour utiliser les appels class_create () / device_create () et je peux voir mes périphériques apparaître correctement dans / dev. Mon problème actuel est que les permissions pour mon périphérique sont définies sur r / w pour utilisateur uniquement:

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

Je sais que je peux “chmod” le fichier via la ligne de commande, et ou je peux configurer les permissions udev … règles déjà en place?

Existe-t-il des API existantes que je puisse appeler pour ce faire, des options me manquent-elles dans l’une de ces API de création?

Pour clarifier, une partie de la raison pour laquelle je ne souhaite pas utiliser les règles udev est que je ne connais pas à l’avance le nom des pilotes de périphérique. Les pilotes de périphérique sont créés en boucle et les noms sont ajoutés avec un chiffre, nNumDevs peut être à peu près n’importe quoi:

 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); } 

    C’est la méthode utilisée par le pilote TTY pour définir l’autorisation sur 0666 lors de la création:

     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; } 

    L’atsortingbut devnode de la struct class a un mode pointeur de paramètre qui vous permettra de définir des permissions.

    Attention, le mode peut être NULL lorsque l’appareil est détruit.

    Essayez ceci: #include

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

    Source: man -s 2 chmod

    udev a des règles pour les permissions, vous devez les créer sous /etc/udev/rules.d

    Essayez d’abord ceci:

    Dans le fichier /etc/udev/udev.conf , ajoutez cette ligne:

     # My default permissions default_mode="0660" 

    Si cela ne fonctionne pas, ajoutez une règle dans /etc/udev/rules.d .