On 2018-07-05 09:29, Takashi Yano wrote: > On Wed, 4 Jul 2018 16:52:47 +0200 Corinna Vinschen wrote: >> Hang on. /dev/kmsg was implemented using a mailslot and it was never >> accessible via the syslog(3) interface. The code you removed has >> nothing to do with /dev/kmsg. > > First of all, /dev/kmsg was not guilty. The real culprit is the code > I had removed by the previous patch. > > However, the patch I posted was based on mis-understanding regarding > AF_UNIX implementation. I had checked fhandler_socket_unix.cc and > thought cygwin AF_UNIX socket is implemented not using AF_INET socket. > On the other hand, the code, I removed, checks existence of UDP socket > to determine whether syslogd is activated. So I thought this is no > longer correct and should be removed. > > As a matter of fact, cygwin AF_UNIX socket usually use fhandler_socket_ > local.cc, in which AF_UNIX socket is implemented using AF_INET socket. > That is, the obove understanding was incorrect. > >> What the code does is to check if we have a listener on the /dev/msg UDP >> socket, otherwise log data may get lost or, IIRC, the syslog call may >> even hang. So removing this code sounds like a bad idea. > > In the case of syslogd is not activated, /dev/log does not exist. > So connect() results in an error. Therefore log data is directed to > windows event logging mechanism even without the removed code. In > usual case, no problem happens. However if syslogd is killed by signal > 9 or died accidently, /dev/log remains without listener. In this case, > the problem you mentioned may happen. > >> Can you please explain *why* removing this code helps and what happens >> if syslogd is not running after removing the code? > > OK. First, connect_syslogd() tries to connect to syslogd via /dev/log > which is created by syslogd. However, the code which I removed can not > perform checking existence of syslogd as expected. > Previously, get_inet_addr() is used to get name information of the socket > opened by syslogd. This was working correctly at that time. Currently, > getsockname() is used instead. This does not return name infomation of > the socket on syslogd side but returns that of client side. Since no > listener exists for this socket, it is not listed in the table returned > by GetUdpTable(). Therefore this check results in false. > > As a result, current connect_syslogd() code gives up to connect to syslogd. > > To fix this, I made a new patch attached. In this patch, get_inet_addr_local() > is used instead of getsockname() as in the past. > > I will appreciate any comments.
Isn't this moot as the supported package is syslog-ng, which seems to work okay? -- Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada