O que preciso fazer para ter permissões de leitura em / dev / hidraw *?
Estou vendo coisas sobre as regras do udev e vi isso na rede, mas o mundo do udev é como uma terra estrangeira para mim, e se houver algum tipo de solução mais simples, eu apenas me adicionarei a um grupo que seria dândi ...
(Visualização do Ubuntu 13.10)
Sinta-se à vontade para refazer a pergunta - não estou muito interessado no que exatamente 'hidraw' significa.
EDITAR:
Tudo bem, então, apenas mais algumas informações para esclarecer o problema: eu literalmente repassei o código que chamava o open()
método POSIX e obtive as errno
permissões insuficientes. A execução cat
no arquivo como um usuário normal resulta em um erro de permissão insuficiente, enquanto a execução em su
resultados resulta em uma cat
operação bem-sucedida (embora sem sentido) .
EDIT EDIT:
A pedido, estou fornecendo o código relevante com a chamada POSIX. É da biblioteca HIDAPI da Signal11 (função hid_open_path
). Confio que esse código esteja correto, pois aparentemente já está em uso há algum tempo. Adicionei um comentário localizado onde a errno
leitura relevante ocorreu no 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;
}