Sync from SUSE:SLFO:Main syslogd revision bc786bf41cca4f10d6402fdc425cfe00

This commit is contained in:
Adrian Schröter 2024-05-04 00:59:18 +02:00
commit eb97ddced7
36 changed files with 5950 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

53
klog.service Normal file
View File

@ -0,0 +1,53 @@
# /lib/systemd/system/klog.service
#
# This file is part of package systemd.
#
# Copyright (c) 2011 SuSE LINUX Products GmbH, Germany.
# Author: Werner Fink
# Please send feedback to http://www.suse.de/feedback
#
# Description:
#
# Create the well known /var/log/boot.msg
# By using dmesg(1) the normal kernel and boot messages handled
# by systemd will not disappear. The character device /dev/tty10
# will be created by udevd and therefore should exists only if
# virtual consoles are available.
#
[Unit]
Description=Early Kernel Boot Messages
DefaultDependencies=no
Requires=local-fs.target
After=local-fs.target
Before=shutdown.target
RefuseManualStart=true
ConditionPathIsDirectory=/var/log
[Service]
# added automatically, for details please see
# https://en.opensuse.org/openSUSE:Security_Features#Systemd_hardening_effort
ProtectSystem=full
ProtectHome=true
ProtectHostname=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictRealtime=true
# end of automatic additions
Type=oneshot
StandardError=tty
StandardOutput=tty
RemainAfterExit=yes
Environment=CONSOLE_LOGLEVEL=
Environment=KLOG_CONSOLE=10
EnvironmentFile=-/etc/sysconfig/boot
ExecStart=/bin/sh -c "test -s /var/log/boot.msg && /bin/mv -f /var/log/boot.msg /var/log/boot.omsg || :"
ExecStart=/bin/sh -c "/bin/dmesg -r > /var/log/boot.msg"
ExecStart=/bin/sh -c "test -s /dev/shm/initrd.msg -a -O /dev/shm/initrd.msg && /bin/cat /dev/shm/initrd.msg >> /var/log/boot.msg || :"
ExecStart=/bin/sh -c "test -c /dev/tty$KLOG_CONSOLE && /usr/bin/setlogcons $KLOG_CONSOLE || :"
ExecStart=/bin/sh -c "if test -n \"$CONSOLE_LOGLEVEL\" ; then /bin/dmesg -n $CONSOLE_LOGLEVEL || : ; fi"
[Install]
WantedBy=basic.target
Alias=bootmsg.service

50
klogd.service Normal file
View File

@ -0,0 +1,50 @@
# /lib/systemd/system/klogd.service
#
# This file is part of package klogd.
#
# Copyright (c) 2011 SuSE LINUX Products GmbH, Germany.
# Author: Werner Fink
# Please send feedback to http://www.suse.de/feedback
#
# Description:
#
# Used to start klogd, the System Kernel Logging Service
# if and only if the System Logger does not provide this
# its self. If the System Logger can do Kernel Logging
# Service this file should be masked by a symbolic link
# from /etc/systemd/system/klogd.service to /dev/null.
#
# If klogd.service is started then BindsTo=syslog.service
# within unit section to make it disappear if syslogd dies.
#
[Unit]
Description=System Kernel Logging Service
Requisite=syslogd.service
BindsTo=syslogd.service
After=syslogd.service
RefuseManualStart=true
[Service]
# added automatically, for details please see
# https://en.opensuse.org/openSUSE:Security_Features#Systemd_hardening_effort
ProtectSystem=full
ProtectHome=true
PrivateDevices=true
ProtectHostname=true
ProtectClock=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictRealtime=true
# end of automatic additions
Type=simple
StandardOutput=journal
StandardError=journal
Environment=KERNEL_LOGLEVEL=1
Environment=KLOGD_PARAMS=
EnvironmentFile=-/etc/sysconfig/syslog
ExecStart=/sbin/klogd -n -c $KERNEL_LOGLEVEL $KLOGD_PARAMS -x
[Install]
WantedBy=multi-user.target

30
logrotate.syslog Normal file
View File

@ -0,0 +1,30 @@
#
# Please note, that changing of log file permissions in this
# file is not sufficient if syslog-ng is used as log daemon.
#
# It is required to specify the permissions in the syslog-ng
# configuration file /etc/syslog-ng/syslog-ng.conf as well.
#
# the firewall,acpid,NetworkManager log files
# are used by syslog-ng and rsyslog only, the
# other by all syslog daemons.
# the mail log files are used by all syslog daemons
# the news log files are used by all syslog daemons
/var/log/warn /var/log/messages /var/log/allmessages /var/log/localmessages
/var/log/firewall /var/log/acpid /var/log/NetworkManager
/var/log/mail /var/log/mail.info /var/log/mail.warn /var/log/mail.err
/var/log/news/news.crit /var/log/news/news.err /var/log/news/news.notice
{
compress
dateext
maxage 365
rotate 99
missingok
notifempty
size +4096k
sharedscripts
postrotate
/usr/bin/systemctl reload syslog.service > /dev/null
endscript
}

15
sysconfig.boot Normal file
View File

@ -0,0 +1,15 @@
## Path: System/Logging
## Description: System logging
## Type: list(1,2,3,4,5,6,7,8,9,10,11,12)
## Default: 10
#
# Console for logging
#
KLOG_CONSOLE="10"
## Type: list(,0,emerg,1,alert,2,crit,3,err,4,warning,5,notice,6,info,7,debug)
## Default:
#
# Loglevel for log console (numbers are equal to corresponding strings)
#
CONSOLE_LOGLEVEL=""

22
sysconfig.klogd Normal file
View File

@ -0,0 +1,22 @@
## Path: System/Logging
## Description: System logging
## Type: list(0,1,2,3,4,5,6,7)
## Default: 1
## Config: ""
## ServiceRestart: syslog
#
# Default loglevel for klogd
#
KERNEL_LOGLEVEL=1
## Type: string
## Default: -x
## Config: ""
## ServiceRestart: syslog
#
# if not empty: parameters for klogd
# for example KLOGD_PARAMS="-x" to avoid (duplicate) symbol resolution
#
KLOGD_PARAMS="-x"

12
sysconfig.syslogd Normal file
View File

@ -0,0 +1,12 @@
## Path: System/Logging
## Description: System logging
## Type: string
## Default: ""
## Config: ""
## ServiceRestart: syslog
#
# if not empty: parameters for syslogd
# for example SYSLOGD_PARAMS="-r -s my.dom.ain"
#
SYSLOGD_PARAMS=""

View File

