2017-01-26 11 views
0

私はLinuxカーネル用のモジュールを書いています。()のアクセス許可を後で?

このモジュールはファイル/sys/kernel/mymodule/fooとして、いくつかのI/Oを暴露されています

static struct kobj_attribute foo_attribute =__ATTR(foo, 0660, foo_show, foo_store); 
...   
ret = sysfs_create_file(&mymodule->kobj, &foo_attribute.attr); 

私は、すぐにいくつかのデータが/sys/kernel/mymodule/fooに書き込まれたとして0440に0660パーミッションを変更できるようにしたいです。私はこれをfoo_store()関数で実行します。

私は__ATTRマクロを検討している - それは、ほとんどの権限を操作し、コードの爆発を作り出します。上記のコードは、gcc -E mymodule.c -I../../include -I../../arch/arm/include -I../../arch/arm/include/generatedをモジュールのディレクトリに使用して

static struct foo_attribute = { .attr = {.name = "foo", .mode = ((sizeof(struct { int:-!!((0660) < 0); })) + (sizeof(struct { int:-!!((0660) > 0777); })) + (sizeof(struct { int:-!!(((0660) >> 6) < (((0660) >> 3) & 7)); })) + (sizeof(struct { int:-!!((((0660) >> 3) & 7) < ((0660) & 7)); })) + (sizeof(struct { int:-!!((0660) & 2); })) + (0660)) }, .show = foo_show, .store = foo_store, }; 
... 
ret = sysfs_create_file(&vr2200pmu->kobj, &revision_attribute.attr); 

に展開されています。

にはどうすればきれいな、ポータブル方法でこれを達成することができますか?

+0

マクロは単にコンパイル時のパーミッションをチェックし、( 'はsizeofを使っているように見えます構造体{INT: - !!(何でも);}) '' whatever'が非ゼロであれば、コンパイル時エラー(負の長さのビットフィールド)をもたらすであろう。 – fadedbee

+0

これらは、権限の有効性をチェック 'BUILD_BUG_ON_ZERO'マクロ呼び出し、です。ただ、[カーネルソースファイル]で '__ATTR()'マクロ定義(http://lxr.free-electrons.com/source/include/linux/sysfs.h#L100)に見えます。 – Tsyvarev

答えて

1

、プログラムのsysfsファイルのパーミッションを変更するための方法を目的としているが、これは動作する必要があるかどうか、わからない:

// Obtain kernfs object for directory 
struct kernfs_node* dir_knode = kobj->sd; 
// Obtain kernfs object for file in the directory 
struct kernfs_node* file_knode = sysfs_get_dirent(dir_knode, foo_attr.attr.name); 
// Change permissions. Set only permissions-related bits. 
file_knode->mode = (file_knode->mode & S_IFMT) | 0440; 
関連する問題