一部の情報をデバイスに渡すドライバを作成し、そのためにsysfsエントリを作成しました。うまくいきますが、問題は管理者としてログインしないと書き込む権限がないことです。公開読み取りおよび書き込み権限を持ちたいです。
ドライバを作成するようアドバイスを受けた方法に応じて、次のマクロを使用してsysfsプロパティを設定しました。
__ATTR(status_vector,0660,status_vector_is_read,status_vector_is_written);
問題は明らかです。 666の代わりに660を権限として使用しました。
ただし、権限を666に設定または定義されているS_IWUGO | S_IRUGOを使用しようとするとエラーが発生します。公開読み取り権限は設定できますが、書き込み権限は設定できません。確かにこれ誰かが同じ問題を抱えていましたが、そのスレッドに与えられた答えを見ることができませんでした。
権限を設定するためにいつでもchmodを使用することができますが、これは迷惑で面倒な解決策のように見え、ドライバを正しく書く方法を学びたいと思います。 S_IWUGOを設定できないのはなぜですか?
ベストアンサー1
この__ATTR
マクロは次に展開されます[1]:
#define __ATTR(_name, _mode, _show, _store) { \
.attr = {.name = __stringify(_name), \
.mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \
.show = _show, \
.store = _store, \
}
マクロの使用に注意してくださいVERIFY_OCTAL_PERMISSIONS
。このマクロは次の[2]に展開されます。
#define VERIFY_OCTAL_PERMISSIONS(perms) \
(BUILD_BUG_ON_ZERO((perms) < 0) + \
BUILD_BUG_ON_ZERO((perms) > 0777) + \
/* USER_READABLE >= GROUP_READABLE >= OTHER_READABLE */ \
BUILD_BUG_ON_ZERO((((perms) >> 6) & 4) < (((perms) >> 3) & 4)) + \
BUILD_BUG_ON_ZERO((((perms) >> 3) & 4) < ((perms) & 4)) + \
/* USER_WRITABLE >= GROUP_WRITABLE */ \
BUILD_BUG_ON_ZERO((((perms) >> 6) & 2) < (((perms) >> 3) & 2)) + \
/* OTHER_WRITABLE? Generally considered a bad idea. */ \
BUILD_BUG_ON_ZERO((perms) & 2) + \
(perms))
入手できるバージョンは、BUILD_BUG_ON_ZERO
私が見つけられなかったマクロによって異なりますが、上記のマクロの説明に注意する必要があります。 "OTHER_WRITABLE? 一般的に悪い考えとみなされます。"
呼び出しパスを追跡しませんでしたが、コードフィルタリング/無視と推測されますo+w
。
しかし、なぜ権限のないユーザーがハードウェアと直接対話できるようにしたいのですか?
[1]http://elixir.free-electrons.com/linux/v4.14/source/include/linux/sysfs.h#L101
[2]http://elixir.free-electrons.com/linux/v4.14/source/include/linux/kernel.h#L940