ディレクトリ内のファイルをチェックするプログラムを作成しようとしています。新しいファイルが作成されたら、それが実行可能かどうかを確認する必要があり、そうであれば実行する必要があります。
私は inotify インターフェースを使用しており、うまく機能していますが、stat(2) を使用してファイルが実行可能かどうかを確認しようとすると、いくつかの問題が発生します。実行する権限がないことがわかりました。
チェックしたいディレクトリの絶対パスをプログラムに渡すと、パーミッションの問題が発生しますか?
int main(int argc,char * argv []){
int fd,wd,len,i=0;
char buffer [EVENT_SIZE_BUF];
if(argc != 2)
usage();
if((fd = inotify_init()) == -1)
perror("inotify_init()");
if((wd = inotify_add_watch(fd,argv[1],IN_CREATE) -1))
perror("inotify_add_watch()");
while(1){
if((len = read(fd,buffer,EVENT_SIZE_BUF)) < 0)
perror("read()");
struct inotify_event * ev = (struct inotify_event *)&buffer;
if(ev->len > 0){
if(ev->mask & IN_CREATE && ((ev-> mask & IN_ISDIR) == 0x00)){
printf("SPY; new file is created %s\n",ev->name);
char * path = strcat(argv[1],ev->name);
printf("%s\n",path);
struct stat sb;
if(!stat(path,&sb)){
printf( (S_ISDIR(sb.st_mode)) ? "d" : "-");
printf( (sb.st_mode & S_IRUSR) ? "r" : "-");
printf( (sb.st_mode & S_IWUSR) ? "w" : "-");
printf( (sb.st_mode & S_IXUSR) ? "x" : "-");
printf( (sb.st_mode & S_IRGRP) ? "r" : "-");
printf( (sb.st_mode & S_IWGRP) ? "w" : "-");
printf( (sb.st_mode & S_IXGRP) ? "x" : "-");
printf( (sb.st_mode & S_IROTH) ? "r" : "-");
printf( (sb.st_mode & S_IWOTH) ? "w" : "-");
printf( (sb.st_mode & S_IXOTH) ? "x" : "-");
fflush(stdout);
printf("\n");
}
}else{ printf("dir\n"); }
}
}
inotify_rm_watch(fd,wd);
close(fd);
return 0;
}