¿Qué debo hacer para tener permisos de lectura en / dev / hidraw *?
Estoy viendo cosas sobre las reglas de udev y vi esto en la red, pero el mundo de udev es como una tierra extranjera para mí, y si hay algún tipo de solución más simple donde me agregue a un grupo que sería genial ...
(Vista previa de Ubuntu 13.10)
Siéntase libre de volver a plantear la pregunta: no estoy demasiado interesado en qué es exactamente lo que 'hidraw' tiene.
EDITAR:
Bien, entonces, solo un poco más de información para aclarar el problema: literalmente revisé el código que llamaba al open()
método POSIX , y obtuve los errno
permisos insuficientes. Ejecutar cat
en el archivo como un usuario normal da como resultado un error de permisos insuficiente, mientras que ejecuta bajo su
resultados en una cat
operación exitosa (aunque sin sentido) .
EDITAR EDITAR:
A petición, proporciono el código relevante con la llamada POSIX. Es de la biblioteca HIDAPI de Signal11 (función hid_open_path
). Confío en que este código sea correcto, ya que aparentemente ha estado en uso durante bastante tiempo. Agregué un comentario donde se realizó la errno
lectura relevante en 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;
}
Respuestas:
Dejé de correr tratando de encontrar alguna otra forma de hacerlo que no sean las reglas de udev, y en su lugar, aprendí un poco sobre udev y escribí una regla de flippin '. La siguiente línea se colocó en un
.rules
archivo (yo llamé el mío99-hidraw-permissions.rules
) ubicado debajo/etc/udev/rules.d
.Básicamente, esto asigna todos los dispositivos que salen del subsistema hidraw en el kernel al grupo
plugdev
y establece los permisos en r / wr / wr (para root [el propietario predeterminado], plugdev y todos los demás, respectivamente). Con mi mismo agregado al grupo plugdev, todo es excelente.No se derritió tanto como esperaba. Las reglas de Udev en realidad parecen bastante sencillas ... Quiero decir, parece que pueden volverse ridículas si se trata de identificaciones de productos individuales y otras cosas, pero parecen bastante mansas por lo que hacen.
fuente
Ok, antes que nada, veamos qué
hidraw
significa y de qué se compone:De esto podemos inferir que
hidraw
es un método crudo / directo para acceder al hid . Ahora veamos qué piensan nuestros sistemas sobre esto:Entonces, ¿qué
character special
significa? Los archivos especiales de caracteres o dispositivos de caracteres se relacionan con dispositivos a través de los cuales el sistema transmite datos un carácter a la vez, por ejemplogetchar
. de nuevo Wikipedia es nuestro amigo. Lo mismo siguec
al inicio dells -l
comando.Entonces, ¿cómo resuelve esto tu pregunta? Para acceder al
/dev/hidraw*
debe usar la implementación C para leer / escribir en este archivo. Pero, si lo que desea es información sobre los HID conectados, debe buscarla/sys/class/hidraw/hidraw*/
. Ejemplo:Tenga en cuenta que solo el núcleo tiene acceso directo en la mayoría de los casos a los dispositivos, y solo debe usar las llamadas proporcionadas en el espacio de usuario para comunicarse con estos dispositivos.
A menos que esté desarrollando un nuevo controlador / dispositivo con el que no debería jugar demasiado
udev
, puede sufrir daños permanentes en su cerebro.fuente
open()
método POSIX y obtuve loserrno
permisos insuficientes. Ejecutarcat
en el archivo como un usuario normal da como resultado un error de permisos insuficiente, mientras que ejecuta bajosu
resultados en unacat
operación exitosa (aunque sin sentido) . Si bien aprecio la información adicional, en realidad no ayuda con mi problema de falta de permisos ... Además, estoy trabajando con un HID experimental, por lo que estoy totalmente de acuerdo con que mi cerebro esté lleno de heridas tan buenas udev cosas es necesario.