github.com/gotranspile/cxgo@v0.3.7/libs/sys_socket.go (about) 1 package libs 2 3 import ( 4 "github.com/gotranspile/cxgo/runtime/cnet" 5 "github.com/gotranspile/cxgo/types" 6 ) 7 8 const ( 9 sysSocketH = "sys/socket.h" 10 ) 11 12 func init() { 13 RegisterLibrary(sysSocketH, func(c *Env) *Library { 14 intT := types.IntT(4) 15 int16T := types.IntT(2) 16 uint16T := types.UintT(2) 17 gintT := c.Go().Int() 18 uintT := types.UintT(4) 19 bytesT := c.C().String() 20 inAddrT := c.GetLibraryType(arpaInetH, "in_addr") 21 sockAddrT := types.NamedT("cnet.SockAddr", types.StructT([]*types.Field{ 22 {Name: types.NewIdentGo("sa_family", "Family", int16T)}, 23 {Name: types.NewIdentGo("sa_data", "Data", c.C().BytesN(14))}, 24 })) 25 sockAddrInT := types.NamedT("cnet.SockAddrInet", types.StructT([]*types.Field{ 26 {Name: types.NewIdentGo("sin_family", "Family", int16T)}, 27 {Name: types.NewIdentGo("sin_port", "Port", uint16T)}, 28 {Name: types.NewIdentGo("sin_addr", "Addr", inAddrT)}, 29 {Name: types.NewIdentGo("sin_zero", "Zero", c.C().BytesN(8))}, 30 })) 31 return &Library{ 32 Imports: map[string]string{ 33 "csys": RuntimePrefix + "csys", 34 "cnet": RuntimePrefix + "cnet", 35 }, 36 Types: map[string]types.Type{ 37 "sockaddr": sockAddrT, 38 "sockaddr_in": sockAddrInT, 39 }, 40 Idents: map[string]*types.Ident{ 41 "AF_INET": c.NewIdent("AF_INET", "cnet.AF_INET", cnet.AF_INET, gintT), 42 "SOCK_STREAM": c.NewIdent("SOCK_STREAM", "cnet.SOCK_STREAM", cnet.SOCK_STREAM, gintT), 43 "SOCK_DGRAM": c.NewIdent("SOCK_DGRAM", "cnet.SOCK_DGRAM", cnet.SOCK_DGRAM, gintT), 44 "SOL_SOCKET": c.NewIdent("SOL_SOCKET", "cnet.SOL_SOCKET", cnet.SOL_SOCKET, types.UintT(2)), 45 "SO_BROADCAST": c.NewIdent("SO_BROADCAST", "cnet.SO_BROADCAST", cnet.SO_BROADCAST, gintT), 46 "accept": c.NewIdent("accept", "cnet.Accept", cnet.Accept, c.FuncTT(gintT, gintT, c.PtrT(sockAddrT), c.PtrT(gintT))), 47 "bind": c.NewIdent("bind", "cnet.Bind", cnet.Bind, c.FuncTT(gintT, gintT, c.PtrT(sockAddrT), gintT)), 48 "listen": c.NewIdent("listen", "cnet.Listen", cnet.Listen, c.FuncTT(intT, intT, intT)), 49 "shutdown": c.NewIdent("shutdown", "cnet.Shutdown", cnet.Shutdown, c.FuncTT(intT, intT, intT)), 50 "send": c.NewIdent("send", "cnet.Send", cnet.Send, c.FuncTT(intT, intT, bytesT, intT, intT)), 51 "sendto": c.NewIdent("sendto", "cnet.SendTo", cnet.SendTo, c.FuncTT(intT, intT, bytesT, uintT, intT, c.PtrT(sockAddrT), gintT)), 52 "recv": c.NewIdent("recv", "cnet.Recv", cnet.Recv, c.FuncTT(intT, intT, bytesT, uintT, intT)), 53 "recvfrom": c.NewIdent("recvfrom", "cnet.RecvFrom", cnet.RecvFrom, c.FuncTT(intT, intT, bytesT, uintT, intT, c.PtrT(sockAddrT), c.PtrT(gintT))), 54 "socket": c.NewIdent("socket", "cnet.Socket", cnet.Socket, c.FuncTT(gintT, gintT, gintT, gintT)), 55 "setsockopt": c.NewIdent("setsockopt", "cnet.SetSockOpt", cnet.SetSockOpt, c.FuncTT(gintT, gintT, gintT, gintT, bytesT, gintT)), 56 }, 57 // TODO 58 Header: ` 59 #include <` + sysTypesH + `> 60 #include <` + arpaInetH + `> 61 62 const _cxgo_go_int AF_INET = 2; /* Internet IP Protocol */ 63 64 const _cxgo_go_int SOCK_STREAM = 1; /* stream (connection) socket */ 65 const _cxgo_go_int SOCK_DGRAM = 2; /* datagram (conn.less) socket */ 66 67 const _cxgo_uint16 SOL_SOCKET = 0xffff; 68 69 const _cxgo_go_int SO_BROADCAST = 0x20; 70 71 #define socklen_t _cxgo_go_int 72 73 struct sockaddr { 74 _cxgo_int16 sa_family; 75 char sa_data[14]; 76 }; 77 78 // TODO: should be elsewhere 79 struct in_addr { 80 _cxgo_uint32 s_addr; 81 }; 82 83 struct sockaddr_in { 84 _cxgo_int16 sin_family; // e.g. AF_INET 85 _cxgo_uint16 sin_port; // e.g. htons(3490) 86 struct in_addr sin_addr; 87 char sin_zero[8]; 88 }; 89 90 _cxgo_go_int accept(_cxgo_go_int, struct sockaddr *restrict, socklen_t *restrict); 91 _cxgo_go_int bind(_cxgo_go_int, const struct sockaddr *, socklen_t); 92 int connect(int, const struct sockaddr *, socklen_t); 93 int getpeername(int, struct sockaddr *restrict, socklen_t *restrict); 94 int getsockname(int, struct sockaddr *restrict, socklen_t *restrict); 95 int getsockopt(int, int, int, void *restrict, socklen_t *restrict); 96 _cxgo_int32 listen(_cxgo_int32, _cxgo_int32); 97 _cxgo_int32 recv(_cxgo_int32, void *, _cxgo_uint32, _cxgo_int32); 98 _cxgo_int32 recvfrom(_cxgo_int32, void *restrict, _cxgo_uint32, _cxgo_int32, struct sockaddr *restrict, socklen_t *restrict); 99 ssize_t recvmsg(int, struct msghdr *, int); 100 _cxgo_int32 send(_cxgo_int32, const void *, _cxgo_int32, _cxgo_int32); 101 ssize_t sendmsg(int, const struct msghdr *, int); 102 _cxgo_int32 sendto(_cxgo_int32, const void *, _cxgo_uint32, _cxgo_int32, const struct sockaddr *, socklen_t); 103 _cxgo_int32 setsockopt(_cxgo_int32, _cxgo_int32, _cxgo_int32, const void *, socklen_t); 104 _cxgo_int32 shutdown(_cxgo_int32, _cxgo_int32); 105 _cxgo_go_int socket(_cxgo_go_int, _cxgo_go_int, _cxgo_go_int); 106 int sockatmark(int); 107 int socketpair(int, int, int, int[2]); 108 `, 109 } 110 }) 111 }