Seems good to me.

I wouldn't bother with disabling this in SMALL_KERNEL.   Space
is not short enough to complicate the code for ~200 bytes.

> 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