github.com/gotranspile/cxgo@v0.3.8-0.20240118201721-29871598a6a2/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  		}
    58  	})
    59  }