Was muss ich tun, um Leseberechtigungen für / dev / hidraw * zu haben?
Ich sehe Dinge über udev-Regeln und habe dies im Internet gesehen, aber die Welt von udev ist für mich wie ein fremdes Land, und wenn es eine einfachere Lösung gibt, bei der ich mich einfach einer Gruppe hinzufüge, die dandy wäre ...
(Ubuntu 13.10 Vorschau)
Fühlen Sie sich frei, die Frage erneut zu beantworten - ich bin nicht besonders daran interessiert, was genau unter "Verstecken" zu verstehen ist.
BEARBEITEN:
H'okay, also nur ein paar weitere Informationen, um das Problem zu klären: Ich bin buchstäblich durch Code gegangen, der die POSIX- open()
Methode aufgerufen hat , und habe die errno
für unzureichende Berechtigungen erhalten. Das Ausführen cat
der Datei als normaler Benutzer führt zu einem unzureichenden Berechtigungsfehler, während das Ausführen unter su
zu einem erfolgreichen (wenn auch bedeutungslosen) cat
Vorgang führt.
BEARBEITEN BEARBEITEN:
Auf Anfrage stelle ich den entsprechenden Code mit POSIX-Aufruf zur Verfügung. Es ist aus der HIDAPI-Bibliothek von Signal11 (Funktion hid_open_path
). Ich vertraue darauf, dass dieser Code korrekt ist, da er anscheinend schon seit einiger Zeit verwendet wird. Ich habe einen Kommentar hinzugefügt, der sich dort befindet, wo die relevante errno
Lesung in GDB stattgefunden hat.
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;
}