Browse Source

core:sys/linux - Add support for Unix Domain Socket addresses

Erik Isidore 1 year ago
parent
commit
f6e699cd22
2 changed files with 14 additions and 0 deletions
  1. 5 0
      core/sys/linux/sys.odin
  2. 9 0
      core/sys/linux/types.odin

+ 5 - 0
core/sys/linux/sys.odin

@@ -487,6 +487,7 @@ connect :: proc "contextless" (sock: Fd, addr: ^$T) -> (Errno)
 where
 where
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In6 ||
 	T == Sock_Addr_In6 ||
+	T == Sock_Addr_Un ||
 	T == Sock_Addr_Any
 	T == Sock_Addr_Any
 {
 {
 	ret := syscall(SYS_connect, sock, addr, size_of(T))
 	ret := syscall(SYS_connect, sock, addr, size_of(T))
@@ -502,6 +503,7 @@ accept :: proc "contextless" (sock: Fd, addr: ^$T, sockflags: Socket_FD_Flags =
 where
 where
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In6 ||
 	T == Sock_Addr_In6 ||
+	T == Sock_Addr_Un ||
 	T == Sock_Addr_Any
 	T == Sock_Addr_Any
 {
 {
 	addr_len: i32 = size_of(T)
 	addr_len: i32 = size_of(T)
@@ -514,6 +516,7 @@ recvfrom :: proc "contextless" (sock: Fd, buf: []u8, flags: Socket_Msg, addr: ^$
 where
 where
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In6 ||
 	T == Sock_Addr_In6 ||
+	T == Sock_Addr_Un ||
 	T == Sock_Addr_Any
 	T == Sock_Addr_Any
 {
 {
 	addr_len: i32 = size_of(T)
 	addr_len: i32 = size_of(T)
@@ -531,6 +534,7 @@ sendto :: proc "contextless" (sock: Fd, buf: []u8, flags: Socket_Msg, addr: ^$T)
 where
 where
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In6 ||
 	T == Sock_Addr_In6 ||
+	T == Sock_Addr_Un ||
 	T == Sock_Addr_Any
 	T == Sock_Addr_Any
 {
 {
 	ret := syscall(SYS_sendto, sock, raw_data(buf), len(buf), transmute(i32) flags, addr, size_of(T))
 	ret := syscall(SYS_sendto, sock, raw_data(buf), len(buf), transmute(i32) flags, addr, size_of(T))
@@ -590,6 +594,7 @@ bind :: proc "contextless" (sock: Fd, addr: ^$T) -> (Errno)
 where
 where
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In ||
 	T == Sock_Addr_In6 ||
 	T == Sock_Addr_In6 ||
+	T == Sock_Addr_Un ||
 	T == Sock_Addr_Any
 	T == Sock_Addr_Any
 {
 {
 	ret := syscall(SYS_bind, sock, addr, size_of(T))
 	ret := syscall(SYS_bind, sock, addr, size_of(T))

+ 9 - 0
core/sys/linux/types.odin

@@ -631,6 +631,14 @@ Sock_Addr_In6 :: struct #packed {
 	sin6_scope_id: u32,
 	sin6_scope_id: u32,
 }
 }
 
 
+/*
+  Struct representing Unix Domain Socket address
+*/
+Sock_Addr_Un :: struct #packed {
+	sun_family: Address_Family,
+	sun_path:   [108]u8
+}
+
 /*
 /*
 	Struct representing an arbitrary socket address.
 	Struct representing an arbitrary socket address.
 */
 */
@@ -641,6 +649,7 @@ Sock_Addr_Any :: struct #raw_union {
 	},
 	},
 	using ipv4: Sock_Addr_In,
 	using ipv4: Sock_Addr_In,
 	using ipv6: Sock_Addr_In6,
 	using ipv6: Sock_Addr_In6,
+	using uds: Sock_Addr_Un,
 }
 }
 
 
 /*
 /*