diff options
| -rw-r--r-- | src/net/udp.c | 25 | ||||
| -rw-r--r-- | src/screen/gameType.c | 10 | ||||
| -rw-r--r-- | src/screen/world.c | 32 | ||||
| -rw-r--r-- | src/server/publicServer.c | 106 |
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; } |