void executeCommandPasv(ClientThreadResource * res , int * result) { char * m; int cantRetries = 0; char * port = calculatePort(getServerDataPort() , res->heapHandler); res->dataSocket = openServerSocket(getServerAddress() , port); while( (res->dataSocket == INVALID_SOCKET) && (cantRetries < getMaxRetriesFindingDataPort())) { port = calculatePort(port , res->heapHandler); res->dataSocket = openServerSocket(getServerAddress() , port); cantRetries++; } validateAndCloseDataConnection(res); res->mode = FTP_DATA_MODE_PASIVE; m = concat(res->heapHandler , 4 , "227 (" , encodeHostAndPort(getServerAddress() , port , res->heapHandler), ")" , CHARACTER_CRLF); sendMessage(res->controlSocket , m , &result); }
int main(int argc, char **argv) { int err; parseArguments(argc, argv); if (nodaemon == 0) { err = daemonise(); if (err != 0) exit(1); err = writePidFile(pidFile); if (err != 0) exit(1); } err = signalisation(); if (err != 0) exit(1); serverSocket = openServerSocket(port); if (serverSocket == -1) exit(1); request_t req; response_t resp; output_t output; memset(&output, 0, sizeof(output_t)); while (serverSocket != -1) { memset(&req, 0, sizeof(request_t)); memset(&resp, 0, sizeof(response_t)); int client = serverSocketAccept(serverSocket); if (client == -1) continue; int r = parseRequest(client, &req, &resp); if (r != 0) { clientPrintf(client, "HTTP/1.1 %03d\r\n", resp.status); closeClient(client); continue; } if (1) { printf("path: %s\n", req.path); for (int i =0; i < req.num_args; i++) printf("arg[%d]: %s = %s\n", i, req.names[i], req.values[i]); } const char* cmdline = findCommand(req.path); if (cmdline == NULL) { log_warn("Daemon: Invalid path: '%s'\n", req.path); clientPrint(client, "HTTP/1.1 404\r\n"); closeClient(client); continue; } if (execute(&output, cmdline) != 0) { clientPrint(client, "HTTP/1.1 500\r\n"); // Internal server error closeClient(client); continue; } if ((output.count > 8) && (strncmp(output.buf, "HTTP/1.1", 8) == 0)) { clientWrite(client, output.buf, output.count); } else { clientPrintf(client, "HTTP/1.1 200\r\nContent-Length: %d\r\n\r\n", output.count); clientWrite(client, output.buf, output.count); } closeClient(client); output_clear(&output); if (req.path) free(req.path); } removePidFile(pidFile); return 0; }
int main(int argc, char **argv) { int err; server_init(); parse_arguments(argc, argv); log_set_file(logFile); if (nodaemon == 0) { err = daemonise(); if (err != 0) exit(1); err = writePidFile(pidFile); if (err != 0) exit(1); err = drop_privileges(); if (err != 0) exit(1); } err = signalisation(); if (err != 0) exit(1); serverSocket = openServerSocket(NULL, port); if (serverSocket == -1) exit(1); log_info("Server ready for connections"); request_t req; response_t resp; memset(&req, 0, sizeof(request_t)); memset(&resp, 0, sizeof(response_t)); while (serverSocket != -1) { int client = serverSocketAccept(serverSocket); if (client == -1) { continue; } int r = parseRequest(client, &req, &resp); if (r != 0) { clientPrintf(client, "HTTP/1.1 %03d\r\n", resp.status); closeClient(client); continue; } log_info("Request: %s", req.path); if (1) { list_t* l = req.args; while (l) { pair_t* p = (pair_t*) l->data; log_debug("args[]: %s = %s", p->name, p->value); l = l->next; } l = req.headers; while (l) { pair_t* p = (pair_t*) l->data; log_debug("headers[]: '%s': '%s'", p->name, p->value); l = l->next; } } server_handle_request(&req, &resp); // Debug printf if (resp.status != 0) { clientPrintf(client, "HTTP/1.1 %03d\r\n" "Content-Length: %d\r\n" "Content-Type: %s\r\n" "\r\n", resp.status, resp.length, resp.content_type); clientWrite(client, resp.body, resp.length); } else { log_err("main.c, request status == 0, request not handle!"); } closeClient(client); request_clear(&req); response_clear(&resp); } removePidFile(pidFile); return 0; }
/** Start des Servers * param argc Anzahl der Startparameter * param argv Startparameter */ int main(int argc, char ** argv) { // Der Server soll auf dem lokalen System nur einmal gestartet werden koennen. setSingleInstance(SingleInstanceFile); setProgName(argv[0]); // verarbeite Parameter process_commands(argc, argv); // reagiere auf Signal, u.a. STRG + C signal(SIGINT, INThandler); // gebe Gruppennamen aus infoPrint("\n\nServer Gruppe 04 Stroh, Steinbinder, Strohm\n"); // Spielerverwaltung initialisieren initSpielerverwaltung(); // Socket erstellen server_socket = openServerSocket(server_port); if(server_socket == -1){ errorPrint("Server Socket konnte nicht erstellt werden!"); endServer(); exit(0); } // Loader starten + Kataloge laden int loader_start_result = startLoader(); if(loader_start_result != 0){ errorPrint("Fehler beim Starten des Loaders: %i", loader_start_result); endServer(); exit(0); } int loader_load_catalogs_result = loadCatalogs(); if(loader_load_catalogs_result != 0){ errorPrint("Fehler beim Laden der Kataloge: %i", loader_load_catalogs_result); endServer(); exit(0); } // http://pubs.opengroup.org/onlinepubs/7908799/xsh/sem_init.html // Semaphor fuer Spielerliste / Punktestand initialisieren sem_init(&semaphor_score, 0, 0); // Score thread starten pthread_t score_thread; if(pthread_create(&score_thread, NULL, (void*)&score_main, NULL) == -1){ errorPrint("Score_thread konnte nicht erstellt werden!"); endServer(); exit(0); } // starte Login-Thread pthread_t login_thread; if(pthread_create(&login_thread, NULL, (void*)login_main(server_socket), NULL) == -1){ errorPrint("Login_thread konnte nicht erstellt werden!"); endServer(); exit(0); } // beende Server endServer(); return 0; }