summaryrefslogtreecommitdiff
path: root/src/server/publicServer.c
diff options
context:
space:
mode:
authorMichal Zima <xhire@mujmalysvet.cz>2010-07-15 14:06:03 +0200
committerMichal Zima <xhire@mujmalysvet.cz>2010-07-15 14:06:03 +0200
commitd57dbc1bdb8bbafbab151700f131ec31385f6d0f (patch)
tree143c765c2e27411471779ece45a515ab05bfa529 /src/server/publicServer.c
parent7a32d3e2544ba4a50ff3f8acb8bf402a240d4fba (diff)
[GS] Unregister from Master Server on shutdown
Diffstat (limited to 'src/server/publicServer.c')
-rw-r--r--src/server/publicServer.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/server/publicServer.c b/src/server/publicServer.c
index 2f41619..ba97f7d 100644
--- a/src/server/publicServer.c
+++ b/src/server/publicServer.c
@@ -116,6 +116,9 @@ static void daemonize()
#endif /* __WIN32__ */
}
+/**
+ * Tell MasterServer that we want to be propagated
+ */
static int public_server_register()
{
#ifndef __WIN32__
@@ -181,6 +184,74 @@ static int public_server_register()
}
}
+/**
+ * Tell MasterServer that we are shutting down
+ */
+static int public_server_unregister()
+{
+#ifndef __WIN32__
+ int s;
+#else /* __WIN32__ */
+ SOCKET s;
+#endif /* __WIN32__ */
+
+ struct sockaddr_in server;
+ char *master_server_ip;
+
+ master_server_ip = dns_resolv(NET_MASTER_SERVER_DOMAIN);
+
+ if (master_server_ip == NULL) {
+ warning("Did not obtained IP of the MasterServer");
+ 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, IPPROTO_TCP)) < 0) {
+ warning("Unable to open socket for connection to MasterServer");
+ return -1;
+ }
+
+ /* connect to MasterServer */
+ if (connect(s, (struct sockaddr *) &server, sizeof(server)) < 0) {
+ warning("Unable to estabilish connection to MasterServer");
+ return -1;
+ }
+
+ typedef struct {
+ unsigned char cmd;
+ unsigned port;
+ unsigned ip;
+ } __PACKED__ register_head;
+
+ register_head *head = (register_head *) malloc(sizeof(register_head));
+
+ head->cmd = 'u';
+ head->port = atoi(public_server_get_setting("PORT4", "--port4", "6800"));
+ head->ip = 0; /* TODO */
+
+ /* send request for server list */
+ int r = send(s, head, sizeof(register_head), 0);
+
+ free(head);
+
+#ifndef __WIN32__
+ close(s);
+#else /* __WIN32__ */
+ closesocket(s);
+#endif /* __WIN32__ */
+
+ if (r == -1) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
static int public_server_initNetwork()
{
char ip4[STR_IP_SIZE];
@@ -326,6 +397,13 @@ void public_server_quit()
debug("Shutting down the Tuxanci game server");
/* TODO: Why not to log it? */
+ if (atoi(public_server_get_setting("LAN_ONLY", "--lan-only", "0")) == 0) {
+ if (public_server_unregister() < 0) {
+ error("Unable to contact MasterServer");
+ /* TODO: Why not to log it? */
+ }
+ }
+
net_multiplayer_quit();
arena_destroy(arena);