2012-08-07 13 views
5

Niedawno odziedziczyłem jakiś kod w pracy, to są stare sterowniki jądra 2.4.X Linuksa i miałem zadanie, aby działały na nowszym jądrze 2.6 lub nowszym. Używam wersji OpenSUSE 12.1 z jądrem 3.1.10.Jak mogę programowo ustawić uprawnienia do mojego urządzenia char? Dowego

Zaktualizowałem oryginalny kod z register_chrdev(), aby używać wywołań class_create()/device_create(), i widzę, że moje urządzenia są prawidłowo wyświetlane w/dev. Mój obecny problem jest to, że uprawnienia dla mojego urządzenia są ustawione na R/W tylko użytkownik:

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

wiem, że może „chmod” plik poprzez linię poleceń, a czy mogę skonfigurować uprawnienia udev. ... ale czy jest tak, aby zrobić to programowo, tak, że kiedy wydam komendę insmod, dev zostanie zamontowany z poprawnymi regułami już istniejącymi?

Czy istnieją jakieś interfejsy API, które mogę wywołać w tym celu, wszelkie opcje, których brakuje w jednym z tych interfejsów API tworzenia?

Dla wyjaśnienia, część powodów, dla których nie chcę używać reguł udev, to fakt, że nie znam nazw sterowników urządzeń z wyprzedzeniem. Sterowniki urządzeń są zrodził się w pętli, a więc nazwy są dołączane z cyfrą, nNumDevs może być prawie wszystko:

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

Myślę, że powinieneś po prostu użyć "udev". Uprawnienia dostępu do urządzenia są zazwyczaj związane z lokalnym administratorem, który może mieć inne pomysły na dostęp niż autor sterownika urządzenia. Możesz usunąć ustawienia domyślne w '/ etc/udev/rules.d' lub coś podobnego. – larsks

+0

Zrozumiałem, ale my (moja grupa) jesteśmy administracją systemu, więc gdybym chciał, aby wszystko miało 777, mógłbym to zrobić. Mam również problem z używaniem rules.d (zaktualizowany w oryginalnym opisie), ponieważ nazwy sterowników urządzeń są tworzone dynamicznie ... chyba że źle zrozumiem jak używać udev. – Mike

+2

@Mike: Ale reguły udev mogą używać dzianek w celu dopasowania nazwy urządzeń ('KERNEL ==" foo * "') i mogą również pasować do nazwy sterownika ('DRIVERS ==" bar "'). – rodrigo

Odpowiedz

3

Spróbuj: #include <sys/stat.h>

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

Źródło: man -s 2 chmod

1

udev ma zasady dla uprawnień, musisz je utworzyć pod /etc/udev/rules.d

Najpierw spróbuj tego:

W pliku /etc/udev/udev.conf, dodaj linię:

# My default permissions 
default_mode="0660" 

Jeśli to nie zadziała dodać regułę w /etc/udev/rules.d, więcej na że tutaj: http://www.reactivated.net/writing_udev_rules.html

4

jest to metoda stosowana by the TTY driver ustawić uprawnienie do 0666 w sprawie utworzenia:

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

Atrybut devnode w struct class ma wskaźnik parametru mode, który pozwoli ci ustawić uprawnienia.

Uwaga, mode może być NULL, gdy urządzenie ulegnie zniszczeniu.

Powiązane problemy