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  }