From b964d186b45dd907f4ae302ea9b1ff63e3592eb6 Mon Sep 17 00:00:00 2001 From: Christian Svensson Date: Mon, 17 Aug 2020 00:09:02 +0200 Subject: [PATCH] Use mkall to generate types --- unix/linux/types.go | 10 ++++++++++ unix/syscall_internal_linux_test.go | 21 +++++++++++++++++++++ unix/syscall_linux.go | 25 +++++++++++++++++++++++-- unix/ztypes_linux.go | 12 ++++++------ 4 files changed, 60 insertions(+), 8 deletions(-) diff --git a/unix/linux/types.go b/unix/linux/types.go index 419ed247..b1daba7f 100644 --- a/unix/linux/types.go +++ b/unix/linux/types.go @@ -257,6 +257,16 @@ struct my_sockaddr_un { #endif }; +// copied from /usr/include/netiucv/iucv.h modified with explicit signed chars. +struct sockaddr_iucv { + sa_family_t siucv_family; + unsigned short siucv_port; + unsigned int siucv_addr; + signed char siucv_nodeid[8]; + signed char siucv_user_id[8]; + signed char siucv_name[8]; +}; + #ifdef __ARM_EABI__ typedef struct user_regs PtraceRegs; #elif defined(__aarch64__) diff --git a/unix/syscall_internal_linux_test.go b/unix/syscall_internal_linux_test.go index af48c2af..a690b991 100644 --- a/unix/syscall_internal_linux_test.go +++ b/unix/syscall_internal_linux_test.go @@ -156,6 +156,18 @@ func Test_anyToSockaddr(t *testing.T) { Name: "gopher", }, }, + { + name: "AF_IUCV", + rsa: sockaddrIUCVToAny(RawSockaddrIUCV{ + Family: AF_IUCV, + User_id: [8]int8{'*', 'M', 'S', 'G', ' ', ' ', ' ', ' '}, + Name: [8]int8{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, + }), + sa: &SockaddrIUCV{ + UserID: "*MSG ", + Name: " ", + }, + }, { name: "AF_MAX EAFNOSUPPORT", rsa: &RawSockaddrAny{ @@ -505,3 +517,12 @@ func sockaddrUnixToAny(in RawSockaddrUnix) *RawSockaddrAny { return &out } + +func sockaddrIUCVToAny(in RawSockaddrIUCV) *RawSockaddrAny { + var out RawSockaddrAny + copy( + (*(*[SizeofSockaddrAny]byte)(unsafe.Pointer(&out)))[:], + (*(*[SizeofSockaddrUnix]byte)(unsafe.Pointer(&in)))[:], + ) + return &out +} diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index 2226e637..e12f9bab 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -902,8 +902,12 @@ func (sa *SockaddrIUCV) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.User_id[i] = ' ' sa.raw.Name[i] = ' ' } - copy(sa.raw.User_id[:], []byte(sa.UserID)) - copy(sa.raw.Name[:], []byte(sa.Name)) + for i, b := range []byte(sa.UserID[:8]) { + sa.raw.User_id[i] = int8(b) + } + for i, b := range []byte(sa.Name[:8]) { + sa.raw.Name[i] = int8(b) + } return unsafe.Pointer(&sa.raw), SizeofSockaddrIUCV, nil } @@ -1087,6 +1091,23 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { } return sa, nil + case AF_IUCV: + pp := (*RawSockaddrIUCV)(unsafe.Pointer(rsa)) + + var user [8]byte + var name [8]byte + + for i := 0; i < 8; i++ { + user[i] = byte(pp.User_id[i]) + name[i] = byte(pp.Name[i]) + } + + sa := &SockaddrIUCV{ + UserID: string(user[:]), + Name: string(name[:]), + } + return sa, nil + } return nil, EAFNOSUPPORT } diff --git a/unix/ztypes_linux.go b/unix/ztypes_linux.go index 801f042d..77449a9e 100644 --- a/unix/ztypes_linux.go +++ b/unix/ztypes_linux.go @@ -311,12 +311,12 @@ type RawSockaddrL2TPIP6 struct { } type RawSockaddrIUCV struct { - Family uint16 - Port uint16 - Addr uint32 - Nodeid [8]byte - User_id [8]byte - Name [8]byte + Family uint16 + Port uint16 + Addr uint32 + Nodeid [8]int8 + User_id [8]int8 + Name [8]int8 } type _Socklen uint32