0

openDir を使用して、Linux カーネル (3.2.17) でカスタム システム コール中にディレクトリを開こうとしています。

#include <linux/kernel.h>
#include <linux/unistd.h>
#include <linux/types.h>    // also tried "asm/types.h"
#include <linux/dirent.h>
#include <linux/stat.h>

asmlinkage
int sys_mycall( const char* srcDir ) {
    DIR* dir_p;
    struct dirent *dirEntry;
    struct stat inode;
    dir_p = opendir(srcDir);
    ...
    ...
}

ただし、コンパイラは必要なものを見つけることができません

mycall.c:9:5: error: unknown type name ‘DIR’
mycall.c:14:5: error: implicit declaration of function ‘opendir’ [-Werror=implicit-function-declaration]

これがユーザー空間アプリケーションの場合、 #include<dirent.h><sys/types.h>を使用しますが、これらは使用できません。コンパイラは上記のヘッダーを見つけるのに何の問題もないように見えますが、明らかに必要なものを取得していません。

別のシステムコールからこの呼び出しを行うことは可能ですか?
別の関連する質問で、直接呼び出すのではなく、目的のシステムコールが内部で行っていることを誰かが実装または再利用することを提案したことがわかります。

可能であれば、電話をかけるために必要なものを誰か教えてもらえませんか (これも Linux 3.2.17 です)。
ありがとう。

編集:
これが進むべき道のようです:そのディレクトリのファイル記述子を使用して、カーネルレベルでディレクトリを開くにはどうすればよいですか?

4

1 に答える 1

1

はい、別のシステムコールからシステムコールを行うことは可能です。しかしそれには限界があります。opendir()また、カーネルでは使用できません。

探してみてくださいstruct nameidata nd

使用するuser_path_parent();

このリンクを確認してください: http://lxr.free-electrons.com/source/fs/namei.c#L3352

于 2012-10-26T07:39:13.403 に答える