From b6ff9e82d9dcf18d222072bc6c4b38bf08a52ca8 Mon Sep 17 00:00:00 2001 From: codehz Date: Wed, 8 May 2024 18:19:45 +0800 Subject: [PATCH] add __convert_sockaddr_un_to_nt --- libc/sock/bind-nt.c | 9 +++------ libc/sock/connect-nt.c | 9 +++------ libc/sock/sockaddr.c | 12 ++++++++++++ libc/sock/struct/sockaddr.internal.h | 1 + 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/libc/sock/bind-nt.c b/libc/sock/bind-nt.c index f4d3b4cd8..e899a0795 100644 --- a/libc/sock/bind-nt.c +++ b/libc/sock/bind-nt.c @@ -27,12 +27,9 @@ __msabi extern typeof(__sys_bind_nt) *const __imp_bind; textwindows int sys_bind_nt(struct Fd *f, const void *addr, uint32_t addrsize) { - struct sockaddr_un *sun, nt_sun; - if (f->family == AF_UNIX && ((struct sockaddr *)addr)->sa_family == AF_UNIX && - addrsize >= sizeof(struct sockaddr_un)) { - sun = (struct sockaddr_un *)addr; - nt_sun.sun_family = AF_UNIX; - if (__mkntsunpath(sun->sun_path, nt_sun.sun_path) == -1) return -1; + struct sockaddr_un nt_sun; + if (f->family == AF_UNIX) { + if (__convert_sockaddr_un_to_nt(&nt_sun, addr, addrsize) == -1) return -1; addr = &nt_sun; } if (__imp_bind(f->handle, addr, addrsize) != -1) { diff --git a/libc/sock/connect-nt.c b/libc/sock/connect-nt.c index c96876a8d..da8648d45 100644 --- a/libc/sock/connect-nt.c +++ b/libc/sock/connect-nt.c @@ -142,12 +142,9 @@ static textwindows int sys_connect_nt_impl(struct Fd *f, const void *addr, textwindows int sys_connect_nt(struct Fd *f, const void *addr, uint32_t addrsize) { - struct sockaddr_un *sun, nt_sun; - if (f->family == AF_UNIX && ((struct sockaddr *)addr)->sa_family == AF_UNIX && - addrsize >= sizeof(struct sockaddr_un)) { - sun = (struct sockaddr_un *)addr; - nt_sun.sun_family = AF_UNIX; - if (__mkntsunpath(sun->sun_path, nt_sun.sun_path) == -1) return -1; + struct sockaddr_un nt_sun; + if (f->family == AF_UNIX) { + if (__convert_sockaddr_un_to_nt(&nt_sun, addr, addrsize) == -1) return -1; addr = &nt_sun; } sigset_t mask = __sig_block(); diff --git a/libc/sock/sockaddr.c b/libc/sock/sockaddr.c index b038cc3ef..0725aa250 100644 --- a/libc/sock/sockaddr.c +++ b/libc/sock/sockaddr.c @@ -17,6 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/sock/struct/sockaddr.h" +#include "libc/calls/syscall_support-nt.internal.h" #include "libc/macros.internal.h" #include "libc/sock/sock.h" #include "libc/sock/struct/sockaddr.h" @@ -61,6 +62,17 @@ void __convert_sockaddr_to_bsd(struct sockaddr_storage *addr) { pun->bsd.sa_len = len; } +// converts cosmo sockaddr_un abi to nt +int __convert_sockaddr_un_to_nt(struct sockaddr_un *out_addr, const void *addr, + uint32_t addrsize) { + const struct sockaddr_un *sun = addr; + if (sun->sun_family == AF_UNIX && addrsize >= sizeof(struct sockaddr_un)) { + out_addr->sun_family = AF_UNIX; + if (__mkntsunpath(sun->sun_path, out_addr->sun_path) == -1) return -1; + } + return 0; +} + // copies sockaddr from internal memory to user's buffer void __write_sockaddr(const struct sockaddr_storage *addr, void *out_addr, uint32_t *inout_addrsize) { diff --git a/libc/sock/struct/sockaddr.internal.h b/libc/sock/struct/sockaddr.internal.h index 59d996d4a..0c74b21cf 100644 --- a/libc/sock/struct/sockaddr.internal.h +++ b/libc/sock/struct/sockaddr.internal.h @@ -45,6 +45,7 @@ const char *DescribeSockaddr(char[128], const struct sockaddr *, size_t); void __convert_bsd_to_sockaddr(struct sockaddr_storage *); void __convert_sockaddr_to_bsd(struct sockaddr_storage *); +int __convert_sockaddr_un_to_nt(struct sockaddr_un *, const void *, uint32_t); uint8_t __get_sockaddr_len(const struct sockaddr_storage *); void __write_sockaddr(const struct sockaddr_storage *, void *, uint32_t *);