--- Makefile | 24 ++++++++++++---------- klogd.c | 57 ++++++++++++++++++++++++++++++++++++++++------------ pidfile.c | 10 ++++----- resolve.c | 21 ++++++++++++++++--- sample-s390.conf | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ sample.conf | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ syslog.c | 7 +++++- syslogd.c | 51 ++++++++++++++++++++++++++++------------------ 8 files changed, 238 insertions(+), 52 deletions(-) --- Makefile +++ Makefile 2022-10-19 09:50:35.677760471 +0000 @@ -17,20 +17,23 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# For newer Kernel we have 16k buffer size +LOG_BUFFER_SIZE = -DLOG_BUFFER_SIZE=16384 + CC= gcc #SKFLAGS= -g -DSYSV -Wall #LDFLAGS= -g -SKFLAGS= $(RPM_OPT_FLAGS) -DINET6 -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce -I. +SKFLAGS= $(RPM_OPT_FLAGS) -D_GNU_SOURCE -DINET6 -DSYSV -Wall $(LOG_BUFFER_SIZE) -fPIE -I. # -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE # -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE # $(shell getconf LFS_SKFLAGS) -LDFLAGS= -s +LDFLAGS= -pie # Look where your install program is. INSTALL = /usr/bin/install # Destination paths, set prefix=/opt if required -BINDIR = $(prefix)/usr/sbin +BINDIR = $(prefix)/sbin MANDIR = $(prefix)/usr/share/man # There is one report that under an all ELF system there may be a need to @@ -47,7 +50,7 @@ LIBS += $(shell pkg-config libsystemd -- # Define the following to impart start-up delay in klogd. This is # useful if klogd is started simultaneously or in close-proximity to syslogd. -# KLOGD_START_DELAY = -DKLOGD_DELAY=5 +KLOGD_START_DELAY = -DKLOGD_DELAY=5 # The following define determines whether the package adheres to the # file system standard. @@ -127,14 +130,15 @@ clobber: clean rm -f syslogd klogd ksym syslog_tst oops_test TAGS tsyslogd tklogd install_exec: syslogd klogd - ${INSTALL} -m 500 -s syslogd ${BINDIR}/syslogd - ${INSTALL} -m 500 -s klogd ${BINDIR}/klogd + ${INSTALL} -m 500 -s syslogd ${DESTDIR}${BINDIR}/syslogd + ${INSTALL} -m 500 -s klogd ${DESTDIR}${BINDIR}/klogd + ${INSTALL} -m 644 sample.conf ${DESTDIR}/etc/syslog.conf install_man: - ${INSTALL} -o ${MAN_USER} -g ${MAN_GROUP} -m ${MAN_PERMS} sysklogd.8 ${MANDIR}/man8/sysklogd.8 - ${INSTALL} -o ${MAN_USER} -g ${MAN_GROUP} -m ${MAN_PERMS} syslogd.8 ${MANDIR}/man8/syslogd.8 - ${INSTALL} -o ${MAN_USER} -g ${MAN_GROUP} -m ${MAN_PERMS} syslog.conf.5 ${MANDIR}/man5/syslog.conf.5 - ${INSTALL} -o ${MAN_USER} -g ${MAN_GROUP} -m ${MAN_PERMS} klogd.8 ${MANDIR}/man8/klogd.8 + ${INSTALL} -m ${MAN_PERMS} sysklogd.8 ${DESTDIR}${MANDIR}/man8/sysklogd.8 + ${INSTALL} -m ${MAN_PERMS} syslogd.8 ${DESTDIR}${MANDIR}/man8/syslogd.8 + ${INSTALL} -m ${MAN_PERMS} syslog.conf.5 ${DESTDIR}${MANDIR}/man5/syslog.conf.5 + ${INSTALL} -m ${MAN_PERMS} klogd.8 ${DESTDIR}${MANDIR}/man8/klogd.8 obj-m += oops.o --- klogd.c +++ klogd.c 2022-10-19 09:50:35.677760471 +0000 @@ -289,15 +289,21 @@ _syscall3(int,ksyslog,int, type, char *, #include -#define LOG_BUFFER_SIZE 4096 +#ifndef _PATH_KLOG +# define _PATH_KLOG "/proc/kmsg" +#endif + +#ifndef LOG_BUFFER_SIZE +# define LOG_BUFFER_SIZE 4096 +#endif #define LOG_LINE_LENGTH 1000 #ifndef TESTING -#if defined(FSSTND) +# if defined(FSSTND) static char *PidFile = _PATH_VARRUN "klogd.pid"; -#else +# else static char *PidFile = "/etc/klogd.pid"; -#endif +# endif #endif #include "fortify.h" @@ -311,6 +317,8 @@ static int kmsg, static int use_syscall = 0, one_shot = 0, + ring_buf = 0, + ring_buf_clear = 0, symbol_lookup = 1, no_fork = 0; /* don't fork - don't run in daemon mode */ @@ -891,8 +899,7 @@ static void LogLine(char *ptr, int len) value = strtoul(sym_start+1, (char **) 0, 16); *(line-1) = '>'; /* put back delim */ - symbol = LookupSymbol(value, &sym); - if ( !symbol_lookup || symbol == (char *) 0 ) + if ( !symbol_lookup || (symbol = LookupSymbol(value, &sym)) == (char *) 0 ) { parse_state = PARSING_TEXT; break; @@ -933,7 +940,7 @@ static void LogLine(char *ptr, int len) static void LogKernelLine(void) { - auto int rdcnt; + auto int rdcnt, lvl; /* * Zero-fill the log buffer. This should cure a multitude of @@ -942,6 +949,11 @@ static void LogKernelLine(void) * messages into this fresh buffer. */ memset(log_buffer, '\0', log_buf_size); + lvl = 2; + if (one_shot) { + if (ring_buf) lvl = 3; + if (ring_buf_clear) lvl = 4; + } if ( (rdcnt = ksyslog(2, log_buffer, log_buf_size-1)) < 0 ) { if ( errno == EINTR ) @@ -1051,10 +1063,15 @@ int main(argc, argv) #ifndef TESTING pid_t ppid = getpid(); - chdir ("/"); + if (chdir ("/") < 0) { + fprintf(stderr, + "klogd: Can not change to root directory: %s\n", + strerror(errno)); + exit(1); + } #endif /* Parse the command-line. */ - while ((ch = getopt(argc, argv, "c:df:iIk:nopsvx2")) != EOF) + while ((ch = getopt(argc, argv, "c:df:iIk:nopsvx2rR")) != EOF) switch((char)ch) { case '2': /* Print lines with symbols twice. */ @@ -1085,6 +1102,14 @@ int main(argc, argv) case 'o': /* One-shot mode. */ one_shot = 1; break; + case 'r': /* One-shot mode. */ + one_shot = 1; + ring_buf = 1; + break; + case 'R': /* One-shot mode. */ + one_shot = 1; + ring_buf_clear = 1; + break; case 'p': SetParanoiaLevel(1); /* Load symbols on oops. */ break; @@ -1229,8 +1254,11 @@ int main(argc, argv) if ( one_shot ) { if (symbol_lookup) { - InitKsyms(symfile); - InitMsyms(); + /* Both functions return 1 at success and 0 otherwise */ + symbol_lookup = InitKsyms(symfile); + symbol_lookup |= InitMsyms(); + if (!symbol_lookup) + Syslog(LOG_WARNING, "Cannot build symbol table - disabling symbol lookups"); } if ( (logsrc = GetKernelLogSrc()) == kernel ) LogKernelLine(); @@ -1245,8 +1273,11 @@ int main(argc, argv) #endif logsrc = GetKernelLogSrc(); if (symbol_lookup) { - InitKsyms(symfile); - InitMsyms(); + /* Both functions return 1 at success and 0 otherwise */ + symbol_lookup = InitKsyms(symfile); + symbol_lookup |= InitMsyms(); + if (!symbol_lookup) + Syslog(LOG_WARNING, "Cannot build symbol table - disabling symbol lookups"); } #ifndef TESTING --- pidfile.c +++ pidfile.c 2022-10-19 09:50:35.677760471 +0000 @@ -46,11 +46,11 @@ int read_pid (char *pidfile) { FILE *f; - int pid; + int pid = 0; if (!(f=fopen(pidfile,"r"))) return 0; - fscanf(f,"%d", &pid); + (void)fscanf(f,"%d", &pid); fclose(f); return pid; } @@ -90,7 +90,7 @@ int write_pid (char *pidfile) { FILE *f; int fd; - int pid; + int pid = 0; #if defined(USE_FCNTL) && (USE_FCNTL != 0) struct flock lck; #endif @@ -115,14 +115,14 @@ int write_pid (char *pidfile) } #else if (flock(fd, LOCK_EX|LOCK_NB) == -1) { - fscanf(f, "%d", &pid); + (void)fscanf(f, "%d", &pid); fclose(f); fprintf(stderr, "Can't lock, lock is held by pid %d.\n", pid); return 0; } #endif - pid = getpid(); + pid = (int)getpid(); if (!fprintf(f,"%d\n", pid)) { fprintf(stderr, "Can't write pid , %s.\n", strerror(errno)); close(fd); --- resolve.c +++ resolve.c 2022-10-19 09:50:35.677760471 +0000 @@ -13,6 +13,7 @@ #include #include #include +#include #if defined(__GLIBC__) #define dprintf mydprintf @@ -208,7 +209,7 @@ do_query(int fd, int family, const char { struct sockaddr_storage ss; struct addrinfo hints, *res; - int r; + int r, c; memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_DGRAM; @@ -244,6 +245,20 @@ do_query(int fd, int family, const char } else { memcpy(&ss, res->ai_addr, res->ai_addrlen); } - write(fd, &ss, sizeof(ss)); - exit(0); + + c = 100; + do { + if ((r = write(fd, &ss, sizeof(ss))) < 0) { + if ((errno != EAGAIN) && (errno != EINTR)) { + dprintf("failed to write: %s\n", strerror(errno)); + exit(1); + } + usleep(50000); + } + } while ((r < 0) && (c-- > 0)); + + if (r >= 0) + exit(0); + dprintf("failed to write: %s\n", strerror(errno)); + exit(1); } --- sample-s390.conf +++ sample-s390.conf 2022-10-19 09:50:35.677760471 +0000 @@ -0,0 +1,60 @@ +# /etc/syslog.conf - Configuration file for syslogd(8) +# +# For info about the format of this file, see "man syslog.conf". +# + +# +# +# print most on /dev/console and on the xconsole pipe +# +kern.*;*.warning;news.emerg;mail.alert;authpriv.none /dev/console +kern.*;*.warning;news.err;mail.err;authpriv.none |/dev/xconsole +*.emerg * + +# enable this, if you want that root is informed +# immediately, e.g. of logins +#*.alert root + + +# +# all email-messages in one file +# +mail.* -/var/log/mail +mail.info -/var/log/mail.info +mail.warning -/var/log/mail.warn +mail.err /var/log/mail.err + +# +# all news-messages +# +# these files are rotated and examined by "news.daily" +news.crit -/var/log/news/news.crit +news.err -/var/log/news/news.err +news.notice -/var/log/news/news.notice +# enable this, if you want to keep all news messages +# in one file +#news.* -/var/log/news.all + +# +# Warnings in one file +# +*.=warning;*.=err -/var/log/warn +*.crit /var/log/warn + +# +# save the rest in one file +# +*.*;mail.none;news.none -/var/log/messages + +# +# enable this, if you want to keep all messages +# in one file +#*.* -/var/log/allmessages + +# +# Some foreign boot scripts require local7 +# +local0,local1.* -/var/log/localmessages +local2,local3.* -/var/log/localmessages +local4,local5.* -/var/log/localmessages +local6,local7.* -/var/log/localmessages --- sample.conf +++ sample.conf 2022-10-19 09:50:35.677760471 +0000 @@ -0,0 +1,60 @@ +# /etc/syslog.conf - Configuration file for syslogd(8) +# +# For info about the format of this file, see "man syslog.conf". +# + +# +# +# print most on tty10 and on the xconsole pipe +# +kern.warning;*.err;authpriv.none /dev/tty10 +kern.warning;*.err;authpriv.none |/dev/xconsole +*.emerg * + +# enable this, if you want that root is informed +# immediately, e.g. of logins +#*.alert root + + +# +# all email-messages in one file +# +mail.* -/var/log/mail +mail.info -/var/log/mail.info +mail.warning -/var/log/mail.warn +mail.err /var/log/mail.err + +# +# all news-messages +# +# these files are rotated and examined by "news.daily" +news.crit -/var/log/news/news.crit +news.err -/var/log/news/news.err +news.notice -/var/log/news/news.notice +# enable this, if you want to keep all news messages +# in one file +#news.* -/var/log/news.all + +# +# Warnings in one file +# +*.=warning;*.=err -/var/log/warn +*.crit /var/log/warn + +# +# save the rest in one file +# +*.*;mail.none;news.none -/var/log/messages + +# +# enable this, if you want to keep all messages +# in one file +#*.* -/var/log/allmessages + +# +# Some foreign boot scripts require local7 +# +local0,local1.* -/var/log/localmessages +local2,local3.* -/var/log/localmessages +local4,local5.* -/var/log/localmessages +local6,local7.* -/var/log/localmessages --- syslog.c +++ syslog.c 2022-10-19 09:50:35.677760471 +0000 @@ -73,7 +73,12 @@ static char sccsid[] = "@(#)syslog.c 5.2 #include #include -#define _PATH_LOGNAME "/dev/log" +#ifdef _PATH_LOG +# define _PATH_LOGNAME _PATH_LOG +#endif +#ifndef _PATH_LOGNAME +# define _PATH_LOGNAME "/dev/log" +#endif #undef LOG_FAC static inline int LOG_FAC(const int pri) --- syslogd.c +++ syslogd.c 2022-10-19 09:55:06.300950261 +0000 @@ -519,6 +519,7 @@ static char sccsid[] __attribute__ ((un #include #endif #include +#include #include #include #include @@ -651,7 +652,11 @@ int sd_fds = 0; # define UNAMESZ 8 /* length of a login name */ #endif #define MAXUNAMES 20 /* maximum number of user names */ -#define MAXFNAME 200 /* max file pathname length */ +#ifdef _POSIX_PATH_MAX +# define MAXFNAME _POSIX_PATH_MAX +#else +# define MAXFNAME 200 /* max file pathname length */ +#endif #define INTERNAL_NOPRI 0x10 /* the "no priority" priority */ #define TABLE_NOPRI 0 /* Value to indicate no priority in f_pmask */ @@ -733,8 +738,8 @@ struct filed { * in seconds after previous message is logged. After each flush, * we move to the next interval until we reach the largest. */ -int repeatinterval[] = { 30, 60 }; /* # of secs before flush */ -#define MAXREPEAT ((sizeof(repeatinterval) / sizeof(repeatinterval[0])) - 1) +time_t repeatinterval[] = { 30, 60 }; /* # of secs before flush */ +#define MAXREPEAT ((int)((sizeof(repeatinterval) / sizeof(repeatinterval[0])) - 1)) #define REPEATTIME(f) ((f)->f_time + repeatinterval[(f)->f_repeatcount]) #define BACKOFF(f) { if (++(f)->f_repeatcount > MAXREPEAT) \ (f)->f_repeatcount = MAXREPEAT; \ @@ -849,7 +854,7 @@ int usage(void); static pid_t sid; #endif void untty(void); -void printchopped(const char *hname, char *msg, int len, int fd); +void printchopped(const char *hname, char *msg, size_t len, int fd); void printline(const char *hname, char *msg); void printsys(char *msg); void logmsg(int pri, char *msg, const char *from, int flags); @@ -944,7 +949,12 @@ int main(argc, argv) int maxfds; #ifndef TESTING - chdir ("/"); + if (chdir("/") < 0) { + fprintf(stderr, + "syslogd: Can not change to root directory: %s\n", + strerror(errno)); + exit(1); + } #endif for (i = 1; i < MAXFUNIX; i++) { funixn[i] = ""; @@ -1400,7 +1410,7 @@ int main(argc, argv) parts[fileno(stdin)] = (char *) 0; i = read(fileno(stdin), line, MAXLINE); if (i > 0) { - printchopped(LocalHostName, line, i+1, fileno(stdin)); + printchopped(LocalHostName, line, (size_t)(i+1), fileno(stdin)); } else if (i < 0) { if (errno != EINTR) { logerror("stdin"); @@ -1474,8 +1484,9 @@ static int create_unix_socket(const char close(fd); #ifndef SYSV dienow(); -#endif +#else return -1; +#endif } return fd; } @@ -1660,7 +1671,7 @@ void untty() void printchopped(hname, msg, len, fd) const char *hname; char *msg; - int len; + size_t len; int fd; { auto int ptlngth; @@ -1771,6 +1782,8 @@ void printline(hname, msg) while ((c = *p++) && q < &line[sizeof(line) - 4]) { if (c == '\n' || c == 127) *q++ = ' '; + else if (c == '\t') + *q++ = c; else if (c < 040) { *q++ = '^'; *q++ = c ^ 0100; @@ -1954,7 +1967,7 @@ void logmsg(pri, msg, from, flags) !strcmp(from, f->f_prevhost)) { (void) strncpy(f->f_lasttime, timestamp, 15); f->f_prevcount++; - dprintf("msg repeated %d times, %ld sec of %d.\n", + dprintf("msg repeated %d times, %ld sec of %ld.\n", f->f_prevcount, now - f->f_time, repeatinterval[f->f_repeatcount]); /* @@ -2293,15 +2306,7 @@ void wallmsg(f, iov) register struct filed *f; struct iovec *iov; { - char p[sizeof (_PATH_DEV) + UNAMESZ]; - register int i; - int ttyf, len; static int reenter = 0; - struct utmp ut; - struct utmp *uptr; - char greetings[200]; - - (void) &len; if (reenter++) return; @@ -2309,12 +2314,18 @@ void wallmsg(f, iov) /* open the user login file */ setutent(); - /* * Might as well fork instead of using nonblocking I/O * and doing notty(). */ if (fork() == 0) { + char p[sizeof (_PATH_DEV) + UNAMESZ]; + register int i; + int ttyf, len; + struct utmp ut; + struct utmp *uptr; + char greetings[200]; + (void) signal(SIGTERM, SIG_DFL); (void) alarm(0); (void) snprintf(greetings, sizeof(greetings), @@ -2358,7 +2369,7 @@ void wallmsg(f, iov) iov[1].iov_len = 0; } if (setjmp(ttybuf) == 0) { - (void) signal(SIGALRM, endtty); + (void) resignal(SIGALRM, endtty); (void) alarm(15); /* open the terminal */ ttyf = open(p, O_WRONLY|O_NOCTTY); @@ -2521,7 +2532,7 @@ void domark() for (f = Files; f; f = f->f_next) { #endif if (f->f_prevcount && now >= REPEATTIME(f)) { - dprintf("flush %s: repeated %d times, %d sec.\n", + dprintf("flush %s: repeated %d times, %ld sec.\n", TypeNames[f->f_type], f->f_prevcount, repeatinterval[f->f_repeatcount]); fprintlog(f, LocalHostName, 0, (char *)NULL);