Que dois-je faire pour avoir des autorisations de lecture sur / dev / hidraw *?
Je vois des choses au sujet des règles udev et vu ce sur le net, mais le monde de udev est comme une terre étrangère pour moi, et s'il y a une sorte d'une solution plus simple où je me suis juste ajouter à un groupe qui serait dandy ...
(Aperçu d'Ubuntu 13.10)
N'hésitez pas à reformuler la question - je ne suis pas trop enclin à ce que le `` hidraw '' se passe exactement.
ÉDITER:
H'okay, donc, juste quelques informations supplémentaires pour clarifier le problème: j'ai littéralement parcouru le code qui appelait la open()
méthode POSIX , et j'ai obtenu les errno
autorisations insuffisantes. L'exécution cat
sur le fichier en tant qu'utilisateur normal entraîne une erreur d'autorisations insuffisante, tandis que l'exécution sous su
entraîne une opération réussie (quoique dénuée de sens) cat
.
MODIFIER MODIFIER:
Sur demande, je fournis le code correspondant avec l'appel POSIX. Il s'agit de la bibliothèque HIDAPI de Signal11 (fonction hid_open_path
). J'espère que ce code est correct, car il est apparemment utilisé depuis un certain temps maintenant. J'ai ajouté un commentaire situé là où la errno
lecture pertinente a eu lieu dans 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;
}