Re: HP-UX pipe read errors
On 04/25/06 09:08, Andrew Gill wrote:
Hello,
I'm new to syslog-ng and am trying to configure it to run on HP-UX 10.20 and 11.11. It seems to have problems reading from the /dev/log pipe. Each time a message is received on the pipe, syslog-ng hits an I/O error and closes the filehandle, and no more messages are received. However, the first message is always processed correctly.
Here is my syslog-ng.conf: source src { pipe("/dev/log" pad_size(2048)); internal(); };
destination d_file { file("/var/adm/syslog-ng/messages" owner(root) group(systaff) perm(0640) ); };
destination d_net { tcp(testy port(1514)); };
log { source(src); destination(d_file); destination(d_net); };
When I run syslog-ng in the foreground with debug and verbose options, this is what I see:
io.c: Preparing fd 3 for reading io.c: connecting using fd 6 connecting fd 6 to inetaddr testy, port 1514 syslog-ng version 1.6.10 starting io.c: Preparing fd 6 for writing io.c: Preparing fd 7 for writing io.c: do_read: read() failed (errno 11), Resource temporarily unavailable fd = 3, buffer = 00098b0, length = 2048 Marking fd 3 for closing. Closing fd 3.
The do_read line is when the message is received. syslog-ng continues to run, and internal messages (e.g. STATS) continue to show up on the local host and the remote loghost.
Any thoughts would be greatly appreciated.
-Andy
I think I figured this out...in libol's src/io.c an assumption is made that EAGAIN == EWOULDBLOCK, but this is not the case for HP-UX.
egrep "EAGAIN|EWOULD" /usr/include/sys/errno.h #define EAGAIN 11 /* No more processes */ #define EWOULDBLOCK 246 /* Operation would block */
I applied the following change to src/io.c and recompiled libol, and it works correctly now. -Andy -- io.c.orig Mon Mar 13 10:01:31 2006 +++ io.c Mon Mar 13 10:01:31 2006 @@ -361,6 +361,7 @@ case EINTR: continue; /* FIXME: Is it really worth looping here, * instead of in the select loop? */ + case EAGAIN: case EWOULDBLOCK: /* aka EAGAIN */ return 0; case EPIPE: @@ -415,6 +416,7 @@ continue; /* FIXME: Is it really worth looping here, * instead of in the select loop? */ case EWOULDBLOCK: /* aka EAGAIN */ + case EAGAIN: return 0; case EPIPE: werror("io.c: recvfrom() returned EPIPE! Treating it as EOF.\n");
On Wed, 2006-04-26 at 16:25 -0600, Andy G. wrote:
On 04/25/06 09:08, Andrew Gill wrote:
-- io.c.orig Mon Mar 13 10:01:31 2006 +++ io.c Mon Mar 13 10:01:31 2006 @@ -361,6 +361,7 @@ case EINTR: continue; /* FIXME: Is it really worth looping here, * instead of in the select loop? */ + case EAGAIN: case EWOULDBLOCK: /* aka EAGAIN */ return 0; case EPIPE: @@ -415,6 +416,7 @@ continue; /* FIXME: Is it really worth looping here, * instead of in the select loop? */ case EWOULDBLOCK: /* aka EAGAIN */ + case EAGAIN: return 0; case EPIPE: werror("io.c: recvfrom() returned EPIPE! Treating it as EOF.\n");
The problem with this patch that it breaks platforms that EAGAIN equals to EWOULDBLOCK as the C compiler complains about overlapping case statements. -- Bazsi
participants (2)
-
Andy G.
-
Balazs Scheidler