Tôi cần làm gì để có quyền đọc trên / dev / hidraw *?
Tôi đang nhìn thấy những thứ về quy tắc của udev và thấy điều này trên mạng, nhưng thế giới của udev giống như một vùng đất xa lạ đối với tôi, và nếu có một giải pháp đơn giản hơn, nơi tôi chỉ cần thêm mình vào một nhóm sẽ trở nên bẩn thỉu ...
(Bản xem trước Ubuntu 13.10)
Vui lòng kiểm tra lại câu hỏi - Tôi không quá quan tâm đến những gì 'hidraw' chính xác diễn ra.
BIÊN TẬP:
Vì vậy, chỉ cần thêm một số thông tin để làm rõ vấn đề: Tôi thực sự bước qua mã được gọi là open()
phương thức POSIX và nhận được các errno
quyền không đủ. Chạy cat
trên tệp như một người dùng bình thường dẫn đến lỗi không đủ quyền, trong khi chạy dưới su
kết quả trong một cat
hoạt động thành công (mặc dù vô nghĩa) .
EDIT EDIT:
Theo yêu cầu, tôi đang cung cấp mã có liên quan với cuộc gọi POSIX. Nó từ thư viện HIDAPI của Signal11 (chức năng hid_open_path
). Tôi tin rằng mã này là chính xác, vì nó dường như đã được sử dụng từ khá lâu rồi. Tôi đã thêm một nhận xét ở nơi errno
diễn ra việc đọc có liên quan trong GDB.
hid_device *dev = NULL;
hid_init();
dev = new_hid_device();
if (kernel_version == 0) {
struct utsname name;
int major, minor, release;
int ret;
uname(&name);
ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
if (ret == 3) {
kernel_version = major << 16 | minor << 8 | release;
//printf("Kernel Version: %d\n", kernel_version);
}
else {
printf("Couldn't sscanf() version string %s\n", name.release);
}
}
/* OPEN HERE */
dev->device_handle = open(path, O_RDWR);
// errno at this location is 13: insufficient permissions
/* If we have a good handle, return it. */
if (dev->device_handle > 0) {
/* Get the report descriptor */
int res, desc_size = 0;
struct hidraw_report_descriptor rpt_desc;
memset(&rpt_desc, 0x0, sizeof(rpt_desc));
/* Get Report Descriptor Size */
res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size);
if (res < 0)
perror("HIDIOCGRDESCSIZE");
/* Get Report Descriptor */
rpt_desc.size = desc_size;
res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc);
if (res < 0) {
perror("HIDIOCGRDESC");
} else {
/* Determine if this device uses numbered reports. */
dev->uses_numbered_reports =
uses_numbered_reports(rpt_desc.value,
rpt_desc.size);
}
return dev;
}
else {
/* Unable to open any devices. */
free(dev);
return NULL;
}