nixpkgs/pkgs/servers/uhub/systemd.patch
2014-09-01 10:53:19 +04:00

165 lines
4.8 KiB
Diff

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 40e996e..fc4fb01 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,6 +19,7 @@ option(LINK_SUPPORT "Allow hub linking" OFF)
option(SSL_SUPPORT "Enable SSL support" ON)
option(USE_OPENSSL "Use OpenSSL's SSL support" ON )
option(SQLITE_SUPPORT "Enable SQLite support" ON)
+option(SYSTEMD_SUPPORT "Enable systemd notify and journal logging" OFF)
option(ADC_STRESS "Enable the stress tester client" OFF)
find_package(Git)
@@ -34,6 +35,12 @@ if (SSL_SUPPORT)
endif()
endif()
+if (SYSTEMD_SUPPORT)
+ INCLUDE(FindPkgConfig)
+ pkg_search_module(SD_DAEMON REQUIRED libsystemd-daemon)
+ pkg_search_module(SD_JOURNAL REQUIRED libsystemd-journal)
+endif()
+
if (MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
@@ -175,6 +182,18 @@ if(SSL_SUPPORT)
endif()
endif()
+if (SYSTEMD_SUPPORT)
+ target_link_libraries(uhub ${SD_DAEMON_LIBRARIES})
+ target_link_libraries(uhub ${SD_JOURNAL_LIBRARIES})
+ target_link_libraries(test ${SD_DAEMON_LIBRARIES})
+ target_link_libraries(test ${SD_JOURNAL_LIBRARIES})
+ target_link_libraries(uhub-passwd ${SD_JOURNAL_LIBRARIES})
+ target_link_libraries(uhub-admin ${SD_JOURNAL_LIBRARIES})
+ include_directories(${SD_DAEMON_INCLUDE_DIRS})
+ include_directories(${SD_JOURNAL_INCLUDE_DIRS})
+ add_definitions(-DSYSTEMD)
+endif()
+
configure_file ("${PROJECT_SOURCE_DIR}/version.h.in" "${PROJECT_SOURCE_DIR}/version.h")
mark_as_advanced(FORCE CMAKE_BUILD_TYPE)
diff --git a/src/core/main.c b/src/core/main.c
index bb78672..ac2d2a8 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -19,6 +19,10 @@
#include "uhub.h"
+#ifdef SYSTEMD
+#include <systemd/sd-daemon.h>
+#endif
+
static int arg_verbose = 5;
static int arg_fork = 0;
static int arg_check_config = 0;
@@ -145,7 +149,16 @@ int main_loop()
}
#if !defined(WIN32)
setup_signal_handlers(hub);
-#endif
+#ifdef SYSTEMD
+ /* Notify the service manager that this daemon has
+ * been successfully initalized and shall enter the
+ * main loop.
+ */
+ sd_notifyf(0, "READY=1\n"
+ "MAINPID=%lu", (unsigned long) getpid());
+#endif /* SYSTEMD */
+
+#endif /* ! WIN32 */
}
hub_set_variables(hub, &acl);
@@ -216,13 +229,17 @@ void print_usage(char* program)
" -q Quiet mode - no output\n"
" -f Fork to background\n"
" -l <file> Log messages to given file (default: stderr)\n"
- " -L Log messages to syslog\n"
" -c <file> Specify configuration file (default: " SERVER_CONFIG ")\n"
" -C Check configuration and return\n"
" -s Show configuration parameters\n"
" -S Show configuration parameters, but ignore defaults\n"
" -h This message\n"
#ifndef WIN32
+#ifdef SYSTEMD
+ " -L Log messages to journal\n"
+#else
+ " -L Log messages to syslog\n"
+#endif
" -u <user> Run as given user\n"
" -g <group> Run with given group permissions\n"
" -p <file> Store pid in file (process id)\n"
diff --git a/src/util/log.c b/src/util/log.c
index 42badb3..2d97528 100644
--- a/src/util/log.c
+++ b/src/util/log.c
@@ -21,7 +21,15 @@
#include <locale.h>
#ifndef WIN32
+
+#ifdef SYSTEMD
+#define SD_JOURNAL_SUPPRESS_LOCATION
+#include <systemd/sd-journal.h>
+
+#else
#include <syslog.h>
+#endif
+
static int use_syslog = 0;
#endif
@@ -83,7 +91,9 @@ void hub_log_initialize(const char* file, int syslog)
if (syslog)
{
use_syslog = 1;
+ #ifndef SYSTEMD
openlog("uhub", LOG_PID, LOG_USER);
+ #endif
}
#endif
@@ -132,7 +142,9 @@ void hub_log_shutdown()
if (use_syslog)
{
use_syslog = 0;
+ #ifndef SYSTEMD
closelog();
+ #endif
}
#endif
}
@@ -212,7 +224,12 @@ void hub_log(int log_verbosity, const char *format, ...)
case log_fatal: level = LOG_CRIT; break;
case log_error: level = LOG_ERR; break;
case log_warning: level = LOG_WARNING; break;
- case log_user: level = LOG_INFO | LOG_AUTH; break;
+ #ifdef SYSTEMD
+ case log_user: level = LOG_INFO; break;
+
+ #else
+ case log_user: level = LOG_INFO | LOG_AUTH; break;
+ #endif
case log_info: level = LOG_INFO; break;
case log_debug: level = LOG_DEBUG; break;
@@ -224,8 +241,13 @@ void hub_log(int log_verbosity, const char *format, ...)
if (level == 0)
return;
+ #ifdef SYSTEMD
+ sd_journal_print(level, "%s", logmsg);
+
+ #else
level |= (LOG_USER | LOG_DAEMON);
syslog(level, "%s", logmsg);
+ #endif
}
#endif