summary refs log tree commit diff
path: root/pkgs/servers/uhub/systemd.patch
blob: 05e7571d18d5f1ba9a93c9e49830c4a87e224abb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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