From 531012df1ad65d9b075a1644a930a09ac584f106 Mon Sep 17 00:00:00 2001
From: "E. Westbrook" <github@westbrook.io>
Date: Tue, 19 Feb 2019 04:51:23 -0700
Subject: src/unixdgram.c: allow connect() and bind() on freebsd without dummy
 char, and simplify calculations

---
 src/unixdgram.c | 21 ++++++---------------
 1 file changed, 6 insertions(+), 15 deletions(-)

diff --git a/src/unixdgram.c b/src/unixdgram.c
index 4645892..07c394c 100644
--- a/src/unixdgram.c
+++ b/src/unixdgram.c
@@ -261,20 +261,15 @@ static int meth_dirty(lua_State *L) {
 static const char *unixdgram_trybind(p_unix un, const char *path) {
     struct sockaddr_un local;
     size_t len = strlen(path);
-    int err;
     if (len >= sizeof(local.sun_path)) return "path too long";
     memset(&local, 0, sizeof(local));
     strcpy(local.sun_path, path);
     local.sun_family = AF_UNIX;
+    size_t addrlen = sizeof(local) - sizeof(local.sun_path) + len;
 #ifdef UNIX_HAS_SUN_LEN
-    local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len)
-        + len + 1;
-    err = socket_bind(&un->sock, (SA *) &local, local.sun_len);
-
-#else
-    err = socket_bind(&un->sock, (SA *) &local,
-            sizeof(local.sun_family) + len);
+    local.sun_len = addrlen + 1;
 #endif
+    int err = socket_bind(&un->sock, (SA *) &local, addrlen);
     if (err != IO_DONE) socket_destroy(&un->sock);
     return socket_strerror(err);
 }
@@ -315,21 +310,17 @@ static int meth_getsockname(lua_State *L)
 static const char *unixdgram_tryconnect(p_unix un, const char *path)
 {
     struct sockaddr_un remote;
-    int err;
     size_t len = strlen(path);
     if (len >= sizeof(remote.sun_path)) return "path too long";
     memset(&remote, 0, sizeof(remote));
     strcpy(remote.sun_path, path);
     remote.sun_family = AF_UNIX;
     timeout_markstart(&un->tm);
+    size_t addrlen = sizeof(remote) - sizeof(remote.sun_path) + len;
 #ifdef UNIX_HAS_SUN_LEN
-    remote.sun_len = sizeof(remote.sun_family) + sizeof(remote.sun_len)
-        + len + 1;
-    err = socket_connect(&un->sock, (SA *) &remote, remote.sun_len, &un->tm);
-#else
-    err = socket_connect(&un->sock, (SA *) &remote,
-            sizeof(remote.sun_family) + len, &un->tm);
+    remote.sun_len = addrlen + 1;
 #endif
+    int err = socket_connect(&un->sock, (SA *) &remote, addrlen, &un->tm);
     if (err != IO_DONE) socket_destroy(&un->sock);
     return socket_strerror(err);
 }
-- 
cgit v1.2.3-55-g6feb