سؤال

لدي هذا الرمز:

#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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top