2012-08-07 89 views
5

我最近在工作中繼承了一些代碼,這是舊的2.4.X Linux內核驅動程序,我一直負責讓它們在較新的內核2.6或更高版本上工作。我在3.1.10內核上運行OpenSUSE 12.1。如何以編程方式在我的char設備上設置權限

我已經更新了來自register_chrdev()的原始代碼以使用class_create()/ device_create()調用,並且我可以正確地看到我的設備顯示在/ dev中。我現在的問題是,我的設備的權限被設置爲R/W僅用於用戶:

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

我知道我可以在「文件模式」通過命令行的文件,或者我可以設置udev的權限。 ..但無論如何,以編程方式執行此操作,以便當我發出insmod命令時,開發人員將使用正確的規則進行裝載?

是否有任何API可能存在,我可以調用這樣做,我在這些創建API之一中缺少的任何選項?

只是爲了澄清,我不想使用udev規則的部分原因是我不知道設備驅動程序的名稱提前。設備驅動程序是在一個循環中催生等名字都以數字追加,nNumDevs可相當多的東西:

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

我認爲你應該繼續使用'udev'。設備權限通常是本地管理員的權限,與設備驅動程序作者相比,本地管理員對訪問權限可能有不同的看法。你可以在'/ etc/udev/rules.d'中刪除默認設置。 – larsks 2012-08-07 13:07:57

+0

瞭解了,但我們(我的團隊)是系統的管理員,所以如果我想讓所有東西都擁有777,我可以這麼做。另外,由於設備驅動程序的名稱是動態創建的,所以我在使用rules.d(在原始描述中更新)時遇到了問題......除非我誤解了如何使用udev。 – Mike 2012-08-07 13:32:43

+2

@Mike:但是udev規則可以使用wildcars來匹配設備的名稱('KERNEL ==「foo *」'),並且它們也可以匹配驅動程序的名稱('DRIVERS ==「bar」')。 – rodrigo 2012-08-07 14:26:33

回答

3

試試這個: #include <sys/stat.h>

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

來源:man -s 2 chmod

1

udev有權限規則,您需要在之下創建它們

第一次嘗試這樣的:

在文件/etc/udev/udev.conf,加入這一行:

# My default permissions 
default_mode="0660" 

如果這不起作用添加/etc/udev/rules.d中的規則,更多的在這裏:http://www.reactivated.net/writing_udev_rules.html

4

這是方法中使用by the TTY driver來權限設置爲0666的創作:

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

struct class中的devnode屬性有一個參數指針mode,它允許您設置權限。

當設備被破壞時,請注意,mode可能爲NULL