summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-06-28 16:38:35 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-06-28 16:38:35 +0000
commit2d776fcd61be168e1ff0ff2e4a5e71835e7cea19 (patch)
tree7cf274897bf540d5332d446f583ffd066e4e2e1d /src/server
parentb877ae23ac5d380ab3aa48d7724045cf4883b186 (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/Makefile15
-rw-r--r--src/server/heightScore.c98
-rw-r--r--src/server/heightScore.h13
-rw-r--r--src/server/logFile.c46
-rw-r--r--src/server/logFile.h18
-rw-r--r--src/server/publicServer.c192
-rw-r--r--src/server/publicServer.h18
-rw-r--r--src/server/serverConfigFile.c86
-rw-r--r--src/server/serverConfigFile.h11
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