/*
Semplice File Searcher

Controlla anche nelle sottodirectory grazie alla funzione ricorsiva search_file()

Coded by __GiReX__
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#define MAX_FOUNDS  25

void usage(char *prog_name);
char **search_file(char *dir_name, char *file_name);

int main(int argc, char *argv[])
{
  char **founds = NULL, 
         current[FILENAME_MAX] = {0};
  
  if(argc < 2)
  {
       usage(argv[0]);
       return 1;
  }

  if(argc == 2)
  {
       getcwd(current, FILENAME_MAX);
       founds = search_file(current, argv[1]);
  }
  else
  {
       chdir(argv[2]);
       founds = search_file(argv[2], argv[1]);
  }

  if(founds != NULL)
  {
	    while(*founds)
        { 
              printf("%s\n", *founds);  
	          founds++;     
        }
  }
  else return 1;

  return 0;
}

char **search_file(char *dir_name, char *file_name)
{
  DIR *dirent = NULL;
  struct dirent *dinfo = NULL;
  static int founds = 0;
  static char dir[FILENAME_MAX] = {0}, *names[MAX_FOUNDS] = {NULL};

  if(!(dirent = opendir(dir_name)))
  {
       fprintf(stderr, "Impossibile aprire la directory %s\n", dir_name);
       return NULL;
  }

  while(dinfo = readdir(dirent))
  {
       if(!strcmp(dinfo->d_name, ".") || !strcmp(dinfo->d_name, "..")) continue;
       
       if(!strcmp(dinfo->d_name, file_name))
       {
             names[founds] = (char*) malloc(FILENAME_MAX);

             if(names[founds] == NULL)
             {
                  fprintf(stderr, "Errore in malloc()\n");
		          return names;
             }
             else
	         {
                  sprintf(names[founds], "%s/%s", dir_name, dinfo->d_name);
                  founds++;
             }
       }

       if(!chdir(dinfo->d_name))
       {
             sprintf(dir, "%s/%s", dir_name, dinfo->d_name);      
	         search_file(dir, file_name);
	         chdir("..");
             getcwd(dir_name, FILENAME_MAX);
       }
  }

  closedir(dirent);
  return names;
}

void usage(char *prog_name)
{
     printf("\nSimply File Searcher, coded by __GiReX__\n");
     printf("Usage: %s  <nome_file>  [DIRECTORY]\n\n", prog_name);
}
