/ dev / hidraw: разрешения на чтение

8

Что мне нужно сделать, чтобы иметь права на чтение для / 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;
}
пользователь
источник
Добавлен фрагмент кода @Braiam.
пользователь

Ответы:

11

Я бросил бегать, пытаясь найти другие способы сделать это, кроме правил udev, и вместо этого просто немного узнал об udev и написал правило flippin '. Следующая строка была помещена в .rulesфайл (я назвал мой 99-hidraw-permissions.rules), расположенный под /etc/udev/rules.d.

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"

По сути это назначает группе все устройства, выходящие из подсистемы hidraw в ядре, plugdevи устанавливает права доступа для r / wr / wr (для root [владелец по умолчанию], plugdev и все остальные соответственно). Со мной, добавленным в группу plugdev, все прекрасно.

Не совсем так, как тает мозг, как я ожидал. Udev правила на самом деле , кажется , довольно просто ... Я имею в виду, они выглядят , как они могут получить смешно , если вы имеете дело с индивидуальными идентификаторами продукта и этажерка, но они , кажется , довольно чертовски укротить за то , что они делают.

пользователь
источник
Это сработало для меня, так как я хотел использовать инструмент конфигурирования Roccat, и ему нужны были права суперпользователя. С этим я могу использовать инструмент с обычным пользователем.
LnxSlck
5

Чтобы понять что-то ... начните знать об этом.

Хорошо, во-первых, давайте посмотрим, что hidrawозначает и из чего состоит:

  • hid (Human Interface Device): устройство человеческого интерфейса или HID - это тип компьютерного устройства, которое напрямую взаимодействует с людьми и чаще всего получает информацию от людей и может передавать результаты людям. источник википедии
  • raw: Это подразумевается как грубое , но в среде Linux это также означает прямой.

Из этого мы можем сделать вывод, что hidrawэто грубый / прямой метод доступа к hid . Теперь давайте посмотрим, что наши системы думают об этом:

$ ls -l /dev/hidraw*
crw------- 1 root root 251, 0 Aug  3  2013 /dev/hidraw0
crw------- 1 root root 251, 1 Aug  3  2013 /dev/hidraw1
crw------- 1 root root 251, 2 Aug  3  2013 /dev/hidraw2
$ file /dev/hidraw*
/dev/hidraw0: character special 
/dev/hidraw1: character special 
/dev/hidraw2: character special

Итак, что character specialзначит? Символьные специальные файлы или символьные устройства относятся к устройствам, через которые система передает данные по одному символу за раз, например getchar,. снова Википедия наш друг То же самое следует cв начале ls -lкоманды.

Что мне нужно сделать, чтобы иметь права на чтение для / dev / hidraw *?

Итак, как это решить ваш вопрос? Для доступа /dev/hidraw*вы должны использовать реализацию C для чтения / записи в этот файл. Но, если вам нужна информация о подключенном HID, вы должны посмотреть /sys/class/hidraw/hidraw*/. Пример:

$ cat /sys/class/hidraw/hidraw2/device/uevent
DRIVER=hid-generic
HID_ID=0003:000015D9:00000A4C
HID_NAME= USB OPTICAL MOUSE
HID_PHYS=usb-0000:00:1d.1-2/input0
HID_UNIQ=
MODALIAS=hid:b0003g0001v000015D9p00000A4C

Примите во внимание, что только ядро ​​имеет прямой доступ в большинстве случаев к устройствам, и вы должны использовать только вызовы, предоставленные в пространстве пользователя, для связи с этими устройствами.

Я вижу материал о правилах udev и видел это в сети, но мир udev для меня как чужая земля

Если вы не разрабатываете новый драйвер / устройство, вы не должны слишком много играть udev, вы можете навсегда повредить свой мозг.

Braiam
источник
Я буквально прошел по коду, который вызывал open()метод POSIX , и получил errnoнедостаточные разрешения. Запуск catфайла с правами обычного пользователя приводит к ошибке с недостаточными правами доступа, в то время как запуск с использованием файла suприводит к успешной (хотя и бессмысленной) catоперации. Хотя я ценю дополнительную информацию, на самом деле она не помогает решить проблему отсутствия разрешений ... Кроме того, я работаю с экспериментальной HID, так что я полностью согласен с тем, чтобы мой мозг был полон больно, так хорошо Удев вещи надо.
пользователь