diff --git a/libc/sock/bind.c b/libc/sock/bind.c index a01cba665..d9b28a4a3 100644 --- a/libc/sock/bind.c +++ b/libc/sock/bind.c @@ -41,10 +41,10 @@ int bind(int fd, const void *addr, uint32_t addrsize) { if (!IsBsd()) { return sys_bind(fd, addr, addrsize); } else { - struct sockaddr_in_bsd addr2; - assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd)); - memcpy(&addr2, addr, sizeof(struct sockaddr_in)); - sockaddr2bsd(&addr2); + char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */ + assert(addrsize <= sizeof(addr2)); + memcpy(&addr2, addr, addrsize); + sockaddr2bsd(&addr2[0]); return sys_bind(fd, &addr2, addrsize); } } else if (__isfdkind(fd, kFdSocket)) { diff --git a/libc/sock/connect-sysv.c b/libc/sock/connect-sysv.c index 94455d035..cc8de8e72 100644 --- a/libc/sock/connect-sysv.c +++ b/libc/sock/connect-sysv.c @@ -23,14 +23,13 @@ #include "libc/sysv/errfuns.h" int sys_connect(int fd, const void *addr, uint32_t addrsize) { - if (addrsize != sizeof(struct sockaddr_in)) return einval(); if (!IsBsd()) { return __sys_connect(fd, addr, addrsize); } else { - struct sockaddr_in_bsd addr2; - assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd)); - memcpy(&addr2, addr, sizeof(struct sockaddr_in)); - sockaddr2bsd(&addr2); - return sys_connect(fd, &addr2, addrsize); + char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */ + assert(addrsize <= sizeof(addr2)); + memcpy(&addr2, addr, addrsize); + sockaddr2bsd(&addr2[0]); + return __sys_connect(fd, &addr2, addrsize); } } diff --git a/libc/sock/internal.h b/libc/sock/internal.h index e4e435a60..2ea9b0aa0 100644 --- a/libc/sock/internal.h +++ b/libc/sock/internal.h @@ -49,7 +49,7 @@ struct msghdr_bsd { struct sockaddr_un_bsd { uint8_t sun_len; /* sockaddr len including NUL on freebsd but excluding it on openbsd/xnu */ uint8_t sun_family; - char sun_path[14]; + char sun_path[108]; }; struct SockFd { diff --git a/libc/sock/sendto.c b/libc/sock/sendto.c index 7b30d6675..44b40140f 100644 --- a/libc/sock/sendto.c +++ b/libc/sock/sendto.c @@ -47,16 +47,15 @@ */ ssize_t sendto(int fd, const void *buf, size_t size, uint32_t flags, const void *opt_addr, uint32_t addrsize) { - assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd)); if (!IsWindows()) { if (!IsBsd() || !opt_addr) { return sys_sendto(fd, buf, size, flags, opt_addr, addrsize); } else { - struct sockaddr_in_bsd addr2; - if (addrsize != sizeof(addr2)) return einval(); - memcpy(&addr2, opt_addr, sizeof(struct sockaddr_in)); - sockaddr2bsd(&addr2); - return sys_sendto(fd, buf, size, flags, &addr2, addrsize); + char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */ + if (addrsize > sizeof(addr2)) return einval(); + memcpy(&addr2, opt_addr, addrsize); + sockaddr2bsd(&addr2[0]); + return sys_sendto(fd, buf, size, flags, &addr2[0], addrsize); } } else if (__isfdkind(fd, kFdSocket)) { return sys_sendto_nt(&g_fds.p[fd], (struct iovec[]){{buf, size}}, 1, flags, diff --git a/libc/sock/sock.h b/libc/sock/sock.h index f5e389677..71ca50fe1 100644 --- a/libc/sock/sock.h +++ b/libc/sock/sock.h @@ -42,7 +42,7 @@ struct sockaddr_in { /* Linux+NT ABI */ struct sockaddr_un { uint16_t sun_family; /* AF_UNIX */ - char sun_path[14];/* path */ + char sun_path[108];/* path */ }; struct sockaddr_storage { diff --git a/libc/sock/syslog.c b/libc/sock/syslog.c index c1ca4a1af..b07d35e2b 100644 --- a/libc/sock/syslog.c +++ b/libc/sock/syslog.c @@ -75,7 +75,12 @@ static void __openlog() { log_fd = RegisterEventSourceA(NULL, log_ident); } else { log_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); - if (log_fd >= 0) connect(log_fd, (void *)&log_addr, sizeof(log_addr)); + if (log_fd >= 0) { + int rc = connect(log_fd, (void *)&log_addr, sizeof(log_addr)); + if (rc < 0) { + printf("ERR: connect(openlog) failed: %s (errno=%d)\n", strerror(errno), errno); + } + } } } @@ -147,6 +152,8 @@ void vsyslog(int priority, const char *message, va_list ap) { * - First try to send it to syslogd * - If fails and LOG_CONS is provided, writes to /dev/console */ + +#if 0 if (send(log_fd, buf, l, 0) < 0 && (!is_lost_conn(errno) || connect(log_fd, (void *)&log_addr, sizeof(log_addr)) < 0 || send(log_fd, buf, l, 0) < 0) @@ -157,6 +164,23 @@ void vsyslog(int priority, const char *message, va_list ap) { close(fd); } } +#else + int rc = send(log_fd, buf, l, 0); + if (rc < 0) { + printf("ERR: send(1) failed: %s (errno=%d)\n", strerror(errno), errno); + if (!is_lost_conn(errno)) { + rc = connect(log_fd, (void *)&log_addr, sizeof(log_addr)); + if (rc < 0) { + printf("ERR: connect(syslog) failed: %s (errno=%d)\n", strerror(errno), errno); + } else { + rc = send(log_fd, buf, l, 0); + if (rc < 0) { + printf("ERR: send(2) failed: %s (errno=%d)\n", strerror(errno), errno); + } + } + } + } +#endif } else { uint16_t evtType; uint32_t evtID;