[C con Clase] Error glibc y escaneo de directorios.

José Álvaro Domínguez ilgrim en gmail.com
Sab Ene 23 17:02:48 CET 2010


On 23/01/10 13:13, Sergio wrote:
> Hola a todos, envió esta consulta a esta lista aun sabiendo que no es
> una pregunta referente a C++ ya que me tiene bastante loco y no consigo
> encontrar el error.
> 
> Estoy haciendo unas pruebas con glibc-2.0 y bueno me puse a hacer un
> pequeño programa para escanear un directorio, sin pretensiones, solo
> unas pruebas.
> El caso es que una vez acabado el programa puedo escanear mi directorio
> /home pero si introduzco cualquier otro directorio por ejemplo /usr no
> me imprime nada , como digo es un programa de prueba y solo escanea el
> primer directorio , no entra en los demás.
> 
> Aquí envió el código a ver si alguien me puede decir cual es el error.
> 
> 
>  #include <glib.h>
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
> 
> int main ( int argc ,char *argv[] )
> {
> 
> 
> //variables
> GDir   *dir        = NULL;
> GDir   *new_dir        = NULL;
> gchar  *name_dir    = NULL;
> gchar  *name_sub_dir    = NULL;
> GError *error        = NULL;
> gchar  *path        = NULL;
> 
> //comprobar argumentos
> if (argc < 2 )
>     {
>     printf ( "Usaje:\nNombre del programa lib_1 " );
>     printf ( "seguido del argumento ( directorio a escanear ).\n" );
>     return;
>     }
> 
> path = ( gchar * ) malloc ( sizeof ( argv ) );
> strcpy ( path ,argv[1] );
> 
> //abrir directorio y comprobar errores
> dir = g_dir_open ( path, 0, &error );
> if ( error )
>     {
>     printf ( "%s", error->message );
>     g_clear_error ( &error );
>     return -1;
>     }
> 
> //mientras name_dir contenga algun valor   
> do
>     {
>     name_dir = g_dir_read_name ( dir );
>     if ( g_file_test ( name_dir, G_FILE_TEST_IS_DIR ) )
>         {
>         printf ( "%s\n", name_dir );
>         new_dir = g_dir_open ( name_dir, 0, &error );
>         if ( error )
>             {
>             printf ( "%s", error->message );
>             g_clear_error ( &error );
>             return -1;
>             }
>         //mientras name_sub_dir contenga algun valor   
>         do
>             {
>             name_sub_dir = g_dir_read_name ( new_dir );
>             if ( g_file_test ( name_sub_dir, G_FILE_TEST_IS_DIR ) ||
> name_sub_dir != NULL )
>                 {
>                 printf ( "\t%s\n", name_sub_dir );
>                 }
>             }while ( name_sub_dir );
>         }    
>     } while ( name_dir );
> free ( path );
> return 0;
> }
> 
> Como digo si arranco el programa con:
> 
> $./lib_1 /home/sergio
> 
> me muestra los directorios que hay incluidos los ocultos y los archivos
> pero si le pongo:
> 
> $./lib_1 /usr
> 
> no muestra nada , debugeando veo que la variable path recoge bien el
> valor pero que en la linea   if ( g_file_test ( name_dir,
> G_FILE_TEST_IS_DIR ) )
> no devuelve true nunca aunque  la variable name_dir contenga un
> directorio y eso es lo que no entiendo porque con /home/sergio si
> funciona y porque con /usr no.
> 
> Por cierto utilizo linux para compilar:
> 
> gcc -g  `pkg-config --cflags --libs glib-2.0`  lib_1.c -o lib_1
> 
> Pues nada mas si alguien me explica el error lo agradecería mucho.
> 
> Saludos.
> 
> 
> PD. Magnifica lista por cierto.
> 

Muy buenas.

Muy probablemente....no se trate de error de codigo, sino que sea tema
de permisos.

Quizás el usuario con el que estás lanzando la aplicación no tiene
suficientes privilegios como para acceder al directorio indicado.
Es solo una suposición, pero creo que tal vez venga por ahí el
problema... prueba a lanzarlo con root o usando sudo, o incluso su -c (a
ser posible en algun sitio menos delicado que /usr, dependiendo de la
distribución, quizas /var/logs te valga para hacer las pruebas).

Un Saludo.




Más información sobre la lista de distribución Cconclase