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;

Reply via email to