/***************************************************************************** * Systemprogrammierung I - Klausur vom Juli 2002 * * Datei: rlsd.c * Autor: Goethe * Datum: 05.09.2005 *****************************************************************************/ /* include */ #include #include #include #include #include #include #include #include #include #include #define MAXCHAR 256 /* Funktionsdeklarationen, globale Variablen */ int ls( int fd, char* dir_name ); /* Funktion main */ int main( int argc, char* argv[] ) { int port, c; int sd, cd; struct sockaddr_in sin; pid_t pid; char line[MAXCHAR]; if( argc != 2 ) { fprintf( stderr, "usage: %s \n", argv[0] ); exit( EXIT_FAILURE ); } port = atoi(argv[1]); /* Socket öffnen */ if( (sd = socket( PF_INET, SOCK_STREAM, 0 )) == -1 ) { perror( "Fehler beim Öffnen des Sockets" ); exit( EXIT_FAILURE ); } /* Socket an angegebenen Port und beliebige IP-Adressen binden */ sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(port); if( bind( sd, (struct sockaddr*)&sin, sizeof(sin) ) == -1 ) { perror( "Fehler beim Binden des Socket" ); exit( EXIT_FAILURE ); } /* Warteschlange ankommender Verbindungen auf 5 einstellen */ if( listen( sd, 5 ) == -1 ) { perror( "Fehler beim Einrichten der Verbindungswarteschlange" ); exit( EXIT_FAILURE ); } /* Server-Schleife */ while(1) { /* Verbindung annehmen */ if( (cd = accept( sd, NULL, 0 )) == -1 ) { if( errno != EINTR ) perror( "Fehler beim Annehmen einer Verbindung" ); continue; } /* Prozess zur Kommandoausführung erzeugen */ pid = fork(); /* Fehler bei Prozesserzeugung */ if( pid == -1 ) { close(cd); perror( "Fehler beim Erzeugen des Kindprozesses" ); } /* Sohnprozess */ else if( pid == 0 ) { close(sd); while( (c = read( cd, line, MAXCHAR-1 )) == -1 ) { if( errno == EINTR ) continue; exit( EXIT_FAILURE ); } line[c-2] = '\0'; if( strlen(line) == MAXCHAR-1 ) { write( cd, "Anfrage zu lang\n", 17 ); while(1) { c = read( cd, line, 1 ); if( c == 0 ) break; else if( c == -1 && errno != EINTR ) break; else if( line[0] == '\n' ) break; } exit( EXIT_FAILURE ); } return ls( cd, line ); } /* Vaterprozess */ else close(cd); } } /* Ende Funktion main */ /* ls-Funktion */ int ls( int fd, char* dir_name ) { DIR* dir; struct dirent* entry; char* output; if( (dir = opendir(dir_name)) == NULL ) { output = strerror(errno); write( fd, output, strlen(output) ); write( fd, "\n", 2 ); return -1; } while( (entry = readdir(dir)) != NULL ) { output = entry->d_name; write( fd, output, strlen(output) ); write( fd, "\n", 2 ); } closedir(dir); return 0; }