github.com/gotranspile/cxgo@v0.3.8-0.20240118201721-29871598a6a2/runtime/cnet/socket.go (about) 1 package cnet 2 3 import ( 4 "fmt" 5 "log" 6 "syscall" 7 "unsafe" 8 9 "github.com/gotranspile/cxgo/runtime/libc" 10 ) 11 12 const ( 13 AF_INET = 2 14 SOCK_STREAM = 1 15 SOCK_DGRAM = 2 16 SOL_SOCKET = uint16(0xffff) 17 SO_BROADCAST = 0x20 18 ) 19 20 type SockAddr struct { 21 Family int16 22 Data [14]byte 23 } 24 25 type SockAddrInet struct { 26 Family int16 27 Port uint16 28 Addr Address 29 Zero [8]byte 30 } 31 32 func Accept(a1 int, a2 *SockAddr, a3 *int) int { 33 panic("TODO") 34 } 35 36 func Bind(fd int, addr *SockAddr, sz int) int { 37 var sa syscall.Sockaddr 38 switch addr.Family { 39 case AF_INET: 40 addr := (*SockAddrInet)(unsafe.Pointer(addr)) 41 port := Ntohs(addr.Port) 42 if addr.Addr.Addr != 0 { 43 panic("TODO") 44 } 45 sa = &syscall.SockaddrInet4{Port: int(port)} 46 default: 47 err := fmt.Errorf("unsupported address family: %d", addr.Family) 48 log.Printf("bind(%d, %p, %d): %v", fd, addr, sz, err) 49 libc.SetErr(err) 50 return -1 51 } 52 err := syscall.Bind(Handle(fd), sa) 53 if err != nil { 54 log.Printf("bind(%d, %p, %d): %v", fd, addr, sz, err) 55 libc.SetErr(err) 56 return -1 57 } 58 return 0 59 } 60 61 func Socket(domain, typ, proto int) int { 62 fd, err := syscall.Socket(domain, typ, proto) 63 if err != nil { 64 log.Printf("socket(%d, %d, %d): %v", domain, typ, proto, err) 65 libc.SetErr(err) 66 return -1 67 } 68 return int(fd) 69 } 70 71 func Listen(a1, a2 int32) int32 { 72 panic("TODO") 73 } 74 75 func Shutdown(a1, a2 int32) int32 { 76 panic("TODO") 77 } 78 79 func Send(a1 int32, a2 *byte, a3 int32, a4 int32) int32 { 80 panic("TODO") 81 } 82 83 func SendTo(a1 int32, a2 *byte, a3 uint32, a4 int32, a5 *SockAddr, a6 int) int32 { 84 panic("TODO") 85 } 86 87 func Recv(a1 int32, a2 *byte, a3 uint32, a4 int32) int32 { 88 panic("TODO") 89 } 90 91 func RecvFrom(a1 int32, a2 *byte, a3 uint32, a4 int32, a5 *SockAddr, a6 *int) int32 { 92 panic("TODO") 93 } 94 95 func SetSockOpt(fd int, level int, name int, val *byte, sz int) int { 96 var err error 97 switch name { 98 case SO_BROADCAST: 99 if sz != 4 { 100 panic(sz) 101 } 102 val := *(*int32)(unsafe.Pointer(val)) 103 err = syscall.SetsockoptInt(Handle(fd), level, name, int(val)) 104 default: 105 log.Printf("setsockopt(%d, %d, %d, %x, %d)", fd, level, name, val, sz) 106 panic("TODO") 107 } 108 if err != nil { 109 log.Printf("setsockopt(%d, %d, %d, %x, %d): %v", fd, level, name, val, sz, err) 110 libc.SetErr(err) 111 return -1 112 } 113 return 0 114 }