| ... | ... | @@ -103,10 +103,10 @@ pub const Address = extern union { |
| 103 | 103 | .path = undefined, |
| 104 | 104 | }; |
| 105 | 105 | |
| 106 | | // this enables us to have the proper length of the socket in getOsSockLen |
| 107 | | mem.set(u8, &sock_addr.path, 0); |
| 106 | // Add 1 to ensure a terminating 0 is present in the path array for maximum portability. |
| 107 | if (path.len + 1 > sock_addr.path.len) return error.NameTooLong; |
| 108 | 108 | |
| 109 | | if (path.len > sock_addr.path.len) return error.NameTooLong; |
| 109 | mem.set(u8, &sock_addr.path, 0); |
| 110 | 110 | mem.copy(u8, &sock_addr.path, path); |
| 111 | 111 | |
| 112 | 112 | return Address{ .un = sock_addr }; |
| ... | ... | @@ -179,9 +179,17 @@ pub const Address = extern union { |
| 179 | 179 | unreachable; |
| 180 | 180 | } |
| 181 | 181 | |
| 182 | | const path_len = std.mem.len(std.meta.assumeSentinel(&self.un.path, 0)); |
| 183 | | return @intCast(os.socklen_t, @sizeOf(os.sockaddr.un) - self.un.path.len + path_len); |
| 182 | // Using the full length of the structure here is more portable than returning |
| 183 | // the number of bytes actually used by the currently stored path. |
| 184 | // This also is correct regardless if we are passing a socket address to the kernel |
| 185 | // (e.g. in bind, connect, sendto) since we ensure the path is 0 terminated in |
| 186 | // initUnix() or if we are receiving a socket address from the kernel and must |
| 187 | // provide the full buffer size (e.g. getsockname, getpeername, recvfrom, accept). |
| 188 | // |
| 189 | // To access the path, std.mem.sliceTo(&address.un.path, 0) should be used. |
| 190 | return @intCast(os.socklen_t, @sizeOf(os.sockaddr.un)); |
| 184 | 191 | }, |
| 192 | |
| 185 | 193 | else => unreachable, |
| 186 | 194 | } |
| 187 | 195 | } |