@ -0,0 +1,37 @@
---
syslog.c | 6 ++++++
syslogd.c | 7 +++++++
2 files changed, 13 insertions(+)
--- syslog.c
+++ syslog.c 2014-09-24 16:09:26.062235727 +0000
@@ -75,6 +75,13 @@ static char sccsid[] = "@(#)syslog.c 5.2
#define _PATH_LOGNAME "/dev/log"
+#undef LOG_FAC
+static inline int LOG_FAC(const int pri)
+{
+ unsigned int fac = pri >> 3;
+ return (fac > 23) ? 23 : fac;
+}
+
#include "fortify.h"
static int LogFile = -1; /* fd for log */
--- syslogd.c
+++ syslogd.c 2014-09-22 08:18:13.122235747 +0000
@@ -614,6 +614,13 @@ static char sccsid[] __attribute__ ((un
#define SYSTEMD_PATH_LOG "/run/systemd/journal/syslog"
#endif
+#undef LOG_FAC
+static inline int LOG_FAC(const int pri)
+{
+ unsigned int fac = pri >> 3;
+ return (fac > 23) ? 23 : fac;
+}
+
char *ConfFile = _PATH_LOGCONF;
char *PidFile = _PATH_LOGPID;
char ctty[] = _PATH_CONSOLE;

View File

@ -0,0 +1,367 @@
!
! Be able to write errors on creating of pid file on
! the current terminal (bug #394787)
!
---
klogd.c | 78 +++++++++++++++++++++++++++++++++++---------------------------
pidfile.c | 39 +++++++++++++++++++++++++++----
syslogd.c | 60 +++++++++++++++++++++++++++++------------------
3 files changed, 117 insertions(+), 60 deletions(-)
--- klogd.c
+++ klogd.c 2022-10-17 11:12:11.438652739 +0000
@@ -268,6 +268,8 @@
#include <stdarg.h>
#include <paths.h>
#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
#include "klogd.h"
#include "ksyms.h"
#ifndef TESTING
@@ -366,13 +368,12 @@ static void CloseLogSrc()
/*
* Signal handler to terminate the parent process.
*/
+static volatile sig_atomic_t leave;
#ifndef TESTING
void doexit(sig)
-
int sig;
-
{
- exit (0);
+ leave++;
}
#endif
@@ -1110,14 +1111,41 @@ int main(argc, argv)
{
if (!check_pid(PidFile))
{
- signal (SIGTERM, doexit);
- if ( fork() == 0 )
- {
- auto int fl;
- int num_fds = getdtablesize();
+ pid_t pid;
+ int n=0, num_fds, fl, status;
+ leave = 0;
+ signal (SIGTERM, doexit);
+ switch ((pid = fork())) {
+ default:
+ retry:
+ /*
+ * Parent process
+ */
+ switch (waitpid(pid, &status, WNOHANG|WUNTRACED)) {
+ case -1:
+ if (errno == EINTR)
+ goto retry;
+ break;
+ case 0:
+ if (leave)
+ exit(0);
+ usleep(10*1000);
+ if (++n < 30000)
+ goto retry;
+ default:
+ break;
+ }
+ case -1:
+ /*
+ * Not reached unless something major went wrong.
+ */
+ exit(1);
+ case 0:
signal (SIGTERM, SIG_DFL);
-
+
+ num_fds = getdtablesize();
+
/* This is the child closing its file descriptors. */
for (fl= 0; fl <= num_fds; ++fl)
{
@@ -1128,17 +1156,12 @@ int main(argc, argv)
}
setsid();
- }
- else
- {
- /*
- * Parent process
- */
- sleep(300);
- /*
- * Not reached unless something major went wrong.
- */
- exit(1);
+
+ /* tuck my process id away */
+ if (!write_pid(PidFile))
+ Terminate();
+
+ break;
}
}
else
@@ -1147,19 +1170,6 @@ int main(argc, argv)
exit(1);
}
}
-
-
- /* tuck my process id away */
- if (!check_pid(PidFile))
- {
- if (!write_pid(PidFile))
- Terminate();
- }
- else
- {
- fputs("klogd: Already running.\n", stderr);
- Terminate();
- }
#endif
/* Signal setups. */
@@ -1225,6 +1235,8 @@ int main(argc, argv)
{
if ( change_state )
ChangeLogging();
+ if (leave)
+ exit(0);
switch ( logsrc )
{
case kernel:
--- pidfile.c
+++ pidfile.c 2022-10-17 11:11:16.627630427 +0000
@@ -23,6 +23,7 @@
* Sat Aug 19 13:24:33 MET DST 1995: Martin Schulze
* First version (v0.2) released
*/
+#define USE_FCNTL 1
#include <stdio.h>
#include <unistd.h>
@@ -31,6 +32,10 @@
#include <string.h>
#include <errno.h>
#include <signal.h>
+#if defined(USE_FCNTL) && (USE_FCNTL != 0)
+# include <unistd.h>
+# include <fcntl.h>
+#endif
/* read_pid
*
@@ -86,6 +91,9 @@ int write_pid (char *pidfile)
FILE *f;
int fd;
int pid;
+#if defined(USE_FCNTL) && (USE_FCNTL != 0)
+ struct flock lck;
+#endif
if ( ((fd = open(pidfile, O_RDWR|O_CREAT|O_TRUNC, 0644)) == -1)
|| ((f = fdopen(fd, "r+")) == NULL) ) {
@@ -93,23 +101,46 @@ int write_pid (char *pidfile)
return 0;
}
+#if defined(USE_FCNTL) && (USE_FCNTL != 0)
+ memset(&lck, 0, sizeof (struct flock));
+ lck.l_type = F_WRLCK;
+ lck.l_whence = SEEK_SET;
+
+ if (fcntl(fd, F_SETLK, &lck) == -1) {
+ fclose(f);
+ memset(&lck, 0, sizeof (struct flock));
+ fcntl(fd, F_GETLK, &lck);
+ fprintf(stderr, "Can't lock, lock is held by pid %d.\n", lck.l_pid);
+ return 0;
+ }
+#else
if (flock(fd, LOCK_EX|LOCK_NB) == -1) {
fscanf(f, "%d", &pid);
fclose(f);
- printf("Can't lock, lock is held by pid %d.\n", pid);
+ fprintf(stderr, "Can't lock, lock is held by pid %d.\n", pid);
return 0;
}
+#endif
pid = getpid();
if (!fprintf(f,"%d\n", pid)) {
- printf("Can't write pid , %s.\n", strerror(errno));
+ fprintf(stderr, "Can't write pid , %s.\n", strerror(errno));
close(fd);
return 0;
}
fflush(f);
- if (flock(fd, LOCK_UN) == -1) {
- printf("Can't unlock pidfile %s, %s.\n", pidfile, strerror(errno));
+#if defined(USE_FCNTL) && (USE_FCNTL != 0)
+ memset(&lck, 0, sizeof (struct flock));
+ lck.l_type = F_UNLCK;
+ lck.l_whence = SEEK_SET;
+
+ if (fcntl(fd, F_SETLK, &lck) == -1)
+#else
+ if (flock(fd, LOCK_UN) == -1)
+#endif
+ {
+ fprintf(stderr,"Can't unlock pidfile %s, %s.\n", pidfile, strerror(errno));
close(fd);
return 0;
}
--- syslogd.c
+++ syslogd.c 2022-10-17 11:11:16.627630427 +0000
@@ -22,7 +22,7 @@ char copyright2[] =
#endif /* not lint */
#if !defined(lint) && !defined(NO_SCCS)
-static char sccsid[] = "@(#)syslogd.c 5.27 (Berkeley) 10/10/88";
+static char sccsid[] __attribute__ ((unused)) = "@(#)syslogd.c 5.27 (Berkeley) 10/10/88";
#endif /* not lint */
/*
@@ -900,7 +900,9 @@ int main(argc, argv)
fd_set readfds;
#ifndef TESTING
+#ifdef SYSLOG_UNIXAF
int fd;
+#endif
#ifdef SYSLOG_INET
#ifdef INET6
struct sockaddr_storage frominet;
@@ -915,7 +917,9 @@ int main(argc, argv)
int ch;
struct hostent *hent;
+#if defined(SYSLOG_UNIXAF) || defined(TESTING)
char line[MAXLINE +1];
+#endif
extern int optind;
extern char *optarg;
int maxfds;
@@ -1033,11 +1037,20 @@ int main(argc, argv)
exit(1);
case 0:
signal (SIGTERM, SIG_DFL);
-
+
+ /* tuck my process id away */
+ dprintf("Writing pidfile.\n");
+ if (!write_pid(PidFile))
+ {
+ dprintf("Can't write pid.\n");
+ exit(1);
+ }
+
num_fds = getdtablesize();
for (i = 0; i < num_fds; i++)
(void) close(i);
untty();
+ break;
}
}
else
@@ -1047,36 +1060,37 @@ int main(argc, argv)
}
}
else
+ {
#endif
debugging_on = 1;
#ifndef SYSV
- else
setlinebuf(stdout);
#endif
#ifndef TESTING
- /* tuck my process id away */
- if ( !Debug )
- {
- dprintf("Writing pidfile.\n");
- if (!check_pid(PidFile))
+ /* tuck my process id away */
+ if ( !Debug )
{
- if (!write_pid(PidFile))
+ dprintf("Writing pidfile.\n");
+ if (!check_pid(PidFile))
+ {
+ if (!write_pid(PidFile))
+ {
+ dprintf("Can't write pid.\n");
+ if (getpid() != ppid)
+ kill (ppid, SIGTERM);
+ exit(1);
+ }
+ }
+ else
{
- dprintf("Can't write pid.\n");
+ dprintf("Pidfile (and pid) already exist.\n");
if (getpid() != ppid)
kill (ppid, SIGTERM);
exit(1);
}
- }
- else
- {
- dprintf("Pidfile (and pid) already exist.\n");
- if (getpid() != ppid)
- kill (ppid, SIGTERM);
- exit(1);
- }
- } /* if ( !Debug ) */
+ } /* if ( !Debug ) */
+ }
#endif
consfile.f_type = F_CONSOLE;
@@ -1738,7 +1752,7 @@ void logmsg(pri, msg, from, flags)
int flags;
{
register struct filed *f;
- int fac, prilev, lognum;
+ int fac, prilev;
int msglen;
char *timestamp;
#ifdef __gnu_linux__
@@ -1746,6 +1760,8 @@ void logmsg(pri, msg, from, flags)
#else
#ifndef SYSV
sigset_t omask;
+#else
+ int lognum;
#endif
#endif
@@ -2512,11 +2528,9 @@ void init()
register int i, lognum;
register FILE *cf;
register struct filed *f;
-#ifndef TESTING
#ifndef SYSV
register struct filed **nextp = (struct filed **) 0;
#endif
-#endif
register char *p;
register unsigned int Forwarding = 0;
#ifdef CONT_LINE
@@ -2601,7 +2615,7 @@ void init()
#else
*nextp = (struct filed *)calloc(1, sizeof(*f));
cfline("*.ERR\t" _PATH_CONSOLE, *nextp);
- (*nextp)->f_next = (struct filed *)calloc(1, sizeof(*f)) /* ASP */
+ (*nextp)->f_next = (struct filed *)calloc(1, sizeof(*f)); /* ASP */
cfline("*.PANIC\t*", (*nextp)->f_next);
#endif
Initialized = 1;

View File

@ -0,0 +1,14 @@
--- syslog.c
+++ syslog.c 2001-05-23 18:48:13.000000000 +0000
@@ -224,8 +224,9 @@ openlog(ident, logstat, logfac)
strncpy(SyslogAddr.sa_data, _PATH_LOGNAME,
sizeof(SyslogAddr.sa_data));
if (LogStat & LOG_NDELAY) {
- LogFile = socket(AF_UNIX, SOCK_DGRAM, 0);
-/* fcntl(LogFile, F_SETFD, 1); */
+ if ((LogFile = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
+ return;
+ fcntl(LogFile, F_SETFD, 1);
}
}
if (LogFile != -1 && !connected &&

498
sysklogd-1.4.1-dns.patch Normal file
View File

@ -0,0 +1,498 @@
---
Makefile | 4
resolve.c | 249 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
syslogd.c | 139 +++++-----------------------------
3 files changed, 275 insertions(+), 117 deletions(-)
--- Makefile
+++ Makefile 2022-10-18 06:11:16.691008894 +0000
@@ -79,8 +79,8 @@ test: syslog_tst ksym oops.ko tsyslogd
install: install_man install_exec
-syslogd: syslogd.o pidfile.o
- ${CC} ${LDFLAGS} -o syslogd syslogd.o pidfile.o ${LIBS}
+syslogd: syslogd.o pidfile.o resolve.o
+ ${CC} ${LDFLAGS} -o syslogd syslogd.o pidfile.o resolve.o ${LIBS}
klogd: klogd.o syslog.o pidfile.o ksym.o ksym_mod.o
${CC} ${LDFLAGS} -o klogd klogd.o syslog.o pidfile.o ksym.o \
--- resolve.c
+++ resolve.c 2022-10-18 06:11:16.691008894 +0000
@@ -0,0 +1,249 @@
+/*
+ * Resolve a hostname
+ *
+ * Copyright (C) 2003, SuSE Linux AG
+ * Written by okir@suse.de
+ */
+
+#include <sys/poll.h>
+#include <netdb.h>
+#include <string.h>
+#include <time.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#if defined(__GLIBC__)
+#define dprintf mydprintf
+#endif /* __GLIBC__ */
+
+/* Number of times we retry resolving a name */
+#define RESOLVER_RETRIES 10
+/* Timeout between retries to resolve a name */
+#define RESOLVER_RETRY_TIME (3 * 60)
+/* Time to wait for the sub-process comes up with an
+ * answer, before we suspend the entry */
+#define RESOLVER_WAIT_TIME 5
+
+struct res_name {
+ struct res_name * next;
+ char * name;
+ unsigned int retries;
+ time_t retry_time;
+ time_t wait_time;
+ pid_t process;
+ int pipe;
+ struct sockaddr_storage address;
+};
+
+extern void dprintf(char *fmt, ...);
+static int do_result(struct res_name *res);
+static void do_query(int, int, const char *);
+
+static struct res_name *resolve;
+
+int
+resolve_name(const char *name, int family, struct sockaddr_storage *addr)
+{
+ struct res_name *res;
+ int fd[2];
+ pid_t pid;
+ time_t now;
+
+ time(&now);
+ for (res = resolve; res; res = res->next) {
+ if (!strcmp(res->name, name)) {
+ /* If there's still a sub-process
+ * attached, see if it came up with an
+ * answer in the meantime */
+ if (res->pipe >= 0)
+ do_result(res);
+ goto check_result;
+ }
+ }
+
+ res = (struct res_name *) calloc(1, sizeof(*res));
+ res->name = strdup(name);
+ res->retries = RESOLVER_RETRIES;
+ res->retry_time = now + RESOLVER_RETRY_TIME;
+ res->pipe = -1;
+ res->next = resolve;
+ resolve = res;
+
+retry: res->retries -= 1;
+
+ dprintf("Trying to resolve \"%s\", attempt #%u\n",
+ res->name, RESOLVER_RETRIES - res->retries);
+
+ if (res->pipe >= 0) {
+ /* Make sure resolver subprocess is dead */
+ kill(res->process, SIGKILL);
+ close(res->pipe);
+ res->pipe = -1;
+ }
+
+ signal(SIGCHLD, SIG_IGN);
+ if (pipe(fd) < 0) {
+ /* log error? */
+ return -1;
+ }
+ if ((pid = fork()) < 0) {
+ /* log error? */
+ close(fd[0]);
+ close(fd[1]);
+ return -1;
+ }
+
+ if (pid == 0) {
+ close(fd[0]);
+ do_query(fd[1], family, res->name);
+ /* shouldn't return */
+ exit(1);
+ }
+
+ res->wait_time = now + RESOLVER_WAIT_TIME;
+ res->process = pid;
+ res->pipe = fd[0];
+ close(fd[1]);
+
+ /* Try to collect result within the next couple
+ * of seconds */
+ do_result(res);
+
+check_result:
+ if (res->pipe >= 0) {
+ dprintf("%s: name resolution not complete, "
+ "waiting for resolver sub-process\n",
+ res->name);
+ return 0;
+ }
+
+ if (res->address.ss_family != AF_UNSPEC) {
+ *addr = res->address;
+ return 1;
+ }
+ if (res->retries == 0) {
+ dprintf("%s: too many failed attempts to resolve hostname, "
+ "given up.\n", res->name);
+ return -1;
+ }
+ if (res->retry_time > now) {
+ dprintf("%s: name resolution failed, "
+ "will retry in %d seconds\n",
+ res->name, res->retry_time - now);
+ return 0;
+ }
+ goto retry;
+}
+
+/*
+ * This function clears the resolver's internal state
+ * when syslogd received a SIGHUP
+ */
+void
+init_resolver(void)
+{
+ struct res_name *res;
+
+ for (res = resolve; res; res = res->next) {
+ res->address.ss_family = AF_UNSPEC;
+ res->retries = RESOLVER_RETRIES;
+ res->retry_time = 0;
+ }
+}
+
+
+/*
+ * Collect result from sub-process
+ */
+int
+do_result(struct res_name *res)
+{
+ struct sockaddr_storage addr;
+ struct pollfd _poll;
+ long wait;
+ int n;
+
+ if (res->pipe < 0)
+ return 0;
+
+ /* See if we should wait for the subprocess to come
+ * up with an answer (the initial call to do_result
+ * after starting the sub-process will always wait for
+ * a few seconds to avoid losing messages) */
+ if ((wait = res->wait_time - time(NULL)) < 0)
+ wait = 0;
+
+ /* See if we get the resolver's result within the
+ * next "wait" seconds. If not, let it continue in the
+ * background */
+ _poll.fd = res->pipe;
+ _poll.events = POLLIN;
+ if (poll(&_poll, 1, wait * 1000) < 1)
+ return 0;
+
+ n = read(res->pipe, &addr, sizeof(addr));
+
+ /* child process has done its duty. */
+ kill(res->process, SIGKILL);
+ close(res->pipe);
+ res->process = 0;
+ res->pipe = -1;
+
+ if (n != sizeof(addr))
+ return -1;
+
+ res->address = addr;
+ if (addr.ss_family != AF_UNSPEC)
+ return 1;
+ return -1;
+}
+
+/*
+ * Sub-process performing lookup
+ */
+void
+do_query(int fd, int family, const char *name)
+{
+ struct sockaddr_storage ss;
+ struct addrinfo hints, *res;
+ int r;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_socktype = SOCK_DGRAM;
+#ifdef notyet
+ /* XXX - specify AI_whatever for automatic v4-v6 mapping */
+#else
+ hints.ai_family = (family == AF_INET)? family : AF_UNSPEC;
+#endif
+
+ r = getaddrinfo(name, "syslog", &hints, &res);
+ if (r != 0) {
+ dprintf("failed to resolve \"%s\": %s\n",
+ name, gai_strerror(r));
+ exit(1);
+ }
+
+ memset(&ss, 0, sizeof(ss));
+
+ /* Do v4mapped v6 address (supported by recent glibcs
+ * only) */
+ if (family == AF_INET6 && res->ai_family == AF_INET) {
+ struct sockaddr_in6 *six = (struct sockaddr_in6 *) &ss;
+ struct sockaddr_in *sin = (struct sockaddr_in *) res->ai_addr;
+
+ six->sin6_family = AF_INET6;
+ six->sin6_port = sin->sin_port;
+ six->sin6_addr.s6_addr16[5] = 0xffff;
+ six->sin6_addr.s6_addr32[3] = sin->sin_addr.s_addr;
+ } else if (res->ai_addrlen > sizeof(ss)) {
+ dprintf("failed to resolve \"%s\": address too large\n",
+ name);
+ exit(1);
+ } else {
+ memcpy(&ss, res->ai_addr, res->ai_addrlen);
+ }
+ write(fd, &ss, sizeof(ss));
+ exit(0);
+}
--- syslogd.c
+++ syslogd.c 2022-10-18 06:17:39.648170295 +0000
@@ -683,14 +683,7 @@ struct filed {
struct {
char f_hname[MAXHOSTNAMELEN+1];
#ifdef INET6
- union {
- struct sockaddr sa;
- struct sockaddr_in sin;
- struct sockaddr_in6 sin6;
- } f_sa;
-#define f_addr f_sa.sa
-#define f_addr4 f_sa.sin
-#define f_addr6 f_sa.sin6
+ struct sockaddr_storage f_addr;
#else
struct sockaddr_in f_addr;
#endif
@@ -846,19 +839,17 @@ int decode(char *name, struct code *code
#if defined(__GLIBC__)
#define dprintf mydprintf
#endif /* __GLIBC__ */
-static void dprintf(char *, ...);
+void dprintf(char *, ...);
static void allocate_log(void);
-void sighup_handler();
+void sighup_handler(int sig);
#ifdef SYSLOG_UNIXAF
static int create_unix_socket(const char *path);
#endif
#ifdef SYSLOG_INET
static int create_inet_socket();
-#ifdef INET6
-static void setup_inetaddr_all();
-static const char *setup_inetaddr(struct filed *f);
-#endif
+extern int resolve_name(const char *, int, struct sockaddr_storage *);
+extern void init_resolver(void);
#endif
int main(argc, argv)
@@ -1413,63 +1404,6 @@ static int create_inet_socket()
return fd;
}
-#ifdef INET6
-
-static void setup_inetaddr_all()
-{
- struct filed *f;
-#ifdef SYSV
- int lognum;
-
- for (lognum = 0; lognum <= nlogs; lognum++) {
- f = &Files[lognum];
-#else
- for (f = Files; f; f = f->f_next) {
-#endif
- if (f->f_type == F_FORW_UNKN) {
- if (setup_inetaddr(f)) {
- f->f_prevcount = INET_RETRY_MAX;
- f->f_time = time( (time_t *)0 );
- } else {
- f->f_type = F_FORW;
- }
- }
- }
-}
-
-static const char *setup_inetaddr(struct filed *f)
-{
- struct addrinfo hints, *res;
- int error;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = family == AF_INET6 ? AF_UNSPEC : AF_INET;
- hints.ai_socktype = SOCK_DGRAM;
- error = getaddrinfo(f->f_un.f_forw.f_hname, "syslog", &hints, &res);
- if (error) {
- return gai_strerror(error);
- }
- if (res->ai_addrlen > sizeof(f->f_un.f_forw.f_sa)) {
- freeaddrinfo(res);
- return "addrlen too large";
- }
- if (family == AF_INET6 && res->ai_family == AF_INET) {
- /* v4mapped addr */
- f->f_un.f_forw.f_addr.sa_family = AF_INET6;
- f->f_un.f_forw.f_addr6.sin6_port =
- ((struct sockaddr_in *)res->ai_addr)->sin_port;
- f->f_un.f_forw.f_addr6.sin6_addr.s6_addr16[5] = 0xffff;
- memcpy(&f->f_un.f_forw.f_addr6.sin6_addr.s6_addr32[3],
- &((struct sockaddr_in *)res->ai_addr)->sin_addr,
- sizeof(struct in_addr));
- } else {
- memcpy(&f->f_un.f_forw.f_addr, res->ai_addr, res->ai_addrlen);
- }
- freeaddrinfo(res);
-
- return NULL;
-}
-#endif /* end of INET6 */
#endif
char **
@@ -1913,7 +1847,7 @@ void fprintlog(f, from, flags, msg)
char line[MAXLINE + 1];
time_t fwd_suspend;
#ifdef INET6
- const char *errmsg;
+ int reserr;
#else
struct hostent *hp;
#endif
@@ -1982,38 +1916,21 @@ void fprintlog(f, from, flags, msg)
*/
case F_FORW_UNKN:
dprintf(" %s\n", f->f_un.f_forw.f_hname);
- fwd_suspend = time((time_t *) 0) - f->f_time;
- if ( fwd_suspend >= INET_SUSPEND_TIME ) {
- dprintf("Forwarding suspension to unknown over, retrying\n");
-#ifdef INET6
- if ((errmsg = setup_inetaddr(f))) {
- dprintf("Failure: %s\n", errmsg);
-#else
- if ( (hp = gethostbyname(f->f_un.f_forw.f_hname)) == NULL ) {
- dprintf("Failure: %s\n", sys_h_errlist[h_errno]);
-#endif
- dprintf("Retries: %d\n", f->f_prevcount);
- if ( --f->f_prevcount < 0 ) {
- dprintf("Giving up.\n");
- f->f_type = F_UNUSED;
- }
- else
- dprintf("Left retries: %d\n", f->f_prevcount);
- }
- else {
- dprintf("%s found, resuming.\n", f->f_un.f_forw.f_hname);
-#ifndef INET6 /* not */
- memcpy((char *) &f->f_un.f_forw.f_addr.sin_addr, hp->h_addr, hp->h_length);
-#endif
- f->f_prevcount = 0;
- f->f_type = F_FORW;
- goto f_forw;
- }
+ reserr = resolve_name(f->f_un.f_forw.f_hname,
+ family,
+ &f->f_un.f_forw.f_addr);
+ if (reserr > 0) {
+ dprintf("Successfully resolved hostname \"%s\"\n", f->f_un.f_forw.f_hname);
+ f->f_type = F_FORW;
+ } else if (reserr < 0) {
+ dprintf("Giving up on hostname \"%s\"\n", f->f_un.f_forw.f_hname);
+ f->f_type = F_UNUSED;
+ break;
+ } else {
+ /* Not yet - query in progress, or suspended */
+ break;
}
- else
- dprintf("Forwarding suspension not over, time " \
- "left: %d\n", INET_SUSPEND_TIME - fwd_suspend);
- break;
+ /* fallthrough */
case F_FORW:
/*
@@ -2429,9 +2346,7 @@ void logerror(type)
}
void die(sig)
-
int sig;
-
{
register struct filed *f;
char buf[100];
@@ -2655,6 +2570,7 @@ void init()
#endif
#ifdef SYSLOG_INET
+ init_resolver();
if (Forwarding || AcceptRemote) {
if (finet < 0) {
finet = create_inet_socket();
@@ -2671,10 +2587,6 @@ void init()
InetInuse = 0;
}
inetm = finet;
-#ifdef INET6
- if (finet >= 0)
- setup_inetaddr_all();
-#endif
#endif
Initialized = 1;
@@ -3040,8 +2952,7 @@ int decode(name, codetab)
return (-1);
}
-static void dprintf(char *fmt, ...)
-
+void dprintf(char *fmt, ...)
{
va_list ap;
@@ -3061,8 +2972,7 @@ static void dprintf(char *fmt, ...)
* The following function is responsible for allocating/reallocating the
* array which holds the structures which define the logging outputs.
*/
-static void allocate_log()
-
+static void allocate_log(void)
{
dprintf("Called allocate_log, nlogs = %d.\n", nlogs);
@@ -3109,8 +3019,7 @@ static void allocate_log()
* doing this during a signal handler. Instead this function simply sets
* a flag variable which will tell the main loop to go through a restart.
*/
-void sighup_handler()
-
+void sighup_handler(int sig)
{
restart = 1;
signal(SIGHUP, sighup_handler);

View File

@ -0,0 +1,16 @@
--- klogd.c
+++ klogd.c 2007-06-18 11:22:06.978362000 +0000
@@ -436,9 +436,11 @@ static void Terminate()
{
CloseLogSrc();
Syslog(LOG_INFO, "Kernel log daemon terminating.");
- sleep(1);
- if ( output_file != (FILE *) 0 )
+ if ( output_file != (FILE *) 0 ) {
+ fflush(output_file);
+ fsync(fileno(output_file));
fclose(output_file);
+ }
closelog();
#ifndef TESTING
(void) remove_pid(PidFile);

90
sysklogd-1.4.1-forw.patch Normal file
View File

@ -0,0 +1,90 @@
---
sysklogd.8 | 6 ++++++
syslogd.c | 26 +++++++++++++++++++++++++-
2 files changed, 31 insertions(+), 1 deletion(-)
--- sysklogd.8
+++ sysklogd.8 2022-10-13 08:04:12.411821359 +0000
@@ -29,6 +29,7 @@ sysklogd \- Linux system logging utiliti
.RB [ " \-s "
.I domainlist
]
+.RB [ " \-t " ]
.RB [ " \-v " ]
.SH DESCRIPTION
.B Sysklogd
@@ -150,6 +151,11 @@ is specified and the host logging resolv
no domain would be cut, you will have to specify two domains like:
.BR "\-s north.de:infodrom.north.de" .
.TP
+.B "\-t"
+Tag forwarded messages with the sending hosts name as seen by the forwarder.
+Useful for relaying syslog from DMZs through the firwall to an internal
+loghost.
+.TP
.B "\-v"
Print version and exit.
.SH SIGNALS
--- syslogd.c
+++ syslogd.c 2022-10-13 08:08:49.502856189 +0000
@@ -417,6 +417,13 @@ static char sccsid[] = "@(#)syslogd.c 5.
* file is defined in the used libc and should not be hardcoded
* into the syslogd binary referring the system it was compiled on.
*
+ * Mon Oct 18 19:23:00 CEST 1999: Andreas Siegert <afx@suse.de>
+ * Added -t flag that triggers tagging of forwarded messages with
+ * the sending hosts name as seen by the forwarder.
+ * Useful for relaying syslog from DMZs through the firwall to an
+ * internal loghost.
+ * Format is "<""hostname"
+ *
* Sun Sep 17 21:26:16 CEST 2000: Martin Schulze <joey@infodrom.ffis.de>
* Don't close open sockets upon reload. Thanks to Bill
* Nottingham.
@@ -787,6 +794,7 @@ int MarkInterval = 20 * 60; /* interval
int MarkSeq = 0; /* mark sequence number */
int NoFork = 0; /* don't fork - don't run in daemon mode */
int AcceptRemote = 0; /* receive messages that come via UDP */
+int TagForward = 0; /* afx: tag remote messages with the hostname they came from */
char **StripDomains = NULL; /* these domains may be stripped before writing logs */
char **LocalHosts = NULL; /* these hosts are logged with their hostname */
int NoHops = 1; /* Can we bounce syslog messages through an
@@ -888,7 +896,7 @@ int main(argc, argv)
funix[i] = -1;
}
- while ((ch = getopt(argc, argv, "a:dhf:l:m:np:rs:v")) != EOF)
+ while ((ch = getopt(argc, argv, "a:dhf:l:m:np:rs:tv")) != EOF)
switch((char)ch) {
case 'a':
if (nfunix < MAXFUNIX)
@@ -933,6 +941,10 @@ int main(argc, argv)
}
StripDomains = crunch_list(optarg);
break;
+/* afx add -t for hostname tagging */
+ case 't':
+ TagForward = 1;
+ break;
case 'v':
printf("syslogd %s.%s\n", VERSION, PATCHLEVEL);
exit (0);
@@ -1872,6 +1884,18 @@ void fprintlog(f, from, flags, msg)
f->f_time = now;
(void) snprintf(line, sizeof(line), "<%d>%s", f->f_prevpri, \
(char *) iov[4].iov_base);
+/* afx: add <sourcehost */
+ if ((TagForward == 1) &&
+ strncmp(f->f_prevhost,LocalHostName,MAXHOSTNAMELEN+1)) {
+ (void) snprintf(line, sizeof(line), "<%d><%s: %s\n",
+ f->f_prevpri, f->f_prevhost,
+ (char *) iov[4].iov_base);
+ } else {
+ (void) snprintf(line, sizeof(line), "<%d>%s\n",
+ f->f_prevpri,
+ (char *) iov[4].iov_base);
+ }
+/* end afx */
l = strlen(line);
if (l > MAXLINE)
l = MAXLINE;

262
sysklogd-1.4.1-klogd24.dif Normal file
View File

@ -0,0 +1,262 @@
---
klogd.c | 4 ++--
ksym.c | 55 +++++++++++++++++++++++++++++++++++++++----------------
ksym_mod.c | 11 +++++------
ksyms.h | 11 +++++++----
4 files changed, 53 insertions(+), 28 deletions(-)
--- klogd.c
+++ klogd.c 2022-10-13 08:49:17.755515718 +0000
@@ -874,7 +874,7 @@ static void LogLine(char *ptr, int len)
{
auto int sym_space;
- unsigned long value;
+ uintptr_t value;
auto struct symbol sym;
auto char *symbol;
@@ -899,7 +899,7 @@ static void LogLine(char *ptr, int len)
break;
}
- delta = sprintf( sym_start, "%s+0x%x/0x%02x]",
+ delta = sprintf( sym_start, "%s+%zl/%zu]",
symbol, sym.offset, sym.size );
space = sym_space + delta;
--- ksym.c
+++ ksym.c 2022-10-13 09:00:17.403732468 +0000
@@ -164,7 +164,7 @@ extern int debugging;
/* Function prototypes. */
static char * FindSymbolFile(void);
-static int AddSymbol(unsigned long, char*);
+static int AddSymbol(uintptr_t, char*);
static void FreeSymbols(void);
static int CheckVersion(char *);
static int CheckMapVersion(char *);
@@ -198,7 +198,7 @@ extern int InitKsyms(mapfile)
auto int version = 0;
- auto unsigned long int address;
+ auto uintptr_t address;
auto FILE *sym_file;
@@ -250,16 +250,24 @@ extern int InitKsyms(mapfile)
*/
while ( !feof(sym_file) )
{
- if ( fscanf(sym_file, "%lx %c %511s\n", &address, &type, sym)
- != 3 )
+#if __WORDSIZE == 64
+ if ( fscanf(sym_file, "%lx %c %511s\n", &address, &type, sym) != 3 )
+#else
+ if ( fscanf(sym_file, "%x %c %511s\n", &address, &type, sym) != 3 )
+#endif
{
Syslog(LOG_ERR, "Error in symbol table input (#1).");
fclose(sym_file);
return(0);
}
if ( VERBOSE_DEBUGGING && debugging )
+#if __WORDSIZE == 64
fprintf(stderr, "Address: %lx, Type: %c, Symbol: %s\n",
address, type, sym);
+#else
+ fprintf(stderr, "Address: %x, Type: %c, Symbol: %s\n",
+ address, type, sym);
+#endif
if ( AddSymbol(address, sym) == 0 )
{
@@ -534,7 +542,7 @@ static int CheckMapVersion(fname)
{
int version;
FILE *sym_file;
- auto unsigned long int address;
+ auto uintptr_t address;
auto char type,
sym[512];
@@ -549,16 +557,24 @@ static int CheckMapVersion(fname)
version = 0;
while ( !feof(sym_file) && (version == 0) )
{
- if ( fscanf(sym_file, "%lx %c %511s\n", &address, \
- &type, sym) != 3 )
+#if __WORDSIZE == 64
+ if ( fscanf(sym_file, "%lx %c %511s\n", &address, &type, sym) != 3 )
+#else
+ if ( fscanf(sym_file, "%x %c %511s\n", &address, &type, sym) != 3 )
+#endif
{
Syslog(LOG_ERR, "Error in symbol table input (#2).");
fclose(sym_file);
return(0);
}
if ( VERBOSE_DEBUGGING && debugging )
+#if __WORDSIZE == 64
fprintf(stderr, "Address: %lx, Type: %c, " \
"Symbol: %s\n", address, type, sym);
+#else
+ fprintf(stderr, "Address: %x, Type: %c, " \
+ "Symbol: %s\n", address, type, sym);
+#endif
version = CheckVersion(sym);
}
@@ -596,7 +612,7 @@ static int CheckMapVersion(fname)
* Purpose: This function is responsible for adding a symbol name
* and its address to the symbol table.
*
- * Arguments: (unsigned long) address, (char *) symbol
+ * Arguments: (uintptr_t) address, (char *) symbol
*
* Return: int
*
@@ -606,7 +622,7 @@ static int CheckMapVersion(fname)
static int AddSymbol(address, symbol)
- unsigned long address;
+ uintptr_t address;
char *symbol;
@@ -652,7 +668,7 @@ static int AddSymbol(address, symbol)
char * LookupSymbol(value, sym)
- unsigned long value;
+ uintptr_t value;
struct symbol *sym;
@@ -774,7 +790,7 @@ extern char * ExpandKadds(line, el)
*symbol;
char num[15];
- auto unsigned long int value;
+ auto uintptr_t value;
auto struct symbol sym;
@@ -858,7 +874,7 @@ extern char * ExpandKadds(line, el)
value = strtol(kp2, (char **) 0, 16);
if ( (symbol = LookupSymbol(value, &sym)) ) {
if (sym.size)
- elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+ elp += sprintf(elp, " (%s+%zl/%zu)", symbol, sym.offset, sym.size);
else
elp += sprintf(elp, " (%s)", symbol);
}
@@ -867,7 +883,7 @@ extern char * ExpandKadds(line, el)
value = strtol(kp3, (char **) 0, 16);
if ( (symbol = LookupSymbol(value, &sym)) ) {
if (sym.size)
- elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+ elp += sprintf(elp, " (%s+%zl/%zu)", symbol, sym.offset, sym.size);
else
elp += sprintf(elp, " (%s)", symbol);
}
@@ -878,7 +894,7 @@ extern char * ExpandKadds(line, el)
value = strtol(kp2, (char **) 0, 16);
if ( (symbol = LookupSymbol(value, &sym)) ) {
if (sym.size)
- elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+ elp += sprintf(elp, " (%s+%zl/%zu)", symbol, sym.offset, sym.size);
else
elp += sprintf(elp, " (%s)", symbol);
}
@@ -914,17 +930,24 @@ extern char * ExpandKadds(line, el)
strcat(elp, symbol);
elp += strlen(symbol);
if ( debugging )
- fprintf(stderr, "Symbol: %s = %lx = %s, %x/%d\n", \
+#if __WORDSIZE == 64
+ fprintf(stderr, "Symbol: %s = %lx = %s, %zx/%zu\n", \
sl+1, value, \
(sym.size==0) ? symbol+1 : symbol, \
sym.offset, sym.size);
+#else
+ fprintf(stderr, "Symbol: %s = %x = %s, %zx/%zu\n", \
+ sl+1, value, \
+ (sym.size==0) ? symbol+1 : symbol, \
+ sym.offset, sym.size);
+#endif
value = 2;
if ( sym.size != 0 )
{
--value;
++kp;
- elp += sprintf(elp, "+0x%x/0x%02x", sym.offset, sym.size);
+ elp += sprintf(elp, "+%zx/%zu", sym.offset, sym.size);
}
strncat(elp, kp, value);
elp += value;
--- ksym_mod.c
+++ ksym_mod.c 2022-10-13 10:53:51.690149032 +0000
@@ -116,12 +116,11 @@
#include <sys/fcntl.h>
#include <sys/stat.h>
#include "module.h"
-#if !defined(__GLIBC__)
-#include <linux/time.h>
-#endif /* __GLIBC__ */
#include <stdarg.h>
#include <paths.h>
-#include <linux/version.h>
+#include <sys/types.h>
+#include <limits.h>
+/* #include <linux/version.h> */
#include "klogd.h"
#include "ksyms.h"
@@ -465,7 +464,7 @@ static int AddSymbol(line)
* Purpose: Find the symbol which is related to the given address from
* a kernel module.
*
- * Arguments: (long int) value, (struct symbol *) sym
+ * Arguments: (uintptr_t) value, (struct symbol *) sym
*
* value:-> The address to be located.
*
@@ -481,7 +480,7 @@ static int AddSymbol(line)
extern char * LookupModuleSymbol(value, sym)
- unsigned long value;
+ uintptr_t value;
struct symbol *sym;
--- ksyms.h
+++ ksyms.h 2022-10-13 08:44:58.028153542 +0000
@@ -20,16 +20,19 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <sys/types.h>
+#include <stdint.h>
+
/* Variables, structures and type definitions static to this module. */
struct symbol
{
char *name;
- int size;
- int offset;
+ size_t size;
+ __off64_t offset;
};
/* Function prototypes. */
-extern char * LookupSymbol(unsigned long, struct symbol *);
-extern char * LookupModuleSymbol(unsigned long int, struct symbol *);
+extern char * LookupSymbol(uintptr_t, struct symbol *);
+extern char * LookupModuleSymbol(uintptr_t, struct symbol *);

View File

@ -0,0 +1,94 @@
---
klogd.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 47 insertions(+), 5 deletions(-)
--- klogd.c
+++ klogd.c 2022-10-14 13:17:38.386601331 +0000
@@ -309,8 +309,10 @@ static int use_syscall = 0,
no_fork = 0; /* don't fork - don't run in daemon mode */
static char *symfile = (char *) 0,
- log_buffer[LOG_BUFFER_SIZE];
+ *log_buffer = (char *) 0;
+static int log_buf_size = 0;
+
static FILE *output_file = (FILE *) 0;
static enum LOGSRC {none, proc, kernel} logsrc;
@@ -932,8 +934,8 @@ static void LogKernelLine(void)
* which will contain old messages. Then read the kernel log
* messages into this fresh buffer.
*/
- memset(log_buffer, '\0', sizeof(log_buffer));
- if ( (rdcnt = ksyslog(2, log_buffer, sizeof(log_buffer)-1)) < 0 )
+ memset(log_buffer, '\0', log_buf_size);
+ if ( (rdcnt = ksyslog(2, log_buffer, log_buf_size-1)) < 0 )
{
if ( errno == EINTR )
return;
@@ -957,8 +959,8 @@ static void LogProcLine(void)
* which will contain old messages. Then read the kernel messages
* from the message pseudo-file into this fresh buffer.
*/
- memset(log_buffer, '\0', sizeof(log_buffer));
- if ( (rdcnt = read(kmsg, log_buffer, sizeof(log_buffer)-1)) < 0 )
+ memset(log_buffer, '\0', log_buf_size);
+ if ( (rdcnt = read(kmsg, log_buffer, log_buf_size-1)) < 0 )
{
if ( errno == EINTR )
return;
@@ -971,6 +973,44 @@ static void LogProcLine(void)
return;
}
+static void SetBufSize(void)
+
+{
+ auto int n, sz;
+
+ n = ksyslog(10, NULL, 0); /* read ringbuffer size */
+ if (n > 0) {
+ log_buf_size = n;
+ log_buffer = (char *) malloc(log_buf_size);
+ if (!log_buffer) {
+ perror("ksyslog");
+ exit(1);
+ }
+ }
+
+ if (!log_buf_size) {
+ sz = LOG_BUFFER_SIZE;
+ while (1) {
+ log_buffer = (char *) malloc(sz+8);
+ if (!log_buffer) {
+ perror("ksyslog");
+ exit(1);
+ }
+ n = ksyslog(3, log_buffer, sz+8);
+ if (n < sz+8 || sz >= (1<<22))
+ break;
+ free(log_buffer);
+ sz <<= 1;
+ }
+ log_buf_size = sz;
+ }
+
+ if (n < 0) {
+ perror("ksyslog");
+ exit(1);
+ }
+}
+
int main(argc, argv)
@@ -1049,6 +1089,8 @@ int main(argc, argv)
console_log_level = *log_level - '0';
}
+ /* get/probe for the kernel ring buffer size */
+ SetBufSize();
#ifndef TESTING
/*

View File

@ -0,0 +1,15 @@
---
Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- Makefile
+++ Makefile 2022-10-13 10:55:16.540631345 +0000
@@ -51,7 +51,7 @@ MANDIR = $(prefix)/usr/share/man
# The following define determines whether the package adheres to the
# file system standard.
-FSSTND = -DFSSTND
+FSSTND = -DFSSTND -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
# The following define establishes ownership for the man pages.
# Avery tells me that there is a difference between Debian and

View File

@ -0,0 +1,42 @@
--- fortify.h
+++ fortify.h 2008-05-30 10:18:14.874490898 +0000
@@ -0,0 +1,17 @@
+#if defined(__USE_FORTIFY_LEVEL)
+# undef syslog
+# undef vsyslog
+# undef openlog
+# undef closelog
+# undef setlogmask
+extern void priv_syslog(int, const char *, ...);
+extern void priv_vsyslog(int, const char *, va_list);
+extern void priv_openlog(const char *, int, int);
+extern void priv_closelog(void);
+extern int priv_setlogmask(int);
+# define syslog priv_syslog
+# define vsyslog priv_vsyslog
+# define openlog priv_openlog
+# define closelog priv_closelog
+# define setlogmask priv_setlogmask
+#endif
--- klogd.c
+++ klogd.c 2008-05-30 10:19:59.501151202 +0000
@@ -296,6 +296,8 @@ static char *PidFile = "/etc/klogd.pid";
#endif
#endif
+#include "fortify.h"
+
static int kmsg,
change_state = 0,
terminate = 0,
--- syslog.c
+++ syslog.c 2008-05-30 10:20:24.799728870 +0000
@@ -75,6 +75,8 @@ static char sccsid[] = "@(#)syslog.c 5.2
#define _PATH_LOGNAME "/dev/log"
+#include "fortify.h"
+
static int LogFile = -1; /* fd for log */
static int connected; /* have done connect */
static int LogStat = 0; /* status bits, set by openlog() */

197
sysklogd-1.4.1-reload.dif Normal file
View File

@ -0,0 +1,197 @@
---
syslogd.c | 68 ++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 42 insertions(+), 26 deletions(-)
--- syslogd.c
+++ syslogd.c 2022-10-19 09:49:43.134694341 +0000
@@ -544,6 +544,10 @@ static char sccsid[] __attribute__ ((un
#include <sys/time.h>
#include <sys/resource.h>
#include <signal.h>
+#ifndef _GNU_SOURCE
+typedef void (*sighandler_t)(int);
+#endif
+static sighandler_t resignal(int signum, sighandler_t handler);
#include <netinet/in.h>
#include <netdb.h>
@@ -618,7 +622,7 @@ char **parts;
int inetm = 0;
static int debugging_on = 0;
static int nlogs = -1;
-static int restart = 0;
+static volatile sig_atomic_t restart;
#define MAXFUNIX 20
@@ -1134,13 +1138,13 @@ int main(argc, argv)
leave = 0;
- (void) signal(SIGTERM, die);
+ (void) resignal(SIGTERM, die); /* Make recvfrom() be able to receive EINTR */
(void) signal(SIGINT, Debug ? die : SIG_IGN);
(void) signal(SIGQUIT, Debug ? die : SIG_IGN);
- (void) signal(SIGCHLD, reapchild);
- (void) signal(SIGALRM, domark);
- (void) signal(SIGUSR1, Debug ? debug_switch : SIG_IGN);
+ (void) resignal(SIGCHLD, reapchild);
+ (void) resignal(SIGUSR1, Debug ? debug_switch : SIG_IGN);
(void) signal(SIGXFSZ, SIG_IGN);
+ (void) resignal(SIGALRM, domark); /* Make recvfrom() be able to receive EINTR */
(void) alarm(TIMERINTVL);
/* Create a partial message table for all file descriptors. */
@@ -1161,6 +1165,7 @@ int main(argc, argv)
dprintf("Starting.\n");
init();
+ (void) resignal(SIGHUP, sighup_handler);
#ifndef TESTING
if ( Debug )
{
@@ -1232,9 +1237,14 @@ int main(argc, argv)
(fd_set *) NULL, (struct timeval *) NULL);
if ( restart )
{
+ sigset_t blockhup;
+ sigemptyset(&blockhup);
+ sigaddset (&blockhup, SIGHUP);
+ (void) sigprocmask(SIG_BLOCK, &blockhup, NULL);
restart = 0;
dprintf("\nReceived SIGHUP, reloading syslogd.\n");
init();
+ (void) sigprocmask (SIG_UNBLOCK, &blockhup, NULL);
continue;
}
if (nfds == 0) {
@@ -1756,7 +1766,8 @@ void logmsg(pri, msg, from, flags)
int msglen;
char *timestamp;
#ifdef __gnu_linux__
- sigset_t mask;
+ sigset_t mask, omask;
+ int lognum;
#else
#ifndef SYSV
sigset_t omask;
@@ -1771,7 +1782,7 @@ void logmsg(pri, msg, from, flags)
sigemptyset(&mask);
sigaddset(&mask, SIGHUP);
sigaddset(&mask, SIGALRM);
- sigprocmask(SIG_BLOCK, &mask, NULL);
+ sigprocmask(SIG_BLOCK, &mask, &omask);
#else
#ifndef SYSV
omask = sigblock(sigmask(SIGHUP)|sigmask(SIGALRM));
@@ -1815,7 +1826,7 @@ void logmsg(pri, msg, from, flags)
f->f_file = -1;
}
#ifdef __gnu_linux__
- sigprocmask(SIG_UNBLOCK, &mask, NULL);
+ sigprocmask(SIG_SETMASK, &omask, NULL);
#else
#ifndef SYSV
(void) sigsetmask(omask);
@@ -1884,7 +1895,7 @@ void logmsg(pri, msg, from, flags)
}
}
#ifdef __gnu_linux__
- sigprocmask(SIG_UNBLOCK, &mask, NULL);
+ sigprocmask(SIG_SETMASK, &omask, NULL);
#else
#ifndef SYSV
(void) sigsetmask(omask);
@@ -2213,10 +2224,6 @@ void wallmsg(f, iov)
if (fork() == 0) {
(void) signal(SIGTERM, SIG_DFL);
(void) alarm(0);
-#ifndef SYSV
- (void) signal(SIGTTOU, SIG_IGN);
- (void) sigsetmask(0);
-#endif
(void) snprintf(greetings, sizeof(greetings),
"\r\n\7Message from syslogd@%s at %.24s ...\r\n",
(char *) iov[2].iov_base, ctime(&now));
@@ -2281,19 +2288,32 @@ void wallmsg(f, iov)
reenter = 0;
}
+static sighandler_t resignal(int signum, sighandler_t handler)
+{
+ struct sigaction nact, oact;
+ sigset_t sigset;
+
+ nact.sa_handler = handler;
+ sigemptyset (&nact.sa_mask);
+
+ do {
+ if (sigaction(signum, &nact, &oact) == 0)
+ break;
+ } while (errno == EINTR);
+
+ sigemptyset(&sigset);
+ sigaddset(&sigset, signum);
+
+ sigprocmask(SIG_UNBLOCK, &sigset, NULL);
+
+ return oact.sa_handler;
+}
+
void reapchild()
{
int saved_errno = errno;
-#if defined(SYSV) && !defined(linux)
- (void) signal(SIGCHLD, reapchild); /* reset signal handler -ASP */
- wait ((int *)0);
-#else
while (waitpid(-1, (int*)0, WNOHANG|WUNTRACED) > 0)
;
-#endif
-#ifdef linux
- (void) signal(SIGCHLD, reapchild); /* reset signal handler -ASP */
-#endif
errno = saved_errno;
}
@@ -2403,6 +2423,7 @@ void domark()
#ifdef SYSV
for (lognum = 0; lognum <= nlogs; lognum++) {
f = &Files[lognum];
+ }
#else
for (f = Files; f; f = f->f_next) {
#endif
@@ -2414,8 +2435,6 @@ void domark()
BACKOFF(f);
}
}
- }
- (void) signal(SIGALRM, domark);
(void) alarm(TIMERINTVL);
}
@@ -2424,7 +2443,6 @@ void debug_switch()
{
dprintf("Switching debugging_on to %s\n", (debugging_on == 0) ? "true" : "false");
debugging_on = (debugging_on == 0) ? 1 : 0;
- signal(SIGUSR1, debug_switch);
}
@@ -2774,7 +2792,6 @@ void init()
logmsg(LOG_SYSLOG|LOG_INFO, "syslogd " VERSION "." PATCHLEVEL \
": restart." , LocalHostName, ADDDATE);
#endif
- (void) signal(SIGHUP, sighup_handler);
dprintf("syslogd: restarted.\n");
}
#if FALSE
@@ -3175,7 +3192,6 @@ static void allocate_log(void)
void sighup_handler(int sig)
{
restart = 1;
- signal(SIGHUP, sighup_handler);
return;
}

View File

@ -0,0 +1,27 @@
#
# Description: reconnects to log socket if a write fails with
# ECONNREFUSED or ENOTCONN -- similar to reopen
# in syslog routines provided by glibc.
# Happens if the log socket (provided by syslog
# daemon) has been reopened. Can be triggered by
# "rcsyslog reload" while syslog-ng is used.
# See also Bugzilla Bug #27971.
#
# Author: mt@suse.de
#
---
syslog.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
--- syslog.c
+++ syslog.c 2022-10-14 13:04:57.692223266 +0000
@@ -177,7 +177,8 @@ vsyslog(pri, fmt, ap)
&& (errno == ECONNRESET || errno == ENOTCONN || errno == ECONNREFUSED)) {
closelog();
openlog(LogTag, LogStat | LOG_NDELAY, LogFacility);
- result = write(LogFile, tbuf, cnt + 1);
+ if (connected)
+ result = write(LogFile, tbuf, cnt + 1);
}
if (result >= 0 || !(LogStat&LOG_CONS))

View File

@ -0,0 +1,178 @@
---
sysklogd.8 | 23 +++++++++++++++++++++++
syslogd.c | 54 ++++++++++++++++++++++++++++++++++++++----------------
2 files changed, 61 insertions(+), 16 deletions(-)
--- sysklogd.8
+++ sysklogd.8 2022-10-14 13:33:28.961599858 +0000
@@ -31,6 +31,7 @@ sysklogd \- Linux system logging utiliti
]
.RB [ " \-t " ]
.RB [ " \-v " ]
+.RB [ " \-S " ]
.SH DESCRIPTION
.B Sysklogd
provides two system utilities which provide support for
@@ -158,6 +159,28 @@ loghost.
.TP
.B "\-v"
Print version and exit.
+.TP
+.B "\-S"
+Insert a special code before the hostname in each message to indicate the
+message's priority and facility. Having the priority and facility encoded in
+each message allows a log analyzer program to monitor a single file
+containing all logged messages. The analyzer program can parse the
+priority/facility code for each logged message to determine if it is
+of interest.
+
+The priority/facility code takes the form of a priority number
+followed by a letter that indicates the facility. The priority number
+can range from 0 to 7. The facility letter can range from 'A' to 'Y',
+where 'A' corresponds to facility number zero (LOG_KERN), 'B'
+corresponds to facility 1 (LOG_USER), etc.
+See /usr/include/sys/syslog.h for a list of priority and LOG_xxx codes.
+
+Example:
+
+ Jun 27 19:22:20 5Q:silence test[1966]: testing
+
+The above message contains a priority/facility code of '5Q', which breaks
+down to a priority of 5 (LOG_NOTICE) and a facility of 16 (LOG_LOCAL0).
.SH SIGNALS
.B Syslogd
reacts to a set of signals. You may easily send a signal to
--- syslogd.c
+++ syslogd.c 2022-10-14 13:27:33.395957312 +0000
@@ -649,6 +649,9 @@ int funix[MAXFUNIX] = { -1, };
#define SYNC_FILE 0x002 /* do fsync on file after printing */
#define ADDDATE 0x004 /* add a date to the message */
#define MARK 0x008 /* this message is a mark */
+#define SHOWPRI 0x010 /* Will craft priFac before hostname */
+
+int showpri = 0; /* Are we showing priority in message ? Default: no */
/*
* This table contains plain text for h_errno errors used by the
@@ -828,7 +831,7 @@ void printchopped(const char *hname, cha
void printline(const char *hname, char *msg);
void printsys(char *msg);
void logmsg(int pri, char *msg, const char *from, int flags);
-void fprintlog(register struct filed *f, char *from, int flags, char *msg);
+void fprintlog(register struct filed *f, char *from, int flags, char *msg, ...);
void endtty();
void wallmsg(register struct filed *f, struct iovec *iov);
void reapchild();
@@ -920,7 +923,7 @@ int main(argc, argv)
funix[i] = -1;
}
- while ((ch = getopt(argc, argv, "a:dhf:l:m:np:rs:tv")) != EOF)
+ while ((ch = getopt(argc, argv, "a:dhf:l:m:np:rs:tvS")) != EOF)
switch((char)ch) {
case 'a':
if (nfunix < MAXFUNIX)
@@ -972,6 +975,9 @@ int main(argc, argv)
case 'v':
printf("syslogd %s.%s\n", VERSION, PATCHLEVEL);
exit (0);
+ case 'S':
+ showpri++;
+ break;
case '?':
default:
usage();
@@ -1287,7 +1293,7 @@ int main(argc, argv)
int usage()
{
- fprintf(stderr, "usage: syslogd [-drvh] [-l hostlist] [-m markinterval] [-n] [-p path]\n" \
+ fprintf(stderr, "usage: syslogd [-drvSh] [-l hostlist] [-m markinterval] [-n] [-p path]\n" \
" [-s domainlist] [-f conffile]\n");
exit(1);
}
@@ -1755,7 +1761,7 @@ void logmsg(pri, msg, from, flags)
if (f->f_file >= 0) {
untty();
- fprintlog(f, (char *)from, flags, msg);
+ fprintlog(f, (char *)from, flags|SHOWPRI, msg, prilev, fac);
(void) close(f->f_file);
f->f_file = -1;
}
@@ -1805,13 +1811,13 @@ void logmsg(pri, msg, from, flags)
* in the future.
*/
if (now > REPEATTIME(f)) {
- fprintlog(f, (char *)from, flags, (char *)NULL);
+ fprintlog(f, (char *)from, flags|SHOWPRI, (char *)NULL, prilev, fac);
BACKOFF(f);
}
} else {
/* new line, save it */
if (f->f_prevcount)
- fprintlog(f, (char *)from, 0, (char *)NULL);
+ fprintlog(f, (char *)from, 0|SHOWPRI, (char *)NULL, prilev, fac);
f->f_prevpri = pri;
f->f_repeatcount = 0;
(void) strncpy(f->f_lasttime, timestamp, 15);
@@ -1820,11 +1826,11 @@ void logmsg(pri, msg, from, flags)
if (msglen < MAXSVLINE) {
f->f_prevlen = msglen;
(void) strcpy(f->f_prevline, msg);
- fprintlog(f, (char *)from, flags, (char *)NULL);
+ fprintlog(f, (char *)from, flags|SHOWPRI, (char *)NULL, prilev, fac);
} else {
f->f_prevline[0] = 0;
f->f_prevlen = 0;
- fprintlog(f, (char *)from, flags, msg);
+ fprintlog(f, (char *)from, flags|SHOWPRI, msg, prilev, fac);
}
}
}
@@ -1840,11 +1846,7 @@ void logmsg(pri, msg, from, flags)
} /* balance parentheses for emacs */
#endif
-void fprintlog(f, from, flags, msg)
- register struct filed *f;
- char *from;
- int flags;
- char *msg;
+void fprintlog(register struct filed *f, char *from, int flags,char *msg, ...)
{
struct iovec iov[6];
register struct iovec *v = iov;
@@ -1865,9 +1867,29 @@ void fprintlog(f, from, flags, msg)
v->iov_base = f->f_lasttime;
v->iov_len = 15;
v++;
- v->iov_base = " ";
- v->iov_len = 1;
- v++;
+
+ if(showpri && (flags & SHOWPRI) ) {
+ va_list ap;
+ int prilev;
+ int fac;
+ char prilev_char[5];
+ const char fac_string[LOG_NFACILITIES+1]="ABCDEFGHIJKLMNOPQRSTUVWXY";
+
+ va_start(ap,msg);
+ prilev=va_arg(ap,int);
+ fac=va_arg(ap,int);
+ va_end(ap);
+ sprintf(prilev_char, " %1d%c:", prilev, fac_string[fac]);
+ v->iov_base = prilev_char;
+ v->iov_len = 4;
+ v++;
+ }
+ else {
+ v->iov_base = " ";
+ v->iov_len = 1;
+ v++;
+ }
+
v->iov_base = f->f_prevhost;
v->iov_len = strlen(v->iov_base);
v++;

239
sysklogd-1.4.1-signal.dif Normal file
View File

@ -0,0 +1,239 @@
---
syslogd.c | 107 +++++++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 78 insertions(+), 29 deletions(-)
--- syslogd.c
+++ syslogd.c 2022-10-18 06:25:00.236304111 +0000
@@ -826,6 +826,9 @@ extern int errno;
int main(int argc, char **argv);
char **crunch_list(char *list);
int usage(void);
+#ifdef SYSV
+static pid_t sid;
+#endif
void untty(void);
void printchopped(const char *hname, char *msg, int len, int fd);
void printline(const char *hname, char *msg);
@@ -839,7 +842,9 @@ const char *cvthname(struct sockaddr *f)
void domark();
void debug_switch();
void logerror(const char *type);
+static volatile sig_atomic_t leave;
void die(int sig);
+void dienow(void);
#ifndef TESTING
void doexit(int sig);
#endif
@@ -991,12 +996,32 @@ int main(argc, argv)
dprintf("Checking pidfile.\n");
if (!check_pid(PidFile))
{
+ pid_t pid;
+ int n = 0, status;
+
signal (SIGTERM, doexit);
- if (fork()) {
+
+ switch ((pid = fork())) {
+ default:
+ retry:
/*
* Parent process
*/
- sleep(300);
+ switch (waitpid(pid, &status, WNOHANG|WUNTRACED)) {
+ case -1:
+ if (errno == EINTR)
+ goto retry;
+ break;
+ case 0:
+ if (leave)
+ exit(0);
+ usleep(10*1000);
+ if (++n < 30000)
+ goto retry;
+ default:
+ break;
+ }
+ case -1:
/*
* Not reached unless something major went wrong. 5
* minutes should be a fair amount of time to wait.
@@ -1006,12 +1031,14 @@ int main(argc, argv)
* logs. -Joey
*/
exit(1);
+ case 0:
+ signal (SIGTERM, SIG_DFL);
+
+ num_fds = getdtablesize();
+ for (i = 0; i < num_fds; i++)
+ (void) close(i);
+ untty();
}
- signal (SIGTERM, SIG_DFL);
- num_fds = getdtablesize();
- for (i= 0; i < num_fds; i++)
- (void) close(i);
- untty();
}
else
{
@@ -1091,6 +1118,8 @@ int main(argc, argv)
if (isupper(*p))
*p = tolower(*p);
+ leave = 0;
+
(void) signal(SIGTERM, die);
(void) signal(SIGINT, Debug ? die : SIG_IGN);
(void) signal(SIGQUIT, Debug ? die : SIG_IGN);
@@ -1111,7 +1140,7 @@ int main(argc, argv)
if (getpid() != ppid)
kill (ppid, SIGTERM);
#endif
- die(0);
+ dienow();
}
for(i= 0; i < num_fds; ++i)
parts[i] = (char *) 0;
@@ -1134,9 +1163,14 @@ int main(argc, argv)
/* Main loop begins here. */
for (;;) {
int nfds;
+
+ if (leave)
+ dienow();
+
errno = 0;
FD_ZERO(&readfds);
maxfds = 0;
+
#ifdef SYSLOG_UNIXAF
#ifndef TESTING
/*
@@ -1322,7 +1356,7 @@ static int create_unix_socket(const char
dprintf("cannot create %s (%d).\n", path, errno);
close(fd);
#ifndef SYSV
- die(0);
+ dienow();
#endif
return -1;
}
@@ -1480,8 +1514,8 @@ crunch_list(list)
void untty()
#ifdef SYSV
{
- if ( !Debug ) {
- setsid();
+ if ( !Debug && !sid ) {
+ sid = setsid();
}
return;
}
@@ -1677,8 +1711,7 @@ void printsys(msg)
/*
* Decode a priority into textual information like auth.emerg.
*/
-char *textpri(pri)
- int pri;
+char *textpri(int pri)
{
static char res[20];
CODE *c_pri, *c_fac;
@@ -2239,9 +2272,7 @@ void reapchild()
(void) signal(SIGCHLD, reapchild); /* reset signal handler -ASP */
wait ((int *)0);
#else
- union wait status;
-
- while (wait3(&status, WNOHANG, (struct rusage *) NULL) > 0)
+ while (waitpid(-1, (int*)0, WNOHANG|WUNTRACED) > 0)
;
#endif
#ifdef linux
@@ -2400,11 +2431,21 @@ void logerror(type)
return;
}
-void die(sig)
- int sig;
+void die(int sig)
{
- register struct filed *f;
char buf[100];
+ leave++;
+
+ dprintf("syslogd: exiting on signal %d\n", sig);
+ (void) snprintf(buf, sizeof(buf), "exiting on signal %d", sig);
+ errno = 0;
+ logmsg(LOG_SYSLOG|LOG_INFO, buf, LocalHostName, ADDDATE);
+ signal(sig, SIG_IGN);
+}
+
+void dienow(void)
+{
+ register struct filed *f;
int lognum;
int i;
int was_initialized = Initialized;
@@ -2420,24 +2461,31 @@ void die(sig)
}
Initialized = was_initialized;
- if (sig) {
- dprintf("syslogd: exiting on signal %d\n", sig);
- (void) snprintf(buf, sizeof(buf), "exiting on signal %d", sig);
- errno = 0;
- logmsg(LOG_SYSLOG|LOG_INFO, buf, LocalHostName, ADDDATE);
- }
/* Close the UNIX sockets. */
- for (i = 0; i < nfunix; i++)
+ for (i = 0; i < nfunix; i++)
if (funix[i] != -1)
close(funix[i]);
+
/* Close the inet socket. */
if (InetInuse) close(inetm);
/* Clean-up files. */
- for (i = 0; i < nfunix; i++)
+ for (i = 0; i < nfunix; i++)
if (funixn[i] && funix[i] != -1)
(void)unlink(funixn[i]);
+
+ for (lognum = 0; lognum <= nlogs; lognum++) {
+ f = &Files[lognum];
+ if (f->f_file < 0)
+ continue;
+ if (f->f_type & F_FILE) {
+ (void) fdatasync(f->f_file);
+ (void) close(f->f_file);
+ f->f_file = -1;
+ }
+ }
+
#ifndef TESTING
(void) remove_pid(PidFile);
#endif
@@ -2451,7 +2499,7 @@ void die(sig)
void doexit(sig)
int sig;
{
- exit (0);
+ leave++;
}
#endif
@@ -2516,7 +2564,8 @@ void init()
case F_TTY:
case F_CONSOLE:
case F_USOCK:
- (void) close(f->f_file);
+ if (f->f_file >= 0)
+ (void) close(f->f_file);
break;
}
}

View File

@ -0,0 +1,95 @@
--- ksym.c
+++ ksym.c 2001-05-23 18:50:36.000000000 +0000
@@ -130,6 +130,7 @@
#include <stdlib.h>
#include <malloc.h>
#include <sys/utsname.h>
+#include <ctype.h>
#include "klogd.h"
#include "ksyms.h"
#include "module.h"
@@ -809,6 +810,84 @@ extern char * ExpandKadds(line, el)
if ( (num_syms == 0) ||
(kp = strstr(line, "[<")) == (char *) 0 )
{
+#ifdef __sparc__
+ if (num_syms) {
+ /*
+ * On SPARC, register dumps do not have the [< >] characters in it.
+ */
+ static struct sparc_tests {
+ char *str;
+ int len;
+ } tests[] = { { "PC: ", 4 },
+ { " o7: ", 5 },
+ { " ret_pc: ", 9 },
+ { " i7: ", 5 },
+ { "Caller[", 7 }
+ };
+ int i, j, ndigits;
+ char *kp2;
+ for (i = 0; i < 5; i++) {
+ kp = strstr(line, tests[i].str);
+ if (!kp) continue;
+ kp2 = kp + tests[i].len;
+ if (!isxdigit(*kp2)) continue;
+ for (ndigits = 1; isxdigit(kp2[ndigits]); ndigits++);
+ if (ndigits != 8 && ndigits != 16) continue;
+ /* On sparc64, all kernel addresses are in first 4GB */
+ if (ndigits == 16) {
+ if (strncmp (kp2, "00000000", 8)) continue;
+ kp2 += 8;
+ }
+ if (!i) {
+ char *kp3;
+ if (ndigits == 16 && kp > line && kp[-1L] != 'T') continue;
+ kp3 = kp2 + 8;
+ if (ndigits == 16) {
+ if (strncmp (kp3, " TNPC: 00000000", 15) || !isxdigit(kp3[15]))
+ continue;
+ kp3 += 15;
+ } else {
+ if (strncmp (kp3, " NPC: ", 6) || !isxdigit(kp3[6]))
+ continue;
+ kp3 += 6;
+ }
+ for (j = 0; isxdigit(kp3[j]); j++);
+ if (j != 8) continue;
+ strncpy(elp, line, kp2 + 8 - line);
+ elp += kp2 + 8 - line;
+ value = strtol(kp2, (char **) 0, 16);
+ if ( (symbol = LookupSymbol(value, &sym)) ) {
+ if (sym.size)
+ elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+ else
+ elp += sprintf(elp, " (%s)", symbol);
+ }
+ strncpy(elp, kp2 + 8, kp3 - kp2);
+ elp += kp3 - kp2;
+ value = strtol(kp3, (char **) 0, 16);
+ if ( (symbol = LookupSymbol(value, &sym)) ) {
+ if (sym.size)
+ elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+ else
+ elp += sprintf(elp, " (%s)", symbol);
+ }
+ strcpy(elp, kp3 + 8);
+ } else {
+ strncpy(elp, line, kp2 + 8 - line);
+ elp += kp2 + 8 - line;
+ value = strtol(kp2, (char **) 0, 16);
+ if ( (symbol = LookupSymbol(value, &sym)) ) {
+ if (sym.size)
+ elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+ else
+ elp += sprintf(elp, " (%s)", symbol);
+ }
+ strcpy(elp, kp2 + 8);
+ }
+ return el;
+ }
+ }
+#endif
strcpy(el, line);
return(el);
}

View File

@ -0,0 +1,64 @@
From: Jeff Mahoney <jeffm@suse.com>
Subject: klogd: Silence System.map and symbol lookup warnings with modern kernels
References: bnc#505421
klogd complains about not being able to parse the version of System.map and
about not being able to load the kernel module symbol table.
Since kernels starting with 2.5 accurately report their own symbol table in
Oopses, this is no longer necessary. The warnings are a harmless annoyance,
but an annoyance nonetheless.
This patch detects if the running kernel is newer newer than 2.5.0 and
disables the symbol lookup on startup, thus avoiding the warnings.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
klogd.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
--- klogd.c
+++ klogd.c 2009-08-12 12:19:17.333901686 +0000
@@ -285,6 +285,8 @@ _syscall3(int,ksyslog,int, type, char *,
#define ksyslog klogctl
#endif
+#include <sys/utsname.h>
+
#define LOG_BUFFER_SIZE 4096
#define LOG_LINE_LENGTH 1000
@@ -1014,6 +1016,23 @@ static void SetBufSize(void)
}
}
+#ifndef KERNEL_VERSION
+#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
+#endif
+
+static int
+need_lookup(void)
+{
+ struct utsname utsname;
+ int major, minor, patch;
+ if (uname(&utsname) < 0) {
+ Syslog(LOG_ERR, "Cannot get kernel version information.");
+ return 0;
+ }
+ sscanf(utsname.release, "%d.%d.%d", &major, &minor, &patch);
+
+ return (KERNEL_VERSION(major, minor, patch) < KERNEL_VERSION(2,5,0));
+}
int main(argc, argv)
@@ -1199,6 +1218,9 @@ int main(argc, argv)
else
openlog("kernel", 0, LOG_KERN);
+ /* We don't need lookups on kernels > 2.4 */
+ if (symbol_lookup)
+ symbol_lookup = need_lookup();
/* Handle one-shot logging. */
if ( one_shot )

View File

@ -0,0 +1,173 @@
---
syslogd.c | 121 +++++++++++++++++++++++++++++++++++---------------------------
1 file changed, 70 insertions(+), 51 deletions(-)
--- syslogd.c
+++ syslogd.c 2022-10-17 09:33:43.942759127 +0000
@@ -626,6 +626,9 @@ static volatile sig_atomic_t restart;
int nfunix = 1;
char *funixn[MAXFUNIX] = { _PATH_LOG };
int funix[MAXFUNIX] = { -1, };
+#if defined(__linux__)
+int sd_fds = 0;
+#endif
#ifdef UT_NAMESIZE
# define UNAMESZ UT_NAMESIZE /* length of a login name */
@@ -1047,12 +1050,44 @@ int main(argc, argv)
exit(1);
}
+ i = 0;
num_fds = getdtablesize();
#if defined(__linux__)
- if (sd_listen_fds(0) <= 0)
-#endif
- for (i = 0; i < num_fds; i++)
+ /* if (sd_booted()) */ {
+ const char *e;
+ char buf[24] = { '\0' };
+ char *p = NULL;
+ unsigned long l;
+
+ /* fork & systemd socket activation:
+ * fetch listen pid and update to ours,
+ * when it is set to pid of our parent.
+ */
+ if ( (e = getenv("LISTEN_PID"))) {
+ errno = 0;
+ l = strtoul(e, &p, 10);
+ if (errno == 0 && l > 0 && (!p || !*p)) {
+ if (getppid() == (pid_t)l) {
+ snprintf(buf, sizeof(buf), "%d",
+ getpid());
+ setenv("LISTEN_PID", buf, 1);
+ }
+ }
+ }
+
+ /*
+ * init sd_fds and close all fds, except
+ * of the fds provided by systemd.
+ */
+ sd_fds = sd_listen_fds(0);
+ for( ; i < SD_LISTEN_FDS_START; i++)
(void) close(i);
+ if (sd_fds > 0)
+ i = SD_LISTEN_FDS_START + sd_fds;
+ }
+#endif
+ for ( ; i < num_fds; i++)
+ (void) close(i);
untty();
break;
}
@@ -1094,6 +1129,11 @@ int main(argc, argv)
exit(1);
}
} /* if ( !Debug ) */
+#if defined(__linux__)
+ /* if (sd_booted()) */ {
+ sd_fds = sd_listen_fds(0);
+ }
+#endif
}
#endif
@@ -1367,54 +1407,30 @@ static int create_unix_socket(const char
return -1;
#if defined(__linux__)
- if (strcmp(path, _PATH_LOG) == 0) {
- int r;
-
- /* Check whether an FD was passed in from systemd. If
- * so, it's the /dev/log socket, so use it. */
-
- r = sd_listen_fds(0);
- if (r < 0) {
- logerror("Failed to acquire systemd socket");
+ /*
+ * Check whether an FD was passed in from systemd.
+ * If so and it matches this socket, so use it.
+ */
+ if (sd_fds < 0) {
+ logerror("Failed to acquire systemd socket");
#ifndef SYSV
- dienow();
+ dienow();
#else
- return -1;
+ return -1;
#endif
- }
+ }
-
- if (r > 1) {
- logerror("Wrong number of systemd sockets passed");
-#ifndef SYSV
- dienow();
-#else
- return -1;
-#endif
- }
-
- if (r == 1) {
- fd = SD_LISTEN_FDS_START;
- r = sd_is_socket_unix(fd, SOCK_DGRAM, -1, _PATH_LOG, 0);
- if (r < 0) {
- logerror("Failed to verify systemd socket type");
-#ifndef SYSV
- dienow();
-#else
- return -1;
-#endif
- }
-
- if (!r) {
- logerror("Passed systemd socket of wrong type");
-#ifndef SYSV
- dienow();
-#else
- return -1;
-#endif
+ if (sd_fds > 0) {
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + sd_fds; fd++) {
+ if( sd_is_socket_unix(fd, SOCK_DGRAM, -1, path, 0) == 1) {
+ /* ok, it matches -- just use as is */
+ return fd;
}
-
- return fd;
+ /*
+ * otherwise it either didn't matched *this* socket and
+ * we just continue to check the next one or there were
+ * an error and we will recreate it bellow.
+ */
}
}
#endif
@@ -2537,14 +2553,17 @@ void dienow(void)
if (InetInuse) close(inetm);
/* Clean-up files. */
- i = 0;
+ for (i = 0; i < nfunix; i++) {
+ if (funixn[i] && funix[i] != -1) {
#if defined(__linux__)
- if (sd_listen_fds(0) > 0)
- i = 1;
+ if (sd_fds > 0 &&
+ funix[i] >= SD_LISTEN_FDS_START &&
+ funix[i] < SD_LISTEN_FDS_START + sd_fds)
+ continue;
#endif
- for (; i < nfunix; i++)
- if (funixn[i] && funix[i] != -1)
(void)unlink(funixn[i]);
+ }
+ }
for (lognum = 0; lognum <= nlogs; lognum++) {
f = &Files[lognum];

View File

@ -0,0 +1,29 @@
--- syslogd.c
+++ syslogd.c 2012/02/20 19:41:22
@@ -610,6 +610,10 @@ static char sccsid[] __attribute__ ((un
#define _PATH_LOG "/dev/log"
#endif
+#ifndef SYSTEMD_PATH_LOG
+#define SYSTEMD_PATH_LOG "/run/systemd/journal/syslog"
+#endif
+
char *ConfFile = _PATH_LOGCONF;
char *PidFile = _PATH_LOGPID;
char ctty[] = _PATH_CONSOLE;
@@ -936,6 +940,15 @@ int main(argc, argv)
funix[i] = -1;
}
+ /* systemd >= 38 wants we use /run/systemd/journal/syslog,
+ * instead of /dev/log, but allow to override it using -p */
+ if(sd_booted()) {
+ struct stat st;
+ if(stat(SYSTEMD_PATH_LOG, &st) != -1 && S_ISSOCK(st.st_mode)) {
+ funixn[0] = SYSTEMD_PATH_LOG;
+ }
+ }
+
while ((ch = getopt(argc, argv, "a:dhf:l:m:np:rs:tvS")) != EOF)
switch((char)ch) {
case 'a':

123
sysklogd-1.4.1-systemd.dif Normal file
View File

@ -0,0 +1,123 @@
---
Makefile | 4 +--
syslogd.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 67 insertions(+), 5 deletions(-)
--- Makefile
+++ Makefile 2022-10-17 09:00:32.945828594 +0000
@@ -20,7 +20,7 @@
CC= gcc
#SKFLAGS= -g -DSYSV -Wall
#LDFLAGS= -g
-SKFLAGS= $(RPM_OPT_FLAGS) -DINET6 -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
+SKFLAGS= $(RPM_OPT_FLAGS) -DINET6 -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce -I.
# -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
# -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
# $(shell getconf LFS_SKFLAGS)
@@ -43,7 +43,7 @@ MANDIR = $(prefix)/usr/share/man
# specific to the ALPHA. If you are attempting to build this package under
# an ALPHA and linking fails with unresolved references please try
# uncommenting the following define.
-# LIBS = ${LIBS} -linux
+LIBS += $(shell pkg-config libsystemd --libs)
# Define the following to impart start-up delay in klogd. This is
# useful if klogd is started simultaneously or in close-proximity to syslogd.
--- syslogd.c
+++ syslogd.c 2022-10-17 08:59:33.354879789 +0000
@@ -558,6 +558,7 @@ static char sccsid[] __attribute__ ((un
#if defined(__linux__)
#include <paths.h>
+#include <systemd/sd-daemon.h>
#endif
#ifndef UTMP_FILE
@@ -1047,8 +1048,11 @@ int main(argc, argv)
}
num_fds = getdtablesize();
- for (i = 0; i < num_fds; i++)
- (void) close(i);
+#if defined(__linux__)
+ if (sd_listen_fds(0) <= 0)
+#endif
+ for (i = 0; i < num_fds; i++)
+ (void) close(i);
untty();
break;
}
@@ -1362,6 +1366,59 @@ static int create_unix_socket(const char
if (path[0] == '\0')
return -1;
+#if defined(__linux__)
+ if (strcmp(path, _PATH_LOG) == 0) {
+ int r;
+
+ /* Check whether an FD was passed in from systemd. If
+ * so, it's the /dev/log socket, so use it. */
+
+ r = sd_listen_fds(0);
+ if (r < 0) {
+ logerror("Failed to acquire systemd socket");
+#ifndef SYSV
+ dienow();
+#else
+ return -1;
+#endif
+ }
+
+
+ if (r > 1) {
+ logerror("Wrong number of systemd sockets passed");
+#ifndef SYSV
+ dienow();
+#else
+ return -1;
+#endif
+ }
+
+ if (r == 1) {
+ fd = SD_LISTEN_FDS_START;
+ r = sd_is_socket_unix(fd, SOCK_DGRAM, -1, _PATH_LOG, 0);
+ if (r < 0) {
+ logerror("Failed to verify systemd socket type");
+#ifndef SYSV
+ dienow();
+#else
+ return -1;
+#endif
+ }
+
+ if (!r) {
+ logerror("Passed systemd socket of wrong type");
+#ifndef SYSV
+ dienow();
+#else
+ return -1;
+#endif
+ }
+
+ return fd;
+ }
+ }
+#endif
+
(void) unlink(path);
memset(&sunx, 0, sizeof(sunx));
@@ -2480,7 +2537,12 @@ void dienow(void)
if (InetInuse) close(inetm);
/* Clean-up files. */
- for (i = 0; i < nfunix; i++)
+ i = 0;
+#if defined(__linux__)
+ if (sd_listen_fds(0) > 0)
+ i = 1;
+#endif
+ for (; i < nfunix; i++)
if (funixn[i] && funix[i] != -1)
(void)unlink(funixn[i]);

View File

@ -0,0 +1,160 @@
---
syslog.conf.5 | 10 +++++++
syslogd.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 82 insertions(+), 4 deletions(-)
--- syslog.conf.5
+++ syslog.conf.5 2022-10-14 13:18:21.953821655 +0000
@@ -173,6 +173,16 @@ command before
.BR syslogd (8)
is started.
+.SS Unix Socket (UDP)
+This version of
+.BR syslogd (8)
+has support for logging output to named sockets (UDP UNIX domain sockets).
+A named socket can be used as a destination for log messages by prepending
+a double at-sign symbol (``@@'') to the pathname of the socket file. This
+feature is useful for applications that need to process all logged messages.
+All they need to do is open the named socket for reading and then process
+the messages as they are received.
+
.SS Terminal and Console
If the file you specified is a tty, special tty-handling is done, same
with
--- syslogd.c
+++ syslogd.c 2022-10-14 13:25:41.625956092 +0000
@@ -688,6 +688,10 @@ struct filed {
struct sockaddr_in f_addr;
#endif
} f_forw; /* forwarding address */
+ struct {
+ struct sockaddr_un su_addr; /* destination address */
+ int su_addrlen; /* address len */
+ } f_usock; /* UNIX domain socket address */
char f_fname[MAXFNAME];
} f_un;
char f_prevline[MAXSVLINE]; /* last message logged */
@@ -699,6 +703,8 @@ struct filed {
int f_repeatcount; /* number of "repeated" msgs */
int f_flags; /* store some additional flags */
};
+#define fus_su f_un.f_usock.su_addr
+#define fus_sal f_un.f_usock.su_addrlen
/*
* Intervals at which we flush out "message repeated" messages,
@@ -729,10 +735,11 @@ int repeatinterval[] = { 30, 60 }; /* #
#define F_FORW_SUSP 7 /* suspended host forwarding */
#define F_FORW_UNKN 8 /* unknown host forwarding */
#define F_PIPE 9 /* named pipe */
+#define F_USOCK 10 /* UNIX domain UDP socket */
char *TypeNames[] = {
"UNUSED", "FILE", "TTY", "CONSOLE",
"FORW", "USERS", "WALL", "FORW(SUSPENDED)",
- "FORW(UNKNOWN)", "PIPE"
+ "FORW(UNKNOWN)", "PIPE", "USOCK"
};
struct filed *Files = (struct filed *) 0;
@@ -2050,6 +2057,32 @@ void fprintlog(f, from, flags, msg)
(void) fsync(f->f_file);
break;
+ case F_USOCK:
+ f->f_time = now;
+ dprintf(" %s\n", f->fus_su.sun_path[0] ? f->fus_su.sun_path : "<undefined>");
+ if (f->f_file != -1) {
+ int l;
+ char line[MAXLINE +1];
+
+ int chunk_len,dstbuf_size = 0;
+ for (l = 0;l < 5;l++) {
+ if( (chunk_len = iov[l].iov_len) > (sizeof(line) - dstbuf_size))
+ chunk_len = sizeof(line) - dstbuf_size;
+ if(chunk_len > 0) {
+ memcpy(&line[dstbuf_size],iov[l].iov_base,chunk_len);
+ dstbuf_size += chunk_len;
+ }
+ }
+ if ((l = dstbuf_size) > MAXLINE) l = MAXLINE;
+ line[l] = 0;
+ if (sendto(f->f_file, line, l, MSG_DONTWAIT,
+ (struct sockaddr*) &f->fus_su, f->fus_sal) != l) {
+ dprintf("sendto error - \"%s\"\n",strerror(errno));
+ /* sendto error must be ignored */
+ }
+ }
+ break;
+
case F_USERS:
case F_WALL:
f->f_time = now;
@@ -2462,6 +2495,7 @@ void init()
case F_PIPE:
case F_TTY:
case F_CONSOLE:
+ case F_USOCK:
(void) close(f->f_file);
break;
}
@@ -2614,7 +2648,11 @@ void init()
case F_PIPE:
case F_TTY:
case F_CONSOLE:
- printf("%s", f->f_un.f_fname);
+ case F_USOCK:
+ if(f->f_type == F_USOCK)
+ printf("%s", f->fus_su.sun_path[0] ? f->fus_su.sun_path : "<undefined>");
+ else
+ printf("%s", f->f_un.f_fname);
if (f->f_file == -1)
printf(" (unused)");
break;
@@ -2832,14 +2870,44 @@ void cfline(line, f)
switch (*p)
{
case '@':
+ if(*(++p) == '@') {
+ /* We need to set up for output to a named socket...
+ */
+ memset((char *)&f->fus_su, 0, sizeof(f->fus_su));
+ (void)strncpy(f->fus_su.sun_path, ++p,
+ sizeof(f->fus_su.sun_path)-1);
+ f->fus_su.sun_path[sizeof(f->fus_su.sun_path)-1] = 0;
+ dprintf ("unix socket filename: %s\n",
+ f->fus_su.sun_path);
+ f->fus_su.sun_family = AF_UNIX;
+ if( (f->f_file = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0) {
+ dprintf("Can't create unix socket\n");
+ logerror("Can't create unix socket");
+ break;
+ }
+ f->fus_sal = strlen(f->fus_su.sun_path) +
+ sizeof(f->fus_su.sun_family);
+ f->f_type = F_USOCK;
+
+ /* Make sure that pathname exists...
+ */
+ if (bind(f->f_file, (struct sockaddr *)&f->fus_su, f->fus_sal) < 0 ||
+ (chmod(f->fus_su.sun_path, 0666) < 0)) {
+ dprintf("Can't bind unix socket to name\n");
+ logerror("Can't bind unix unix socket to name");
+ break;
+ }
+ break;
+ }
#ifdef SYSLOG_INET
+#ifndef INET6
if (!LogPort) {
f->f_type = F_UNUSED;
logerror("Forward rule without networking enabled");
break;
}
-
- (void) strcpy(f->f_un.f_forw.f_hname, ++p);
+#endif
+ (void) strcpy(f->f_un.f_forw.f_hname, p);
dprintf("forwarding host: %s\n", p); /*ASP*/
#ifdef INET6
f->f_type = F_FORW_UNKN;

584
sysklogd-1.4.1.dif Normal file
View File

@ -0,0 +1,584 @@
---
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 <sys/utsname.h>
-#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 <stdlib.h>
#include <signal.h>
#include <unistd.h>
+#include <errno.h>
#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 <paths.h>
#include <stdio.h>
-#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 <sys/types.h>
#endif
#include <utmp.h>
+#include <limits.h>
#include <ctype.h>
#include <string.h>
#include <setjmp.h>
@@ -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);

BIN
sysklogd-1.5.1.tar.gz (Stored with Git LFS) Normal file

Binary file not shown.

501
sysklogd-ipv6.diff Normal file
View File

@ -0,0 +1,501 @@
---
CHANGES | 3
Makefile | 2
syslogd.c | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
3 files changed, 210 insertions(+), 23 deletions(-)
--- CHANGES
+++ CHANGES 2022-10-13 08:13:35.285747318 +0000
@@ -72,6 +72,9 @@ Version 1.5
. Matthew Fischer <futhark@vzavenue.net>
- Remove special treatment of the percent sign in klogd
+Version 1.4.1-usagi (2001/03/21)
+ - syslogd IPv6 support
+ (based on patch from Hiroyuki YAMAMORI <h-yamamo@db3.so-net.ne.jp>)
Version 1.4.1
--- Makefile
+++ Makefile 2022-10-13 08:30:44.607385067 +0000
@@ -20,7 +20,7 @@
CC= gcc
#SKFLAGS= -g -DSYSV -Wall
#LDFLAGS= -g
-SKFLAGS= $(RPM_OPT_FLAGS) -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
+SKFLAGS= $(RPM_OPT_FLAGS) -DINET6 -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
# -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
# -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
# $(shell getconf LFS_SKFLAGS)
--- syslogd.c
+++ syslogd.c 2022-10-13 08:30:05.088090073 +0000
@@ -654,6 +654,7 @@ int funix[MAXFUNIX] = { -1, };
* This table contains plain text for h_errno errors used by the
* net subsystem.
*/
+#ifndef INET6 /* not */
const char *sys_h_errlist[] = {
"No problem", /* NETDB_SUCCESS */
"Authoritative answer: host not found", /* HOST_NOT_FOUND */
@@ -662,6 +663,7 @@ const char *sys_h_errlist[] = {
"Valid name, no data record of requested type", /* NO_DATA */
"no address, look for MX record" /* NO_ADDRESS */
};
+#endif
/*
* This structure represents the files that will have log
@@ -680,7 +682,18 @@ struct filed {
char f_uname[MAXUNAMES][UNAMESZ+1];
struct {
char f_hname[MAXHOSTNAMELEN+1];
+#ifdef INET6
+ union {
+ struct sockaddr sa;
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ } f_sa;
+#define f_addr f_sa.sa
+#define f_addr4 f_sa.sin
+#define f_addr6 f_sa.sin6
+#else
struct sockaddr_in f_addr;
+#endif
} f_forw; /* forwarding address */
char f_fname[MAXFNAME];
} f_un;
@@ -788,7 +801,11 @@ char *LocalDomain; /* our local domain
char *emptystring = "";
int InetInuse = 0; /* non-zero if INET sockets are being used */
int finet = -1; /* Internet datagram socket */
+#ifdef INET6
+sa_family_t family; /* socket address family */
+#else
int LogPort; /* port number for INET connections */
+#endif
int Initialized = 0; /* set when we have initialized ourselves */
int MarkInterval = 20 * 60; /* interval between marks in seconds */
int MarkSeq = 0; /* mark sequence number */
@@ -815,10 +832,10 @@ void fprintlog(register struct filed *f,
void endtty();
void wallmsg(register struct filed *f, struct iovec *iov);
void reapchild();
-const char *cvthname(struct sockaddr_in *f);
+const char *cvthname(struct sockaddr *f);
void domark();
void debug_switch();
-void logerror(char *type);
+void logerror(const char *type);
void die(int sig);
#ifndef TESTING
void doexit(int sig);
@@ -838,6 +855,10 @@ static int create_unix_socket(const char
#endif
#ifdef SYSLOG_INET
static int create_inet_socket();
+#ifdef INET6
+static void setup_inetaddr_all();
+static const char *setup_inetaddr(struct filed *f);
+#endif
#endif
int main(argc, argv)
@@ -875,7 +896,12 @@ int main(argc, argv)
#ifndef TESTING
int fd;
#ifdef SYSLOG_INET
+#ifdef INET6
+ struct sockaddr_storage frominet;
+ char hbuf[INET6_ADDRSTRLEN];
+#else
struct sockaddr_in frominet;
+#endif
char *from;
#endif
pid_t ppid = getpid();
@@ -1204,10 +1230,21 @@ int main(argc, argv)
memset(line, 0, sizeof(line));
msglen = recvfrom(finet, line, MAXLINE - 2, 0, \
(struct sockaddr *) &frominet, &len);
+#ifdef INET6
+ if (getnameinfo((struct sockaddr *)&frominet, len,
+ hbuf, sizeof(hbuf), NULL, 0,
+ NI_NUMERICHOST)) {
+ strcpy(hbuf, "???");
+ }
+ dprintf("Message from inetd socket: #%d, host: %s\n",
+ inetm, hbuf);
+#else
+
dprintf("Message from inetd socket: #%d, host: %s\n",
inetm, inet_ntoa(frominet.sin_addr));
+#endif
if (msglen > 0) {
- from = (char *)cvthname(&frominet);
+ from = (char *)cvthname((struct sockaddr*)&frominet);
/*
* Here we could check if the host is permitted
* to send us syslog messages. We just have to
@@ -1293,18 +1330,51 @@ static int create_unix_socket(const char
static int create_inet_socket()
{
int fd, on = 1;
+#ifdef INET6
+ struct addrinfo hints, *res;
+ int error;
+#else
struct sockaddr_in sin;
+#endif
int sockflags;
+#ifdef INET6
+ fd = socket(AF_INET6, SOCK_DGRAM, 0);
+ if (fd >= 0) {
+ family = AF_INET6;
+ } else {
+ family = AF_INET;
+ dprintf("cannot create INET6 socket.\n");
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
+ }
+#else
fd = socket(AF_INET, SOCK_DGRAM, 0);
+#endif
if (fd < 0) {
logerror("syslog: Unknown protocol, suspending inet service.");
return fd;
}
+#ifdef NO_BIND_AT_FORWARD_ONLY
+ if (AcceptRemote == 0)
+ return fd;
+#endif
+#ifdef INET6
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = AI_PASSIVE;
+ hints.ai_family = family;
+ hints.ai_socktype = SOCK_DGRAM;
+ error = getaddrinfo(NULL, "syslog", &hints, &res);
+ if (error) {
+ logerror(gai_strerror(error));
+ close(fd);
+ return -1;
+ }
+#else
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = LogPort;
+#endif
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, \
(char *) &on, sizeof(on)) < 0 ) {
logerror("setsockopt(REUSEADDR), suspending inet");
@@ -1329,13 +1399,77 @@ static int create_inet_socket()
close(fd);
return -1;
}
+#ifdef INET6
+ error = bind(fd, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ if (error < 0) {
+#else
if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
+#endif
logerror("bind, suspending inet");
close(fd);
return -1;
}
return fd;
}
+
+#ifdef INET6
+
+static void setup_inetaddr_all()
+{
+ struct filed *f;
+#ifdef SYSV
+ int lognum;
+
+ for (lognum = 0; lognum <= nlogs; lognum++) {
+ f = &Files[lognum];
+#else
+ for (f = Files; f; f = f->f_next) {
+#endif
+ if (f->f_type == F_FORW_UNKN) {
+ if (setup_inetaddr(f)) {
+ f->f_prevcount = INET_RETRY_MAX;
+ f->f_time = time( (time_t *)0 );
+ } else {
+ f->f_type = F_FORW;
+ }
+ }
+ }
+}
+
+static const char *setup_inetaddr(struct filed *f)
+{
+ struct addrinfo hints, *res;
+ int error;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = family == AF_INET6 ? AF_UNSPEC : AF_INET;
+ hints.ai_socktype = SOCK_DGRAM;
+ error = getaddrinfo(f->f_un.f_forw.f_hname, "syslog", &hints, &res);
+ if (error) {
+ return gai_strerror(error);
+ }
+ if (res->ai_addrlen > sizeof(f->f_un.f_forw.f_sa)) {
+ freeaddrinfo(res);
+ return "addrlen too large";
+ }
+ if (family == AF_INET6 && res->ai_family == AF_INET) {
+ /* v4mapped addr */
+ f->f_un.f_forw.f_addr.sa_family = AF_INET6;
+ f->f_un.f_forw.f_addr6.sin6_port =
+ ((struct sockaddr_in *)res->ai_addr)->sin_port;
+ f->f_un.f_forw.f_addr6.sin6_addr.s6_addr16[5] = 0xffff;
+ memcpy(&f->f_un.f_forw.f_addr6.sin6_addr.s6_addr32[3],
+ &((struct sockaddr_in *)res->ai_addr)->sin_addr,
+ sizeof(struct in_addr));
+ } else {
+ memcpy(&f->f_un.f_forw.f_addr, res->ai_addr, res->ai_addrlen);
+ }
+ freeaddrinfo(res);
+
+ return NULL;
+}
+#endif /* end of INET6 */
#endif
char **
@@ -1778,8 +1912,12 @@ void fprintlog(f, from, flags, msg)
register int l;
char line[MAXLINE + 1];
time_t fwd_suspend;
+#ifdef INET6
+ const char *errmsg;
+#else
struct hostent *hp;
#endif
+#endif
dprintf("Called fprintlog, ");
@@ -1833,22 +1971,27 @@ void fprintlog(f, from, flags, msg)
fwd_suspend);
}
break;
-
+
/*
* The trick is to wait some time, then retry to get the
* address. If that fails retry x times and then give up.
*
* You'll run into this problem mostly if the name server you
* need for resolving the address is on the same machine, but
- * is started after syslogd.
+ * is started after syslogd.
*/
case F_FORW_UNKN:
dprintf(" %s\n", f->f_un.f_forw.f_hname);
fwd_suspend = time((time_t *) 0) - f->f_time;
if ( fwd_suspend >= INET_SUSPEND_TIME ) {
dprintf("Forwarding suspension to unknown over, retrying\n");
+#ifdef INET6
+ if ((errmsg = setup_inetaddr(f))) {
+ dprintf("Failure: %s\n", errmsg);
+#else
if ( (hp = gethostbyname(f->f_un.f_forw.f_hname)) == NULL ) {
dprintf("Failure: %s\n", sys_h_errlist[h_errno]);
+#endif
dprintf("Retries: %d\n", f->f_prevcount);
if ( --f->f_prevcount < 0 ) {
dprintf("Giving up.\n");
@@ -1859,7 +2002,9 @@ void fprintlog(f, from, flags, msg)
}
else {
dprintf("%s found, resuming.\n", f->f_un.f_forw.f_hname);
+#ifndef INET6 /* not */
memcpy((char *) &f->f_un.f_forw.f_addr.sin_addr, hp->h_addr, hp->h_length);
+#endif
f->f_prevcount = 0;
f->f_type = F_FORW;
goto f_forw;
@@ -1901,7 +2046,11 @@ void fprintlog(f, from, flags, msg)
l = MAXLINE;
if (sendto(finet, line, l, 0, \
(struct sockaddr *) &f->f_un.f_forw.f_addr,
- sizeof(f->f_un.f_forw.f_addr)) != l) {
+#ifdef INET6
+ family == AF_INET6 ?
+ sizeof(struct sockaddr_in6) :
+#endif
+ sizeof(f->f_un.f_forw.f_addr)) != l) {
int e = errno;
dprintf("INET sendto error: %d = %s.\n",
e, strerror(e));
@@ -2132,28 +2281,53 @@ void reapchild()
/*
* Return a printable representation of a host address.
*/
-const char *cvthname(f)
- struct sockaddr_in *f;
+const char *cvthname(struct sockaddr *f)
{
+#ifdef INET6
+ static char hname[NI_MAXHOST];
+ int error;
+#else
struct hostent *hp;
+ char *hname;
+#endif
register char *p;
int count;
- if (f->sin_family != AF_INET) {
+#ifdef INET6
+ if (((struct sockaddr *)f)->sa_family == AF_INET6 &&
+ IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)f)->sin6_addr)) {
+ ((struct sockaddr *)f)->sa_family = AF_INET;
+ ((struct sockaddr_in *)f)->sin_addr.s_addr =
+ ((struct sockaddr_in6 *)f)->sin6_addr.s6_addr32[3];
+ }
+ error = getnameinfo((struct sockaddr *)f,
+ ((struct sockaddr *)f)->sa_family == AF_INET6 ?
+ sizeof(struct sockaddr_in6)
+ : sizeof(struct sockaddr_in),
+ hname, sizeof(hname), NULL, 0, 0);
+ if (error) {
+ dprintf("Malformed from address %s\n", gai_strerror(error));
+ return ("???");
+ }
+#else
+ if (((struct sockaddr_in *)f)->sin_family != AF_INET) {
dprintf("Malformed from address.\n");
return ("???");
}
- hp = gethostbyaddr((char *) &f->sin_addr, sizeof(struct in_addr), \
- f->sin_family);
+ hp = gethostbyaddr((char *) &(((struct sockaddr_in *)&f)->sin_addr),
+ sizeof(struct in_addr),
+ ((struct sockaddr_in *)f)->sin_family);
if (hp == 0) {
dprintf("Host name for your address (%s) unknown.\n",
- inet_ntoa(f->sin_addr));
- return (inet_ntoa(f->sin_addr));
+ inet_ntoa(((struct sockaddr_in *)f)->sin_addr));
+ return (inet_ntoa(((struct sockaddr_in *)f)->sin_addr));
}
+ hname = hp->h_name;
+#endif
/*
* Convert to lower case, just like LocalDomain above
*/
- for (p = (char *)hp->h_name; *p ; p++)
+ for (p = hname; *p ; p++)
if (isupper(*p))
*p = tolower(*p);
@@ -2161,17 +2335,17 @@ const char *cvthname(f)
* Notice that the string still contains the fqdn, but your
* hostname and domain are separated by a '\0'.
*/
- if ((p = strchr(hp->h_name, '.'))) {
+ if ((p = strchr(hname, '.'))) {
if (strcmp(p + 1, LocalDomain) == 0) {
*p = '\0';
- return (hp->h_name);
+ return (hname);
} else {
if (StripDomains) {
count=0;
while (StripDomains[count]) {
if (strcmp(p + 1, StripDomains[count]) == 0) {
*p = '\0';
- return (hp->h_name);
+ return (hname);
}
count++;
}
@@ -2179,9 +2353,9 @@ const char *cvthname(f)
if (LocalHosts) {
count=0;
while (LocalHosts[count]) {
- if (!strcmp(hp->h_name, LocalHosts[count])) {
+ if (!strcmp(hname, LocalHosts[count])) {
*p = '\0';
- return (hp->h_name);
+ return (hname);
}
count++;
}
@@ -2189,7 +2363,7 @@ const char *cvthname(f)
}
}
- return (hp->h_name);
+ return (hname);
}
void domark()
@@ -2239,7 +2413,7 @@ void debug_switch()
* Print syslogd errors some place.
*/
void logerror(type)
- char *type;
+ const char *type;
{
char buf[100];
@@ -2333,6 +2507,7 @@ void init()
#else
char cline[BUFSIZ];
#endif
+#ifndef INET6 /* not */
struct servent *sp;
sp = getservbyname("syslog", "udp");
@@ -2347,6 +2522,7 @@ void init()
LogPort = 0;
} else
LogPort = sp->s_port;
+#endif
/*
* Close all open log files and free log descriptor array.
@@ -2495,6 +2671,10 @@ void init()
InetInuse = 0;
}
inetm = finet;
+#ifdef INET6
+ if (finet >= 0)
+ setup_inetaddr_all();
+#endif
#endif
Initialized = 1;
@@ -2582,7 +2762,7 @@ void cfline(line, f)
int singlpri = 0;
int ignorepri = 0;
int syncfile;
-#ifdef SYSLOG_INET
+#if defined(SYSLOG_INET) && !defined(INET6)
struct hostent *hp;
#endif
char buf[MAXLINE];
@@ -2747,6 +2927,9 @@ void cfline(line, f)
(void) strcpy(f->f_un.f_forw.f_hname, ++p);
dprintf("forwarding host: %s\n", p); /*ASP*/
+#ifdef INET6
+ f->f_type = F_FORW_UNKN;
+#else
if ( (hp = gethostbyname(p)) == NULL ) {
f->f_type = F_FORW_UNKN;
f->f_prevcount = INET_RETRY_MAX;
@@ -2761,6 +2944,7 @@ void cfline(line, f)
f->f_un.f_forw.f_addr.sin_port = LogPort;
if ( f->f_type == F_FORW )
memcpy((char *) &f->f_un.f_forw.f_addr.sin_addr, hp->h_addr, hp->h_length);
+#endif
/*
* Otherwise the host might be unknown due to an
* inaccessible nameserver (perhaps on the same

58
syslog.8 Normal file
View File

@ -0,0 +1,58 @@
.\" Process this file with
.\" groff -man -Tascii syslog.8
.\"
.TH SYSLOG 8 "May 2008" "syslog" "System Logging"
.SH NAME
syslog - the system logging service
.SH DESCRIPTION
There are different syslog daemon implementations
supported as the system's syslog service, currently:
.BR syslogd ,
.BR rsyslogd ,
.BR syslog-ng .
It depends on the software selection during the installation
which daemon is installed as default.
Each syslog-daemon provides an own service file, that is:
.BR syslogd.service ,
.BR rsyslogd.service ,
.BR syslog-ng.service .
Only one syslog-daemon can be installed, it activates itself as the syslog
service by creating the
.BR syslog.service
alias, a common name to start/stop, query status and reload the daemon while
log rotation.
The
.BR /etc/sysconfig/syslog
file contains several variables allowing to specify additional
settings, such as start parameters for the daemon or additional
chroot log sockets.
The \fIyast2 sysconfig\fR module provides a comfortable way to
change these settings.
Starting with openSUSE-12.3, the
.BR SYSLOG_DAEMON
variable, which was used to select the daemon before, has been
removed. Also the
.BR SYSLOG_REQUIRES_NETWORK
has been removed and each daemon declares in its service file
whether the network will be started before syslog or not.
.SH BUGS
Please report bugs at <http://bugs.opensuse.org>
.SH AUTHOR
.nf
Juergen Weigert <jw@suse.com>
Dr. Werner Fink <werner@suse.com>
Marius Tomaschewski <mt@suse.com>
.SH "SEE ALSO"
.BR sysklogd (8)
.BR syslogd (8)
.BR syslog.conf (5)
.BR syslog-ng (8)
.BR syslog-ng.conf (5)
.BR rsyslogd (8)
.BR rsyslog.conf (5)

3
syslogd-rpmlintrc Normal file
View File

@ -0,0 +1,3 @@
addFilter(".*W:.*macro-in-comment.*%{version}.*")
addFilter(".*W:.*binary-or-shlib-calls-gethostbyname.*/usr/sbin/syslogd.*")

49
syslogd-service-prepare Normal file
View File

@ -0,0 +1,49 @@
#!/bin/bash
# Copyright (c) 2011 SuSE LINUX Products GmbH, Germany.
#
# Description:
#
# This script is executed by syslogd.service to prepare
# the syslogd daemon start.
# Currently it writes an evirtoment file which contains
# a variable with the additional log socket parameters
# passed to syslogd.
#
# Author: Werner Fink, Marius Tomaschewski
# Please send feedback to http://www.suse.de/feedback
#
test -s "/etc/sysconfig/syslog" && \
. "/etc/sysconfig/syslog"
run_dir="/var/run/syslogd"
env_file="/var/run/syslogd/additional-log-sockets.env"
umask 0022
/bin/mkdir -p -m 0755 "${run_dir}"
#
# Prepare include with sockets in chroot's
# passed as start parameter to the syslogd.
#
echo -n 'ADDITIONAL_SOCKET="' > "${env_file}"
for variable in ${!SYSLOGD_ADDITIONAL_SOCKET*}; do
eval value=\$$variable
test -z "$value" && continue
test ! -d "${value%/*}" && continue
echo -n "-a $value "
done >> "${env_file}"
echo '"' >> "${env_file}"
#
# make sure xconsole exists and is a pipe
#
if test -e /dev/xconsole -a ! -p /dev/xconsole ; then
/bin/rm -f /dev/xconsole
fi
if test ! -e /dev/xconsole ; then
/bin/mknod -m 0600 /dev/xconsole p
/bin/chown root:tty /dev/xconsole
fi
exit 0

1365
syslogd.changes Normal file

File diff suppressed because it is too large Load Diff

54
syslogd.service Normal file
View File

@ -0,0 +1,54 @@
#
# This file is part of package syslogd.
#
# Copyright (c) 2011 SuSE LINUX Products GmbH, Germany.
# Author: Werner Fink, Marius Tomaschewski
# Please send feedback to http://www.suse.de/feedback
#
# Description:
#
# Used to start syslogd as the System Logging Service daemon.
# The SYSLOG_DAEMON variable in /etc/sysconfig/syslog is not
# used any longer, instead use
# systemctl enable syslogd.service
# which also installs an alias to syslog.service.
#
[Unit]
Description=System Logging Service
Conflicts=syslog-ng.service rsyslog.service
Requires=var-run.mount
Requires=syslog.socket
Requires=network.target
Requires=klogd.service
Before=klogd.service
[Service]
# added automatically, for details please see
# https://en.opensuse.org/openSUSE:Security_Features#Systemd_hardening_effort
ProtectSystem=full
ProtectHome=true
PrivateDevices=true
ProtectHostname=true
ProtectClock=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectControlGroups=true
RestrictRealtime=true
# end of automatic additions
Type=notify
Sockets=syslog.socket
StandardOutput=null
Environment=ADDITIONAL_SOCKET=
ExecStartPre=/usr/sbin/syslogd-service-prepare
EnvironmentFile=-/var/run/syslogd/additional-log-sockets.env
ExecStart=/usr/sbin/syslogd -n $ADDITIONAL_SOCKET
ExecReload=/bin/systemctl kill --signal=TSTP klogd.service
ExecReload=/sbin/killproc -p /var/run/syslogd.pid -HUP /usr/sbin/syslogd
ExecReload=/bin/systemctl kill --signal=CONT klogd.service
ExecReload=/bin/systemctl kill --signal=USR2 klogd.service
[Install]
WantedBy=multi-user.target
Alias=syslog.service

408
syslogd.spec Normal file
View File

@ -0,0 +1,408 @@
#
# spec file for package syslogd
#
# Copyright (c) 2022 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
#Compat macro for new _fillupdir macro introduced in Nov 2017
%if ! %{defined _fillupdir}
%define _fillupdir /var/adm/fillup-templates
%endif
%if ! %{defined _rundir}
%define _rundir %{_localstatedir}/run
%endif
Name: syslogd
Version: 1.5.1
Release: 0
Summary: The Syslog daemon
License: GPL-2.0-or-later
Group: System/Daemons
URL: https://www.infodrom.org/projects/sysklogd/
Source: https://www.infodrom.org/projects/sysklogd/download/sysklogd-%{version}.tar.gz
#Source4: https://www.infodrom.org/projects/sysklogd/download/sysklogd-%{version}.tar.gz.asc
Source1: logrotate.syslog
Source2: sysconfig.syslogd
Source3: sysconfig.klogd
Source5: syslog.8
Source6: klog.service
Source7: klogd.service
Source8: syslogd.service
Source9: syslogd-service-prepare
Source11: syslogd-rpmlintrc
Source12: sysconfig.boot
Patch0: sysklogd-1.4.1.dif
Patch1: sysklogd-1.4.1-dgram.patch
Patch2: sysklogd-1.4.1-sparc.patch
Patch3: sysklogd-1.4.1-forw.patch
Patch5: sysklogd-ipv6.diff
Patch6: sysklogd-1.4.1-klogd24.dif
Patch7: sysklogd-1.4.1-large.patch
Patch8: sysklogd-1.4.1-dns.patch
Patch9: sysklogd-1.4.1-reopen.patch
Patch12: sysklogd-1.4.1-ksyslogsize.diff
Patch13: sysklogd-1.4.1-unix_sockets.patch
Patch14: sysklogd-1.4.1-showpri.patch
Patch18: sysklogd-1.4.1-dontsleep.patch
Patch19: sysklogd-1.4.1-signal.dif
Patch20: sysklogd-1.4.1-clearing.patch
Patch21: sysklogd-1.4.1-nofortify.patch
Patch22: sysklogd-1.4.1-sysmap-prior-to-2.5.patch
Patch23: sysklogd-1.4.1-reload.dif
Patch24: sysklogd-1.4.1-systemd.dif
Patch25: sysklogd-1.4.1-systemd-multi.dif
Patch26: sysklogd-1.4.1-systemd-sock-name.patch
# PATCH-FIX-SUSE bsc#897262, CVE-2014-3634 rsyslog/syslogd: remote syslog PRI vulnerability
Patch28: sysklogd-1.4.1-CVE-2014-3634.patch
BuildRequires: pkgconfig
BuildRequires: group(news)
BuildRequires: pkgconfig(libsystemd)
BuildRequires: pkgconfig(systemd)
BuildRequires: user(news)
Requires: klogd
Requires(post): %fillup_prereq
Requires(post): permissions
# Note: this package is for >= 12.3 only
# and does not provide LSB init scripts!
Requires(pre): syslog-service >= 2.0
Requires(pre): user(news)
Requires(pre): group(news)
Conflicts: syslog
Provides: sysklogd
Provides: syslog
Provides: sysvinit(syslog)
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%{?systemd_requires}
%description
The syslogd daemon is the general system logging daemon, which is
responsible for handling requests for syslog services.
This version of syslogd is similar to the standard Berkeley product,
but with a number of compatible extensions.
%package -n klogd
Summary: The kernel log daemon
Group: System/Daemons
Requires(post): %fillup_prereq
%description -n klogd
The klogd daemon 'listens' to kernel log messages, prioritizes them,
and routes them to either output files or to syslog daemon.
This version of klogd will optionally translate kernel addresses to
their symbolic equivalents if provided with a system map.
%package -n syslog-service
Version: 2.0
Release: 0
Summary: Syslog service files & scripts
Group: System/Daemons
Requires: logrotate
Requires: syslog
Requires: sysvinit(network)
Requires(post): %fillup_prereq
BuildArch: noarch
%description -n syslog-service
The package syslog-service provides the service boot
scripts for SysV and the service unit files for systemd.
%prep
%setup -q -n sysklogd-1.5.1
%patch1 -b .dgram
%patch2 -b .sparc
%patch3 -b .forw
%patch5 -b .ipv6
%patch6 -b .klogd24
%patch7 -b .large
%patch8 -b .dns
%patch9 -b .reopen
%patch12 -b .klsize
%patch13 -b .usock
%patch14 -b .shprio
%patch18 -b .sleep
%patch19 -b .signal
%patch20 -b .clear
%patch21 -b .nofortify
%patch22 -b .sysmap
%patch23 -b .reload
%patch24 -b .sd
%patch25 -b .sd2
%patch26 -b .sd3
%patch28 -b .cve20143634
%patch0 -b .p0
%build
%ifarch s390 s390x
mv sample-s390.conf sample.conf
%endif
# honor the increased LOG_BUF_LEN in kernel/printk.c
make %{?_smp_mflags} BINDIR=%{_sbindir} LOG_BUFFER_SIZE=-DLOG_BUFFER_SIZE=131072
%install
mkdir -p %{buildroot}/etc
mkdir -p %{buildroot}/sbin
mkdir -p %{buildroot}/%{_sbindir}
mkdir -p %{buildroot}/%{_mandir}/man{5,8}
mkdir -p %{buildroot}%{_fillupdir}
mkdir -p %{buildroot}%{_unitdir}
mkdir -p -m 0755 %{buildroot}/%{_rundir}/syslogd
make install MANDIR=%{_mandir} BINDIR=%{_sbindir} DESTDIR=%{buildroot}
%if 0%{?suse_version} > 1500
mkdir -p %{buildroot}%{_distconfdir}/logrotate.d
install -m 644 %{SOURCE1} %{buildroot}%{_distconfdir}/logrotate.d/syslog
%else
mkdir -p %{buildroot}%{_sysconfdir}/logrotate.d
install -m 644 %{SOURCE1} %{buildroot}%{_sysconfdir}/logrotate.d/syslog
%endif
install -m 644 %{SOURCE2} %{buildroot}%{_fillupdir}
install -m 644 %{SOURCE3} %{buildroot}%{_fillupdir}
install -m 644 %{SOURCE5} %{buildroot}/%{_mandir}/man8/syslog.8
install -m 644 %{SOURCE6} %{buildroot}%{_unitdir}/
install -m 644 %{SOURCE7} %{buildroot}%{_unitdir}/
install -m 644 %{SOURCE8} %{buildroot}%{_unitdir}/
install -m 755 %{SOURCE9} %{buildroot}/%{_sbindir}/
ln -s service %{buildroot}/%{_sbindir}/rcsyslogd
install -m 644 %{SOURCE12} %{buildroot}%{_fillupdir}
%if 0%{?suse_version} < 1550
for sbin in klogd syslogd ; do
ln -sf %{_sbindir}/${sbin} %{buildroot}/sbin/${sbin}
done
%endif
%ifarch s390 s390x
sed -i 's/^KERNEL_LOGLEVEL=1/KERNEL_LOGLEVEL=7/' \
%{buildroot}%{_fillupdir}/sysconfig.klogd
%endif
%if %{defined verify_permissions}
%verifyscript
%verify_permissions -e %{_sysconfdir}/syslog.conf
%endif
%pre
%service_add_pre syslogd.service
%post
%set_permissions %{_sysconfdir}/syslog.conf
#
# add syslog variables provided by syslogd if needed
#
%{remove_and_set -n syslog SYSLOG_DAEMON}
%{remove_and_set -n syslog SYSLOG_REQUIRES_NETWORK}
%{fillup_only -ns syslog syslogd}
#
# create dirs, touch log default files
#
mkdir -p var/log
touch var/log/messages; chmod 640 var/log/messages
touch var/log/mail; chmod 640 var/log/mail
touch var/log/mail.info; chmod 640 var/log/mail.info
touch var/log/mail.warn; chmod 640 var/log/mail.warn
touch var/log/mail.err; chmod 640 var/log/mail.err
test -f var/log/news && mv var/log/news var/log/news.bak
mkdir -p -m 0750 var/log/news
chown news:news var/log/news
touch var/log/news/news.crit; chmod 640 var/log/news/news.crit
chown news:news var/log/news/news.crit
touch var/log/news/news.err; chmod 640 var/log/news/news.err
chown news:news var/log/news/news.err
touch var/log/news/news.notice; chmod 640 var/log/news/news.notice
chown news:news var/log/news/news.notice
#
# Enable the syslogd as service
#
# This macro enables based on a systemctl preset config file only
%service_add_post syslogd.service
# But we want to enable a syslog-daemon regardless of the preset;
# force the creation of a syslog.service alias link (bnc#790805).
# We do not check the obsolete SYSLOG_DAEMON variable as we want
# to switch when installing it and there is a provider conflict.
%{_bindir}/systemctl -f enable syslogd.service >/dev/null 2>&1 || :
%preun
%service_del_preun syslog.socket
%service_del_preun syslogd.service
%postun
%service_del_postun syslogd.service
%preun -n syslog-service
%service_del_preun klog.service
%post -n syslog-service -p /bin/bash
%{remove_and_set -n syslog SYSLOG_DAEMON}
%{remove_and_set -n syslog SYSLOG_REQUIRES_NETWORK}
%{remove_and_set -n boot KLOGCONSOLE_PARAMS}
%{fillup_only -n boot}
#BEGIN KLOGCONSOLE_PARAMS migration
# KLOGCONSOLE_PARAMS was supported in /etc/sysconfig/boot up to Leap 15 and SLE 15.
# Based on genopts-1.3 options parser.
if test "$KLOGCONSOLE_PARAMS" != "no" ; then
KLOG_CONSOLE=
CONSOLE_LOGLEVEL=
function optarg_parse {
until [ $# -eq 0 ] ; do
case "$1" in
-* )
OPTTMP="${1:1}"
until [[ -z "$OPTTMP" ]] ; do
case "${OPTTMP:0:1}" in
r )
KLOG_CONSOLE="${OPTTMP:1}"
if [[ -z "$KLOG_CONSOLE" ]] ; then
shift
KLOG_CONSOLE="$1"
else
break
fi
;;
l )
CONSOLE_LOGLEVEL="${OPTTMP:1}"
if [[ -z "$CONSOLE_LOGLEVEL" ]] ; then
shift
CONSOLE_LOGLEVEL="$1"
else
break
fi
;;
esac
OPTTMP="${OPTTMP:1}"
done
;;
esac
shift
done
}
optarg_parse $KLOGCONSOLE_PARAMS
case "$CONSOLE_LOGLEVEL" in
0) CONSOLE_LOGLEVEL=emerg ;;
1) CONSOLE_LOGLEVEL=alert ;;
2) CONSOLE_LOGLEVEL=crit ;;
3) CONSOLE_LOGLEVEL=err ;;
4) CONSOLE_LOGLEVEL=warning ;;
5) CONSOLE_LOGLEVEL=notice ;;
6) CONSOLE_LOGLEVEL=info ;;
7) CONSOLE_LOGLEVEL=debug ;;
esac
unset OPTTMP
cat >%{_sysconfdir}/sysconfig/boot.update <<EOF
## Path: System/Logging
## Description: System logging
## Type: list(1,2,3,4,5,6,7,8,9,10,11,12)
## Default: 10
#
# Console for logging
#
KLOG_CONSOLE="$KLOG_CONSOLE"
## Type: list(,0,emerg,1,alert,2,crit,3,err,4,warning,5,notice,6,info,7,debug)
## Default:
#
# Loglevel for log console
#
CONSOLE_LOGLEVEL="$CONSOLE_LOGLEVEL"
EOF
fillup -m %{_sysconfdir}/sysconfig/boot.update %{_sysconfdir}/sysconfig/boot %{_sysconfdir}/sysconfig/boot
rm %{_sysconfdir}/sysconfig/boot.update
fi
#END KLOGCONSOLE_PARAMS migration
# when exists, remove the broken link pointing to the
# common syslog.service file, we've provided before...
rm -f %{_sysconfdir}/systemd/system/multi-user.target.wants/syslog.service
%service_add_post klog.service
%{_bindir}/systemctl -f enable klog.service >/dev/null 2>&1 || :
%pre -n syslog-service
%service_add_pre klog.service
%if 0%{?suse_version} > 1500
# Prepare for migration to /usr/etc; save any old .rpmsave
for i in logrotate.d/syslog ; do
test -f %{_sysconfdir}/${i}.rpmsave && mv -v %{_sysconfdir}/${i}.rpmsave %{_sysconfdir}/${i}.rpmsave.old ||:
done
%endif
%if 0%{?suse_version} > 1500
%posttrans -n syslog-service
# Migration to /usr/etc, restore just created .rpmsave
for i in logrotate.d/syslog ; do
test -f %{_sysconfdir}/${i}.rpmsave && mv -v %{_sysconfdir}/${i}.rpmsave %{_sysconfdir}/${i} ||:
done
%endif
%postun -n syslog-service
%service_del_postun klog.service
%pre -n klogd
%service_add_pre klogd.service
%post -n klogd
#
# add syslog variables provided by klogd if needed
#
%{remove_and_set -n syslog SYSLOG_DAEMON}
%{remove_and_set -n syslog SYSLOG_REQUIRES_NETWORK}
%{fillup_only -ns syslog klogd}
#
# Enable the syslogd as service
#
%service_add_post klogd.service
%preun -n klogd
%service_del_preun klogd.service
%postun -n klogd
%service_del_postun klogd.service
%files
%defattr(-,root,root)
%{_fillupdir}/sysconfig.syslogd
%config %verify(not mode) %attr(0600,root,root) %{_sysconfdir}/syslog.conf
%{_mandir}/man5/syslog.conf.5%{ext_man}
%{_mandir}/man8/syslogd.8%{ext_man}
%{_mandir}/man8/sysklogd.8%{ext_man}
%{_unitdir}/syslogd.service
%{_sbindir}/syslogd-service-prepare
%attr(0755,root,root) %dir %ghost %{_rundir}/syslogd
%{_sbindir}/syslogd
%{_sbindir}/rcsyslogd
%if 0%{?suse_version} < 1550
/sbin/syslogd
%endif
%files -n klogd
%defattr(-,root,root)
%{_fillupdir}/sysconfig.klogd
%{_unitdir}/klogd.service
%{_mandir}/man8/klogd.8%{ext_man}
%{_sbindir}/klogd
%if 0%{?suse_version} < 1550
/sbin/klogd
%endif
%files -n syslog-service
%defattr(-,root,root)
%{_fillupdir}/sysconfig.boot
%if 0%{?suse_version} > 1500
%{_distconfdir}/logrotate.d/syslog
%else
%config(noreplace) %{_sysconfdir}/logrotate.d/syslog
%endif
%{_unitdir}/klog.service
%{_mandir}/man8/syslog.8%{ext_man}
%changelog