سؤال
لدي هذا الرمز:
#include <ftw.h>
#include <stdio.h>
#include <string.h>
int nftw_stat(const char *path, const struct stat *stat, int flags,
struct FTW *ftw)
{
if (strcmp(path, "/home/pf/.gvfs\0") == 0) {
printf("nftw()\n");
printf("mode = %d\n", stat->st_mode);
printf("size = %d\n", (int) stat->st_size);
}
return 0;
}
int main()
{
if (nftw("/home/pf", &nftw_stat, 1, FTW_PHYS)) {
perror("nftw");
return 2;
}
}
إذا قمت بتنفيذها بشكل طبيعي ، فإنه يعود بنفس طريقة وظيفة STAT ():
mode = 16704 (S_IFDIR | S_IRUSR | S_IXUSR) size = 0
لكن عندما أقوم بتنفيذها sudo
, ، يعيد هذا:
mode = 16832 (S_IFDIR | S_IRWXU) size = 4096
ماذا يحدث؟ إذا استخدمت stat()
مع sudo
انها تعطيني تم رفض الإذن خطأ. يحدث هذا فقط مع .gvfs
الدليل ، الذي تبلغ أذوناته 500 (DR-X ------). إذا sudo
لا يمكن القراءة مع stat()
، لماذا يعمل مع nftw()
? :|
المحلول
ما يحدث على الأرجح هو أن STAT قد فشلت في الدليل ، لكنك تقوم بطباعة قيم بنية STAT بغض النظر ، مما يعني أنك تحصل على القمامة. تحتاج إلى التحقق من قيمة Oryflag ، والتي تسميها "أعلام" في روتين NFTW_STAT للتأكد من أن Stat قد قام بنجاح بتعيين بنية STAT.
int nftw_stat(const char *path, const struct stat *stat, int typeflag,
struct FTW *ftw)
{
if (typeflag == FTW_NS) {
printf("stat failed on %s\n", path);
return 1;
}
if (strcmp(path, "/home/pf/.gvfs\0") == 0) {
printf("nftw()\n");
printf("mode = %d\n", stat->st_mode);
printf("size = %d\n", (int) stat->st_size);
}
return 0;
}
لا تنتمي إلى StackOverflow