Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: BatchianoISpyxolo en 25 Octubre 2012, 22:58 pm



Título: sys/stat, stat() problema (?) [Lenguaje C]
Publicado por: BatchianoISpyxolo en 25 Octubre 2012, 22:58 pm
Bueno, estoy creando una shell básica en C y trato de crear el comando deltree. Lo que quiero hacer es poder diferenciar entre archivos y directorios para que cuando sea un directorio, hacer una llamada recursiva a la propia función. La idea, como todos sabréis, es yo le paso una ruta, y la función me borra todo el árbol de archivos y directorios cuya raíz es la ruta que le paso. (En el código no verifiqué todavía el argc, pero ahí no está el problema, sino en la struct stat que creo que no se actualiza correctamente.

El código:

Código
  1. // Includes de la shell
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <dirent.h>
  8. #include <sys/dir.h>
  9. #include <sys/stat.h>
  10. #include <sys/types.h>
  11. #include <errno.h>
  12. #define MAXENTRADA 2048
  13.  
  14. void deltree (char ** argv, int argc) {
  15.    struct dirent *ent;
  16.    struct stat fStat;
  17.    DIR *dir = opendir(argv[1]);
  18.    if(dir == NULL) {
  19.        perror("Hubo un error");
  20.    } else {
  21.        while ( (ent=readdir(dir)) != NULL ) {
  22.  
  23.            if(strcmp(".",ent->d_name) == 0 ||
  24.               strcmp("..",ent->d_name) == 0) continue;
  25.  
  26.            stat(ent->d_name, &fStat);
  27.  
  28.            if ( S_ISDIR(fStat.st_mode) )
  29.                puts(ent->d_name);
  30.  
  31.        }
  32.  
  33.        closedir(dir);
  34.        free(ent);
  35.        ent = NULL;
  36.  
  37.    }
  38. }
  39.  

el stat(ent->d_name, &fStat); devuelve -1 pero cuando hago un stat("dir/archivo_válido", &fStat); funciona correctamente. Es decir, que cuando le paso un "string" a stat, funciona correctamente pero cuando le paso el d_name del struct dirent, su salida es -1...

¿Alguna ayudita para poder solucionar el código?

¡Gracias de antemano!


Título: Re: sys/stat, stat() problema (?) [Lenguaje C]
Publicado por: 0xDani en 26 Octubre 2012, 15:43 pm
Nunca he visto un codigo en el que se le reserve memoria al puntero a dirent.


Título: Re: sys/stat, stat() problema (?) [Lenguaje C]
Publicado por: BatchianoISpyxolo en 26 Octubre 2012, 15:47 pm
Nunca he visto un codigo en el que se le reserve memoria al puntero a dirent.

He hecho tantas pruebas y tantos cambios... El error está en el stat() que siempre me devuelve -1 cuando le paso el d_name de la entrada de directorio actual...


Título: Re: sys/stat, stat() problema (?) [Lenguaje C]
Publicado por: 0xDani en 26 Octubre 2012, 16:02 pm
Pues ahora mismo no se cual es el error, pero si solo usas stat() para saber si es un directorio o un archivo, en la estructura dirent tambien hay un campo que te lo dice: d_type.

y aqui hay un ejemplo de la funcion stat(): http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html

Saludos.


Título: Re: sys/stat, stat() problema (?) [Lenguaje C]
Publicado por: BatchianoISpyxolo en 26 Octubre 2012, 17:25 pm
Pues ahora mismo no se cual es el error, pero si solo usas stat() para saber si es un directorio o un archivo, en la estructura dirent tambien hay un campo que te lo dice: d_type.

y aqui hay un ejemplo de la funcion stat(): http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html

Saludos.

Gracias por el d_type, se nota que no miré bien la struct dirent xD


Título: Re: sys/stat, stat() problema (?) [Lenguaje C]
Publicado por: Khronos14 en 27 Octubre 2012, 00:23 am
Jajaja debes de ser uno de la FIC con la práctica de Sistemas Operativos para el Domingo. Yo encontré toda la información necesaria aquí:

http://www.kernel.org/doc/man-pages/online/pages/man2/stat.2.html

La función esDirectorio, sería algo como esto:

Código
  1. /*
  2.  * Función esDirectorio.
  3.  * Recibe como parámetro la ruta de un archivo.
  4.  * - Devuelve 0 si es un directorio, en caso contrario -1
  5. */
  6. int esDirectorio(char * file)
  7. {
  8. struct stat s;
  9.  
  10. if (stat(file, &s) == 0)
  11. return (S_ISDIR(s.st_mode) == 0);
  12. else
  13. return -1;
  14. }
  15.