[syslog-ng]syslog-ng 1.5.25 released

Balazs Scheidler bazsi@balabit.hu
Fri, 24 Jan 2003 17:09:11 +0100


On Fri, Jan 24, 2003 at 04:58:05PM +0100, Roberto Nibali wrote:
> >Syslog-ng has been running on a couple of Unixes and nobody complained 
> >about
> >EWOULDBLOCK. I think it is defined as EAGAIN on most platforms.
> 
>           *Portability Note:* In many older Unix systems, this condition
>           was indicated by `EWOULDBLOCK', which was a distinct error
>           code different from `EAGAIN'.  To make your program portable,
>           you should check for both codes and treat them the same.

IIRC I tried but gcc then complained I have two case statements in my
switch with the same value. 

> I have one last question to bother you. I'm scanning through your code and 
> I've found following code snippet in src/afinet.c:do_init_afinet_dest(...):
> 
>         self->conn_fd = io_connect(cfg->backend,
>                                    fd, self->super.dest_addr,
>                                    make_afsocket_dest_connected(cfg->backend,
> &self->super));
> 
>         if (self->conn_fd) {
>                 return ST_OK | ST_GOON;
>         }
>         else {
>                 if (errno == ECONNREFUSED) {
>                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
> This yields different behaviour on Linux and Solaris for link state down 
> and primary link flushed interfaces.

This case was added especially to handle Solaris. The fd here is set into
non-blocking mode  in which case Linux _always_ returns EINPROGRESS, the
poll loop then checks for writability and calls the callback for
afsocket_dest_connected. (probably defined in afsocket.c)

On the other hand Solaris returned ECONNREFUSED when connecting to a local
socket immediately regardless whether the fd was set into non-blocking mode.

Thus I reinit when I get ECONNREFUSED or in the connected callback called
from the main loop.

> I'm talking about the ECONNREFUSED. Why do you only _reinit() when you get 
> a connection refused and not all the time? Consider following usage: You 
> start syslog-ng before the interface is up (link state up and primary 
> address assigned). In your case you'd do no new _reinit(). What's the hitch 
> in removing this 'if'-part?

Syslog-ng currently does not start if initialization fails. If the interface
is not up or the routing table not complete syslog-ng might not start.

This was intended at the time I implemented this code. This decision might
not be the best but I wouldn't bother fixing those as I am currently
rewriting syslog-ng from scratch. (see my announcement about the 1.9.x
branch)

-- 
Bazsi
PGP info: KeyID 9AF8D0A9 Fingerprint CD27 CFB0 802C 0944 9CFD 804E C82C 8EB1