2012-08-07 40 views
5

Gần đây tôi đã thừa kế một số mã tại nơi làm việc, đây là trình điều khiển nhân Linux 2.4.X cũ và tôi đã được giao nhiệm vụ nhận chúng hoạt động trên hạt nhân mới hơn 2.6 trở lên. Tôi đang chạy trên OpenSUSE 12.1 với một hạt nhân 3.1.10.Làm thế nào tôi có thể lập trình quyền trên thiết bị char

Tôi đã cập nhật mã gốc từ register_chrdev() để sử dụng các cuộc gọi class_create()/device_create() và tôi có thể thấy thiết bị của mình hiển thị trong/dev một cách chính xác. vấn đề hiện tại của tôi là các quyền cho điện thoại của tôi đang được thiết lập để r/w cho chỉ sử dụng:

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

Tôi biết tôi có thể "chmod" các tập tin thông qua dòng lệnh, và hay tôi có thể thiết lập quyền udev. .. nhưng có anyway để làm điều này lập trình, như vậy mà khi tôi phát hành lệnh insmod, dev sẽ được gắn kết với các quy tắc chính xác tại chỗ đã?

Có bất kỳ API nào có thể tồn tại mà tôi có thể gọi để thực hiện việc này hay không, bất kỳ tùy chọn nào tôi thiếu trong một trong các API tạo này?

Chỉ cần làm rõ, một phần lý do tôi không muốn sử dụng quy tắc udev là tôi không biết tên của trình điều khiển thiết bị trước thời hạn. Các trình điều khiển thiết bị được sinh ra trong một vòng lặp và vì vậy những cái tên được nối bằng một chữ số, nNumDevs có thể được khá nhiều bất cứ điều gì:

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

Tôi nghĩ bạn nên tiếp tục và sử dụng 'udev'. Quyền truy cập thiết bị thường là dịch vụ của quản trị viên cục bộ, những người có thể có các ý tưởng khác nhau về quyền truy cập so với tác giả trình điều khiển thiết bị. Bạn có thể thả các thiết lập mặc định trong '/ etc/udev/rules.d' hoặc một cái gì đó. – larsks

+0

Đã hiểu, nhưng chúng tôi (nhóm của tôi) là quản trị viên của hệ thống, vì vậy nếu tôi muốn mọi thứ có 777, tôi có thể làm như vậy. Ngoài ra, tôi có một vấn đề với việc sử dụng rules.d (cập nhật trong mô tả ban đầu), vì tên của các trình điều khiển thiết bị được tạo động ... trừ khi tôi hiểu lầm cách sử dụng udev. – Mike

+2

@Mike: Nhưng quy tắc udev có thể sử dụng wildcars để khớp với tên của thiết bị ('KERNEL ==" foo * "') và chúng cũng có thể khớp với tên của trình điều khiển ('DRIVERS ==" bar "'). – rodrigo

Trả lời

3

Hãy thử điều này: #include <sys/stat.h>

int chmod(const char *path, mode_t mode); HOẶC int fchmod(int fd, mode_t mode);

Nguồn: man -s 2 chmod

1

udev có quy tắc cho quyền, bạn cần tạo chúng theo /etc/udev/rules.d

Trước tiên hãy thử này:

Trong tập tin /etc/udev/udev.conf, thêm dòng này:

# My default permissions 
default_mode="0660" 

Nếu điều này không làm việc thêm một quy tắc trong /etc/udev/rules.d, trên nhiều mà ở đây: http://www.reactivated.net/writing_udev_rules.html

4

đây là phương pháp được sử dụng để thiết lập by the TTY driver phép 0666 trên tạo:

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

Thuộc tính devnode trong struct class có con trỏ tham số mode cho phép bạn đặt quyền.

Cẩn thận, mode có thể là NULL khi thiết bị bị hủy.

Các vấn đề liên quan