diff options
| author | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-06-28 16:38:35 +0000 |
|---|---|---|
| committer | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-06-28 16:38:35 +0000 |
| commit | 2d776fcd61be168e1ff0ff2e4a5e71835e7cea19 (patch) | |
| tree | 7cf274897bf540d5332d446f583ffd066e4e2e1d /src/server | |
| parent | b877ae23ac5d380ab3aa48d7724045cf4883b186 (diff) | |
- prekopanie adresarovej struktury, prva cast
git-svn-id: http://opensvn.csie.org/tuxanci_ng@77 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/Makefile | 15 | ||||
| -rw-r--r-- | src/server/heightScore.c | 98 | ||||
| -rw-r--r-- | src/server/heightScore.h | 13 | ||||
| -rw-r--r-- | src/server/logFile.c | 46 | ||||
| -rw-r--r-- | src/server/logFile.h | 18 | ||||
| -rw-r--r-- | src/server/publicServer.c | 192 | ||||
| -rw-r--r-- | src/server/publicServer.h | 18 | ||||
| -rw-r--r-- | src/server/serverConfigFile.c | 86 | ||||
| -rw-r--r-- | src/server/serverConfigFile.h | 11 |
9 files changed, 497 insertions, 0 deletions
diff --git a/src/server/Makefile b/src/server/Makefile new file mode 100644 index 0000000..41e140e --- /dev/null +++ b/src/server/Makefile @@ -0,0 +1,15 @@ + + +all: heightScore.o publicServer.o serverConfigFile.o + +heightScore.o: heightScore.c heightScore.h + $(CC) $(CFLAGS) -o heightScore.o -c heightScore.c + +publicServer.o: publicServer.c publicServer.h + $(CC) $(CFLAGS) -o publicServer.o -c publicServer.c + +serverConfigFile.o: serverConfigFile.c serverConfigFile.h + $(CC) $(CFLAGS) -o serverConfigFile.o -c serverConfigFile.c + +clean: + rm -rf *.o diff --git a/src/server/heightScore.c b/src/server/heightScore.c new file mode 100644 index 0000000..f36dcf7 --- /dev/null +++ b/src/server/heightScore.c @@ -0,0 +1,98 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include "base/main.h" +#include "base/list.h" +#include "base/textFile.h" +#include "server/heightScore.h" + +static textFile_t *textFile; + +void initHeightScore(char *file) +{ + int i; + + textFile = loadTextFile(file); + + if( textFile == NULL ) + { + fprintf(stderr, "I can't load %s !\n", file); + fprintf(stderr, "I create %s\n", file); + textFile = newTextFile(file); + } + else + { + return; + } + + if( textFile == NULL ) + { + fprintf(stderr, "I can't 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); + 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/heightScore.h b/src/server/heightScore.h new file mode 100644 index 0000000..b1bf7e2 --- /dev/null +++ b/src/server/heightScore.h @@ -0,0 +1,13 @@ + +#ifndef HEIGHT_SCORE_H + +#define HEIGHT_SCORE_H + +#define HEIGHTSCORE_MAX_PLAYERS 100 + +extern void initHeightScore(char *file); +extern int addPlayerInHighScore(char *name, int score); +extern char* getTableItem(int index); +extern void quitHeightScore(); + +#endif diff --git a/src/server/logFile.c b/src/server/logFile.c new file mode 100644 index 0000000..12a4df8 --- /dev/null +++ b/src/server/logFile.c @@ -0,0 +1,46 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <assert.h> + +typedef struct logFile_struct +{ + char *name; + FILE *file; +} logFile_t; + +logFile_t* newLogFile(char *s) +{ + logFile_t *new; + + assert( s != NULL ); + + new = malloc( sizeof(logFile_t) ); + memset(new, 0, sizeof(logFile_t) ); + + new->name = strdup(s); + new->file = fopen(new->name, "a+"); + + assert( new->file != NULL ); + + return new; +} + +int writeLog(logFile_t *p, char *s) +{ + assert( p != NULL ); + assert( s != NULL ); + + return fprintf(p->file, s); +} + +void destroyLogFile(logFile_t *p) +{ + assert( p != NULL ); + + free(p->name); + fclose(p->file); + free(p); +} diff --git a/src/server/logFile.h b/src/server/logFile.h new file mode 100644 index 0000000..12f5606 --- /dev/null +++ b/src/server/logFile.h @@ -0,0 +1,18 @@ + +#ifndef LOGFILE_H + +#define LOGFILE_H + +#include "main.h" + +typedef struct logFile_struct +{ + char *name; + FILE *file; +} logFile_t; + +extern logFile_t* newLogFile(char *s); +extern int writeLog(logFile_t *p, char *s); +extern void destroyLogFile(logFile_t *p); + +#endif diff --git a/src/server/publicServer.c b/src/server/publicServer.c new file mode 100644 index 0000000..0bd88ac --- /dev/null +++ b/src/server/publicServer.c @@ -0,0 +1,192 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <signal.h> +#include <time.h> + +#include "base/main.h" +#include "base/list.h" +#include "base/tux.h" +#include "base/idManager.h" +#include "base/myTimer.h" +#include "base/arena.h" +#include "base/item.h" +#include "base/shot.h" +#include "base/arenaFile.h" +#include "base/proto.h" +#include "base/modules.h" +#include "base/net_multiplayer.h" + +#include "server/publicServer.h" +#include "server/serverConfigFile.h" +#include "server/heightScore.h" + +static int arenaId; +static arena_t *arena; +static bool_t isSignalEnd; + +void countRoundInc() +{ +} + +static char *getSetting(char *env, char *param, char *default_val) +{ + return getParamElse(param, getServerConfigFileValue(env, default_val) ); +} + +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("PORTv4", "--port", "2200") ); + port6 = atoi( getSetting("PORTv6", "--port", "2200") ); + + ret = initNetMulitplayerPublicServer(p_ip4, port4, p_ip6, port6); + + return ret; +} + +int initPublicServer() +{ + int ret; + + initListID(); + initModule(); + initArenaFile(); + initTux(); + initItem(); + initShot(); + initServerConfigFile(); + initHeightScore( getSetting("SCOREFILE", "--scorefile", "./heightscore") ); + + arenaId = getArenaIdFormNetName( getSetting("ARENA", "--arena", "FAGN") ); + arena = getArena(arenaId); + setCurrentArena(arena); + + addNewItem(arena->spaceItem, ID_UNKNOWN); + isSignalEnd = FALSE; + + ret = initPublicServerNetwork(); + + if( ret < 0 ) + { + printf("Nemozem inicalizovat sietovy socket !\n"); + return -1; + } + + setServerMaxClients( atoi( getSetting("MAX_CLIENTS", "--maxclients", "32") )); + + return 0; +} + +int getChoiceArenaId() +{ + return arenaId; +} + +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(); + + //fce_interval(); + eventArena(arena); +} + +void my_handler_quit(int n) +{ + printf("my_handler_quit\n"); + isSignalEnd = TRUE; +} + +void quitPublicServer() +{ + printf("quit public server\n"); + + quitNetMultiplayer(); + destroyArena(arena); + + quitTux(); + quitItem(); + quitShot(); + + quitArenaFile(); + quitServerConfigFile(); + quitModule(); + quitListID(); + quitHeightScore(); + destroyList(listHelp); + + exit(0); +} + +int startPublicServer() +{ + signal(SIGPIPE, SIG_IGN); + signal(SIGINT, my_handler_quit); + signal(SIGTERM, my_handler_quit); + signal(SIGQUIT, my_handler_quit); + + if( initPublicServer() < 0 ) + { + quitPublicServer(); + return -1; + } + + while(1) + { + eventPublicServer(); + } + + return 0; +} diff --git a/src/server/publicServer.h b/src/server/publicServer.h new file mode 100644 index 0000000..111ff9c --- /dev/null +++ b/src/server/publicServer.h @@ -0,0 +1,18 @@ + +#ifndef PUBLIC_SERVER_H + +#define PUBLIC_SERVER_H + +#include "base/arena.h" + +#define WORLD_COUNT_ROUND_UNLIMITED -1 + +extern void countRoundInc(); +extern int initPublicServer(); +extern int getChoiceArenaId(); +extern void eventPublicServer(); +extern void my_handler_quit(int n); +extern void quitPublicServer(); +extern int startPublicServer(); + +#endif diff --git a/src/server/serverConfigFile.c b/src/server/serverConfigFile.c new file mode 100644 index 0000000..7f03019 --- /dev/null +++ b/src/server/serverConfigFile.c @@ -0,0 +1,86 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include "base/main.h" +#include "base/list.h" +#include "base/textFile.h" +#include "server/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() +{ + serverTextFile = loadTextFile("./server.conf"); + + if( serverTextFile == NULL ) + { + fprintf(stderr, "I dont load config file, I used default values\n"); + return; + } + + prepareConfigFile(serverTextFile); + +} +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 strrchr(line,' ')+1; + } + } + + return s; +} + +void quitServerConfigFile() +{ + if( serverTextFile != NULL ) + { + destroyTextFile(serverTextFile); + } +} + + diff --git a/src/server/serverConfigFile.h b/src/server/serverConfigFile.h new file mode 100644 index 0000000..d016807 --- /dev/null +++ b/src/server/serverConfigFile.h @@ -0,0 +1,11 @@ + + +#ifndef SERVER_CONFIG_FILE_H + +#define SERVER_CONFIG_FILE_H + +extern void initServerConfigFile(); +extern char* getServerConfigFileValue(char *env, char *s); +extern void quitServerConfigFile(); + +#endif |