#include #include//NOTA_1 #include//NOTA_2 int main(int argc,char*argv[]) { char*nomefile,*pathname,*foundfile; void incoming(char**),findfile(char*,char*); printf("Nome del file da trovare : "); incoming(&nomefile); if(strlen(nomefile)>NAME_MAX)//NOTA_3 {fprintf(stderr,"il sistema supporta file al massimo %d lettere" " per file\n");exit(3);} printf("Pathname da cui cominciare la ricerca : "); incoming(&pathname); printf("Processing ...\n"); findfile(nomefile,pathname); } void incoming(char**s) { char*p,c; int i=0,t=sizeof(char); for(p=(char*)malloc(t);(c=getchar())!='\n';p=(char*)realloc(p,(i+1)*t)) if(p) p[i++]=c; else {fprintf(stderr,"memoria esaurita\n");exit(1);} p[i]='\0'; *s=p; } void findfile(char*nome,char*path) { typedef struct dirent Dirent;//NOTA_4 typedef struct stat Stat; Stat file_dir; Dirent*dp; DIR*dda; char megapath[NAME_MAX*100]; if(!strcmp("/dev",path)||!strcmp("/dev/",path)||!strcmp("//dev",path)|| !strcmp("//dev/",path))//NOTA_9 return; if(!(dda=opendir(path)))//NOTA_5 {fprintf(stderr,"errore nell'apertura di %s\n",path);exit(2);} for(;(dp=readdir(dda))!=NULL;)//NOTA_6 if(!strcmp(dp->d_name,".")||!strcmp(dp->d_name,"..")) continue; else if(!strcmp(nome,dp->d_name)) {printf("%s/%s\n",path,nome);continue;} else {sprintf(megapath,"%s/%s",path,dp->d_name); if(stat(megapath,&file_dir)==-1) continue; else if((file_dir.st_mode&S_IFMT)==S_IFDIR)//NOTA_7 findfile(nome,megapath); else continue;} closedir(dda);//NOTA_8 } /*NOTA_1 dirent.h contiene la definizione della struttura dirent . NOTA_2 stat.h contiene la definizione della struttura stat ,NAME_MAX ,le routine opendir() ,readdir() e closedir() . NOTA_3 NAME_MAX e' il numero massimo di lettere che un file puo' avere in quel sys . NOTA_4 creo dei nuovi tipi che in auto creano strutture dirent e stat . NOTA_5 DIR*opendir(char*) ritorna una struttura di tipo DIR* dopo aver aperto la directory specificata nel char* . In caso di errore ritorna NULL . NOTA_6 struct dirent readdir(DIR*) ritorna una struttura dirent che punta al prossimo file nella directory . In caso di errore ritorna NULL . NOTA_7 Qui si puo' modificare il programma in maniera tale che salti x es. i collegamenti simbolici ,ed altre cose che ancora non supporta . NOTA_8 chiude la directory aperta . come argomento accetta un DIR* . NOTA_9 non so come trattare la /dev .*/