166 lines
4.7 KiB
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);
|
|
}
|