/ dev / hidraw *の読み取り権限を取得するには、何をする必要がありますか?
私はudevルールについて何かを見ていますが、ネットでこれを見ましたが、udevの世界は私にとっては異国の地のようなものです。 ...
(Ubuntu 13.10プレビュー)
質問のタグを自由に付け直してください。「hidraw」が正確に何に該当するかについては、あまり熱心ではありません。
編集:
H'okay、それで、問題を明確にするためのもう少しの情報:POSIX open()
メソッドを呼び出すコードを文字通りステップ実行しerrno
、不十分な権限のためにを取得しました。cat
通常のユーザーとしてファイルを実行すると、アクセス許可エラーが発生します。一方、下で実行するsu
と、(意味はありませんが)cat
操作は成功します。
編集編集:
リクエストに応じて、POSIX呼び出しで関連するコードを提供しています。これは、Signal11(関数hid_open_path
)によるHIDAPIライブラリからのものです。このコードはかなり長い間使用されているようで、正しいと信じています。errno
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;
}