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;
}
Jawaban:
Saya menyerah untuk mencari tahu cara lain untuk melakukannya selain aturan udev, dan alih-alih hanya belajar sedikit tentang udev dan menulis aturan flippin. Baris berikut ditempatkan dalam
.rules
file (saya beri nama milik saya99-hidraw-permissions.rules
) yang terletak di bawah/etc/udev/rules.d
.Pada dasarnya ini menetapkan semua perangkat yang keluar dari subsistem hidraw di kernel ke grup
plugdev
dan menetapkan izin untuk r / wr / wr (masing-masing untuk root [pemilik default], plugdev, dan semua orang lainnya). Dengan diriku yang ditambahkan ke grup plugdev, semuanya keren.Tidak cukup meleleh seperti yang saya duga. Aturan Udev sebenarnya tampak sangat mudah ... Maksudku, sepertinya mereka bisa konyol jika Anda berurusan dengan ID produk individu dan yang lainnya, tetapi mereka tampaknya sangat jinak untuk apa yang mereka lakukan.
sumber
Ok, pertama-tama, mari kita lihat apa
hidraw
artinya dan apa yang terdiri dari:Dari sini kita dapat menyimpulkan bahwa
hidraw
ini adalah metode mentah / langsung untuk mengakses hid . Sekarang mari kita lihat apa yang dipikirkan sistem kami tentang ini:Jadi, apa
character special
artinya? File khusus karakter atau perangkat karakter berhubungan dengan perangkat yang digunakan oleh sistem untuk mentransmisikan data satu karakter setiap kali, misalnyagetchar
,. lagi Wikipedia adalah teman kita. Hal yang sama mengikutic
di awalls -l
perintah.Jadi, bagaimana ini menyelesaikan pertanyaan Anda? Untuk mengakses
/dev/hidraw*
Anda harus menggunakan implementasi C untuk membaca / menulis ke file ini. Tetapi, jika yang Anda inginkan adalah informasi tentang HID yang terhubung, Anda harus melihatnya/sys/class/hidraw/hidraw*/
. Contoh:Mempertimbangkan bahwa hanya kernel yang memiliki akses langsung di sebagian besar kasus ke perangkat, dan Anda hanya boleh menggunakan panggilan yang disediakan di userspace untuk berkomunikasi dengan perangkat ini.
Kecuali jika Anda mengembangkan driver / perangkat baru yang seharusnya tidak terlalu Anda mainkan
udev
, otak Anda bisa rusak secara permanen.sumber
open()
metode POSIX , dan mendapaterrno
izin yang tidak mencukupi. Berjalancat
di file sebagai pengguna normal menghasilkan kesalahan izin yang tidak mencukupi, sementara berjalan di bawahsu
hasil dalam operasi yang sukses (meskipun tidak berarti)cat
. Meskipun saya menghargai info tambahan, itu sebenarnya tidak membantu dengan kurangnya masalah izin saya ... Juga, saya bekerja dengan HID eksperimental, jadi saya benar-benar baik-baik saja dengan membuat otak saya penuh dengan rasa sakit-sangat-baik hal udev itu perlu.