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;
}
Respostas:
Desisti de tentar descobrir outros meios de fazê-lo além das regras do udev. Em vez disso, apenas aprendi um pouco sobre o udev e escrevi uma regra de flippin '. A seguinte linha foi colocada em um
.rules
arquivo (denominei meu99-hidraw-permissions.rules
) localizado em/etc/udev/rules.d
.Basicamente, isso atribui todos os dispositivos que saem do subsistema hidraw no kernel ao grupo
plugdev
e define as permissões para r / wr / wr (para root [o proprietário padrão], plugdev e todos os outros, respectivamente). Eu mesmo adicionado ao grupo plugdev, está tudo bem.Não é tão derretido como eu esperava. Udev governa realmente parecem bastante simples ... Quer dizer, parece que eles podem obter ridículo se você está lidando com IDs de produtos individuais e outros enfeites, mas eles parecem muito muito domar por aquilo que fazem.
fonte
Ok, antes de tudo, vamos ver o que
hidraw
significa e o que é composto:A partir disso, podemos inferir que
hidraw
é um método bruto / direto para acessar o hid . Agora vamos ver o que nossos sistemas pensam sobre isso:Então, o que
character special
significa? Arquivos especiais de caracteres ou dispositivos de caracteres referem-se a dispositivos através dos quais o sistema transmite dados, um caractere de cada vez, por exemplogetchar
. novamente Wikipedia é nosso amigo O mesmo segue oc
no início dols -l
comando.Então, como isso resolve sua pergunta? Para acessar,
/dev/hidraw*
você deve usar a implementação C para ler / gravar neste arquivo. Mas, se você deseja informações sobre os HIDs conectados, consulte/sys/class/hidraw/hidraw*/
. Exemplo:Leve em consideração que apenas o kernel tem acesso direto na maioria dos casos aos dispositivos, e você só deve usar as chamadas fornecidas no espaço do usuário para se comunicar com esses dispositivos.
A menos que você esteja desenvolvendo um novo driver / dispositivo para o qual não deve brincar muito
udev
, pode danificar permanentemente o cérebro.fonte
open()
método POSIX e obtive aserrno
permissões insuficientes. A execuçãocat
no arquivo como um usuário normal resulta em um erro de permissão insuficiente, enquanto a execução emsu
resultados resulta em umacat
operação bem-sucedida (embora sem sentido) . Embora eu aprecie as informações extras, na verdade não ajuda no meu problema de falta de permissões ... Além disso, estou trabalhando com um HID experimental, por isso estou totalmente bem em deixar meu cérebro cheio de mágoas tão boas udev é necessário.