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  }