Hi,
To make syslog reliable, I want to see log messages about failed
log atempts. sendsyslog(2) seems a good place to detect and report
the problem.
ok?
bluhm
Index: kern/subr_log.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/subr_log.c,v
retrieving revision 1.30
diff -u -p -r1.30 subr_log.c
--- kern/subr_log.c 6 May 2015 08:52:17 -0000 1.30
+++ kern/subr_log.c 14 Aug 2015 18:11:47 -0000
@@ -83,6 +83,8 @@ int filt_logread(struct knote *kn, long
struct filterops logread_filtops =
{ 1, NULL, filt_logrdetach, filt_logread};
+int dosendsyslog(struct proc *, const char *, size_t, enum uio_seg);
+
void
initmsgbuf(caddr_t buf, size_t bufsize)
{
@@ -354,6 +356,40 @@ sys_sendsyslog(struct proc *p, void *v,
syscallarg(const void *) buf;
syscallarg(size_t) nbyte;
} */ *uap = v;
+ int error;
+#ifndef SMALL_KERNEL
+ static int dropped_count, orig_error;
+ int len;
+ char buf[64];
+
+ if (dropped_count) {
+ len = snprintf(buf, sizeof(buf),
+ "<%d> sendsyslog: dropped %d message%s, error %d",
+ LOG_KERN|LOG_WARNING, dropped_count,
+ dropped_count == 1 ? "" : "s", orig_error);
+ error = dosendsyslog(p, buf, MIN((size_t)len, sizeof(buf) - 1),
+ UIO_SYSSPACE);
+ if (error) {
+ dropped_count++;
+ return (error);
+ }
+ dropped_count = 0;
+ }
+#endif
+ error = dosendsyslog(p, SCARG(uap, buf), SCARG(uap, nbyte),
+ UIO_USERSPACE);
+#ifndef SMALL_KERNEL
+ if (error) {
+ dropped_count++;
+ orig_error = error;
+ }
+#endif
+ return (error);
+}
+
+int
+dosendsyslog(struct proc *p, const char *buf, size_t nbyte, enum uio_seg sflg)
+{
#ifdef KTRACE
struct iovec *ktriov = NULL;
int iovlen;
@@ -369,11 +405,11 @@ sys_sendsyslog(struct proc *p, void *v,
f = syslogf;
FREF(f);
- aiov.iov_base = (char *)SCARG(uap, buf);
- aiov.iov_len = SCARG(uap, nbyte);
+ aiov.iov_base = (char *)buf;
+ aiov.iov_len = nbyte;
auio.uio_iov = &aiov;
auio.uio_iovcnt = 1;
- auio.uio_segflg = UIO_USERSPACE;
+ auio.uio_segflg = sflg;
auio.uio_rw = UIO_WRITE;
auio.uio_procp = p;
auio.uio_offset = 0;