2012-08-07 6 views
5

Ich habe vor kurzem einige Code bei der Arbeit geerbt, das ist alt 2.4.X Linux-Kernel-Treiber und ich habe damit beauftragt, sie auf einem neueren Kernel 2.6 oder höher arbeiten. Ich laufe auf OpenSUSE 12.1 mit einem 3.1.10 Kernel.Wie kann ich programmatisch Berechtigungen auf meinem Char-Gerät festlegen

Ich habe den ursprünglichen Code von register_chrdev() aktualisiert, um Aufrufe von class_create()/device_create() zu verwenden, und ich kann meine Geräte in/dev korrekt angezeigt werden. Mein aktuelles Problem ist, dass die Berechtigungen für das Gerät eingestellt werden, um r/w für Benutzer nur:

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

Ich weiß, ich kann „chmod“ die Datei über die Befehlszeile und oder ich kann udev Berechtigungen einrichten. .. aber gibt es das irgendwie programmatisch zu tun, so dass, wenn ich den Befehl insmod ausstelle, der Entwickler mit den richtigen Regeln schon an seinem Platz ist?

Gibt es eventuell vorhandene APIs, die ich aufrufen kann, irgendwelche Optionen, die ich in einer dieser Erstellungs-APIs vermisse?

Nur um zu verdeutlichen, ist ein Teil des Grundes, warum ich keine udev-Regeln verwenden möchte, dass ich die Namen der Gerätetreiber im Voraus nicht kenne. Die Gerätetreiber hervorgebracht werden in einer Schleife und so werden die Namen mit einer Ziffer angehängt, nNumDevs kann so ziemlich alles sein:

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

Ich denke, dass Sie einfach gehen und 'udev' verwenden sollten. Geräteberechtigungen sind normalerweise der Pervue des lokalen Administrators, der möglicherweise andere Vorstellungen über den Zugriff hat als der Gerätetreiberautor. Sie könnten die Standardeinstellungen in '/ etc/udev/rules.d' oder etwas löschen. – larsks

+0

Verstanden, aber wir (meine Gruppe) sind der Administrator des Systems, also wenn ich alles 777 haben wollte, könnte ich es tun. Außerdem habe ich ein Problem mit der Verwendung von rules.d (in der ursprünglichen Beschreibung aktualisiert), da die Namen der Gerätetreiber dynamisch erstellt werden ... es sei denn, ich missverstand die Verwendung von udev. – Mike

+2

@Mike: Aber udev Regeln können Wildcars verwenden, um den Namen der Geräte ('KERNEL ==" foo * "') zu entsprechen und sie können auch den Namen des Treibers ('DRIVERS ==" bar "') zuordnen. – rodrigo

Antwort

3

starten: #include <sys/stat.h>

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

Quelle: man -s 2 chmod

1

udev hat Regeln für Berechtigungen, die Sie untererstellen müssen Diese

Erster Versuch:

In der Datei /etc/udev/udev.conf, diese Zeile hinzu:

# My default permissions 
default_mode="0660" 

Wenn dies eine Regel in /etc/udev/rules.d nicht hinzufügen, nicht funktioniert, mehr auf hier, dass: http://www.reactivated.net/writing_udev_rules.html

4

Dies ist die Methode by the TTY driver Berechtigung für die Schaffung von 0666 zu setzen verwendet:

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

Das devnode-Attribut in struct class verfügt über einen Parameterzeiger mode, mit dem Sie Berechtigungen festlegen können.

Vorsicht, mode kann NULL sein, wenn das Gerät zerstört wird.

Verwandte Themen