#include /* rechercheSetUidRecursif.c */ #include #include #include #include #include void repCourant(void); int main(void) { repCourant(); return 0; } void repCourant(void) { DIR *dirp; struct dirent *dp; struct stat inodeFic; /* ouverture du catalogue du repertoire courant */ if ((dirp=opendir("."))==NULL) { return; } /* parcours du catalogue par la fonction readdir */ for (dp=readdir(dirp); dp !=NULL; dp=readdir(dirp) ) { /* pour chaque entree du catalogue, ... */ /* identique a stat sauf que dans le cas */ lstat(dp->d_name,&inodeFic); /* d'un lien symbolique, donne l'etat du */ /* lien et non celui du fichier vise */ if (S_ISDIR(inodeFic.st_mode) && strcmp(dp->d_name,".") && strcmp(dp->d_name,"..")) { /* ... si c'est un repertoire, recommencer la recherche dans ce rep. */ if (!chdir(dp->d_name)) { /* On descend */ repCourant(); /* On explore */ chdir(".."); /* On revient ou il faut */ } else fprintf(stderr,"Impossible de descendre dans %s\n",dp->d_name); } else /* .. si c'est un fichier executable et setuid */ if ( (inodeFic.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)) && (inodeFic.st_mode & S_ISUID)) { printf("setiud sur %s\n", dp->d_name); } } closedir(dirp); }