ここに関数があります:
handle_file(FILE *file)
{
if(condition)
{
print filename and other msg;
}
}
ここでわかっているのは、ファイルへのポインタだけです。ポインタに従ってファイル名を取得することは可能ですか?
ここに関数があります:
handle_file(FILE *file)
{
if(condition)
{
print filename and other msg;
}
}
ここでわかっているのは、ファイルへのポインタだけです。ポインタに従ってファイル名を取得することは可能ですか?
この回答をチェックしてファイル記述子を取得し、この回答をチェックしてファイル記述子からファイル名を取得してください。Linuxでは問題ないはずです(他のオペレーティングシステムについてはよくわかりません)。
これが簡単な例です(Cygwin / Win7でテスト済み):
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int MAXSIZE = 0xFFF;
char proclnk[0xFFF];
char filename[0xFFF];
FILE *fp;
int fno;
ssize_t r;
// test.txt created earlier
fp = fopen("test.txt", "r");
if (fp != NULL)
{
fno = fileno(fp);
sprintf(proclnk, "/proc/self/fd/%d", fno);
r = readlink(proclnk, filename, MAXSIZE);
if (r < 0)
{
printf("failed to readlink\n");
exit(1);
}
filename[r] = '\0';
printf("fp -> fno -> filename: %p -> %d -> %s\n",
fp, fno, filename);
}
return 0;
}
出力:
fp -> fno -> filename: 0x80010294 -> 3 -> /tmp/test.txt
これは2段階で行うことができます。まず、ファイル記述子を取得する必要があります。次に、ファイル名を回復する必要があります。以下は例ですが、いくつかの深刻なバッファオーバーフローの脆弱性があります!
#include <stdio.h>
#include <unistd.h>
char * recover_filename(FILE * f) {
int fd;
char fd_path[255];
char * filename = malloc(255);
ssize_t n;
fd = fileno(f);
sprintf(fd_path, "/proc/self/fd/%d", fd);
n = readlink(fd_path, filename, 255);
if (n < 0)
return NULL;
filename[n] = '\0';
return filename;
}
私が検索したように、あなたがルートであり、コマンドlsof
がシステムに存在する場合は、を使用fileno(fp)
して、開いているファイルの記述子を取得できますlsof -d descriptor
。あなたはそれを試すことができます。
それ以外の場合、フォルダ内のすべてのディレクトリとファイルを分析する場合は、opendirとstructdirentを使用できます。これはファイルポインタを使用していませんが、コードがどのように機能しているかによっては、役立つ場合があります。
DIR *BaseDIR;
struct dirent *curentDir;
BaseDIR = opendir("path/to/the/directory");
while((curentDir = readdir(BaseDIR)) != NULL){
printf("directory or file name : %s\n",curentDir->d_name);
}
closedir(BaseDIR);
可能だと思います。記述子を取得するために
使用します。
その後、関数を使用できます。fileno(fp)
fstat()
The fstat() function shall obtain information about an open file asso‐
ciated with the file descriptor fildes, and shall write it to the area
pointed to by buf.
int fstat(int fildes, struct stat *buf);
次に、で多くのファイル情報を取得できます*buf
。