Accepting request 68825 from Base:System
update to 5.8.0 OBS-URL: https://build.opensuse.org/request/show/68825 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/rsyslog?expand=0&rev=26
This commit is contained in:
commit
a3f392757f
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:38c5f3639d316d1fd78bb933a701063be0910977c71ba775fabac0eb3f94c013
|
||||
size 1848178
|
3
rsyslog-5.8.0.tar.bz2
Normal file
3
rsyslog-5.8.0.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6ca538374f347eddff5f827f8f14792b0f3cda82dbbeecfe6509ea65e3a5f779
|
||||
size 1904404
|
@ -1,281 +0,0 @@
|
||||
From 21f69b2c3a95c990ea123d078b08c554cab1d121 Mon Sep 17 00:00:00 2001
|
||||
From: Rainer Gerhards <rgerhards@adiscon.com>
|
||||
Date: Fri, 8 Apr 2011 11:04:38 +0200
|
||||
Subject: [PATCH] bugfix: race condition in deferred name resolution
|
||||
|
||||
Note that this actually is a very small change, but I needed
|
||||
to shuffle a lot of code around in order to make it compile
|
||||
(due to required define order...).
|
||||
|
||||
Signed-off-by: Marius Tomaschewski <mt@suse.de>
|
||||
---
|
||||
runtime/msg.c | 232 +++++++++++++++++++++++++++++----------------------------
|
||||
1 files changed, 117 insertions(+), 115 deletions(-)
|
||||
|
||||
diff --git a/runtime/msg.c b/runtime/msg.c
|
||||
index 409515a..8a1e66a 100644
|
||||
--- a/runtime/msg.c
|
||||
+++ b/runtime/msg.c
|
||||
@@ -287,6 +287,121 @@ static pthread_mutex_t mutTrimCtr; /* mutex to handle malloc trim */
|
||||
static int getAPPNAMELen(msg_t *pM, sbool bLockMutex);
|
||||
|
||||
|
||||
+/* The following functions will support advanced output module
|
||||
+ * multithreading, once this is implemented. Currently, we
|
||||
+ * include them as hooks only. The idea is that we need to guard
|
||||
+ * some msg objects data fields against concurrent access if
|
||||
+ * we run on multiple threads. Please note that in any case this
|
||||
+ * is not necessary for calls from INPUT modules, because they
|
||||
+ * construct the message object and do this serially. Only when
|
||||
+ * the message is in the processing queue, multiple threads may
|
||||
+ * access a single object. Consequently, there are no guard functions
|
||||
+ * for "set" methods, as these are called during input. Only "get"
|
||||
+ * functions that modify important structures have them.
|
||||
+ * rgerhards, 2007-07-20
|
||||
+ * We now support locked and non-locked operations, depending on
|
||||
+ * the configuration of rsyslog. To support this, we use function
|
||||
+ * pointers. Initially, we start in non-locked mode. There, all
|
||||
+ * locking operations call into dummy functions. When locking is
|
||||
+ * enabled, the function pointers are changed to functions doing
|
||||
+ * actual work. We also introduced another MsgPrepareEnqueue() function
|
||||
+ * which initializes the locking structures, if needed. This is
|
||||
+ * necessary because internal messages during config file startup
|
||||
+ * processing are always created in non-locking mode. So we can
|
||||
+ * not initialize locking structures during constructions. We now
|
||||
+ * postpone this until when the message is fully constructed and
|
||||
+ * enqueued. Then we know the status of locking. This has a nice
|
||||
+ * side effect, and that is that during the initial creation of
|
||||
+ * the Msg object no locking needs to be done, which results in better
|
||||
+ * performance. -- rgerhards, 2008-01-05
|
||||
+ */
|
||||
+static void (*funcLock)(msg_t *pMsg);
|
||||
+static void (*funcUnlock)(msg_t *pMsg);
|
||||
+static void (*funcDeleteMutex)(msg_t *pMsg);
|
||||
+void (*funcMsgPrepareEnqueue)(msg_t *pMsg);
|
||||
+#if 1 /* This is a debug aid */
|
||||
+#define MsgLock(pMsg) funcLock(pMsg)
|
||||
+#define MsgUnlock(pMsg) funcUnlock(pMsg)
|
||||
+#else
|
||||
+#define MsgLock(pMsg) {dbgprintf("MsgLock line %d\n - ", __LINE__); funcLock(pMsg);; }
|
||||
+#define MsgUnlock(pMsg) {dbgprintf("MsgUnlock line %d - ", __LINE__); funcUnlock(pMsg); }
|
||||
+#endif
|
||||
+
|
||||
+/* the next function is a dummy to be used by the looking functions
|
||||
+ * when the class is not yet running in an environment where locking
|
||||
+ * is necessary. Please note that the need to lock can (and will) change
|
||||
+ * during a single run. Typically, this is depending on the operation mode
|
||||
+ * of the message queues (which is operator-configurable). -- rgerhards, 2008-01-05
|
||||
+ */
|
||||
+static void MsgLockingDummy(msg_t __attribute__((unused)) *pMsg)
|
||||
+{
|
||||
+ /* empty be design */
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/* The following function prepares a message for enqueue into the queue. This is
|
||||
+ * where a message may be accessed by multiple threads. This implementation here
|
||||
+ * is the version for multiple concurrent acces. It initializes the locking
|
||||
+ * structures.
|
||||
+ * TODO: change to an iRet interface! -- rgerhards, 2008-07-14
|
||||
+ */
|
||||
+static void MsgPrepareEnqueueLockingCase(msg_t *pThis)
|
||||
+{
|
||||
+ BEGINfunc
|
||||
+ assert(pThis != NULL);
|
||||
+ pthread_mutex_init(&pThis->mut, NULL);
|
||||
+ pThis->bDoLock = 1;
|
||||
+ ENDfunc
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/* ... and now the locking and unlocking implementations: */
|
||||
+static void MsgLockLockingCase(msg_t *pThis)
|
||||
+{
|
||||
+ /* DEV debug only! dbgprintf("MsgLock(0x%lx)\n", (unsigned long) pThis); */
|
||||
+ assert(pThis != NULL);
|
||||
+ if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
|
||||
+ pthread_mutex_lock(&pThis->mut);
|
||||
+}
|
||||
+
|
||||
+static void MsgUnlockLockingCase(msg_t *pThis)
|
||||
+{
|
||||
+ /* DEV debug only! dbgprintf("MsgUnlock(0x%lx)\n", (unsigned long) pThis); */
|
||||
+ assert(pThis != NULL);
|
||||
+ if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
|
||||
+ pthread_mutex_unlock(&pThis->mut);
|
||||
+}
|
||||
+
|
||||
+/* delete the mutex object on message destruction (locking case)
|
||||
+ */
|
||||
+static void MsgDeleteMutexLockingCase(msg_t *pThis)
|
||||
+{
|
||||
+ assert(pThis != NULL);
|
||||
+ pthread_mutex_destroy(&pThis->mut);
|
||||
+}
|
||||
+
|
||||
+/* enable multiple concurrent access on the message object
|
||||
+ * This works on a class-wide basis and can bot be undone.
|
||||
+ * That is, if it is once enabled, it can not be disabled during
|
||||
+ * the same run. When this function is called, no other thread
|
||||
+ * must manipulate message objects. Then we would have race conditions,
|
||||
+ * but guarding against this is counter-productive because it
|
||||
+ * would cost additional time. Plus, it would be a programming error.
|
||||
+ * rgerhards, 2008-01-05
|
||||
+ */
|
||||
+rsRetVal MsgEnableThreadSafety(void)
|
||||
+{
|
||||
+ DEFiRet;
|
||||
+ funcLock = MsgLockLockingCase;
|
||||
+ funcUnlock = MsgUnlockLockingCase;
|
||||
+ funcMsgPrepareEnqueue = MsgPrepareEnqueueLockingCase;
|
||||
+ funcDeleteMutex = MsgDeleteMutexLockingCase;
|
||||
+ RETiRet;
|
||||
+}
|
||||
+
|
||||
+/* end locking functions */
|
||||
+
|
||||
+
|
||||
static inline int getProtocolVersion(msg_t *pM)
|
||||
{
|
||||
return(pM->iProtocolVersion);
|
||||
@@ -306,6 +421,7 @@ resolveDNS(msg_t *pMsg) {
|
||||
uchar fromHostFQDN[NI_MAXHOST];
|
||||
DEFiRet;
|
||||
|
||||
+ MsgLock(pMsg);
|
||||
CHKiRet(objUse(net, CORE_COMPONENT));
|
||||
if(pMsg->msgFlags & NEEDS_DNSRESOL) {
|
||||
localRet = net.cvthname(pMsg->rcvFrom.pfrominet, fromHost, fromHostFQDN, fromHostIP);
|
||||
@@ -315,6 +431,7 @@ resolveDNS(msg_t *pMsg) {
|
||||
}
|
||||
}
|
||||
finalize_it:
|
||||
+ MsgUnlock(pMsg);
|
||||
if(iRet != RS_RET_OK) {
|
||||
/* best we can do: remove property */
|
||||
MsgSetRcvFromStr(pMsg, UCHAR_CONSTANT(""), 0, &propFromHost);
|
||||
@@ -531,121 +648,6 @@ uchar *propIDToName(propid_t propID)
|
||||
}
|
||||
|
||||
|
||||
-/* The following functions will support advanced output module
|
||||
- * multithreading, once this is implemented. Currently, we
|
||||
- * include them as hooks only. The idea is that we need to guard
|
||||
- * some msg objects data fields against concurrent access if
|
||||
- * we run on multiple threads. Please note that in any case this
|
||||
- * is not necessary for calls from INPUT modules, because they
|
||||
- * construct the message object and do this serially. Only when
|
||||
- * the message is in the processing queue, multiple threads may
|
||||
- * access a single object. Consequently, there are no guard functions
|
||||
- * for "set" methods, as these are called during input. Only "get"
|
||||
- * functions that modify important structures have them.
|
||||
- * rgerhards, 2007-07-20
|
||||
- * We now support locked and non-locked operations, depending on
|
||||
- * the configuration of rsyslog. To support this, we use function
|
||||
- * pointers. Initially, we start in non-locked mode. There, all
|
||||
- * locking operations call into dummy functions. When locking is
|
||||
- * enabled, the function pointers are changed to functions doing
|
||||
- * actual work. We also introduced another MsgPrepareEnqueue() function
|
||||
- * which initializes the locking structures, if needed. This is
|
||||
- * necessary because internal messages during config file startup
|
||||
- * processing are always created in non-locking mode. So we can
|
||||
- * not initialize locking structures during constructions. We now
|
||||
- * postpone this until when the message is fully constructed and
|
||||
- * enqueued. Then we know the status of locking. This has a nice
|
||||
- * side effect, and that is that during the initial creation of
|
||||
- * the Msg object no locking needs to be done, which results in better
|
||||
- * performance. -- rgerhards, 2008-01-05
|
||||
- */
|
||||
-static void (*funcLock)(msg_t *pMsg);
|
||||
-static void (*funcUnlock)(msg_t *pMsg);
|
||||
-static void (*funcDeleteMutex)(msg_t *pMsg);
|
||||
-void (*funcMsgPrepareEnqueue)(msg_t *pMsg);
|
||||
-#if 1 /* This is a debug aid */
|
||||
-#define MsgLock(pMsg) funcLock(pMsg)
|
||||
-#define MsgUnlock(pMsg) funcUnlock(pMsg)
|
||||
-#else
|
||||
-#define MsgLock(pMsg) {dbgprintf("MsgLock line %d\n - ", __LINE__); funcLock(pMsg);; }
|
||||
-#define MsgUnlock(pMsg) {dbgprintf("MsgUnlock line %d - ", __LINE__); funcUnlock(pMsg); }
|
||||
-#endif
|
||||
-
|
||||
-/* the next function is a dummy to be used by the looking functions
|
||||
- * when the class is not yet running in an environment where locking
|
||||
- * is necessary. Please note that the need to lock can (and will) change
|
||||
- * during a single run. Typically, this is depending on the operation mode
|
||||
- * of the message queues (which is operator-configurable). -- rgerhards, 2008-01-05
|
||||
- */
|
||||
-static void MsgLockingDummy(msg_t __attribute__((unused)) *pMsg)
|
||||
-{
|
||||
- /* empty be design */
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/* The following function prepares a message for enqueue into the queue. This is
|
||||
- * where a message may be accessed by multiple threads. This implementation here
|
||||
- * is the version for multiple concurrent acces. It initializes the locking
|
||||
- * structures.
|
||||
- * TODO: change to an iRet interface! -- rgerhards, 2008-07-14
|
||||
- */
|
||||
-static void MsgPrepareEnqueueLockingCase(msg_t *pThis)
|
||||
-{
|
||||
- BEGINfunc
|
||||
- assert(pThis != NULL);
|
||||
- pthread_mutex_init(&pThis->mut, NULL);
|
||||
- pThis->bDoLock = 1;
|
||||
- ENDfunc
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/* ... and now the locking and unlocking implementations: */
|
||||
-static void MsgLockLockingCase(msg_t *pThis)
|
||||
-{
|
||||
- /* DEV debug only! dbgprintf("MsgLock(0x%lx)\n", (unsigned long) pThis); */
|
||||
- assert(pThis != NULL);
|
||||
- if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
|
||||
- pthread_mutex_lock(&pThis->mut);
|
||||
-}
|
||||
-
|
||||
-static void MsgUnlockLockingCase(msg_t *pThis)
|
||||
-{
|
||||
- /* DEV debug only! dbgprintf("MsgUnlock(0x%lx)\n", (unsigned long) pThis); */
|
||||
- assert(pThis != NULL);
|
||||
- if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
|
||||
- pthread_mutex_unlock(&pThis->mut);
|
||||
-}
|
||||
-
|
||||
-/* delete the mutex object on message destruction (locking case)
|
||||
- */
|
||||
-static void MsgDeleteMutexLockingCase(msg_t *pThis)
|
||||
-{
|
||||
- assert(pThis != NULL);
|
||||
- pthread_mutex_destroy(&pThis->mut);
|
||||
-}
|
||||
-
|
||||
-/* enable multiple concurrent access on the message object
|
||||
- * This works on a class-wide basis and can bot be undone.
|
||||
- * That is, if it is once enabled, it can not be disabled during
|
||||
- * the same run. When this function is called, no other thread
|
||||
- * must manipulate message objects. Then we would have race conditions,
|
||||
- * but guarding against this is counter-productive because it
|
||||
- * would cost additional time. Plus, it would be a programming error.
|
||||
- * rgerhards, 2008-01-05
|
||||
- */
|
||||
-rsRetVal MsgEnableThreadSafety(void)
|
||||
-{
|
||||
- DEFiRet;
|
||||
- funcLock = MsgLockLockingCase;
|
||||
- funcUnlock = MsgUnlockLockingCase;
|
||||
- funcMsgPrepareEnqueue = MsgPrepareEnqueueLockingCase;
|
||||
- funcDeleteMutex = MsgDeleteMutexLockingCase;
|
||||
- RETiRet;
|
||||
-}
|
||||
-
|
||||
-/* end locking functions */
|
||||
-
|
||||
-
|
||||
/* This is common code for all Constructors. It is defined in an
|
||||
* inline'able function so that we can save a function call in the
|
||||
* actual constructors (otherwise, the msgConstruct would need
|
||||
--
|
||||
1.7.3.4
|
||||
|
@ -1,929 +0,0 @@
|
||||
commit 020e414396b9ed4d005b6b0f6fb6567fe954230c
|
||||
Author: Marius Tomaschewski <mt@suse.de>
|
||||
Date: Thu Jan 20 15:08:08 2011 +0100
|
||||
|
||||
Improved systemd socket activation support
|
||||
|
||||
Support for multiple unix sockets and activation in forking mode
|
||||
|
||||
commit f9a409137bdcd04ebf4851a23f573c436a14e5b2
|
||||
Author: Rainer Gerhards <rgerhards@adiscon.com>
|
||||
Date: Wed Sep 8 12:46:03 2010 +0200
|
||||
|
||||
moved systemd interface to rsyslog convenience lib
|
||||
|
||||
Mostly a refresh of sd-daemon.[ch] from its source plus some make file changes.
|
||||
We now have systemd interfaces inside rsyslog, so that all plugins interested can
|
||||
call the interfaces. Seems not to be totally necessary right now, but will help
|
||||
in the long term.
|
||||
|
||||
commit be3d81ee54088180a657ac37899d1def8ef4b36c
|
||||
Author: Rainer Gerhards <rgerhards@adiscon.com>
|
||||
Date: Tue Sep 7 14:19:05 2010 +0200
|
||||
|
||||
added forgotten files
|
||||
|
||||
commit 8b7ca000dec71f6dcb73a8ab738093c17bd293c1
|
||||
Author: Lennart Poettering <mailto:lennart@poettering.net>
|
||||
Date: Tue Sep 7 13:06:04 2010 +0200
|
||||
|
||||
acquire /dev/log socket optionally from systemd
|
||||
|
||||
[skipped whitespace-only changes -- mt@suse.de]
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index 89d5711..1e2aaa7 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,5 @@
|
||||
+- acquire /dev/log socket optionally from systemd
|
||||
+ thanks to Lennart Poettering for this patch
|
||||
---------------------------------------------------------------------------
|
||||
Version 5.6.5 [V5-STABLE] (rgerhards), 2011-03-22
|
||||
- bugfix: failover did not work correctly if repeated msg reduction was on
|
||||
diff --git a/plugins/imuxsock/Makefile.am b/plugins/imuxsock/Makefile.am
|
||||
index a2fe0ba..28f9f9e 100644
|
||||
--- a/plugins/imuxsock/Makefile.am
|
||||
+++ b/plugins/imuxsock/Makefile.am
|
||||
@@ -1,6 +1,6 @@
|
||||
pkglib_LTLIBRARIES = imuxsock.la
|
||||
|
||||
imuxsock_la_SOURCES = imuxsock.c
|
||||
-imuxsock_la_CPPFLAGS = -I$(top_srcdir) $(PTHREADS_CFLAGS) $(RSRT_CFLAGS)
|
||||
+imuxsock_la_CPPFLAGS = -DSD_EXPORT_SYMBOLS -I$(top_srcdir) $(PTHREADS_CFLAGS) $(RSRT_CFLAGS)
|
||||
imuxsock_la_LDFLAGS = -module -avoid-version
|
||||
-imuxsock_la_LIBADD =
|
||||
+imuxsock_la_LIBADD = $(RSRT_LIBS)
|
||||
diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c
|
||||
index 046f12f..fc6b1e7 100644
|
||||
--- a/plugins/imuxsock/imuxsock.c
|
||||
+++ b/plugins/imuxsock/imuxsock.c
|
||||
@@ -47,6 +47,7 @@
|
||||
#include "prop.h"
|
||||
#include "debug.h"
|
||||
#include "unlimited_select.h"
|
||||
+#include "sd-daemon.h"
|
||||
|
||||
MODULE_TYPE_INPUT
|
||||
|
||||
@@ -86,6 +87,7 @@ static prop_t *funixHName[MAXFUNIX] = { NULL, }; /* host-name override - if set,
|
||||
static int funixFlowCtl[MAXFUNIX] = { eFLOWCTL_NO_DELAY, }; /* flow control settings for this socket */
|
||||
static int funix[MAXFUNIX] = { -1, }; /* read-only after startup */
|
||||
static int nfunix = 1; /* number of Unix sockets open / read-only after startup */
|
||||
+static int sd_fds = 0; /* number of systemd activated sockers */
|
||||
|
||||
/* config settings */
|
||||
static int bOmitLocalLogging = 0;
|
||||
@@ -190,6 +192,20 @@ static int create_unix_socket(const char *path, int bCreatePath)
|
||||
if (path[0] == '\0')
|
||||
return -1;
|
||||
|
||||
+ if (sd_fds > 0) {
|
||||
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + sd_fds; fd++) {
|
||||
+ if( sd_is_socket_unix(fd, SOCK_DGRAM, -1, path, 0) == 1) {
|
||||
+ /* ok, it matches -- just use as is */
|
||||
+ return fd;
|
||||
+ }
|
||||
+ /*
|
||||
+ * otherwise it either didn't matched *this* socket and
|
||||
+ * we just continue to check the next one or there were
|
||||
+ * an error and we will recreate it bellow.
|
||||
+ */
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
unlink(path);
|
||||
|
||||
memset(&sunx, 0, sizeof(sunx));
|
||||
@@ -371,6 +387,11 @@ CODESTARTwillRun
|
||||
if(pLogSockName != NULL)
|
||||
funixn[0] = pLogSockName;
|
||||
|
||||
+ sd_fds = sd_listen_fds(0);
|
||||
+ if (sd_fds < 0) {
|
||||
+ errmsg.LogError(-sd_fds, NO_ERRCODE, "Failed to acquire systemd sockets");
|
||||
+ }
|
||||
+
|
||||
/* initialize and return if will run or not */
|
||||
for (i = startIndexUxLocalSockets ; i < nfunix ; i++) {
|
||||
if ((funix[i] = create_unix_socket((char*) funixn[i], funixCreateSockPath[i])) != -1)
|
||||
@@ -395,10 +416,19 @@ CODESTARTafterRun
|
||||
if (funix[i] != -1)
|
||||
close(funix[i]);
|
||||
|
||||
- /* Clean-up files. */
|
||||
- for(i = startIndexUxLocalSockets; i < nfunix; i++)
|
||||
- if (funixn[i] && funix[i] != -1)
|
||||
+ /* Clean-up files. If systemd passed us a socket it is
|
||||
+ * systemd's job to clean it up.*/
|
||||
+ for(i = startIndexUxLocalSockets; i < nfunix; i++) {
|
||||
+ if (funixn[i] && funix[i] != -1) {
|
||||
+ if (sd_fds > 0 &&
|
||||
+ funix[i] >= SD_LISTEN_FDS_START &&
|
||||
+ funix[i] < SD_LISTEN_FDS_START + sd_fds)
|
||||
+ continue;
|
||||
+
|
||||
unlink((char*) funixn[i]);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* free no longer needed string */
|
||||
free(pLogSockName);
|
||||
free(pLogHostName);
|
||||
diff --git a/runtime/Makefile.am b/runtime/Makefile.am
|
||||
index b700eae..27c56a2 100644
|
||||
--- a/runtime/Makefile.am
|
||||
+++ b/runtime/Makefile.am
|
||||
@@ -82,6 +82,8 @@ librsyslog_la_SOURCES = \
|
||||
prop.h \
|
||||
cfsysline.c \
|
||||
cfsysline.h \
|
||||
+ sd-daemon.c \
|
||||
+ sd-daemon.h \
|
||||
\
|
||||
\
|
||||
../action.h \
|
||||
@@ -100,9 +102,9 @@ librsyslog_la_SOURCES = \
|
||||
# runtime or will no longer be needed. -- rgerhards, 2008-06-13
|
||||
|
||||
if WITH_MODDIRS
|
||||
-librsyslog_la_CPPFLAGS = -D_PATH_MODDIR=\"$(pkglibdir)/:$(moddirs)\" $(PTHREADS_CFLAGS)
|
||||
+librsyslog_la_CPPFLAGS = -DSD_EXPORT_SYMBOLS -D_PATH_MODDIR=\"$(pkglibdir)/:$(moddirs)\" $(PTHREADS_CFLAGS)
|
||||
else
|
||||
-librsyslog_la_CPPFLAGS = -D_PATH_MODDIR=\"$(pkglibdir)/\" -I$(top_srcdir) $(PTHREADS_CFLAGS)
|
||||
+librsyslog_la_CPPFLAGS = -DSD_EXPORT_SYMBOLS -D_PATH_MODDIR=\"$(pkglibdir)/\" -I$(top_srcdir) $(PTHREADS_CFLAGS)
|
||||
endif
|
||||
#librsyslog_la_LDFLAGS = -module -avoid-version
|
||||
librsyslog_la_LIBADD = $(DL_LIBS) $(RT_LIBS)
|
||||
@@ -178,3 +180,6 @@ lmnsd_gtls_la_LDFLAGS = -module -avoid-version
|
||||
lmnsd_gtls_la_LIBADD = $(GNUTLS_LIBS)
|
||||
endif
|
||||
|
||||
+update-systemd:
|
||||
+ curl http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c > sd-daemon.c
|
||||
+ curl http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.h > sd-daemon.h
|
||||
diff --git a/runtime/sd-daemon.c b/runtime/sd-daemon.c
|
||||
new file mode 100644
|
||||
index 0000000..9c23b91
|
||||
--- /dev/null
|
||||
+++ b/runtime/sd-daemon.c
|
||||
@@ -0,0 +1,435 @@
|
||||
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||
+
|
||||
+/***
|
||||
+ Copyright 2010 Lennart Poettering
|
||||
+
|
||||
+ Permission is hereby granted, free of charge, to any person
|
||||
+ obtaining a copy of this software and associated documentation files
|
||||
+ (the "Software"), to deal in the Software without restriction,
|
||||
+ including without limitation the rights to use, copy, modify, merge,
|
||||
+ publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
+ and to permit persons to whom the Software is furnished to do so,
|
||||
+ subject to the following conditions:
|
||||
+
|
||||
+ The above copyright notice and this permission notice shall be
|
||||
+ included in all copies or substantial portions of the Software.
|
||||
+
|
||||
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
+ SOFTWARE.
|
||||
+***/
|
||||
+
|
||||
+#ifndef _GNU_SOURCE
|
||||
+#define _GNU_SOURCE
|
||||
+#endif
|
||||
+
|
||||
+#include <sys/types.h>
|
||||
+#include <sys/stat.h>
|
||||
+#include <sys/socket.h>
|
||||
+#include <sys/un.h>
|
||||
+#include <sys/fcntl.h>
|
||||
+#include <netinet/in.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <errno.h>
|
||||
+#include <unistd.h>
|
||||
+#include <string.h>
|
||||
+#include <stdarg.h>
|
||||
+#include <stdio.h>
|
||||
+
|
||||
+#include "sd-daemon.h"
|
||||
+
|
||||
+int sd_listen_fds(int unset_environment) {
|
||||
+
|
||||
+#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
|
||||
+ return 0;
|
||||
+#else
|
||||
+ int r, fd;
|
||||
+ const char *e;
|
||||
+ char *p = NULL;
|
||||
+ unsigned long l;
|
||||
+
|
||||
+ if (!(e = getenv("LISTEN_PID"))) {
|
||||
+ r = 0;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ errno = 0;
|
||||
+ l = strtoul(e, &p, 10);
|
||||
+
|
||||
+ if (errno != 0) {
|
||||
+ r = -errno;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if (!p || *p || l <= 0) {
|
||||
+ r = -EINVAL;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ /* Is this for us? */
|
||||
+ if (getpid() != (pid_t) l) {
|
||||
+ r = 0;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if (!(e = getenv("LISTEN_FDS"))) {
|
||||
+ r = 0;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ errno = 0;
|
||||
+ l = strtoul(e, &p, 10);
|
||||
+
|
||||
+ if (errno != 0) {
|
||||
+ r = -errno;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if (!p || *p) {
|
||||
+ r = -EINVAL;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int) l; fd ++) {
|
||||
+ int flags;
|
||||
+
|
||||
+ if ((flags = fcntl(fd, F_GETFD)) < 0) {
|
||||
+ r = -errno;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if (flags & FD_CLOEXEC)
|
||||
+ continue;
|
||||
+
|
||||
+ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
|
||||
+ r = -errno;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ r = (int) l;
|
||||
+
|
||||
+finish:
|
||||
+ if (unset_environment) {
|
||||
+ unsetenv("LISTEN_PID");
|
||||
+ unsetenv("LISTEN_FDS");
|
||||
+ }
|
||||
+
|
||||
+ return r;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+int sd_is_fifo(int fd, const char *path) {
|
||||
+ struct stat st_fd;
|
||||
+
|
||||
+ if (fd < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ memset(&st_fd, 0, sizeof(st_fd));
|
||||
+ if (fstat(fd, &st_fd) < 0)
|
||||
+ return -errno;
|
||||
+
|
||||
+ if (!S_ISFIFO(st_fd.st_mode))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (path) {
|
||||
+ struct stat st_path;
|
||||
+
|
||||
+ memset(&st_path, 0, sizeof(st_path));
|
||||
+ if (stat(path, &st_path) < 0) {
|
||||
+
|
||||
+ if (errno == ENOENT || errno == ENOTDIR)
|
||||
+ return 0;
|
||||
+
|
||||
+ return -errno;
|
||||
+ }
|
||||
+
|
||||
+ return
|
||||
+ st_path.st_dev == st_fd.st_dev &&
|
||||
+ st_path.st_ino == st_fd.st_ino;
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+static int sd_is_socket_internal(int fd, int type, int listening) {
|
||||
+ struct stat st_fd;
|
||||
+
|
||||
+ if (fd < 0 || type < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (fstat(fd, &st_fd) < 0)
|
||||
+ return -errno;
|
||||
+
|
||||
+ if (!S_ISSOCK(st_fd.st_mode))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (type != 0) {
|
||||
+ int other_type = 0;
|
||||
+ socklen_t l = sizeof(other_type);
|
||||
+
|
||||
+ if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &other_type, &l) < 0)
|
||||
+ return -errno;
|
||||
+
|
||||
+ if (l != sizeof(other_type))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (other_type != type)
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if (listening >= 0) {
|
||||
+ int accepting = 0;
|
||||
+ socklen_t l = sizeof(accepting);
|
||||
+
|
||||
+ if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &accepting, &l) < 0)
|
||||
+ return -errno;
|
||||
+
|
||||
+ if (l != sizeof(accepting))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (!accepting != !listening)
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+union sockaddr_union {
|
||||
+ struct sockaddr sa;
|
||||
+ struct sockaddr_in in4;
|
||||
+ struct sockaddr_in6 in6;
|
||||
+ struct sockaddr_un un;
|
||||
+ struct sockaddr_storage storage;
|
||||
+};
|
||||
+
|
||||
+int sd_is_socket(int fd, int family, int type, int listening) {
|
||||
+ int r;
|
||||
+
|
||||
+ if (family < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
|
||||
+ return r;
|
||||
+
|
||||
+ if (family > 0) {
|
||||
+ union sockaddr_union sockaddr;
|
||||
+ socklen_t l;
|
||||
+
|
||||
+ memset(&sockaddr, 0, sizeof(sockaddr));
|
||||
+ l = sizeof(sockaddr);
|
||||
+
|
||||
+ if (getsockname(fd, &sockaddr.sa, &l) < 0)
|
||||
+ return -errno;
|
||||
+
|
||||
+ if (l < sizeof(sa_family_t))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return sockaddr.sa.sa_family == family;
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) {
|
||||
+ union sockaddr_union sockaddr;
|
||||
+ socklen_t l;
|
||||
+ int r;
|
||||
+
|
||||
+ if (family != 0 && family != AF_INET && family != AF_INET6)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
|
||||
+ return r;
|
||||
+
|
||||
+ memset(&sockaddr, 0, sizeof(sockaddr));
|
||||
+ l = sizeof(sockaddr);
|
||||
+
|
||||
+ if (getsockname(fd, &sockaddr.sa, &l) < 0)
|
||||
+ return -errno;
|
||||
+
|
||||
+ if (l < sizeof(sa_family_t))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (sockaddr.sa.sa_family != AF_INET &&
|
||||
+ sockaddr.sa.sa_family != AF_INET6)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (family > 0)
|
||||
+ if (sockaddr.sa.sa_family != family)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (port > 0) {
|
||||
+ if (sockaddr.sa.sa_family == AF_INET) {
|
||||
+ if (l < sizeof(struct sockaddr_in))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return htons(port) == sockaddr.in4.sin_port;
|
||||
+ } else {
|
||||
+ if (l < sizeof(struct sockaddr_in6))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return htons(port) == sockaddr.in6.sin6_port;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) {
|
||||
+ union sockaddr_union sockaddr;
|
||||
+ socklen_t l;
|
||||
+ int r;
|
||||
+
|
||||
+ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
|
||||
+ return r;
|
||||
+
|
||||
+ memset(&sockaddr, 0, sizeof(sockaddr));
|
||||
+ l = sizeof(sockaddr);
|
||||
+
|
||||
+ if (getsockname(fd, &sockaddr.sa, &l) < 0)
|
||||
+ return -errno;
|
||||
+
|
||||
+ if (l < sizeof(sa_family_t))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (sockaddr.sa.sa_family != AF_UNIX)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (path) {
|
||||
+ if (length <= 0)
|
||||
+ length = strlen(path);
|
||||
+
|
||||
+ if (length <= 0)
|
||||
+ /* Unnamed socket */
|
||||
+ return l == sizeof(sa_family_t);
|
||||
+
|
||||
+ if (path[0])
|
||||
+ /* Normal path socket */
|
||||
+ return
|
||||
+ (l >= sizeof(sa_family_t) + length + 1) &&
|
||||
+ memcmp(path, sockaddr.un.sun_path, length+1) == 0;
|
||||
+ else
|
||||
+ /* Abstract namespace socket */
|
||||
+ return
|
||||
+ (l == sizeof(sa_family_t) + length) &&
|
||||
+ memcmp(path, sockaddr.un.sun_path, length) == 0;
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+int sd_notify(int unset_environment, const char *state) {
|
||||
+#if defined(DISABLE_SYSTEMD) || !defined(__linux__) || !defined(SOCK_CLOEXEC)
|
||||
+ return 0;
|
||||
+#else
|
||||
+ int fd = -1, r;
|
||||
+ struct msghdr msghdr;
|
||||
+ struct iovec iovec;
|
||||
+ union sockaddr_union sockaddr;
|
||||
+ const char *e;
|
||||
+
|
||||
+ if (!state) {
|
||||
+ r = -EINVAL;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if (!(e = getenv("NOTIFY_SOCKET")))
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Must be an abstract socket, or an absolute path */
|
||||
+ if ((e[0] != '@' && e[0] != '/') || e[1] == 0) {
|
||||
+ r = -EINVAL;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) {
|
||||
+ r = -errno;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ memset(&sockaddr, 0, sizeof(sockaddr));
|
||||
+ sockaddr.sa.sa_family = AF_UNIX;
|
||||
+ strncpy(sockaddr.un.sun_path, e, sizeof(sockaddr.un.sun_path));
|
||||
+
|
||||
+ if (sockaddr.un.sun_path[0] == '@')
|
||||
+ sockaddr.un.sun_path[0] = 0;
|
||||
+
|
||||
+ memset(&iovec, 0, sizeof(iovec));
|
||||
+ iovec.iov_base = (char*) state;
|
||||
+ iovec.iov_len = strlen(state);
|
||||
+
|
||||
+ memset(&msghdr, 0, sizeof(msghdr));
|
||||
+ msghdr.msg_name = &sockaddr;
|
||||
+ msghdr.msg_namelen = sizeof(sa_family_t) + strlen(e);
|
||||
+
|
||||
+ if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
|
||||
+ msghdr.msg_namelen = sizeof(struct sockaddr_un);
|
||||
+
|
||||
+ msghdr.msg_iov = &iovec;
|
||||
+ msghdr.msg_iovlen = 1;
|
||||
+
|
||||
+ if (sendmsg(fd, &msghdr, MSG_NOSIGNAL) < 0) {
|
||||
+ r = -errno;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
+ r = 1;
|
||||
+
|
||||
+finish:
|
||||
+ if (unset_environment)
|
||||
+ unsetenv("NOTIFY_SOCKET");
|
||||
+
|
||||
+ if (fd >= 0)
|
||||
+ close(fd);
|
||||
+
|
||||
+ return r;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+int sd_notifyf(int unset_environment, const char *format, ...) {
|
||||
+#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
|
||||
+ return 0;
|
||||
+#else
|
||||
+ va_list ap;
|
||||
+ char *p = NULL;
|
||||
+ int r;
|
||||
+
|
||||
+ va_start(ap, format);
|
||||
+ r = vasprintf(&p, format, ap);
|
||||
+ va_end(ap);
|
||||
+
|
||||
+ if (r < 0 || !p)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ r = sd_notify(unset_environment, p);
|
||||
+ free(p);
|
||||
+
|
||||
+ return r;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+int sd_booted(void) {
|
||||
+#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
|
||||
+ return 0;
|
||||
+#else
|
||||
+
|
||||
+ struct stat a, b;
|
||||
+
|
||||
+ /* We simply test whether the systemd cgroup hierarchy is
|
||||
+ * mounted */
|
||||
+
|
||||
+ if (lstat("/sys/fs/cgroup", &a) < 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (lstat("/sys/fs/cgroup/systemd", &b) < 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ return a.st_dev != b.st_dev;
|
||||
+#endif
|
||||
+}
|
||||
diff --git a/runtime/sd-daemon.h b/runtime/sd-daemon.h
|
||||
new file mode 100644
|
||||
index 0000000..45aac8b
|
||||
--- /dev/null
|
||||
+++ b/runtime/sd-daemon.h
|
||||
@@ -0,0 +1,261 @@
|
||||
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||
+
|
||||
+#ifndef foosddaemonhfoo
|
||||
+#define foosddaemonhfoo
|
||||
+
|
||||
+/***
|
||||
+ Copyright 2010 Lennart Poettering
|
||||
+
|
||||
+ Permission is hereby granted, free of charge, to any person
|
||||
+ obtaining a copy of this software and associated documentation files
|
||||
+ (the "Software"), to deal in the Software without restriction,
|
||||
+ including without limitation the rights to use, copy, modify, merge,
|
||||
+ publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
+ and to permit persons to whom the Software is furnished to do so,
|
||||
+ subject to the following conditions:
|
||||
+
|
||||
+ The above copyright notice and this permission notice shall be
|
||||
+ included in all copies or substantial portions of the Software.
|
||||
+
|
||||
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
+ SOFTWARE.
|
||||
+***/
|
||||
+
|
||||
+#include <sys/types.h>
|
||||
+#include <inttypes.h>
|
||||
+
|
||||
+#ifdef __cplusplus
|
||||
+extern "C" {
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ Reference implementation of a few systemd related interfaces for
|
||||
+ writing daemons. These interfaces are trivial to implement. To
|
||||
+ simplify porting we provide this reference implementation.
|
||||
+ Applications are welcome to reimplement the algorithms described
|
||||
+ here if they do not want to include these two source files.
|
||||
+
|
||||
+ The following functionality is provided:
|
||||
+
|
||||
+ - Support for logging with log levels on stderr
|
||||
+ - File descriptor passing for socket-based activation
|
||||
+ - Daemon startup and status notification
|
||||
+ - Detection of systemd boots
|
||||
+
|
||||
+ You may compile this with -DDISABLE_SYSTEMD to disable systemd
|
||||
+ support. This makes all those calls NOPs that are directly related to
|
||||
+ systemd (i.e. only sd_is_xxx() will stay useful).
|
||||
+
|
||||
+ Since this is drop-in code we don't want any of our symbols to be
|
||||
+ exported in any case. Hence we declare hidden visibility for all of
|
||||
+ them.
|
||||
+
|
||||
+ You may find an up-to-date version of these source files online:
|
||||
+
|
||||
+ http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.h
|
||||
+ http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c
|
||||
+
|
||||
+ This should compile on non-Linux systems, too, but with the
|
||||
+ exception of the sd_is_xxx() calls all functions will become NOPs.
|
||||
+
|
||||
+ See sd-daemon(7) for more information.
|
||||
+*/
|
||||
+
|
||||
+#if (__GNUC__ >= 4)
|
||||
+#define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
|
||||
+# if defined(SD_EXPORT_SYMBOLS)
|
||||
+# define _sd_hidden_
|
||||
+# else
|
||||
+# define _sd_hidden_ __attribute__ ((visibility("hidden")))
|
||||
+# endif
|
||||
+#else
|
||||
+#define _sd_printf_attr_(a,b)
|
||||
+#define _sd_hidden_
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ Log levels for usage on stderr:
|
||||
+
|
||||
+ fprintf(stderr, SD_NOTICE "Hello World!\n");
|
||||
+
|
||||
+ This is similar to printk() usage in the kernel.
|
||||
+*/
|
||||
+#define SD_EMERG "<0>" /* system is unusable */
|
||||
+#define SD_ALERT "<1>" /* action must be taken immediately */
|
||||
+#define SD_CRIT "<2>" /* critical conditions */
|
||||
+#define SD_ERR "<3>" /* error conditions */
|
||||
+#define SD_WARNING "<4>" /* warning conditions */
|
||||
+#define SD_NOTICE "<5>" /* normal but significant condition */
|
||||
+#define SD_INFO "<6>" /* informational */
|
||||
+#define SD_DEBUG "<7>" /* debug-level messages */
|
||||
+
|
||||
+/* The first passed file descriptor is fd 3 */
|
||||
+#define SD_LISTEN_FDS_START 3
|
||||
+
|
||||
+/*
|
||||
+ Returns how many file descriptors have been passed, or a negative
|
||||
+ errno code on failure. Optionally, removes the $LISTEN_FDS and
|
||||
+ $LISTEN_PID file descriptors from the environment (recommended, but
|
||||
+ problematic in threaded environments). If r is the return value of
|
||||
+ this function you'll find the file descriptors passed as fds
|
||||
+ SD_LISTEN_FDS_START to SD_LISTEN_FDS_START+r-1. Returns a negative
|
||||
+ errno style error code on failure. This function call ensures that
|
||||
+ the FD_CLOEXEC flag is set for the passed file descriptors, to make
|
||||
+ sure they are not passed on to child processes. If FD_CLOEXEC shall
|
||||
+ not be set, the caller needs to unset it after this call for all file
|
||||
+ descriptors that are used.
|
||||
+
|
||||
+ See sd_listen_fds(3) for more information.
|
||||
+*/
|
||||
+int sd_listen_fds(int unset_environment) _sd_hidden_;
|
||||
+
|
||||
+/*
|
||||
+ Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
+ the file descriptor is a FIFO in the file system stored under the
|
||||
+ specified path, 0 otherwise. If path is NULL a path name check will
|
||||
+ not be done and the call only verifies if the file descriptor
|
||||
+ refers to a FIFO. Returns a negative errno style error code on
|
||||
+ failure.
|
||||
+
|
||||
+ See sd_is_fifo(3) for more information.
|
||||
+*/
|
||||
+int sd_is_fifo(int fd, const char *path) _sd_hidden_;
|
||||
+
|
||||
+/*
|
||||
+ Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
+ the file descriptor is a socket of the specified family (AF_INET,
|
||||
+ ...) and type (SOCK_DGRAM, SOCK_STREAM, ...), 0 otherwise. If
|
||||
+ family is 0 a socket family check will not be done. If type is 0 a
|
||||
+ socket type check will not be done and the call only verifies if
|
||||
+ the file descriptor refers to a socket. If listening is > 0 it is
|
||||
+ verified that the socket is in listening mode. (i.e. listen() has
|
||||
+ been called) If listening is == 0 it is verified that the socket is
|
||||
+ not in listening mode. If listening is < 0 no listening mode check
|
||||
+ is done. Returns a negative errno style error code on failure.
|
||||
+
|
||||
+ See sd_is_socket(3) for more information.
|
||||
+*/
|
||||
+int sd_is_socket(int fd, int family, int type, int listening) _sd_hidden_;
|
||||
+
|
||||
+/*
|
||||
+ Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
+ the file descriptor is an Internet socket, of the specified family
|
||||
+ (either AF_INET or AF_INET6) and the specified type (SOCK_DGRAM,
|
||||
+ SOCK_STREAM, ...), 0 otherwise. If version is 0 a protocol version
|
||||
+ check is not done. If type is 0 a socket type check will not be
|
||||
+ done. If port is 0 a socket port check will not be done. The
|
||||
+ listening flag is used the same way as in sd_is_socket(). Returns a
|
||||
+ negative errno style error code on failure.
|
||||
+
|
||||
+ See sd_is_socket_inet(3) for more information.
|
||||
+*/
|
||||
+int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) _sd_hidden_;
|
||||
+
|
||||
+/*
|
||||
+ Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
+ the file descriptor is an AF_UNIX socket of the specified type
|
||||
+ (SOCK_DGRAM, SOCK_STREAM, ...) and path, 0 otherwise. If type is 0
|
||||
+ a socket type check will not be done. If path is NULL a socket path
|
||||
+ check will not be done. For normal AF_UNIX sockets set length to
|
||||
+ 0. For abstract namespace sockets set length to the length of the
|
||||
+ socket name (including the initial 0 byte), and pass the full
|
||||
+ socket path in path (including the initial 0 byte). The listening
|
||||
+ flag is used the same way as in sd_is_socket(). Returns a negative
|
||||
+ errno style error code on failure.
|
||||
+
|
||||
+ See sd_is_socket_unix(3) for more information.
|
||||
+*/
|
||||
+int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) _sd_hidden_;
|
||||
+
|
||||
+/*
|
||||
+ Informs systemd about changed daemon state. This takes a number of
|
||||
+ newline separated environment-style variable assignments in a
|
||||
+ string. The following variables are known:
|
||||
+
|
||||
+ READY=1 Tells systemd that daemon startup is finished (only
|
||||
+ relevant for services of Type=notify). The passed
|
||||
+ argument is a boolean "1" or "0". Since there is
|
||||
+ little value in signalling non-readiness the only
|
||||
+ value daemons should send is "READY=1".
|
||||
+
|
||||
+ STATUS=... Passes a single-line status string back to systemd
|
||||
+ that describes the daemon state. This is free-from
|
||||
+ and can be used for various purposes: general state
|
||||
+ feedback, fsck-like programs could pass completion
|
||||
+ percentages and failing programs could pass a human
|
||||
+ readable error message. Example: "STATUS=Completed
|
||||
+ 66% of file system check..."
|
||||
+
|
||||
+ ERRNO=... If a daemon fails, the errno-style error code,
|
||||
+ formatted as string. Example: "ERRNO=2" for ENOENT.
|
||||
+
|
||||
+ BUSERROR=... If a daemon fails, the D-Bus error-style error
|
||||
+ code. Example: "BUSERROR=org.freedesktop.DBus.Error.TimedOut"
|
||||
+
|
||||
+ MAINPID=... The main pid of a daemon, in case systemd did not
|
||||
+ fork off the process itself. Example: "MAINPID=4711"
|
||||
+
|
||||
+ Daemons can choose to send additional variables. However, it is
|
||||
+ recommened to prefix variable names not listed above with X_.
|
||||
+
|
||||
+ Returns a negative errno-style error code on failure. Returns > 0
|
||||
+ if systemd could be notified, 0 if it couldn't possibly because
|
||||
+ systemd is not running.
|
||||
+
|
||||
+ Example: When a daemon finished starting up, it could issue this
|
||||
+ call to notify systemd about it:
|
||||
+
|
||||
+ sd_notify(0, "READY=1");
|
||||
+
|
||||
+ See sd_notifyf() for more complete examples.
|
||||
+
|
||||
+ See sd_notify(3) for more information.
|
||||
+*/
|
||||
+int sd_notify(int unset_environment, const char *state) _sd_hidden_;
|
||||
+
|
||||
+/*
|
||||
+ Similar to sd_notify() but takes a format string.
|
||||
+
|
||||
+ Example 1: A daemon could send the following after initialization:
|
||||
+
|
||||
+ sd_notifyf(0, "READY=1\n"
|
||||
+ "STATUS=Processing requests...\n"
|
||||
+ "MAINPID=%lu",
|
||||
+ (unsigned long) getpid());
|
||||
+
|
||||
+ Example 2: A daemon could send the following shortly before
|
||||
+ exiting, on failure:
|
||||
+
|
||||
+ sd_notifyf(0, "STATUS=Failed to start up: %s\n"
|
||||
+ "ERRNO=%i",
|
||||
+ strerror(errno),
|
||||
+ errno);
|
||||
+
|
||||
+ See sd_notifyf(3) for more information.
|
||||
+*/
|
||||
+int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3) _sd_hidden_;
|
||||
+
|
||||
+/*
|
||||
+ Returns > 0 if the system was booted with systemd. Returns < 0 on
|
||||
+ error. Returns 0 if the system was not booted with systemd. Note
|
||||
+ that all of the functions above handle non-systemd boots just
|
||||
+ fine. You should NOT protect them with a call to this function. Also
|
||||
+ note that this function checks whether the system, not the user
|
||||
+ session is controlled by systemd. However the functions above work
|
||||
+ for both session and system services.
|
||||
+
|
||||
+ See sd_booted(3) for more information.
|
||||
+*/
|
||||
+int sd_booted(void) _sd_hidden_;
|
||||
+
|
||||
+#ifdef __cplusplus
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff --git a/tools/syslogd.c b/tools/syslogd.c
|
||||
index 1148108..e18101c 100644
|
||||
--- a/tools/syslogd.c
|
||||
+++ b/tools/syslogd.c
|
||||
@@ -135,6 +135,7 @@
|
||||
#include "net.h"
|
||||
#include "vm.h"
|
||||
#include "prop.h"
|
||||
+#include "sd-daemon.h"
|
||||
|
||||
/* definitions for objects we access */
|
||||
DEFobjCurrIf(obj)
|
||||
@@ -2433,10 +2434,44 @@ doGlblProcessInit(void)
|
||||
*/
|
||||
exit(1); /* "good" exit - after forking, not diasabling anything */
|
||||
}
|
||||
+
|
||||
num_fds = getdtablesize();
|
||||
close(0);
|
||||
/* we keep stdout and stderr open in case we have to emit something */
|
||||
- for (i = 3; i < num_fds; i++)
|
||||
+ i = 3;
|
||||
+
|
||||
+ /* if (sd_booted()) */ {
|
||||
+ const char *e;
|
||||
+ char buf[24] = { '\0' };
|
||||
+ char *p = NULL;
|
||||
+ unsigned long l;
|
||||
+ int sd_fds;
|
||||
+
|
||||
+ /* fork & systemd socket activation:
|
||||
+ * fetch listen pid and update to ours,
|
||||
+ * when it is set to pid of our parent.
|
||||
+ */
|
||||
+ if ( (e = getenv("LISTEN_PID"))) {
|
||||
+ errno = 0;
|
||||
+ l = strtoul(e, &p, 10);
|
||||
+ if (errno == 0 && l > 0 && (!p || !*p)) {
|
||||
+ if (getppid() == (pid_t)l) {
|
||||
+ snprintf(buf, sizeof(buf), "%d",
|
||||
+ getpid());
|
||||
+ setenv("LISTEN_PID", buf, 1);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * close only all further fds, except
|
||||
+ * of the fds provided by systemd.
|
||||
+ */
|
||||
+ sd_fds = sd_listen_fds(0);
|
||||
+ if (sd_fds > 0)
|
||||
+ i = SD_LISTEN_FDS_START + sd_fds;
|
||||
+ }
|
||||
+ for ( ; i < num_fds; i++)
|
||||
(void) close(i);
|
||||
untty();
|
||||
}
|
@ -1,3 +1,44 @@
|
||||
-------------------------------------------------------------------
|
||||
Wed Apr 27 16:19:31 UTC 2011 - mrueckert@suse.de
|
||||
|
||||
- move most of the additional requirements and subpackages into
|
||||
conditionals so we can switch them on and off by more easily.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Apr 26 12:30:17 UTC 2011 - mt@suse.de
|
||||
|
||||
- Dropped obsolete rsyslog-systemd-integration.bnc656104.diff
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Apr 26 12:20:16 UTC 2011 - mrueckert@suse.de
|
||||
|
||||
- dont ship the systemd service file for now.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sun Apr 24 01:32:17 UTC 2011 - mrueckert@suse.de
|
||||
|
||||
- update to 5.8.0 (v5-tsable)
|
||||
This is the new v5-stable branch, importing all feature from the
|
||||
5.7.x versions. To see what has changed in regard to the previous
|
||||
v5-stable, check the entries for 5.7.x in
|
||||
/usr/share/doc/packages/rsyslog/ChangeLog.
|
||||
|
||||
- bugfix: race condition in deferred name resolution
|
||||
closes: http://bugzilla.adiscon.com/show_bug.cgi?id=238
|
||||
Special thanks to Marcin for his persistence in helping to solve this
|
||||
bug.
|
||||
- bugfix: DA queue was never shutdown once it was started
|
||||
closes: http://bugzilla.adiscon.com/show_bug.cgi?id=241
|
||||
- dropped patch rsyslog-deferred-dns-query-race.diff
|
||||
included in the release
|
||||
- refreshed rsyslog-systemd-integration.bnc656104.diff:
|
||||
most of the patch went upstream just a small chunk left
|
||||
- fixed the with_dbi conditional, it was using the build_with_relp.
|
||||
- added a new conditional with_systemd and moved all the systemd
|
||||
specific things from suse_version >= 1140 to the with_systemd
|
||||
conditional. the patch line in the preamble should be
|
||||
unconditional.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Apr 8 13:24:34 UTC 2011 - mt@suse.de
|
||||
|
||||
|
@ -43,12 +43,12 @@ $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
|
||||
# using the SYSLOGD_ADDITIONAL_SOCKET* variables in the
|
||||
# /etc/sysconfig/syslog file.
|
||||
#
|
||||
$IncludeConfig /var/run/rsyslog/additional-log-sockets.conf
|
||||
$IncludeConfig ADDITIONAL_SOCKETS
|
||||
|
||||
#
|
||||
# Include config files, that the admin provided? :
|
||||
#
|
||||
$IncludeConfig /etc/rsyslog.d/*.conf
|
||||
$IncludeConfig ETC_RSYSLOG_D_GLOB
|
||||
|
||||
|
||||
###
|
||||
|
153
rsyslog.spec
153
rsyslog.spec
@ -20,11 +20,31 @@
|
||||
|
||||
Name: rsyslog
|
||||
Summary: The enhanced syslogd for Linux and Unix
|
||||
Version: 5.6.5
|
||||
Version: 5.8.0
|
||||
Release: 2
|
||||
%define upstream_version 5.6.5
|
||||
%define with_dbi 0%{?suse_version} >= 1140 || 0%{?build_with_relp:1}
|
||||
%define with_relp 0%{?suse_version} >= 1130 || 0%{?build_with_relp:1}
|
||||
# for setting those bcond_with* configs see
|
||||
# http://lizards.opensuse.org/2008/09/12/conditional-features-aka-use-flags/
|
||||
%if 0%{?suse_version} >= 1140
|
||||
%bcond_without dbi
|
||||
%else
|
||||
%bcond_with dbi
|
||||
%endif
|
||||
%if 0%{?suse_version} >= 1140
|
||||
%bcond_without systemd
|
||||
%else
|
||||
%bcond_with systemd
|
||||
%endif
|
||||
%if 0%{?suse_version} >= 1130
|
||||
%bcond_without relp
|
||||
%else
|
||||
%bcond_with relp
|
||||
%endif
|
||||
%bcond_without gssapi
|
||||
%bcond_without gnutls
|
||||
%bcond_without mysql
|
||||
%bcond_without pgsql
|
||||
%bcond_without snmp
|
||||
%define upstream_version 5.8.0
|
||||
%define _sbindir /sbin
|
||||
%define rsyslogdocdir %{_docdir}/%{name}
|
||||
%define additional_sockets %{_localstatedir}/run/rsyslog/additional-log-sockets.conf
|
||||
@ -38,26 +58,46 @@ AutoReqProv: on
|
||||
Provides: syslog
|
||||
PreReq: %insserv_prereq %fillup_prereq /sbin/klogd /etc/init.d/syslog /sbin/checkproc
|
||||
BuildRequires: klogd
|
||||
BuildRequires: dos2unix openssl-devel pcre-devel pkgconfig zlib-devel
|
||||
BuildRequires: krb5-devel mysql-devel net-snmp-devel postgresql-devel
|
||||
BuildRequires: dos2unix
|
||||
BuildRequires: openssl-devel
|
||||
BuildRequires: pcre-devel
|
||||
BuildRequires: pkgconfig
|
||||
BuildRequires: zlib-devel
|
||||
#
|
||||
%if %{with gssapi}
|
||||
BuildRequires: krb5-devel
|
||||
%endif
|
||||
%if %{with mysql}
|
||||
BuildRequires: mysql-devel
|
||||
%endif
|
||||
%if %{with snmp}
|
||||
BuildRequires: net-snmp-devel
|
||||
%endif
|
||||
%if %{with pgsql}
|
||||
BuildRequires: postgresql-devel
|
||||
%endif
|
||||
%if %{with gnutls}
|
||||
BuildRequires: libgnutls-devel
|
||||
%if 0%{?with_dbi}
|
||||
%endif
|
||||
%if %{with dbi}
|
||||
BuildRequires: libdbi-devel
|
||||
%endif
|
||||
%if 0%{?with_relp}
|
||||
%if %{with relp}
|
||||
# RELP support
|
||||
BuildRequires: librelp-devel
|
||||
%endif
|
||||
# UDP spoof support
|
||||
%if 0%{?suse_version} >= 1140
|
||||
BuildRequires: libnet-devel
|
||||
# The systemd package provides
|
||||
# /usr/share/doc/packages/systemd/sd-daemon.[ch]
|
||||
# files instead of a lib ...
|
||||
BuildRequires: systemd
|
||||
%else
|
||||
BuildRequires: libnet
|
||||
%endif
|
||||
%if %{with systemd}
|
||||
# The systemd package provides
|
||||
# /usr/share/doc/packages/systemd/sd-daemon.[ch]
|
||||
# files instead of a lib ... See also bug 656259.
|
||||
BuildRequires: systemd
|
||||
%endif
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
#Source0: http://download.rsyslog.com/rsyslog/rsyslog-<upstream_version>.tar.gz
|
||||
Source0: %{name}-%{upstream_version}.tar.bz2
|
||||
@ -65,10 +105,6 @@ Source1: rsyslog.sysconfig
|
||||
Source2: rsyslog.conf.in
|
||||
Source3: rsyslog.early.conf.in
|
||||
Source4: rsyslog.d.remote.conf.in
|
||||
%if 0%{?suse_version} >= 1140
|
||||
Patch1: rsyslog-systemd-integration.bnc656104.diff
|
||||
%endif
|
||||
Patch2: rsyslog-deferred-dns-query-race.diff
|
||||
|
||||
%description
|
||||
Rsyslog is an enhanced multi-threaded syslogd supporting, among others,
|
||||
@ -104,6 +140,7 @@ package.
|
||||
This package provides additional diagnostic tools (small helpers,
|
||||
usually not needed).
|
||||
|
||||
%if %{with gssapi}
|
||||
%package module-gssapi
|
||||
License: GPLv3+
|
||||
Group: System/Daemons
|
||||
@ -116,7 +153,9 @@ package.
|
||||
|
||||
This module provides the support to receive syslog messages from the
|
||||
network protected via Kerberos 5 encryption and authentication.
|
||||
%endif
|
||||
|
||||
%if %{with mysql}
|
||||
%package module-mysql
|
||||
License: GPLv3+
|
||||
Group: System/Daemons
|
||||
@ -129,7 +168,9 @@ package.
|
||||
|
||||
This package provides a module with the support for logging into MySQL
|
||||
databases.
|
||||
%endif
|
||||
|
||||
%if %{with pgsql}
|
||||
%package module-pgsql
|
||||
License: GPLv3+
|
||||
Group: System/Daemons
|
||||
@ -141,9 +182,9 @@ Rsyslog is an enhanced multi-threaded syslog daemon. See rsyslog
|
||||
package.
|
||||
|
||||
This module provides the support for logging into PostgreSQL databases.
|
||||
%endif
|
||||
|
||||
%if 0%{?with_dbi}
|
||||
|
||||
%if %{with dbi}
|
||||
%package module-dbi
|
||||
License: GPLv3+
|
||||
Group: System/Daemons
|
||||
@ -158,6 +199,7 @@ This package provides a module with the support for logging into DBI
|
||||
supported databases.
|
||||
%endif
|
||||
|
||||
%if %{with snmp}
|
||||
%package module-snmp
|
||||
License: GPLv3+
|
||||
Group: System/Daemons
|
||||
@ -170,7 +212,9 @@ package.
|
||||
|
||||
This module provides the ability to send syslog messages as an SNMPv1 &
|
||||
v2c traps.
|
||||
%endif
|
||||
|
||||
%if %{with gnutls}
|
||||
%package module-gtls
|
||||
License: GPLv3+
|
||||
Group: System/Daemons
|
||||
@ -183,9 +227,9 @@ package.
|
||||
|
||||
This module provides the ability for TLS encrypted TCP logging (based
|
||||
on current syslog-transport-tls internet drafts).
|
||||
%endif
|
||||
|
||||
%if 0%{?with_relp}
|
||||
|
||||
%if %{with relp}
|
||||
%package module-relp
|
||||
License: GPLv3+
|
||||
Group: System/Daemons
|
||||
@ -214,9 +258,8 @@ This module provides a UDP forwarder that allows changing the sender address.
|
||||
|
||||
%prep
|
||||
%setup -q -n %{name}-%{upstream_version}
|
||||
%if 0%{?suse_version} >= 1140
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
%if %{with systemd}
|
||||
# Bug: https://bugzilla.novell.com/show_bug.cgi?id=656259
|
||||
# install the files systemd provides rather than what we provide.
|
||||
cp -a /usr/share/doc/packages/systemd/sd-daemon.[ch] runtime/
|
||||
%endif
|
||||
@ -240,18 +283,28 @@ export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing -W -Wall"
|
||||
--enable-zlib \
|
||||
--enable-klog \
|
||||
--enable-inet \
|
||||
%if %{with gnutls}
|
||||
--enable-gnutls \
|
||||
%endif
|
||||
--enable-rsyslogd \
|
||||
%if %{with gssapi}
|
||||
--enable-gssapi-krb5 \
|
||||
%endif
|
||||
%if %{with mysql}
|
||||
--enable-mysql \
|
||||
%endif
|
||||
%if %{with pgsql}
|
||||
--enable-pgsql \
|
||||
%if 0%{?with_dbi}
|
||||
%endif
|
||||
%if %{with dbi}
|
||||
--enable-libdbi \
|
||||
%endif
|
||||
%if 0%{?with_relp}
|
||||
%if %{with relp}
|
||||
--enable-relp \
|
||||
%endif
|
||||
%if %{with snmp}
|
||||
--enable-snmp \
|
||||
%endif
|
||||
--enable-mail \
|
||||
--enable-imfile \
|
||||
--enable-imptcp \
|
||||
@ -275,13 +328,27 @@ rm -f %{buildroot}%{rsyslog_module_dir_nodeps}/*.la
|
||||
# move all modules linking libraries in /usr to /usr/lib[64]
|
||||
# the user has to specify them with full path then...
|
||||
install -d -m0755 %{buildroot}%{rsyslog_module_dir_withdeps}
|
||||
for mod in omgssapi.so imgssapi.so lmgssutil.so ommysql.so \
|
||||
ompgsql.so omsnmp.so lmnsd_gtls.so \
|
||||
%if 0%{?with_dbi}
|
||||
omlibdbi.so \
|
||||
for mod in \
|
||||
%if %{with gssapi}
|
||||
omgssapi.so imgssapi.so lmgssutil.so \
|
||||
%endif
|
||||
%if 0%{?with_relp}
|
||||
imrelp.so omrelp.so \
|
||||
%if %{with mysql}
|
||||
ommysql.so \
|
||||
%endif
|
||||
%if %{with pgsql}
|
||||
ompgsql.so \
|
||||
%endif
|
||||
%if %{with snmp}
|
||||
omsnmp.so \
|
||||
%endif
|
||||
%if %{with dbi}
|
||||
omlibdbi.so \
|
||||
%endif
|
||||
%if %{with relp}
|
||||
imrelp.so omrelp.so \
|
||||
%endif
|
||||
%if %{with gnutls}
|
||||
lmnsd_gtls.so \
|
||||
%endif
|
||||
; do
|
||||
mv -f %{buildroot}%{rsyslog_module_dir_nodeps}/$mod \
|
||||
@ -323,11 +390,19 @@ install -d -m0755 %{buildroot}%{rsyslogdocdir}/
|
||||
find ChangeLog README AUTHORS COPYING COPYING.LESSER rsyslog.conf doc \
|
||||
\( -type d -exec install -m755 -d %{buildroot}%{rsyslogdocdir}/\{\} \; \) \
|
||||
-o \( -type f -exec install -m644 \{\} %{buildroot}%{rsyslogdocdir}/\{\} \; \)
|
||||
%if %{with mysql}
|
||||
install -m644 plugins/ommysql/createDB.sql \
|
||||
%{buildroot}%{rsyslogdocdir}/mysql-createDB.sql
|
||||
%endif
|
||||
%if %{with pgsql}
|
||||
install -m644 plugins/ompgsql/createDB.sql \
|
||||
%{buildroot}%{rsyslogdocdir}/pgsql-createDB.sql
|
||||
%endif
|
||||
#
|
||||
%if %{with systemd}
|
||||
# TODO: https://features.opensuse.org/311316
|
||||
rm -v %{buildroot}/lib/systemd/system/rsyslog.service
|
||||
%endif
|
||||
|
||||
%clean
|
||||
if [ -n "%{buildroot}" ] && [ "%{buildroot}" != "/" ] ; then
|
||||
@ -484,39 +559,47 @@ fi
|
||||
%{_sbindir}/rsyslog_diag_hostname
|
||||
%{_sbindir}/zpipe
|
||||
|
||||
%if %{with gssapi}
|
||||
%files module-gssapi
|
||||
%defattr(-,root,root)
|
||||
%{rsyslog_module_dir_withdeps}/omgssapi.so
|
||||
%{rsyslog_module_dir_withdeps}/imgssapi.so
|
||||
%{rsyslog_module_dir_withdeps}/lmgssutil.so
|
||||
%endif
|
||||
|
||||
%if %{with mysql}
|
||||
%files module-mysql
|
||||
%defattr(-,root,root)
|
||||
%doc %{rsyslogdocdir}/mysql-createDB.sql
|
||||
%{rsyslog_module_dir_withdeps}/ommysql.so
|
||||
%endif
|
||||
|
||||
%if %{with pgsql}
|
||||
%files module-pgsql
|
||||
%defattr(-,root,root)
|
||||
%doc %{rsyslogdocdir}/pgsql-createDB.sql
|
||||
%{rsyslog_module_dir_withdeps}/ompgsql.so
|
||||
%endif
|
||||
|
||||
%if 0%{?with_dbi}
|
||||
|
||||
%if %{with dbi}
|
||||
%files module-dbi
|
||||
%defattr(-,root,root)
|
||||
%{rsyslog_module_dir_withdeps}/omlibdbi.so
|
||||
%endif
|
||||
|
||||
%if %{with snmp}
|
||||
%files module-snmp
|
||||
%defattr(-,root,root)
|
||||
%{rsyslog_module_dir_withdeps}/omsnmp.so
|
||||
%endif
|
||||
|
||||
%if %{with gnutls}
|
||||
%files module-gtls
|
||||
%defattr(-,root,root)
|
||||
%{rsyslog_module_dir_withdeps}/lmnsd_gtls.so
|
||||
%endif
|
||||
|
||||
%if 0%{?with_relp}
|
||||
|
||||
%if %{with relp}
|
||||
%files module-relp
|
||||
%defattr(-,root,root)
|
||||
%{rsyslog_module_dir_withdeps}/imrelp.so
|
||||
|
Loading…
Reference in New Issue
Block a user