#include #include #include #include #include #include #include #include /* * Inhalt in einer Datei suchen. * "search" wird nur sicher gefunden wenn es von Leerzeichen umgeben ist. */ int grep( char *filename, char *search ) { char c; int counter = 0; int search_len = strlen(search); int fd; if( (fd = open(filename, O_RDONLY)) < 0) { perror ( "open" ); return 0; } while(1) { // ein Zeichen von fd in den Puffer lesen // bei EOF ist Schluss mit dem Einlesen if ( read(fd, &c , 1) <= 0) { //Datei schliessen nicht vergessen close(fd); return 0; } //Uebereinstimmungen zaehlen if( c == search[counter] ) { counter++; if( counter == search_len) { //Datei schliessen nicht vergessen close(fd); return 1; } } else { counter = 0; } } //sollte nie erreicht werden... close(fd); return 0; } //Verzeichnis durchgehen und suchen void find( char *dir_name, char *search, int function ) { //Maximale Pfadlaenge ist 255 char filename[256]; DIR *dir; struct dirent *entry; struct stat attribut; //Verzeichnis oeffnen if ( !(dir = opendir (dir_name)) ) { perror ( "opendir" ); exit(2); } //Einzelne Eintraege durchgehen while( (entry = readdir(dir)) ) { //Wir ignorieren die Eintraege "." und ".." if( (strcmp(entry->d_name, ".") == 0) || (strcmp(entry->d_name, "..") == 0) ) { continue; } /* * Die Funktion "stat" benoetigt einen kompletten Pfad um auf die Eigenschaften * der Datei zugreifen zu koennen. * Da d_name nur der Name der Datei im Verzeichnis dir_name ist, muss * ein kompleter Pfad zu dieser Datei erzeugt werden. * Bsp.: * d_name := a.out * dirname := /home/user/test/ * * => filename := /home/user/test/a.out * */ strcpy( filename, dir_name ); strcat( filename, "/" ); strcat( filename, entry->d_name ); //Die Eigenschaften holen und in attribute speichern if( stat(filename, &attribut) == -1 ) { perror ( "stat" ); exit(2); } //Ist es ein Verzeichnis if( attribut.st_mode & S_IFDIR ) { find( filename, search, function ); } //Ist es eine Datei else if(attribut.st_mode & S_IFREG) { //Welche Funktion wurde ausgwaehlt switch(function) { //Ausgeben case 0: printf ( "FILE: %s\n", filename); break; //Dateiname mit dem zu suchenden vergeleichen case 1: if( (strcmp(filename, search) == 0) || (strcmp(entry->d_name, search) == 0) ) { printf ( "FOUND: %s\n", filename); } break; //In der Datei suchen case 2: if( grep(filename, search) ) { printf ( "FOUND: %s\n", filename); } break; } } } //Verzeichnis schliessen closedir ( dir ); } int main( int argc , char **argv) { int i; char *dir_name = NULL; char *search = NULL; int function = -1; //Optionen verarbeiten for(i=0; i < argc; i++) { if( (strcmp(argv[i], "-v") == 0) && (i < (argc-1)) ) { dir_name = argv[i+1]; function = 0; } if( (strcmp(argv[i], "-f") == 0) && (i < (argc-1)) ) { search = argv[i+1]; function = 1; } if( (strcmp(argv[i], "-s") == 0) && (i < (argc-1)) ) { search = argv[i+1]; function = 2; } } //Falsche eingabe if( dir_name == NULL ) { printf ( "USAGE: -v dir [-f filename] | [-s text]\n" ); return 1; } //suchen find( dir_name, search, function ); return 0; }