aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver
diff options
context:
space:
mode:
authorLiam Mitchell <[email protected]>2025-03-13 17:46:06 -0700
committerGitHub Enterprise <[email protected]>2025-03-13 17:46:06 -0700
commit64f9055d3b5c445c57a0f2dacd20853667013819 (patch)
tree54cf2adb63dec15affcdb796335b472d19e06bac /src/zenserver
parentchangelog (diff)
parentUpdate Linux service type and add libsystemd dependency (diff)
downloadzen-64f9055d3b5c445c57a0f2dacd20853667013819.tar.xz
zen-64f9055d3b5c445c57a0f2dacd20853667013819.zip
Merge pull request #288 from ue-foundation/lm/zen-service-command
Implementation of service commands for Linux.
Diffstat (limited to 'src/zenserver')
-rw-r--r--src/zenserver/main.cpp53
-rw-r--r--src/zenserver/windows/service.cpp8
-rw-r--r--src/zenserver/windows/service.h4
3 files changed, 57 insertions, 8 deletions
diff --git a/src/zenserver/main.cpp b/src/zenserver/main.cpp
index f35010866..9ae54bdf1 100644
--- a/src/zenserver/main.cpp
+++ b/src/zenserver/main.cpp
@@ -23,6 +23,8 @@
#include <zencore/memory/memorytrace.h>
#include <zencore/memory/newdelete.h>
+#include <zenutil/service.h>
+
#include "config.h"
#include "diag/logging.h"
#include "sentryintegration.h"
@@ -32,6 +34,10 @@
# include "windows/service.h"
#endif
+#if ZEN_PLATFORM_LINUX
+# include <systemd/sd-daemon.h>
+#endif
+
//////////////////////////////////////////////////////////////////////////
// We don't have any doctest code in this file but this is needed to bring
// in some shared code into the executable
@@ -88,6 +94,43 @@ ZenEntryPoint::ZenEntryPoint(ZenServerOptions& ServerOptions) : m_ServerOptions(
{
}
+void
+ReportServiceStatus(ServiceStatus Status)
+{
+#if ZEN_PLATFORM_WINDOWS
+ switch (Status)
+ {
+ case ServiceStatus::Starting:
+ ReportSvcStatus(SERVICE_START_PENDING, NO_ERROR, 3000);
+ break;
+ case ServiceStatus::Running:
+ ReportSvcStatus(SERVICE_RUNNING, NO_ERROR, 0);
+ break;
+ case ServiceStatus::Stopping:
+ ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
+ break;
+ case ServiceStatus::Stopped:
+ ReportSvcStatus(SERVICE_STOPPED, (DWORD)ApplicationExitCode(), 0);
+ break;
+ default:
+ break;
+ }
+#elif ZEN_PLATFORM_LINUX
+ switch (Status)
+ {
+ case ServiceStatus::Running:
+ sd_notify(0, "READY=1");
+ break;
+ case ServiceStatus::Stopping:
+ sd_notify(0, "STOPPING=1");
+ break;
+ case ServiceStatus::Stopped:
+ sd_notifyf(0, "EXIT_STATUS=%d", ApplicationExitCode());
+ break;
+ }
+#endif
+}
+
int
ZenEntryPoint::Run()
{
@@ -281,6 +324,8 @@ ZenEntryPoint::Run()
}});
auto CleanupShutdown = MakeGuard([&ShutdownEvent, &ShutdownThread] {
+ ReportServiceStatus(ServiceStatus::Stopping);
+
if (ShutdownEvent)
{
ShutdownEvent->Set();
@@ -302,6 +347,8 @@ ZenEntryPoint::Run()
NamedEvent ParentEvent{m_ServerOptions.ChildId};
ParentEvent.Set();
}
+
+ ReportServiceStatus(ServiceStatus::Running);
});
Server.Run();
@@ -327,6 +374,8 @@ ZenEntryPoint::Run()
ShutdownServerLogging();
+ ReportServiceStatus(ServiceStatus::Stopped);
+
return ApplicationExitCode();
}
@@ -396,6 +445,10 @@ main(int argc, char* argv[])
signal(SIGINT, utils::SignalCallbackHandler);
signal(SIGTERM, utils::SignalCallbackHandler);
+#if ZEN_PLATFORM_LINUX
+ IgnoreChildSignals();
+#endif
+
try
{
ZenServerOptions ServerOptions;
diff --git a/src/zenserver/windows/service.cpp b/src/zenserver/windows/service.cpp
index cb87df1f6..4be5e6205 100644
--- a/src/zenserver/windows/service.cpp
+++ b/src/zenserver/windows/service.cpp
@@ -21,7 +21,6 @@ HANDLE ghSvcStopEvent = NULL;
void SvcInstall(void);
-void ReportSvcStatus(DWORD, DWORD, DWORD);
void SvcReportEvent(LPTSTR);
WindowsService::WindowsService()
@@ -222,14 +221,7 @@ WindowsService::SvcMain()
return 1;
}
- // Report running status when initialization is complete.
-
- ReportSvcStatus(SERVICE_RUNNING, NO_ERROR, 0);
-
int ReturnCode = Run();
-
- ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0);
-
return ReturnCode;
}
diff --git a/src/zenserver/windows/service.h b/src/zenserver/windows/service.h
index 7c9610983..ca0270a36 100644
--- a/src/zenserver/windows/service.h
+++ b/src/zenserver/windows/service.h
@@ -2,6 +2,8 @@
#pragma once
+#include <zencore/windows.h>
+
class WindowsService
{
public:
@@ -18,3 +20,5 @@ public:
int SvcMain();
static void __stdcall SvcCtrlHandler(unsigned long);
};
+
+VOID ReportSvcStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint);