Hello Michael, thanks for the reply. I'll have a look at this at the weekend... Best regards, Peter Müller > Hello, > > On Sun, 2017-11-12 at 08:13 +0100, Peter Müller wrote: > > Make syslogctrl.c use TCP as remote logging file if specified so. > > > > NOTE: This patch likely contains errors, since I do not know anything > > about C at all. Please have a close look at it. Sorry. > > Yes it has some errors and won't work. Not sure how you tested this > successfully. > > > Signed-off-by: Peter Müller > > --- > > src/misc-progs/syslogdctrl.c | 24 ++++++++++++++++++++++-- > > 1 file changed, 22 insertions(+), 2 deletions(-) > > > > diff --git a/src/misc-progs/syslogdctrl.c b/src/misc-progs/syslogdctrl.c > > index 52719023e..b356ebe49 100644 > > --- a/src/misc-progs/syslogdctrl.c > > +++ b/src/misc-progs/syslogdctrl.c > > @@ -32,13 +32,14 @@ > > > > int main(void) > > { > > - char buffer[STRING_SIZE], command[STRING_SIZE], hostname[STRING_SIZE]; > > + char buffer[STRING_SIZE], command[STRING_SIZE], hostname[STRING_SIZE], > > protocol[STRING_SIZE]; > > char varmessages[STRING_SIZE], asynclog[STRING_SIZE]; > > int config_fd,rc,fd,pid; > > struct stat st; > > struct keyvalue *kv = NULL; > > memset(buffer, 0, STRING_SIZE); > > memset(hostname, 0, STRING_SIZE); > > + memset(protocol, 0, STRING_SIZE); > > memset(varmessages, 0, STRING_SIZE); > > memset(asynclog, 0, STRING_SIZE); > > There is no need to call memset here, but since it is for everything else it > probably doesn't hurt. > > Better would be to initialise the string with "" right when it is defined. Would > spare the memset at runtime. > > Or to change findkey() to set the string to "" when the key wasn't found. > > > @@ -73,6 +74,12 @@ int main(void) > > exit(ERR_SETTINGS); > > } > > > > + if (!findkey(kv, "REMOTELOG_PROTOCOL", protocol)) > > + { > > + fprintf(stderr, "Cannot read REMOTELOG_PROTOCOL\n"); > > + exit(ERR_SETTINGS); > > + } > > + > > freekeyvalues(kv); > > Should we not default to UDP here in case the value is not being set? > > I think exiting is a bit much. > > > @@ -105,9 +112,22 @@ int main(void) > > exit(ERR_CONFIG); > > } > > > > + /* differ between UDP and TCP as rsyslog protocol */ > > if (!strcmp(buffer,"on")) > > - snprintf(buffer, STRING_SIZE - 1, "/bin/sed -e > > 's/^#\\?\\(\\*\\.\\*[[:blank:]]\\+@\\).\\+$/\\1%s/' /etc/syslog.conf >&%d", > > hostname, config_fd ); > > + if ( protocol == "udp" ) > > + { > > + snprintf(buffer, STRING_SIZE - 1, "/bin/sed -e > > 's/^#\\?\\(\\*\\.\\*[[:blank:]]\\+@\\).\\+$/\\1%s/' /etc/syslog.conf >&%d", > > hostname, config_fd ); > > + } > > + elif ( protocol == "tcp" ) > > + { > > + snprintf(buffer, STRING_SIZE - 1, "/bin/sed -e > > 's/^#\\?\\(\\*\\.\\*[[:blank:]]\\+@@\\).\\+$/\\1%s/' /etc/syslog.conf >&%d", > > hostname, config_fd ); > > + } > > + else > > + { > > + fprintf(stderr, "Received invalid protocol for remote log\n"); > > + } > > else > > + /* turn off remote syslog if specified */ > > snprintf(buffer, STRING_SIZE - 1, "/bin/sed -e > > 's/^#\\?\\(\\*\\.\\*[[:blank:]]\\+(a).\\+\\)$/#\\1/' /etc/syslog.conf >&%d", > > config_fd ); > > > > /* if the return code isn't 0 failsafe */ > > This block is slightly messy with calling all the seds. But I it has been like > this before, performance is not important here, etc. > > But you can't compare strings in C like this. You will compare the pointer > values here which will never match. > > The correct check would be: strcmp(protocol, "udp") == 0 > > And likewise for TCP. > > Best, > -Michael