Что мне нужно сделать, чтобы иметь права на чтение для / dev / hidraw *?
Я вижу кое-что о правилах udev и вижу это в сети, но мир udev для меня как чужая земля, и если есть какое-то более простое решение, где я просто добавляю себя в группу, которая была бы денди ...
(Предварительный просмотр Ubuntu 13.10)
Не стесняйтесь пометить вопрос - я не слишком заинтересован в том, что именно означает «hidraw».
РЕДАКТИРОВАТЬ:
Итак, просто еще немного информации, чтобы прояснить проблему: я буквально прошел по коду, который вызывал open()
метод POSIX , и получил errno
недостаточные разрешения. Запуск cat
файла с правами обычного пользователя приводит к ошибке с недостаточными правами доступа, в то время как запуск с использованием файла su
приводит к успешной (хотя и бессмысленной) cat
операции.
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ:
По запросу я предоставляю соответствующий код с вызовом POSIX. Это из библиотеки HIDAPI от Signal11 (функция hid_open_path
). Я верю, что этот код верен, так как он, по-видимому, уже довольно давно используется. Я добавил комментарий, расположенный там, где errno
в 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;
}
Ответы:
Я бросил бегать, пытаясь найти другие способы сделать это, кроме правил udev, и вместо этого просто немного узнал об udev и написал правило flippin '. Следующая строка была помещена в
.rules
файл (я назвал мой99-hidraw-permissions.rules
), расположенный под/etc/udev/rules.d
.По сути это назначает группе все устройства, выходящие из подсистемы hidraw в ядре,
plugdev
и устанавливает права доступа для r / wr / wr (для root [владелец по умолчанию], plugdev и все остальные соответственно). Со мной, добавленным в группу plugdev, все прекрасно.Не совсем так, как тает мозг, как я ожидал. Udev правила на самом деле , кажется , довольно просто ... Я имею в виду, они выглядят , как они могут получить смешно , если вы имеете дело с индивидуальными идентификаторами продукта и этажерка, но они , кажется , довольно чертовски укротить за то , что они делают.
источник
Хорошо, во-первых, давайте посмотрим, что
hidraw
означает и из чего состоит:Из этого мы можем сделать вывод, что
hidraw
это грубый / прямой метод доступа к hid . Теперь давайте посмотрим, что наши системы думают об этом:Итак, что
character special
значит? Символьные специальные файлы или символьные устройства относятся к устройствам, через которые система передает данные по одному символу за раз, напримерgetchar
,. снова Википедия наш друг То же самое следуетc
в началеls -l
команды.Итак, как это решить ваш вопрос? Для доступа
/dev/hidraw*
вы должны использовать реализацию C для чтения / записи в этот файл. Но, если вам нужна информация о подключенном HID, вы должны посмотреть/sys/class/hidraw/hidraw*/
. Пример:Примите во внимание, что только ядро имеет прямой доступ в большинстве случаев к устройствам, и вы должны использовать только вызовы, предоставленные в пространстве пользователя, для связи с этими устройствами.
Если вы не разрабатываете новый драйвер / устройство, вы не должны слишком много играть
udev
, вы можете навсегда повредить свой мозг.источник
open()
метод POSIX , и получилerrno
недостаточные разрешения. Запускcat
файла с правами обычного пользователя приводит к ошибке с недостаточными правами доступа, в то время как запуск с использованием файлаsu
приводит к успешной (хотя и бессмысленной)cat
операции. Хотя я ценю дополнительную информацию, на самом деле она не помогает решить проблему отсутствия разрешений ... Кроме того, я работаю с экспериментальной HID, так что я полностью согласен с тем, чтобы мой мозг был полон больно, так хорошо Удев вещи надо.