2

私はこのコードを持っています:

#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()関数と同じ方法で返されます。

モード=16704(S_IFDIR | S_IRUSR | S_IXUSR)
サイズ=0

しかし、で実行するとsudo、次のようになります。

モード=16832(S_IFDIR | S_IRWXU)
サイズ=4096

何が起こるのですか?stat()一緒に使用するとsudo許可拒否エラーが発生します。これは.gvfs、権限が500(dr-x ------)のディレクトリでのみ発生します。sudoで読めないのならstat()、なぜそれがうまくいくのnftw()ですか?:|

4

1 に答える 1

3

おそらく何が起こっているのかというと、ディレクトリでstatが失敗しましたが、stat構造の値を出力しているので、ゴミが出てしまいます。nftw_statルーチンで「flags」と呼ばれるtypeflagの値をチェックして、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;
}
于 2010-11-09T11:12:53.590 に答える