/dev/hidraw: 読み取り権限

/dev/hidraw: 読み取り権限

/dev/hidraw*への読み取りアクセス権を取得するにはどうすればよいですか?

私はudevルールについて何かを見ていましたが、これオンラインですが、udevの世界は私に外国のように感じます。グループに自分自身を追加するより簡単な解決策があれば良いと思います。

(Ubuntu 13.10 プレビュー)

この質問に自由にタグを付け直してください。私は「hidraw」が正確に何であるかはあまり興味がありません。

編集する:

さて、質問を明確にするためにもう少し情報を提供します。open()POSIXメソッドを呼び出すコードをそのまま実行しましたが、errno権限が不足しているというメッセージが表示されました。通常のユーザーとしてファイルを実行するとcat権限不足エラーが発生しますが、通常のユーザーとして実行するとsu(意味はありません)、操作は成功しますcat

編集済み:

要求時にPOSIX呼び出しに関する関連コードを提供しました。これはSignal11のHIDAPIライブラリ(関数hid_open_path)で提供されています。私はこのコードがかなり長い間使用されてきたので、正しいと思います。私は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;
}

ベストアンサー1

私はudevルール以外のものを見つけることをあきらめ、udevについて少し学び、簡単なルールを書いた。次の行は、.rules下のファイル(私が名前を付ける)に配置されます。99-hidraw-permissions.rules/etc/udev/rules.d

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0660", GROUP="plugdev"

デフォルトでは、これはカーネルのhidrawサブシステムからのすべてのデバイスをこのグループに割り当て、権限をplugdevr / wr / wr(ルート[デフォルト所有者]、Plugdev、および他のすべての人のそれぞれ)に設定します。私はPlugdevグループに直接参加し、すべてが順調に進んだ。

思ったより脳が溶けるほどではありませんでした。 Udevのルールは実際には非常にシンプルに見えます。私の言うことは、彼らは次のとおりです。できる別途の商品IDなどを扱う場合、これは面白くなるかもしれませんが、その効果はとても良いようです。

おすすめ記事