Pregunta

Tengo este código:

#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;
    }
}

Si ejecuto normal, emitirá la misma manera que la función stat ():

mode = 16704 (S_IFDIR | S_IRUSR | S_IXUSR)
size = 0

Pero cuando ejecuto con sudo, devuelve lo siguiente:

mode = 16832 (S_IFDIR | S_IRWXU)
size = 4096

¿Qué ocurre? Si uso stat() con sudo que dame la Permiso denegado de error. Esto ocurre sólo con el directorio .gvfs, cuyos permisos son 500 (dr-x ------). Si sudo no puede leer con stat(), por lo que funciona con nftw()? : |

¿Fue útil?

Solución

Lo que está sucediendo es que, probablemente, stat ha fracasado en el directorio, pero que va a imprimir los valores de la estructura stat independientemente, así que le darán basura. Es necesario comprobar el valor de la typeflag, que se llama "banderas" en su rutina nftw_stat para asegurarse de que esa estadística ha establecido con éxito la estructura 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top