diff options
| author | fusion32 <marcopuzziello@gmail.com> | 2025-07-22 22:22:01 -0300 |
|---|---|---|
| committer | fusion32 <marcopuzziello@gmail.com> | 2025-07-22 22:22:01 -0300 |
| commit | 82b82dca7d621bf4530416c7c5e9fc69874eecd3 (patch) | |
| tree | 92c6bfd20e9a926854ac40cd380c6c37cc7e5ab3 /src/querymanager.cc | |
| parent | 29f6d814a276af83d9fb98a398ac8d22d8b6e9c1 (diff) | |
| download | querymanager-82b82dca7d621bf4530416c7c5e9fc69874eecd3.tar.gz querymanager-82b82dca7d621bf4530416c7c5e9fc69874eecd3.zip | |
improvements and bug fixes
- Add support for SIGINT and SIGTERM signals for graceful termination.
- Properly check premium account status with `EVICT_FREE_ACCOUNTS`
query.
- Properly check if character is already online before failing game
login with "too many characters" error.
- Overall cleanup.
Diffstat (limited to 'src/querymanager.cc')
| -rw-r--r-- | src/querymanager.cc | 61 |
1 files changed, 48 insertions, 13 deletions
diff --git a/src/querymanager.cc b/src/querymanager.cc index 26d2855..5086032 100644 --- a/src/querymanager.cc +++ b/src/querymanager.cc @@ -1,19 +1,28 @@ #include "querymanager.hh" +// TODO(fusion): Support windows eventually? +#if OS_LINUX +# include <errno.h> +# include <signal.h> +#else +# error "Operating system not currently supported." +#endif + +// Shutdown Signal +int g_ShutdownSignal = 0; + // Time int g_MonotonicTimeMS = 0; -// Database CONFIG +// Config char g_DatabaseFile[1024] = "tibia.db"; int g_MaxCachedStatements = 100; - -// Connection CONFIG -char g_Password[30] = ""; -int g_Port = 7174; +int g_UpdateRate = 20; +int g_QueryManagerPort = 7174; +char g_QueryManagerPassword[30] = ""; int g_MaxConnections = 50; int g_MaxConnectionIdleTime = 60000; int g_MaxConnectionPacketSize = (int)MB(1); -int g_UpdateRate = 20; void LogAdd(const char *Prefix, const char *Format, ...){ char Entry[4096]; @@ -331,18 +340,18 @@ bool ReadConfig(const char *FileName){ ReadStringConfig(g_DatabaseFile, (int)sizeof(g_DatabaseFile), Val); }else if(StringEqCI(Key, "MaxCachedStatements")){ ReadIntegerConfig(&g_MaxCachedStatements, Val); - }else if(StringEqCI(Key, "Password")){ - ReadStringConfig(g_Password, (int)sizeof(g_Password), Val); - }else if(StringEqCI(Key, "Port")){ - ReadIntegerConfig(&g_Port, Val); + }else if(StringEqCI(Key, "UpdateRate")){ + ReadIntegerConfig(&g_UpdateRate, Val); + }else if(StringEqCI(Key, "QueryManagerPort")){ + ReadIntegerConfig(&g_QueryManagerPort, Val); + }else if(StringEqCI(Key, "QueryManagerPassword")){ + ReadStringConfig(g_QueryManagerPassword, (int)sizeof(g_QueryManagerPassword), Val); }else if(StringEqCI(Key, "MaxConnections")){ ReadIntegerConfig(&g_MaxConnections, Val); }else if(StringEqCI(Key, "MaxConnectionIdleTime")){ ReadDurationConfig(&g_MaxConnectionIdleTime, Val); }else if(StringEqCI(Key, "MaxConnectionPacketSize")){ ReadSizeConfig(&g_MaxConnectionPacketSize, Val); - }else if(StringEqCI(Key, "UpdateRate")){ - ReadIntegerConfig(&g_UpdateRate, Val); }else{ LOG_WARN("Unknown config \"%s\"", Key); } @@ -352,10 +361,33 @@ bool ReadConfig(const char *FileName){ return true; } +static bool SigHandler(int SigNr, sighandler_t Handler){ + struct sigaction Action = {}; + Action.sa_handler = Handler; + sigfillset(&Action.sa_mask); + if(sigaction(SigNr, &Action, NULL) == -1){ + LOG_ERR("Failed to change handler for signal %d (%s): (%d) %s", + SigNr, sigdescr_np(SigNr), errno, strerrordesc_np(errno)); + return false; + } + return true; +} + +static void ShutdownHandler(int SigNr){ + g_ShutdownSignal = SigNr; +} + int main(int argc, const char **argv){ (void)argc; (void)argv; + g_ShutdownSignal = 0; + if(!SigHandler(SIGPIPE, SIG_IGN) + || !SigHandler(SIGINT, ShutdownHandler) + || !SigHandler(SIGTERM, ShutdownHandler)){ + return EXIT_FAILURE; + } + int64 StartTime = GetClockMonotonicMS(); g_MonotonicTimeMS = 0; @@ -376,7 +408,7 @@ int main(int argc, const char **argv){ LOG("Running at %d updates per second...", g_UpdateRate); int64 UpdateInterval = 1000 / (int64)g_UpdateRate; - while(true){ + while(g_ShutdownSignal == 0){ int64 UpdateStart = GetClockMonotonicMS(); g_MonotonicTimeMS = (int)(UpdateStart - StartTime); ProcessConnections(); @@ -387,5 +419,8 @@ int main(int argc, const char **argv){ } } + LOG("Received signal %d (%s), shutting down...", + g_ShutdownSignal, sigdescr_np(g_ShutdownSignal)); + return EXIT_SUCCESS; } |
