The branch main has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=881059955a5d83fc173f40f266d93ddd91255291

commit 881059955a5d83fc173f40f266d93ddd91255291
Author:     Dmitry Wagin <dmitry.wa...@ya.ru>
AuthorDate: 2021-03-23 16:01:15 +0000
Commit:     Mark Johnston <ma...@freebsd.org>
CommitDate: 2021-12-31 17:57:01 +0000

    libc: Some enhancements to syslog(3)
    
    This is a re-application of commit
    2d82b47a5b4ef18550565dd55628d51f54d0af2e, which was reverted since it
    broke with syslog daemons that don't adjust the /dev/log recv buffer
    size.  Now that the default is large enough to accomodate 8KB messages,
    restore support for large messages.
    
    PR:             260126
---
 lib/libc/gen/syslog.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/lib/libc/gen/syslog.c b/lib/libc/gen/syslog.c
index 19d44db0075a..797c7389d1a2 100644
--- a/lib/libc/gen/syslog.c
+++ b/lib/libc/gen/syslog.c
@@ -57,6 +57,9 @@ __FBSDID("$FreeBSD$");
 
 #include "libc_private.h"
 
+/* Maximum number of characters of syslog message */
+#define        MAXLINE         8192
+
 static int     LogFile = -1;           /* fd for log */
 static int     status;                 /* connection status */
 static int     opened;                 /* have done openlog() */
@@ -141,7 +144,7 @@ vsyslog1(int pri, const char *fmt, va_list ap)
        char ch, *p;
        long tz_offset;
        int cnt, fd, saved_errno;
-       char hostname[MAXHOSTNAMELEN], *stdp, tbuf[2048], fmt_cpy[1024],
+       char hostname[MAXHOSTNAMELEN], *stdp, tbuf[MAXLINE], fmt_cpy[MAXLINE],
            errstr[64], tz_sign;
        FILE *fp, *fmt_fp;
        struct bufcookie tbuf_cookie;
@@ -396,9 +399,19 @@ connectlog(void)
        struct sockaddr_un SyslogAddr;  /* AF_UNIX address of local logger */
 
        if (LogFile == -1) {
+               socklen_t len;
+
                if ((LogFile = _socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC,
                    0)) == -1)
                        return;
+               if (_getsockopt(LogFile, SOL_SOCKET, SO_SNDBUF, &len,
+                   &(socklen_t){sizeof(len)}) == 0) {
+                       if (len < MAXLINE) {
+                               len = MAXLINE;
+                               (void)_setsockopt(LogFile, SOL_SOCKET, 
SO_SNDBUF,
+                                   &len, sizeof(len));
+                       }
+               }
        }
        if (LogFile != -1 && status == NOCONN) {
                SyslogAddr.sun_len = sizeof(SyslogAddr);

Reply via email to