summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas 'ZeXx86' Jedrzejek <zexx86@gmail.com>2009-04-19 12:50:29 +0200
committerTomas 'ZeXx86' Jedrzejek <zexx86@gmail.com>2009-04-19 12:50:29 +0200
commitf22e568d568dd35cef3e5c5119a6dd7093e62b10 (patch)
tree571acdcefb0955f2c8d46e7451ea4dcaa592c62e /src
parent82c397bde642ecacce33911c4d97b3cf664209c7 (diff)
Support for domain address of game server
Bugfix of tuxie movement on shooting/reloading event Support for daemon mode in game server build, "--daemon=1" parameter Cleanup in publicServer, gameType, udp sources
Diffstat (limited to 'src')
-rw-r--r--src/net/udp.c25
-rw-r--r--src/screen/gameType.c10
-rw-r--r--src/screen/world.c32
-rw-r--r--src/server/publicServer.c106
4 files changed, 136 insertions, 37 deletions
diff --git a/src/net/udp.c b/src/net/udp.c
index 6d61a11..b13fa1f 100644
--- a/src/net/udp.c
+++ b/src/net/udp.c
@@ -25,6 +25,7 @@
#include "net_multiplayer.h"
#include "udp.h"
+#include "dns.h"
static int getProto(char *str)
{
@@ -45,7 +46,7 @@ sock_udp_t *sock_udp_new(void)
return new;
}
-void sock_udp_destroy(sock_udp_t * p)
+void sock_udp_destroy(sock_udp_t *p)
{
assert(p != NULL);
free(p);
@@ -144,6 +145,11 @@ sock_udp_t *sock_udp_connect(char *address, int port)
return NULL;
}
+ char *domain = gns_resolv (address);
+
+ if (domain)
+ address = domain;
+
memset(&(new->sockAddr), 0, sizeof(new->sockAddr));
if (new->proto == PROTO_UDPv4) {
@@ -158,10 +164,13 @@ sock_udp_t *sock_udp_connect(char *address, int port)
inet_pton(AF_INET6, address, &(new->sockAddr6.sin6_addr));
}
#endif
+ if (domain)
+ free (domain);
+
return new;
}
-int sock_udp_set_non_block(sock_udp_t * p)
+int sock_udp_set_non_block(sock_udp_t *p)
{
/* Set to nonblocking socket mode */
#ifndef __WIN32__
@@ -183,7 +192,7 @@ int sock_udp_set_non_block(sock_udp_t * p)
return 0;
}
-int sock_udp_read(sock_udp_t * src, sock_udp_t * dst, void *address, int len)
+int sock_udp_read(sock_udp_t *src, sock_udp_t *dst, void *address, int len)
{
int addrlen;
int size = -1; // no warninng
@@ -236,7 +245,7 @@ int sock_udp_read(sock_udp_t * src, sock_udp_t * dst, void *address, int len)
return size;
}
-int sock_udp_write(sock_udp_t * src, sock_udp_t * dst, void *address, int len)
+int sock_udp_write(sock_udp_t *src, sock_udp_t *dst, void *address, int len)
{
int addrlen;
int size = -1; // no warninng
@@ -278,7 +287,7 @@ int sock_udp_write(sock_udp_t * src, sock_udp_t * dst, void *address, int len)
return size;
}
-void sock_udp_get_ip(sock_udp_t * p, char *str_ip, int len)
+void sock_udp_get_ip(sock_udp_t *p, char *str_ip, int len)
{
assert(p != NULL);
assert(str_ip != NULL);
@@ -299,7 +308,7 @@ void sock_udp_get_ip(sock_udp_t * p, char *str_ip, int len)
#endif
}
-int sock_udp_get_port(sock_udp_t * p)
+int sock_udp_get_port(sock_udp_t *p)
{
assert(p != NULL);
@@ -318,7 +327,7 @@ int sock_udp_get_port(sock_udp_t * p)
}
-void sock_udp_close(sock_udp_t * p)
+void sock_udp_close(sock_udp_t *p)
{
assert(p != NULL);
@@ -333,7 +342,7 @@ void sock_udp_close(sock_udp_t * p)
#if 0
-static int myWait(sock_udp_t * p)
+static int myWait(sock_udp_t *p)
{
fd_set readfds;
fd_set errorfds;
diff --git a/src/screen/gameType.c b/src/screen/gameType.c
index 58199e8..9513c7d 100644
--- a/src/screen/gameType.c
+++ b/src/screen/gameType.c
@@ -188,6 +188,7 @@ static void eventWidget(void *p)
if (button == button_back) {
screen_set("mainMenu");
+ return;
}
if (button == button_play) {
@@ -200,16 +201,17 @@ static void eventWidget(void *p)
return;
}
- if (public_server_get_settingGameType() == NET_GAME_TYPE_CLIENT) {
+ if (public_server_get_settingGameType() == NET_GAME_TYPE_CLIENT)
screen_set("downArena");
- //screen_set("world");
- } else {
+ else
screen_set("chiceArena");
- }
+
+ return;
}
if (button == button_browser) {
screen_set("browser");
+ return;
}
}
diff --git a/src/screen/world.c b/src/screen/world.c
index e32ca1a..6aee31b 100644
--- a/src/screen/world.c
+++ b/src/screen/world.c
@@ -71,7 +71,7 @@ void setGameType()
}
}
-void world_set_arena(arenaFile_t * arenaFile)
+void world_set_arena(arenaFile_t *arenaFile)
{
arena = arena_file_get_arena(arenaFile);
@@ -193,7 +193,7 @@ void world_draw()
save_dialog_draw();
}
-static void netAction(tux_t * tux, int action)
+static void netAction(tux_t *tux, int action)
{
if (public_server_get_settingGameType() == NET_GAME_TYPE_SERVER) {
proto_send_event_server(PROTO_SEND_ALL_SEES_TUX, NULL, tux, action);
@@ -204,7 +204,7 @@ static void netAction(tux_t * tux, int action)
}
}
-static void control_keyboard_right(tux_t * tux)
+static void control_keyboard_right(tux_t *tux)
{
static int lastKey = 0;
int countKey;
@@ -232,14 +232,12 @@ static void control_keyboard_right(tux_t * tux)
&& tux->isCanSwitchGun == TRUE) {
netAction(tux, TUX_SWITCH_GUN);
tux_action(tux, TUX_SWITCH_GUN);
- return;
}
if (mapa[(SDLKey) key_table_get_key(KEY_TUX_RIGHT_SHOOT)] == SDL_PRESSED
&& tux->isCanShot == TRUE) {
netAction(tux, TUX_SHOT);
tux_action(tux, TUX_SHOT);
- return;
}
if (mapa[(SDLKey) key_table_get_key(KEY_TUX_RIGHT_MOVE_UP)] == SDL_PRESSED) {
@@ -248,9 +246,9 @@ static void control_keyboard_right(tux_t * tux)
if (countKey == 1)
lastKey = key_table_get_key(KEY_TUX_RIGHT_MOVE_UP);
+
netAction(tux, TUX_UP);
tux_action(tux, TUX_UP);
- return;
tuUp:;
}
@@ -261,12 +259,11 @@ static void control_keyboard_right(tux_t * tux)
if (countKey == 1)
lastKey = key_table_get_key(KEY_TUX_RIGHT_MOVE_RIGHT);
+
netAction(tux, TUX_RIGHT);
tux_action(tux, TUX_RIGHT);
- return;
tuRight:;
-
}
if (mapa[(SDLKey) key_table_get_key(KEY_TUX_RIGHT_MOVE_LEFT)] == SDL_PRESSED) {
@@ -275,9 +272,9 @@ static void control_keyboard_right(tux_t * tux)
if (countKey == 1)
lastKey = key_table_get_key(KEY_TUX_RIGHT_MOVE_LEFT);
+
netAction(tux, TUX_LEFT);
tux_action(tux, TUX_LEFT);
- return;
tuLeft:;
}
@@ -288,15 +285,15 @@ static void control_keyboard_right(tux_t * tux)
if (countKey == 1)
lastKey = key_table_get_key(KEY_TUX_RIGHT_MOVE_DOWN);
+
netAction(tux, TUX_DOWN);
tux_action(tux, TUX_DOWN);
- return;
tuDown:;
}
}
-static void control_keyboard_left(tux_t * tux)
+static void control_keyboard_left(tux_t *tux)
{
static int lastKey = 0;
int countKey;
@@ -323,14 +320,12 @@ static void control_keyboard_left(tux_t * tux)
if (mapa[(SDLKey) key_table_get_key(KEY_TUX_LEFT_SWITCH_WEAPON)] == SDL_PRESSED) {
if (tux->isCanSwitchGun == TRUE) {
tux_action(tux, TUX_SWITCH_GUN);
- return;
}
}
if (mapa[(SDLKey) key_table_get_key(KEY_TUX_LEFT_SHOOT)] == SDL_PRESSED
&& tux->isCanShot == TRUE) {
tux_action(tux, TUX_SHOT);
- return;
}
if (mapa[(SDLKey) key_table_get_key(KEY_TUX_LEFT_MOVE_UP)] == SDL_PRESSED) {
@@ -339,8 +334,8 @@ static void control_keyboard_left(tux_t * tux)
if (countKey == 1)
lastKey = key_table_get_key(KEY_TUX_LEFT_MOVE_UP);
+
tux_action(tux, TUX_UP);
- return;
tuUp:;
}
@@ -351,8 +346,8 @@ static void control_keyboard_left(tux_t * tux)
if (countKey == 1)
lastKey = key_table_get_key(KEY_TUX_LEFT_MOVE_RIGHT);
+
tux_action(tux, TUX_RIGHT);
- return;
tuRight:;
@@ -364,8 +359,8 @@ static void control_keyboard_left(tux_t * tux)
if (countKey == 1)
lastKey = key_table_get_key(KEY_TUX_LEFT_MOVE_LEFT);
+
tux_action(tux, TUX_LEFT);
- return;
tuLeft:;
}
@@ -376,8 +371,8 @@ static void control_keyboard_left(tux_t * tux)
if (countKey == 1)
lastKey = key_table_get_key(KEY_TUX_LEFT_MOVE_DOWN);
+
tux_action(tux, TUX_DOWN);
- return;
tuDown:;
}
@@ -581,8 +576,7 @@ void world_init()
assert(panel_is_inicialized() == TRUE);
assert(screen_is_inicialized() == TRUE);
- screen_register(screen_new
- ("world", startWorld, world_event, world_draw, stoptWorld));
+ screen_register(screen_new("world", startWorld, world_event, world_draw, stoptWorld));
#ifndef NO_SOUND
sound_add("dead.ogg", "dead", SOUND_GROUP_BASE);
diff --git a/src/server/publicServer.c b/src/server/publicServer.c
index 19e2f75..82861ed 100644
--- a/src/server/publicServer.c
+++ b/src/server/publicServer.c
@@ -56,7 +56,97 @@ char *public_server_get_setting(char *env, char *param, char *default_val)
return getParamElse(param, server_configFile_get_value(env, default_val));
}
-static int registerPublicServer()
+
+#ifndef __WIN32__
+void daemonize ()
+{
+ int i, lockfd;
+ char pid[16];
+ char spid[64];
+
+ int ipid = getpid ();
+
+ /* detach if asked */
+ if (ipid == 1)
+ return; /* already a daemon */
+
+ /* fork to guarantee we are not process group leader */
+ i = fork ();
+
+ if (i < 0)
+ exit (1); /* fork error */
+ if (i > 0)
+ exit (0); /* parent exits */
+
+ /* child (daemon) continues */
+ setsid (); /* obtain a new process group */
+ ipid = getpid ()+1;
+
+ printf ("> started with pid -> %d\n", ipid);
+ /* fork again so we become process group leader
+ * and cannot regain a controlling tty
+ */
+ i = fork ();
+
+ if (i < 0)
+ exit (1); /* fork error */
+ else if (i > 0)
+ exit (0); /* parent exits */
+
+ /* close all fds */
+ for (i = getdtablesize (); i >= 0; --i)
+ close (i); /* close all descriptors */
+
+ /* close parent fds and send output to fds 0, 1 and 2 to bitbucket */
+ i = open ("/dev/null", O_RDWR);
+
+ if (i < 0)
+ exit (1);
+
+ dup (i);
+ dup (i); /* handle standart I/O */
+
+ sprintf (spid, "/tmp/tuxanci-server-%d.pid", ipid);
+
+ /* create local lock */
+ lockfd = open (spid, O_RDWR | O_CREAT, 0640);
+
+ if (lockfd < 0) {
+ perror ("lock: open");
+ exit (1);
+ }
+ #ifndef __CYGWIN__
+ /* lock the file */
+ if (lockf (lockfd, F_TLOCK, 0) < 0) {
+ perror ("lock: lockf");
+ printf ("> tuxanci-server is already running.\n");
+ exit (0);
+ }
+ #else
+ /* lock the file */
+ {
+ struct flock lock;
+ lock.l_type = F_RDLCK;
+ lock.l_start = 0;
+ lock.l_whence = SEEK_SET;
+ lock.l_len = 0;
+
+ if (fcntl (lockfd, F_SETLK, &lock) < 0) {
+ printf ("> tuxanci-server is already running.\n");
+ exit (0);
+ }
+ }
+ #endif
+ /* write to pid to lockfile */
+ snprintf (pid, 16, "%d\n", getpid ());
+ write (lockfd, pid, strlen (pid));
+
+ /* restrict created files to 0750 */
+ umask (027);
+}
+#endif
+
+static int public_server_register()
{
#ifndef __WIN32
int s;
@@ -275,7 +365,7 @@ int public_server_init()
server_set_max_clients(atoi (public_server_get_setting("MAX_CLIENTS", "--max-clients", "32")));
- if (registerPublicServer() < 0) {
+ if (public_server_register() < 0) {
printf(_("Unable to contact MasterServer!)\n"));
}
@@ -287,7 +377,7 @@ arenaFile_t *choice_arena_get()
return choice_arenaFile;
}
-void eventPublicServer()
+void public_server_event()
{
static my_time_t lastActive = 0;
my_time_t interval;
@@ -354,9 +444,13 @@ int public_server_start()
return -1;
}
- while (1) {
- eventPublicServer();
- }
+ char *s = public_server_get_setting("DAEMON", "--daemon", "none");
+
+ if (atoi(s))
+ daemonize();
+
+ for (;;)
+ public_server_event();
return 0;
}