Am 14.03.2011 01:08, schrieb Phil Dibowitz:
> On 03/13/2011 04:15 AM, Michael Biebl wrote:
>> Attached is a very simple (though untested) patch, which imho doesn't really
>> complicate the code.
>>
>> Phil, could you please try that patch. Compile it using your new kernel, test
>> rsyslog using your new kernel, the boot the old kernel again and see if it 
>> still
>> works correctly.
> 
> Tested, works great, thanks!!
> 

Rainer, in case you decide to merge this patch, here is one with a proper commit
header which can be applied using git am.

Cheers,
Michael

-- 
Why is it that all of the instruments seeking intelligent life in the
universe are pointed away from Earth?
From 88c6c7445c530d3c76013da3eff1b93b40eb76de Mon Sep 17 00:00:00 2001
From: Michael Biebl <bi...@debian.org>
Date: Sun, 13 Mar 2011 12:09:06 +0100
Subject: [PATCH] Fall back to epoll_create() if epoll_create1() is not available

epoll_create1() was introduced in Linux kernel 2.6.27. If rsyslog was
compiled on a newer kernel but run on a kernel older than 2.6.27, remote
syslog fails. Apply a runtime check for epoll_create1() and fall back to
epoll_create() in this case.

Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=617996
---
 plugins/imptcp/imptcp.c |   13 ++++++++-----
 plugins/imudp/imudp.c   |   13 ++++++++-----
 runtime/nsdpoll_ptcp.c  |   13 ++++++++-----
 3 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/plugins/imptcp/imptcp.c b/plugins/imptcp/imptcp.c
index 3197564..c4fbab3 100644
--- a/plugins/imptcp/imptcp.c
+++ b/plugins/imptcp/imptcp.c
@@ -1047,17 +1047,20 @@ CODESTARTwillRun
 		ABORT_FINALIZE(RS_RET_NO_RUN);
 	}
 
-#	if defined(EPOLL_CLOEXEC) && defined(HAVE_EPOLL_CREATE1)
-		DBGPRINTF("imptcp uses epoll_create1()\n");
-		epollfd = epoll_create1(EPOLL_CLOEXEC);
-#	else
+#if defined(EPOLL_CLOEXEC) && defined(HAVE_EPOLL_CREATE1)
+	DBGPRINTF("imptcp uses epoll_create1()\n");
+	epollfd = epoll_create1(EPOLL_CLOEXEC);
+	if(epollfd < 0 && errno ENOSYS)
+#endif
+	{
 		DBGPRINTF("imptcp uses epoll_create()\n");
 		/* reading the docs, the number of epoll events passed to
 		 * epoll_create() seems not to be used at all in kernels. So
 		 * we just provide "a" number, happens to be 10.
 		 */
 		epollfd = epoll_create(10);
-#	endif
+	}
+
 	if(epollfd < 0) {
 		errmsg.LogError(0, RS_RET_EPOLL_CR_FAILED, "error: epoll_create() failed");
 		ABORT_FINALIZE(RS_RET_NO_RUN);
diff --git a/plugins/imudp/imudp.c b/plugins/imudp/imudp.c
index 56cdab2..a500259 100644
--- a/plugins/imudp/imudp.c
+++ b/plugins/imudp/imudp.c
@@ -453,13 +453,16 @@ rsRetVal rcvMainLoop(thrdInfo_t *pThrd)
 
 	CHKmalloc(udpEPollEvt = calloc(udpLstnSocks[0], sizeof(struct epoll_event)));
 
-#	if defined(EPOLL_CLOEXEC) && defined(HAVE_EPOLL_CREATE1)
-		DBGPRINTF("imudp uses epoll_create1()\n");
-		efd = epoll_create1(EPOLL_CLOEXEC);
-#	else
+#if defined(EPOLL_CLOEXEC) && defined(HAVE_EPOLL_CREATE1)
+	DBGPRINTF("imudp uses epoll_create1()\n");
+	efd = epoll_create1(EPOLL_CLOEXEC);
+	if(efd < 0 && errno == ENOSYS)
+#endif
+	{
 		DBGPRINTF("imudp uses epoll_create()\n");
 		efd = epoll_create(NUM_EPOLL_EVENTS);
-#	endif
+	}
+
 	if(efd < 0) {
 		DBGPRINTF("epoll_create1() could not create fd\n");
 		ABORT_FINALIZE(RS_RET_IO_ERROR);
diff --git a/runtime/nsdpoll_ptcp.c b/runtime/nsdpoll_ptcp.c
index bc374c6..ef9c37a 100644
--- a/runtime/nsdpoll_ptcp.c
+++ b/runtime/nsdpoll_ptcp.c
@@ -133,13 +133,16 @@ delEvent(nsdpoll_epollevt_lst_t **ppEvtLst) {
 /* Standard-Constructor
  */
 BEGINobjConstruct(nsdpoll_ptcp) /* be sure to specify the object type also in END macro! */
-#	if defined(EPOLL_CLOEXEC) && defined(HAVE_EPOLL_CREATE1)
-		DBGPRINTF("nsdpoll_ptcp uses epoll_create1()\n");
-		pThis->efd = epoll_create1(EPOLL_CLOEXEC);
-#	else
+#if defined(EPOLL_CLOEXEC) && defined(HAVE_EPOLL_CREATE1)
+	DBGPRINTF("nsdpoll_ptcp uses epoll_create1()\n");
+	pThis->efd = epoll_create1(EPOLL_CLOEXEC);
+	if(pThis->efd < 0 && errno == ENOSYS)
+#endif
+	{
 		DBGPRINTF("nsdpoll_ptcp uses epoll_create()\n");
 		pThis->efd = epoll_create(100); /* size is ignored in newer kernels, but 100 is not bad... */
-#	endif
+	}
+
 	if(pThis->efd < 0) {
 		DBGPRINTF("epoll_create1() could not create fd\n");
 		ABORT_FINALIZE(RS_RET_IO_ERROR);
-- 
1.7.4.1

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to