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