diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/heightScore.c | 139 | ||||
| -rw-r--r-- | src/server/heightScore.c~ | 102 | ||||
| -rw-r--r-- | src/server/log.c | 82 | ||||
| -rw-r--r-- | src/server/log.c~ | 67 | ||||
| -rw-r--r-- | src/server/publicServer.c | 446 | ||||
| -rw-r--r-- | src/server/publicServer.c~ | 372 | ||||
| -rw-r--r-- | src/server/serverConfigFile.c | 135 | ||||
| -rw-r--r-- | src/server/serverConfigFile.c~ | 108 |
8 files changed, 1051 insertions, 400 deletions
diff --git a/src/server/heightScore.c b/src/server/heightScore.c index 5c42ad6..1a0026b 100644 --- a/src/server/heightScore.c +++ b/src/server/heightScore.c @@ -11,92 +11,85 @@ static textFile_t *textFile; -void initHeightScore(char *file) +void +initHeightScore(char *file) { - int i; - - textFile = loadTextFile(file); - - if( textFile == NULL ) - { - fprintf(stderr, _("I am unable to load: \"%s\" !\n"), file); - fprintf(stderr, _("Creating: \"%s\"\n"), file); - textFile = newTextFile(file); - } - else - { + int i; + + textFile = loadTextFile(file); + + if (textFile == NULL) { + fprintf(stderr, _("I am unable to load: \"%s\" !\n"), file); + fprintf(stderr, _("Creating: \"%s\"\n"), file); + textFile = newTextFile(file); + } + else { #ifdef DEBUG - printf(_("Scorefile: \"%s\"\n"), file); + printf(_("Scorefile: \"%s\"\n"), file); #endif - return; - } + return; + } - if( textFile == NULL ) - { - fprintf(stderr, _("I was unable to create: \"%s\" !\n"), file); - return; - } + if (textFile == NULL) { + fprintf(stderr, _("I was unable to create: \"%s\" !\n"), file); + return; + } - for( i = 0 ; i < HEIGHTSCORE_MAX_PLAYERS ; i++ ) - { - addList(textFile->text, strdup("no_name 0") ); - } + for (i = 0; i < HEIGHTSCORE_MAX_PLAYERS; i++) { + addList(textFile->text, strdup("no_name 0")); + } - saveTextFile(textFile); + saveTextFile(textFile); } -int addPlayerInHighScore(char *name, int score) +int +addPlayerInHighScore(char *name, int score) { - int i; - - if( score <= 0 ) - { - return -1; // Ha ha ha - } - - for( i = 0 ; i < HEIGHTSCORE_MAX_PLAYERS ; i++ ) - { - char *line; - char thisName[STR_NAME_SIZE]; - int thisCore; - - line = (char *) textFile->text->list[i]; - sscanf(line, "%s %d", thisName, &thisCore); - - if( score >= thisCore ) - { - char new[STR_SIZE]; - - sprintf(new, "%s %d", name, score); - insList(textFile->text, i, strdup(new) ); - delListItem(textFile->text, HEIGHTSCORE_MAX_PLAYERS, free); - //printTextFile(textFile); - saveTextFile(textFile); - - return 0; - } - } - - return -1; + int i; + + if (score <= 0) { + return -1; // Ha ha ha + } + + for (i = 0; i < HEIGHTSCORE_MAX_PLAYERS; i++) { + char *line; + char thisName[STR_NAME_SIZE]; + int thisCore; + + line = (char *) textFile->text->list[i]; + sscanf(line, "%s %d", thisName, &thisCore); + + if (score >= thisCore) { + char new[STR_SIZE]; + + sprintf(new, "%s %d", name, score); + insList(textFile->text, i, strdup(new)); + delListItem(textFile->text, HEIGHTSCORE_MAX_PLAYERS, free); + //printTextFile(textFile); + saveTextFile(textFile); + + return 0; + } + } + + return -1; } -char* getTableItem(int index) +char * +getTableItem(int index) { - if( textFile != NULL && - index >= 0 && - index < textFile->text->count ) - { - return (char *)textFile->text->list[index]; - } - - return NULL; + if (textFile != NULL && index >= 0 && index < textFile->text->count) { + return (char *) textFile->text->list[index]; + } + + return NULL; } -void quitHeightScore() +void +quitHeightScore() { - if( textFile != NULL ) - { - saveTextFile(textFile); - destroyTextFile(textFile); - } + if (textFile != NULL) { + saveTextFile(textFile); + destroyTextFile(textFile); + } } diff --git a/src/server/heightScore.c~ b/src/server/heightScore.c~ new file mode 100644 index 0000000..5c42ad6 --- /dev/null +++ b/src/server/heightScore.c~ @@ -0,0 +1,102 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include "main.h" +#include "list.h" +#include "textFile.h" +#include "heightScore.h" + +static textFile_t *textFile; + +void initHeightScore(char *file) +{ + int i; + + textFile = loadTextFile(file); + + if( textFile == NULL ) + { + fprintf(stderr, _("I am unable to load: \"%s\" !\n"), file); + fprintf(stderr, _("Creating: \"%s\"\n"), file); + textFile = newTextFile(file); + } + else + { +#ifdef DEBUG + printf(_("Scorefile: \"%s\"\n"), file); +#endif + return; + } + + if( textFile == NULL ) + { + fprintf(stderr, _("I was unable to create: \"%s\" !\n"), file); + return; + } + + for( i = 0 ; i < HEIGHTSCORE_MAX_PLAYERS ; i++ ) + { + addList(textFile->text, strdup("no_name 0") ); + } + + saveTextFile(textFile); +} + +int addPlayerInHighScore(char *name, int score) +{ + int i; + + if( score <= 0 ) + { + return -1; // Ha ha ha + } + + for( i = 0 ; i < HEIGHTSCORE_MAX_PLAYERS ; i++ ) + { + char *line; + char thisName[STR_NAME_SIZE]; + int thisCore; + + line = (char *) textFile->text->list[i]; + sscanf(line, "%s %d", thisName, &thisCore); + + if( score >= thisCore ) + { + char new[STR_SIZE]; + + sprintf(new, "%s %d", name, score); + insList(textFile->text, i, strdup(new) ); + delListItem(textFile->text, HEIGHTSCORE_MAX_PLAYERS, free); + //printTextFile(textFile); + saveTextFile(textFile); + + return 0; + } + } + + return -1; +} + +char* getTableItem(int index) +{ + if( textFile != NULL && + index >= 0 && + index < textFile->text->count ) + { + return (char *)textFile->text->list[index]; + } + + return NULL; +} + +void quitHeightScore() +{ + if( textFile != NULL ) + { + saveTextFile(textFile); + destroyTextFile(textFile); + } +} diff --git a/src/server/log.c b/src/server/log.c index 89e4f46..9773926 100644 --- a/src/server/log.c +++ b/src/server/log.c @@ -11,57 +11,65 @@ static FILE *logFile; -int initLog(char *name) +int +initLog(char *name) { - logFile = fopen(name, "a"); + logFile = fopen(name, "a"); - if( logFile == NULL ) - { - fprintf(stderr, _("Opening logfile \"%s\" failed!\n"), name); - return -1; - } + if (logFile == NULL) { + fprintf(stderr, _("Opening logfile \"%s\" failed!\n"), name); + return -1; + } #ifdef DEBUG - printf(_("I use logfile: \"%s\")\n"), name); + printf(_("I use logfile: \"%s\")\n"), name); #endif - addToLog(LOG_INF, "open log file"); + addToLog(LOG_INF, "open log file"); - return 0; + return 0; } -void addToLog(int type, char *msg) +void +addToLog(int type, char *msg) { - char str[STR_LOG_SIZE]; - struct tm *tm_struct; - time_t currentTime; - char *str_type; + char str[STR_LOG_SIZE]; + struct tm *tm_struct; + time_t currentTime; + char *str_type; - currentTime = time(NULL); - tm_struct = localtime(¤tTime); + currentTime = time(NULL); + tm_struct = localtime(¤tTime); - switch( type ) - { - case LOG_INF : str_type = "INF"; break; - case LOG_DBG : str_type = "DBG"; break; - case LOG_WRN : str_type = "WRN"; break; - case LOG_ERR : str_type = "ERR"; break; - default : - assert( ! _("Really bad log value!") ); - break; - } + switch (type) { + case LOG_INF: + str_type = "INF"; + break; + case LOG_DBG: + str_type = "DBG"; + break; + case LOG_WRN: + str_type = "WRN"; + break; + case LOG_ERR: + str_type = "ERR"; + break; + default: + assert(!_("Really bad log value!")); + break; + } - sprintf(str, "(%02d-%02d-%02d %02d:%02d:%02d) %s %s\n", - 1900+tm_struct->tm_year, tm_struct->tm_mon, tm_struct->tm_mday, - tm_struct->tm_hour, tm_struct->tm_min, tm_struct->tm_sec, - str_type, msg); + sprintf(str, "(%02d-%02d-%02d %02d:%02d:%02d) %s %s\n", + 1900 + tm_struct->tm_year, tm_struct->tm_mon, tm_struct->tm_mday, + tm_struct->tm_hour, tm_struct->tm_min, tm_struct->tm_sec, + str_type, msg); - fprintf(logFile, str); + fprintf(logFile, str); - fflush(logFile); + fflush(logFile); } -void quitLog() +void +quitLog() { - addToLog(LOG_INF, "close log file"); - fclose(logFile); + addToLog(LOG_INF, "close log file"); + fclose(logFile); } - diff --git a/src/server/log.c~ b/src/server/log.c~ new file mode 100644 index 0000000..89e4f46 --- /dev/null +++ b/src/server/log.c~ @@ -0,0 +1,67 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <time.h> +#include <assert.h> + +#include "log.h" +#include "main.h" + +static FILE *logFile; + +int initLog(char *name) +{ + logFile = fopen(name, "a"); + + if( logFile == NULL ) + { + fprintf(stderr, _("Opening logfile \"%s\" failed!\n"), name); + return -1; + } +#ifdef DEBUG + printf(_("I use logfile: \"%s\")\n"), name); +#endif + addToLog(LOG_INF, "open log file"); + + return 0; +} + +void addToLog(int type, char *msg) +{ + char str[STR_LOG_SIZE]; + struct tm *tm_struct; + time_t currentTime; + char *str_type; + + currentTime = time(NULL); + tm_struct = localtime(¤tTime); + + switch( type ) + { + case LOG_INF : str_type = "INF"; break; + case LOG_DBG : str_type = "DBG"; break; + case LOG_WRN : str_type = "WRN"; break; + case LOG_ERR : str_type = "ERR"; break; + default : + assert( ! _("Really bad log value!") ); + break; + } + + sprintf(str, "(%02d-%02d-%02d %02d:%02d:%02d) %s %s\n", + 1900+tm_struct->tm_year, tm_struct->tm_mon, tm_struct->tm_mday, + tm_struct->tm_hour, tm_struct->tm_min, tm_struct->tm_sec, + str_type, msg); + + fprintf(logFile, str); + + fflush(logFile); +} + +void quitLog() +{ + addToLog(LOG_INF, "close log file"); + fclose(logFile); +} + diff --git a/src/server/publicServer.c b/src/server/publicServer.c index 8770300..a3c7326 100644 --- a/src/server/publicServer.c +++ b/src/server/publicServer.c @@ -47,326 +47,330 @@ extern int errno; #define __PACKED__ __attribute__ ((__packed__)) -void countRoundInc() +void +countRoundInc() { } -char *getSetting(char *env, char *param, char *default_val) +char * +getSetting(char *env, char *param, char *default_val) { - return getParamElse(param, getServerConfigFileValue(env, default_val) ); + return getParamElse(param, getServerConfigFileValue(env, default_val)); } -static int registerPublicServer() +static int +registerPublicServer() { #ifndef __WIN32 - int s; + int s; #else - SOCKET s; + SOCKET s; #endif - /* TODO: dodelat TCP makro */ - struct sockaddr_in server; - char *master_server_ip; + /* TODO: dodelat TCP makro */ + struct sockaddr_in server; + char *master_server_ip; - master_server_ip = getIPFormDNS(NET_MASTER_SERVER_DOMAIN); + master_server_ip = getIPFormDNS(NET_MASTER_SERVER_DOMAIN); - //printf("master_server_ip = %s\n", master_server_ip); + //printf("master_server_ip = %s\n", master_server_ip); - if( master_server_ip == NULL ) // master server is down - { - return -1; - } + if (master_server_ip == NULL) // master server is down + { + return -1; + } - server.sin_family = AF_INET; - server.sin_port = htons (NET_MASTER_PORT); - server.sin_addr.s_addr = inet_addr (master_server_ip); - - free(master_server_ip); + server.sin_family = AF_INET; + server.sin_port = htons(NET_MASTER_PORT); + server.sin_addr.s_addr = inet_addr(master_server_ip); - if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) { - return 0; - } + free(master_server_ip); - /* Set to nonblocking socket mode */ + if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + return 0; + } + + /* Set to nonblocking socket mode */ #ifndef __WIN32__ - int oldFlag; + int oldFlag; - oldFlag = fcntl (s, F_GETFL, 0); + oldFlag = fcntl(s, F_GETFL, 0); - if( fcntl(s, F_SETFL, oldFlag | O_NONBLOCK) == -1 ) - { - return -1; - } + if (fcntl(s, F_SETFL, oldFlag | O_NONBLOCK) == -1) { + return -1; + } #else - unsigned long arg = 1; - // Operation is FIONBIO. Parameter is pointer on non-zero number. - if( ioctlsocket(s, FIONBIO, &arg) == SOCKET_ERROR ) - { - WSACleanup(); - return -1; - } + unsigned long arg = 1; + // Operation is FIONBIO. Parameter is pointer on non-zero number. + if (ioctlsocket(s, FIONBIO, &arg) == SOCKET_ERROR) { + WSACleanup(); + return -1; + } #endif - if( connect (s, (struct sockaddr *) &server, sizeof (server)) == -1 ) { + if (connect(s, (struct sockaddr *) &server, sizeof(server)) == -1) { #ifndef __WIN32__ - if (errno != EINPROGRESS) - return -1; + if (errno != EINPROGRESS) + return -1; #else - if (WSAGetLastError() != WSAEWOULDBLOCK) { - WSACleanup(); - return -1; - } + if (WSAGetLastError() != WSAEWOULDBLOCK) { + WSACleanup(); + return -1; + } #endif - } + } - struct timeval tv; + struct timeval tv; - fd_set myset; + fd_set myset; - FD_ZERO(&myset); - FD_SET(s, &myset); + FD_ZERO(&myset); + FD_SET(s, &myset); - tv.tv_sec = 3; - tv.tv_usec = 0; + tv.tv_sec = 3; + tv.tv_usec = 0; - int ret = select (s+1, NULL, &myset, NULL, &tv); + int ret = select(s + 1, NULL, &myset, NULL, &tv); - if (ret == -1) - return -1; + if (ret == -1) + return -1; - if (ret == 0) - return -1; + if (ret == 0) + return -1; - FD_ZERO(&myset); - FD_SET(s, &myset); + FD_ZERO(&myset); + FD_SET(s, &myset); - tv.tv_sec = 1; - tv.tv_usec = 0; + tv.tv_sec = 1; + tv.tv_usec = 0; - ret = select (s+1, NULL, &myset, NULL, &tv); + ret = select(s + 1, NULL, &myset, NULL, &tv); - if (ret == -1) - return -1; + if (ret == -1) + return -1; - if (ret == 0) - return -1; + if (ret == 0) + return -1; - typedef struct { - unsigned char cmd; - unsigned port; - unsigned ip; - } __PACKED__ register_head; + typedef struct + { + unsigned char cmd; + unsigned port; + unsigned ip; + } __PACKED__ register_head; - char *str = (char *) malloc (sizeof (register_head)); + char *str = (char *) malloc(sizeof(register_head)); - register_head *head = (register_head *) str; + register_head *head = (register_head *) str; - head->cmd = 'p'; - head->port = atoi( getSetting("PORT4", "--port4", "2200") ); - head->ip = 0; // TODO + head->cmd = 'p'; + head->port = atoi(getSetting("PORT4", "--port4", "2200")); + head->ip = 0; // TODO - /* send request for server list */ - int r = send (s, str, 9, 0); + /* send request for server list */ + int r = send(s, str, 9, 0); - free (str); + free(str); - if (r == -1) { + if (r == -1) { #ifndef __WIN32 - close(s); + close(s); #else - closesocket(s); + closesocket(s); #endif - return -1; - } + return -1; + } #ifndef __WIN32 - close(s); + close(s); #else - closesocket(s); + closesocket(s); #endif - return 0; + return 0; } -static int initPublicServerNetwork() +static int +initPublicServerNetwork() { - char ip4[STR_IP_SIZE]; - char ip6[STR_IP_SIZE]; - char *p_ip4, *p_ip6; - int port4; - int port6; - int ret; + char ip4[STR_IP_SIZE]; + char ip6[STR_IP_SIZE]; + char *p_ip4, *p_ip6; + int port4; + int port6; + int ret; + + ret = -1; - ret = -1; + strcpy(ip4, getSetting("IP4", "--ip4", "none")); + strcpy(ip6, getSetting("IP6", "--ip6", "none")); - strcpy(ip4, getSetting("IP4", "--ip4", "none" ) ); - strcpy(ip6, getSetting("IP6", "--ip6", "none" ) ); + p_ip4 = ip4; - p_ip4 = ip4; + if (strcmp(ip4, "none") == 0) { + p_ip4 = NULL; + } - if( strcmp(ip4, "none") == 0 ) - { - p_ip4 = NULL; - } + p_ip6 = ip6; - p_ip6 = ip6; + if (strcmp(ip6, "none") == 0) { + p_ip6 = NULL; + } - if( strcmp(ip6, "none") == 0 ) - { - p_ip6 = NULL; - } + port4 = atoi(getSetting("PORT4", "--port4", "2200")); + port6 = atoi(getSetting("PORT6", "--port6", "2200")); - port4 = atoi( getSetting("PORT4", "--port4", "2200") ); - port6 = atoi( getSetting("PORT6", "--port6", "2200") ); + //ret = initNetMulitplayerPublicServer(p_ip4, port4, p_ip6, port6); - //ret = initNetMulitplayerPublicServer(p_ip4, port4, p_ip6, port6); - - ret = initNetMuliplayerForGameServer(p_ip4, port4, p_ip6, port6); + ret = initNetMuliplayerForGameServer(p_ip4, port4, p_ip6, port6); - return ret; + return ret; } -static void loadArena() +static void +loadArena() { - choice_arenaFile = getArenaFileFormNetName( getSetting("ARENA", "--arena", "FAGN") ); - arena = getArena(choice_arenaFile); - setCurrentArena(arena); + choice_arenaFile = + getArenaFileFormNetName(getSetting("ARENA", "--arena", "FAGN")); + arena = getArena(choice_arenaFile); + setCurrentArena(arena); } -int initPublicServer() +int +initPublicServer() { - int ret; - int i; - - initListID(); - initModule(); - initArenaFile(); - initTux(); - initItem(); - initShot(); - initServerConfigFile(); - - ret = initLog(getSetting("LOG_FILE", "--log-file", "/tmp/tuxanci-server.log") ); - - if( ret < 0 ) - { - fprintf(stderr, _("I was unable to open config file!\n")); - return -1; - } - - initHeightScore( getSetting("SCORE_FILE", "--score-file", "/tmp/heightscore") ); - - loadArena(); - - for( i = 0 ; i < atoi(getSetting("ITEM", "--item", "10")) ; i++ ) - { - addNewItem(arena->spaceItem, ID_UNKNOWN); - } - - isSignalEnd = FALSE; - - ret = initPublicServerNetwork(); - - if( ret < 0 ) - { - printf(_("Unable to initialize network socket!\n")); - return -1; - } - - setServerMaxClients( atoi( getSetting("MAX_CLIENTS", "--max-clients", "32") )); - - if (registerPublicServer() < 0) - { - printf(_("Unable to contact MasterServer!)\n")); - } - - return 0; + int ret; + int i; + + initListID(); + initModule(); + initArenaFile(); + initTux(); + initItem(); + initShot(); + initServerConfigFile(); + + ret = + initLog(getSetting + ("LOG_FILE", "--log-file", "/tmp/tuxanci-server.log")); + + if (ret < 0) { + fprintf(stderr, _("I was unable to open config file!\n")); + return -1; + } + + initHeightScore(getSetting + ("SCORE_FILE", "--score-file", "/tmp/heightscore")); + + loadArena(); + + for (i = 0; i < atoi(getSetting("ITEM", "--item", "10")); i++) { + addNewItem(arena->spaceItem, ID_UNKNOWN); + } + + isSignalEnd = FALSE; + + ret = initPublicServerNetwork(); + + if (ret < 0) { + printf(_("Unable to initialize network socket!\n")); + return -1; + } + + setServerMaxClients(atoi + (getSetting("MAX_CLIENTS", "--max-clients", "32"))); + + if (registerPublicServer() < 0) { + printf(_("Unable to contact MasterServer!)\n")); + } + + return 0; } -arenaFile_t* getChoiceArena() +arenaFile_t * +getChoiceArena() { - return choice_arenaFile; + return choice_arenaFile; } -void eventPublicServer() +void +eventPublicServer() { - static my_time_t lastActive = 0; - my_time_t interval; + static my_time_t lastActive = 0; + my_time_t interval; - eventNetMultiplayer(); + eventNetMultiplayer(); - if( isSignalEnd == TRUE ) - { - quitPublicServer(); - } + if (isSignalEnd == TRUE) { + quitPublicServer(); + } - if( lastActive == 0 ) - { - lastActive = getMyTime(); - } + if (lastActive == 0) { + lastActive = getMyTime(); + } - interval = getMyTime() - lastActive; + interval = getMyTime() - lastActive; - if( interval < 50 ) - { - return; - } + if (interval < 50) { + return; + } - //printf("interval = %d\n", interval); + //printf("interval = %d\n", interval); - lastActive = getMyTime(); + lastActive = getMyTime(); - eventArena(arena); + eventArena(arena); } -void my_handler_quit(int n) +void +my_handler_quit(int n) { #ifdef DEBUG - printf("my_handler_quit\n"); + printf("my_handler_quit\n"); #endif - isSignalEnd = TRUE; + isSignalEnd = TRUE; } -void quitPublicServer() +void +quitPublicServer() { #ifdef DEBUG - printf(_("Quitting public server\n")); + printf(_("Quitting public server\n")); #endif - quitNetMultiplayer(); - destroyArena(arena); - - quitTux(); - quitItem(); - quitShot(); - - quitArenaFile(); - quitServerConfigFile(); - quitModule(); - quitListID(); - quitHeightScore(); - quitLog(); - - exit(0); + quitNetMultiplayer(); + destroyArena(arena); + + quitTux(); + quitItem(); + quitShot(); + + quitArenaFile(); + quitServerConfigFile(); + quitModule(); + quitListID(); + quitHeightScore(); + quitLog(); + + exit(0); } -int startPublicServer() +int +startPublicServer() { #ifndef __WIN32__ - signal(SIGINT, my_handler_quit); - signal(SIGTERM, my_handler_quit); - signal(SIGQUIT, my_handler_quit); + signal(SIGINT, my_handler_quit); + signal(SIGTERM, my_handler_quit); + signal(SIGQUIT, my_handler_quit); #endif - if( initPublicServer() < 0 ) - { - quitPublicServer(); - return -1; - } - - while(1) - { - eventPublicServer(); - } - - return 0; + if (initPublicServer() < 0) { + quitPublicServer(); + return -1; + } + + while (1) { + eventPublicServer(); + } + + return 0; } diff --git a/src/server/publicServer.c~ b/src/server/publicServer.c~ new file mode 100644 index 0000000..8770300 --- /dev/null +++ b/src/server/publicServer.c~ @@ -0,0 +1,372 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <signal.h> +#include <time.h> + +#ifndef __WIN32 +#include <sys/socket.h> +#include <sys/select.h> +#include <arpa/inet.h> +#else +# include <windows.h> +# include <wininet.h> +#endif + +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> + +#include "main.h" +#include "list.h" +#include "tux.h" +#include "idManager.h" +#include "myTimer.h" +#include "arena.h" +#include "item.h" +#include "shot.h" +#include "arenaFile.h" +#include "proto.h" +#include "modules.h" +#include "net_multiplayer.h" + +#include "publicServer.h" +#include "serverConfigFile.h" +#include "heightScore.h" +#include "log.h" + +#include "dns.h" + +static arena_t *arena; +static bool_t isSignalEnd; +static arenaFile_t *choice_arenaFile; + +extern int errno; + +#define __PACKED__ __attribute__ ((__packed__)) + +void countRoundInc() +{ +} + +char *getSetting(char *env, char *param, char *default_val) +{ + return getParamElse(param, getServerConfigFileValue(env, default_val) ); +} + +static int registerPublicServer() +{ +#ifndef __WIN32 + int s; +#else + SOCKET s; +#endif + + /* TODO: dodelat TCP makro */ + struct sockaddr_in server; + char *master_server_ip; + + master_server_ip = getIPFormDNS(NET_MASTER_SERVER_DOMAIN); + + //printf("master_server_ip = %s\n", master_server_ip); + + if( master_server_ip == NULL ) // master server is down + { + return -1; + } + + server.sin_family = AF_INET; + server.sin_port = htons (NET_MASTER_PORT); + server.sin_addr.s_addr = inet_addr (master_server_ip); + + free(master_server_ip); + + if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) { + return 0; + } + + /* Set to nonblocking socket mode */ +#ifndef __WIN32__ + int oldFlag; + + oldFlag = fcntl (s, F_GETFL, 0); + + if( fcntl(s, F_SETFL, oldFlag | O_NONBLOCK) == -1 ) + { + return -1; + } +#else + unsigned long arg = 1; + // Operation is FIONBIO. Parameter is pointer on non-zero number. + if( ioctlsocket(s, FIONBIO, &arg) == SOCKET_ERROR ) + { + WSACleanup(); + return -1; + } +#endif + + if( connect (s, (struct sockaddr *) &server, sizeof (server)) == -1 ) { +#ifndef __WIN32__ + if (errno != EINPROGRESS) + return -1; +#else + if (WSAGetLastError() != WSAEWOULDBLOCK) { + WSACleanup(); + return -1; + } +#endif + } + + struct timeval tv; + + fd_set myset; + + FD_ZERO(&myset); + FD_SET(s, &myset); + + tv.tv_sec = 3; + tv.tv_usec = 0; + + int ret = select (s+1, NULL, &myset, NULL, &tv); + + if (ret == -1) + return -1; + + if (ret == 0) + return -1; + + FD_ZERO(&myset); + FD_SET(s, &myset); + + tv.tv_sec = 1; + tv.tv_usec = 0; + + ret = select (s+1, NULL, &myset, NULL, &tv); + + if (ret == -1) + return -1; + + if (ret == 0) + return -1; + + + typedef struct { + unsigned char cmd; + unsigned port; + unsigned ip; + } __PACKED__ register_head; + + char *str = (char *) malloc (sizeof (register_head)); + + register_head *head = (register_head *) str; + + head->cmd = 'p'; + head->port = atoi( getSetting("PORT4", "--port4", "2200") ); + head->ip = 0; // TODO + + /* send request for server list */ + int r = send (s, str, 9, 0); + + free (str); + + if (r == -1) { +#ifndef __WIN32 + close(s); +#else + closesocket(s); +#endif + return -1; + } + +#ifndef __WIN32 + close(s); +#else + closesocket(s); +#endif + + return 0; +} + +static int initPublicServerNetwork() +{ + char ip4[STR_IP_SIZE]; + char ip6[STR_IP_SIZE]; + char *p_ip4, *p_ip6; + int port4; + int port6; + int ret; + + ret = -1; + + strcpy(ip4, getSetting("IP4", "--ip4", "none" ) ); + strcpy(ip6, getSetting("IP6", "--ip6", "none" ) ); + + p_ip4 = ip4; + + if( strcmp(ip4, "none") == 0 ) + { + p_ip4 = NULL; + } + + p_ip6 = ip6; + + if( strcmp(ip6, "none") == 0 ) + { + p_ip6 = NULL; + } + + port4 = atoi( getSetting("PORT4", "--port4", "2200") ); + port6 = atoi( getSetting("PORT6", "--port6", "2200") ); + + //ret = initNetMulitplayerPublicServer(p_ip4, port4, p_ip6, port6); + + ret = initNetMuliplayerForGameServer(p_ip4, port4, p_ip6, port6); + + return ret; +} + +static void loadArena() +{ + choice_arenaFile = getArenaFileFormNetName( getSetting("ARENA", "--arena", "FAGN") ); + arena = getArena(choice_arenaFile); + setCurrentArena(arena); +} + +int initPublicServer() +{ + int ret; + int i; + + initListID(); + initModule(); + initArenaFile(); + initTux(); + initItem(); + initShot(); + initServerConfigFile(); + + ret = initLog(getSetting("LOG_FILE", "--log-file", "/tmp/tuxanci-server.log") ); + + if( ret < 0 ) + { + fprintf(stderr, _("I was unable to open config file!\n")); + return -1; + } + + initHeightScore( getSetting("SCORE_FILE", "--score-file", "/tmp/heightscore") ); + + loadArena(); + + for( i = 0 ; i < atoi(getSetting("ITEM", "--item", "10")) ; i++ ) + { + addNewItem(arena->spaceItem, ID_UNKNOWN); + } + + isSignalEnd = FALSE; + + ret = initPublicServerNetwork(); + + if( ret < 0 ) + { + printf(_("Unable to initialize network socket!\n")); + return -1; + } + + setServerMaxClients( atoi( getSetting("MAX_CLIENTS", "--max-clients", "32") )); + + if (registerPublicServer() < 0) + { + printf(_("Unable to contact MasterServer!)\n")); + } + + return 0; +} + +arenaFile_t* getChoiceArena() +{ + return choice_arenaFile; +} + +void eventPublicServer() +{ + static my_time_t lastActive = 0; + my_time_t interval; + + eventNetMultiplayer(); + + if( isSignalEnd == TRUE ) + { + quitPublicServer(); + } + + if( lastActive == 0 ) + { + lastActive = getMyTime(); + } + + interval = getMyTime() - lastActive; + + if( interval < 50 ) + { + return; + } + + //printf("interval = %d\n", interval); + + lastActive = getMyTime(); + + eventArena(arena); +} + +void my_handler_quit(int n) +{ +#ifdef DEBUG + printf("my_handler_quit\n"); +#endif + isSignalEnd = TRUE; +} + +void quitPublicServer() +{ +#ifdef DEBUG + printf(_("Quitting public server\n")); +#endif + quitNetMultiplayer(); + destroyArena(arena); + + quitTux(); + quitItem(); + quitShot(); + + quitArenaFile(); + quitServerConfigFile(); + quitModule(); + quitListID(); + quitHeightScore(); + quitLog(); + + exit(0); +} + +int startPublicServer() +{ +#ifndef __WIN32__ + signal(SIGINT, my_handler_quit); + signal(SIGTERM, my_handler_quit); + signal(SIGQUIT, my_handler_quit); +#endif + if( initPublicServer() < 0 ) + { + quitPublicServer(); + return -1; + } + + while(1) + { + eventPublicServer(); + } + + return 0; +} diff --git a/src/server/serverConfigFile.c b/src/server/serverConfigFile.c index 487ec13..7e843eb 100644 --- a/src/server/serverConfigFile.c +++ b/src/server/serverConfigFile.c @@ -11,98 +11,95 @@ static textFile_t *serverTextFile; -static void prepareConfigFile(textFile_t *ts) +static void +prepareConfigFile(textFile_t * ts) { - int i; - int j; - - for( i = 0 ; i < serverTextFile->text->count ; i++ ) - { - char *line; - int len; - - line = (char *)(serverTextFile->text->list[i]); - len = strlen(line); - - for( j = 0 ; j < len ; j++ ) - { - if( line[j] == ' ' ) // [TAB] - { - line[j] = ' '; - } - } - } + int i; + int j; + + for (i = 0; i < serverTextFile->text->count; i++) { + char *line; + int len; + + line = (char *) (serverTextFile->text->list[i]); + len = strlen(line); + + for (j = 0; j < len; j++) { + if (line[j] == ' ') // [TAB] + { + line[j] = ' '; + } + } + } } -void initServerConfigFile() +void +initServerConfigFile() { - char *configFile; + char *configFile; - configFile = getParamElse("--config-file", SERVER_CONFIG); - printf(_("Loading configuration from: \"%s\"\n"), getParamElse("--config-file", SERVER_CONFIG) ); + configFile = getParamElse("--config-file", SERVER_CONFIG); + printf(_("Loading configuration from: \"%s\"\n"), + getParamElse("--config-file", SERVER_CONFIG)); - serverTextFile = loadTextFile(configFile); + serverTextFile = loadTextFile(configFile); - if( serverTextFile == NULL ) - { - fprintf(stderr, _("I was unable to load config file. Falling back to defaults!\n")); - return; - } - - prepareConfigFile(serverTextFile); + if (serverTextFile == NULL) { + fprintf(stderr, + _ + ("I was unable to load config file. Falling back to defaults!\n")); + return; + } + + prepareConfigFile(serverTextFile); } -static char *findValue(char *s) +static char * +findValue(char *s) { - int len; - int i; + int len; + int i; - len = strlen(s); + len = strlen(s); - for( i = 0 ; i < len-1 ; i++) - { - if( s[i] == ' ' && s[i+1] != ' ' ) - { - return s+i+1; - } - } + for (i = 0; i < len - 1; i++) { + if (s[i] == ' ' && s[i + 1] != ' ') { + return s + i + 1; + } + } - return NULL; + return NULL; } -char* getServerConfigFileValue(char *env, char *s) +char * +getServerConfigFileValue(char *env, char *s) { - int i; - int len; + int i; + int len; - if( serverTextFile == NULL ) - { - return s; - } + if (serverTextFile == NULL) { + return s; + } - len = strlen(env); + len = strlen(env); - for( i = 0 ; i < serverTextFile->text->count ; i++ ) - { - char *line; + for (i = 0; i < serverTextFile->text->count; i++) { + char *line; - line = (char *)(serverTextFile->text->list[i]); + line = (char *) (serverTextFile->text->list[i]); - if( strncmp(line, env, len) == 0 ) - { - return findValue(line); - } - } + if (strncmp(line, env, len) == 0) { + return findValue(line); + } + } - return s; + return s; } -void quitServerConfigFile() +void +quitServerConfigFile() { - if( serverTextFile != NULL ) - { - destroyTextFile(serverTextFile); - } + if (serverTextFile != NULL) { + destroyTextFile(serverTextFile); + } } - - diff --git a/src/server/serverConfigFile.c~ b/src/server/serverConfigFile.c~ new file mode 100644 index 0000000..487ec13 --- /dev/null +++ b/src/server/serverConfigFile.c~ @@ -0,0 +1,108 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include "main.h" +#include "list.h" +#include "textFile.h" +#include "serverConfigFile.h" + +static textFile_t *serverTextFile; + +static void prepareConfigFile(textFile_t *ts) +{ + int i; + int j; + + for( i = 0 ; i < serverTextFile->text->count ; i++ ) + { + char *line; + int len; + + line = (char *)(serverTextFile->text->list[i]); + len = strlen(line); + + for( j = 0 ; j < len ; j++ ) + { + if( line[j] == ' ' ) // [TAB] + { + line[j] = ' '; + } + } + } +} + +void initServerConfigFile() +{ + char *configFile; + + configFile = getParamElse("--config-file", SERVER_CONFIG); + printf(_("Loading configuration from: \"%s\"\n"), getParamElse("--config-file", SERVER_CONFIG) ); + + serverTextFile = loadTextFile(configFile); + + if( serverTextFile == NULL ) + { + fprintf(stderr, _("I was unable to load config file. Falling back to defaults!\n")); + return; + } + + prepareConfigFile(serverTextFile); +} + +static char *findValue(char *s) +{ + int len; + int i; + + len = strlen(s); + + for( i = 0 ; i < len-1 ; i++) + { + if( s[i] == ' ' && s[i+1] != ' ' ) + { + return s+i+1; + } + } + + return NULL; +} + +char* getServerConfigFileValue(char *env, char *s) +{ + int i; + int len; + + if( serverTextFile == NULL ) + { + return s; + } + + len = strlen(env); + + for( i = 0 ; i < serverTextFile->text->count ; i++ ) + { + char *line; + + line = (char *)(serverTextFile->text->list[i]); + + if( strncmp(line, env, len) == 0 ) + { + return findValue(line); + } + } + + return s; +} + +void quitServerConfigFile() +{ + if( serverTextFile != NULL ) + { + destroyTextFile(serverTextFile); + } +} + + |