kpmpgsmkii/server/src/main.c

166 lines
4.7 KiB
C

/*
* Kangaroo Punch MultiPlayer Game Server Mark II
* Copyright (C) 2020-2021 Scott Duensing
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include "os.h"
#include "console.h"
#include "stddclmr.h"
#include "server.h"
#include "rest.h"
#include "database.h"
#include "settings.h"
#include "thirdparty/ini/src/ini.h"
// Exported in os.h
uint8_t __running = 1;
uint8_t __restAvailable = 1;
// "Config" items come from the INI file. "Settings" are from the database.
static char *_configServer = NULL;
static uint32_t _configPort = 0;
static char *_configDatabase = NULL;
static char *_configUser = NULL;
static char *_configPassword = NULL;
static void configRead(char *file);
static void configWrite(char *file);
static void configRead(char *file) {
ini_t *ini = NULL;
// Numeric defaults.
_configPort = 16550;
ini = ini_load(file);
if (ini) {
ini_sget(ini, "SERVER", "PORT", "%d", &_configPort);
_configServer = strdup(ini_get(ini, "SERVER", "HOST"));
_configDatabase = strdup(ini_get(ini, "SERVER", "DATA"));
_configUser = strdup(ini_get(ini, "SERVER", "USER"));
_configPassword = strdup(ini_get(ini, "SERVER", "PASS"));
ini_free(ini);
}
// String defaults.
if (!_configServer) strdup("kanga.world");
if (!_configDatabase) strdup("kangaworld");
if (!_configUser) strdup("kangaworld");
if (!_configPassword) strdup("");
}
static void configWrite(char *file) {
FILE *out = NULL;
out = fopen(file, "w");
if (out) {
fprintf(out,
"[SERVER]\n"
"HOST=%s\n"
"PORT=%d\n"
"DATA=%s\n"
"USER=%s\n"
"PASS=%s\n",
_configServer,
(int)_configPort,
_configDatabase,
_configUser,
_configPassword
);
fclose(out);
}
DEL(_configServer);
DEL(_configDatabase);
DEL(_configUser);
DEL(_configPassword);
}
int main(int argc, char *argv[]) {
char *configFile = NULL;
char hostname[256] = { 0 };
(void)argc;
memoryStartup(argv[0]);
logOpenByHandle(memoryLogHandleGet());
logWrite("%s", "Kangaroo Punch MultiPlayer Game Server Mark II\n");
logWrite("%s", "Copyright (C) 2020-2021 Scott Duensing scott@kangaroopunch.com\n\n");
// Load our config.
configFile = utilAppNameWithNewExtensionGet(argv[0], "ini");
configRead(configFile);
// Find our hostname.
gethostname(hostname, 256);
// Connect to database.
if (!dbConnect(_configServer, _configPort, _configDatabase, _configUser, _configPassword)) {
utilDie("Unable to connect to database.\n");
}
// Fetch settings needed to start server.
if (!dbSettingsValueGet(hostname, "maxClients", (int32_t *)&__settingsMaxClients)) utilDie("Unable to load maxClients.\n");
if (!dbSettingsValueGet(hostname, "portNumber", (int32_t *)&__settingsPortNumber)) utilDie("Unable to load portNumber.\n");
if (!dbSettingsValueGet(hostname, "clientVersion", (int32_t *)&__settingsClientVersion)) utilDie("Unable to load clientVersion.\n");
if (!dbSettingsStringGet(hostname, "fileLocation", __settingsFile, DB_CONFIG_ITEM_SIZE)) utilDie("Unable to load file location.\n");
if (!dbSettingsStringGet(hostname, "restEndpoint", __settingsRest, DB_CONFIG_ITEM_SIZE)) utilDie("Unable to load REST URL.\n");
if (!dbSettingsStringGet(hostname, "restUser", __settingsUser, DB_CONFIG_ITEM_SIZE)) utilDie("Unable to load REST user.\n");
if (!dbSettingsStringGet(hostname, "restPassword", __settingsPass, DB_CONFIG_ITEM_SIZE)) utilDie("Unable to load REST password.\n");
// Start up REST.
if (!restStartup(__settingsRest, __settingsUser, __settingsPass)) {
logWrite("Unable to locate REST endpoint. Web site integration disabled.\n");
__restAvailable = 0;
}
clientStartup();
serverStartup(__settingsPortNumber, __settingsMaxClients);
logWrite("Server online.\n");
// Run Console.
consoleRun();
// Console closed. Stop server.
__running = 0;
// Wait for all running threads to shut down.
logWrite("Shutting down.\n");
serverShutdown();
clientShutdown();
// Shut down.
restShutdown();
configWrite(configFile);
DEL(configFile);
dbDisconnect();
logWrite("Shutdown complete.\n");
logClose();
memoryShutdown();
pthread_exit(NULL);
}