Apa yang harus saya lakukan untuk memiliki izin baca di / dev / hidraw *?
Saya melihat hal-hal tentang aturan udev dan melihat ini di internet, tetapi dunia udev seperti negeri asing bagi saya, dan jika ada semacam solusi yang lebih sederhana di mana saya hanya menambahkan diri saya ke grup yang akan menjadi keren ...
(Ubuntu 13.10 Preview)
Jangan ragu untuk mengulang pertanyaannya - saya tidak terlalu tertarik dengan apa yang sebenarnya disebut 'hidraw'.
EDIT:
H'okay, jadi, hanya beberapa informasi untuk mengklarifikasi masalah ini: Saya benar-benar melangkah melalui kode yang disebut open()
metode POSIX , dan mendapatkan errno
izin yang tidak mencukupi. Berjalan cat
di file sebagai pengguna normal menghasilkan kesalahan izin yang tidak mencukupi, sementara berjalan di bawah su
hasil dalam operasi yang sukses (meskipun tidak berarti) cat
.
EDIT EDIT:
Atas permintaan, saya memberikan kode yang relevan dengan panggilan POSIX. Itu dari perpustakaan HIDAPI oleh Signal11 (fungsi hid_open_path
). Saya percaya bahwa kode ini benar, karena tampaknya sudah cukup lama digunakan. Saya telah menambahkan komentar yang terletak di mana errno
bacaan yang relevan terjadi di 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;
}