Я пишу программу, имитирующую некоторые действия find
, которая обходит дерево каталогов и вызывает lstat
для файлов, которые там находят, чтобы определить их тип.Реальный find
будет игнорировать файлы, в которых у пользователя нет доступа R или X в этом каталоге.Я не могу воспроизвести это поведение;мой код выполнит вызов lstat
и получит ошибку незаконного поиска (что я и пытаюсь предотвратить), даже если код, выполняющий это, находится внутри блока, проверяющего access()
.
Моей первой мыслью было, что, возможно, второй access()
вызов должен быть по пути, а не по пути / имени файла, но, похоже, это тоже не сработало (и разве это не избыточно?)
Будем весьма благодарны за любые указания.
Мой код (я сокращаю ошибки и другие мелочи для краткости):
void open_dir( char *dir, char *pattern, char type )
{
DIR *d;
struct dirent *de;
if ( access(dir, (R_OK | X_OK)) == 0 )
{
d = opendir(dir);
while( ( de = readdir(d) ) )
examine_de( de, dir, pattern, type );
closedir(d);
}
}
void examine_de( struct dirent *de, char *dir, char *pattern, char type )
{
char fn[ _POSIX_PATH_MAX ];
strcpy(fn, dir);
strcat(fn, "/");
strcat(fn, de->d_name);
if ( access(fn, (R_OK | X_OK)) == 0 )
{
struct stat buf;
lstat(fn, &buf);
//check pattern matches, etc., printf fn if appropriate
if ( ( S_ISDIR(buf.st_mode) ) &&
( strcmp(de->d_name, ".") != 0 ) &&
( strcmp(de->d_name, "..") != 0 ) )
open_dir(fn, pattern, type);
}
return;
}