Bueno, la verdad es que no estoy completamente seguro de qué es lo que quieres exactamente.
He probado el código como lo has publicado, y está muy cerca de lo que me parece buscas; imprime correctamente los nombres de directorios y archivos que encuentra, recursivamente. Falla un poco en el número de tabulaciones que imprime en algunas líneas, pero la lógica de fondo se ve que está bien planteada.
Te propongo esta pequeña modificación:
Código:
#include<stdio.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include <stdlib.h>
//Prototipos
void busqueda(char [],char [],int);
int main(int argc, char *argv[]){
char user [PATH_MAX];
char ruta [PATH_MAX];
int tab=0;
strcpy(user,argv[1]); // Pillamos el nombre del usuario // NO IMPORTA SI HAY ERROR AL NO AÑADIR EL NOMBRE DEL USUARIO // SOLO ES PRUEBA
getcwd(ruta,PATH_MAX); // Pillamos el directorio actual.
busqueda(user,ruta,tab);//Llamamos la funcion recursiva de busqueda de Directorios/archivos.
}
void busqueda(char user[],char ruta[],int tab){
DIR *directorio;
struct dirent *fichero;
struct stat fich;
char ficheros [PATH_MAX];
int i;
directorio = opendir(ruta);
if(directorio==NULL){
printf("Error al abrir el directorio\n");
exit(-1);
}
while ( (fichero=readdir(directorio)) != NULL ){
if ( strcmp(fichero->d_name, "..") == 0
|| strcmp(fichero->d_name, ".") == 0 )
continue;
strcpy (ficheros, ruta);
strcat (ficheros, "/");
strcat (ficheros, fichero->d_name);
//obtenemos la informacion del archivo
if ( (lstat(ficheros, &fich)) == -1 ){
fprintf( stderr,
"\nNo se pudo obtener la informacion del fichero:\n" );
fprintf( stderr, "\t%s\n\n", ficheros);
continue;
}
for(i = 0; i < tab; i++)
printf("\t");
printf("%s \n",fichero->d_name);
//-tree? xD
//recursiva
if(S_ISDIR(fich.st_mode))
busqueda(user, ficheros, tab + 1);
}
closedir(directorio);
}
¿Mejora un poco la cosa? ¿Empeora? Quizás si pudieras mostrarnos un ejemplo de la salida que quieres, y un ejemplo de la salida que recibes en la práctica, podemos guiarnos un poco mejor :).