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;
}
Réponses:
J'ai renoncé à courir en essayant de trouver un autre moyen de le faire que les règles udev, et à la place, j'ai juste appris un peu sur udev et écrit une règle de retournement. La ligne suivante a été placée dans un
.rules
fichier (j'ai nommé le mien99-hidraw-permissions.rules
) situé sous/etc/udev/rules.d
.Fondamentalement, cela affecte tous les périphériques sortant du sous-système hidraw du noyau au groupe
plugdev
et définit les autorisations sur r / wr / wr (pour root [le propriétaire par défaut], plugdev et tout le monde respectivement). Avec moi-même ajouté au groupe plugdev, tout est dandy.Pas autant que le cerveau qui fondait comme je m'y attendais. Les règles d'Udev semblent en fait assez simples ... Je veux dire, elles peuvent devenir ridicules si vous traitez avec des ID de produit individuels et ainsi de suite, mais elles semblent assez fous pour ce qu'elles font.
la source
Ok, tout d'abord, voyons ce que
hidraw
signifie et ce qui est composé de:Nous pouvons en déduire qu'il
hidraw
s'agit d'une méthode brute / directe pour accéder au cache . Voyons maintenant ce que nos systèmes en pensent:Alors, qu'est-ce que cela
character special
signifie? Les fichiers de caractères spéciaux ou les dispositifs de caractères se rapportent aux dispositifs par lesquels le système transmet des données un caractère à la fois, par exemplegetchar
. Wikipédia est à nouveau notre ami. Il en va de mêmec
au début de lals -l
commande.Alors, comment cela résout-il votre question? Pour accéder à,
/dev/hidraw*
vous devez utiliser l'implémentation C pour lire / écrire dans ce fichier. Mais, si vous voulez des informations sur les HID connectés, vous devriez regarder/sys/class/hidraw/hidraw*/
. Exemple:Tenez compte du fait que seul le noyau a un accès direct dans la plupart des cas aux périphériques, et vous ne devez utiliser que les appels fournis dans l'espace utilisateur pour communiquer avec ces périphériques.
À moins que vous ne développiez un nouveau pilote / périphérique que vous ne devriez pas trop jouer
udev
, vous pouvez endommager votre cerveau de façon permanente.la source
open()
méthode POSIX et j'ai obtenu leserrno
autorisations insuffisantes. L'exécutioncat
sur le fichier en tant qu'utilisateur normal entraîne une erreur d'autorisations insuffisante, tandis que l'exécution soussu
entraîne une opération réussie (quoique dénuée de sens)cat
. Bien que j'apprécie les informations supplémentaires, cela n'aide pas vraiment mon problème de manque d'autorisations ... De plus, je travaille avec un HID expérimental, donc je suis tout à fait d'accord pour avoir le cerveau plein de blessures udev stuff c'est nécessaire.