runtime: net/textproto/textproto.go overlay don't import llgo runtime

This commit is contained in:
Li Jie
2025-02-19 12:09:03 +08:00
parent a473901cfd
commit 35ba8476b0

View File

@@ -24,6 +24,11 @@
// with a single network connection.
package textproto
/*
#include <stdint.h>
*/
import "C"
import (
"bufio"
"errors"
@@ -33,12 +38,117 @@ import (
"strings"
"syscall"
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/net"
"github.com/goplus/llgo/c/os"
)
const (
AF_UNSPEC = 0 // unspecified
AF_UNIX = 1 // local to host (pipes)
AF_LOCAL = AF_UNIX // backward compatibility
AF_INET = 2 // internetwork: UDP, TCP, etc.
AF_IMPLINK = 3 // arpanet imp addresses
AF_PUP = 4 // pup protocols: e.g. BSP
AF_CHAOS = 5 // mit CHAOS protocols
AF_NS = 6 // XEROX NS protocols
AF_ISO = 7 // ISO protocols
AF_OSI = AF_ISO
AF_ECMA = 8 // European computer manufacturers
AF_DATAKIT = 9 // datakit protocols
AF_CCITT = 10 // CCITT protocols, X.25 etc
AF_SNA = 11 // IBM SNA
AF_DECnet = 12 // DECnet
AF_DLI = 13 // DEC Direct data link interface
AF_LAT = 14 // LAT
AF_HYLINK = 15 // NSC Hyperchannel
AF_APPLETALK = 16 // Apple Talk
AF_ROUTE = 17 // Internal Routing Protocol
AF_LINK = 18 // Link layer interface
pseudo_AF_XTP = 19 // eXpress Transfer Protocol (no AF)
AF_COIP = 20 // connection-oriented IP, aka ST II
AF_CNT = 21 // Computer Network Technology
pseudo_AF_RTIP = 22 // Help Identify RTIP packets
AF_IPX = 23 // Novell Internet Protocol
AF_SIP = 24 // Simple Internet Protocol
pseudo_AF_PIP = 25 // Help Identify PIP packets
AF_NDRV = 27 // Network Driver 'raw' access
AF_ISDN = 28 // Integrated Services Digital Network
AF_E164 = AF_ISDN // CCITT E.164 recommendation
pseudo_AF_KEY = 29 // Internal key-management function
AF_INET6 = 30 // IPv6
AF_NATM = 31 // native ATM access
AF_SYSTEM = 32 // Kernel event messages
AF_NETBIOS = 33 // NetBIOS
AF_PPP = 34 // PPP communication protocol
pseudo_AF_HDRCMPLT = 35 // Used by BPF to not rewrite headers in interface output routine
AF_RESERVED_36 = 36 // Reserved for internal usage
AF_IEEE80211 = 37 // IEEE 802.11 protocol
AF_UTUN = 38
AF_VSOCK = 40 // VM Sockets
AF_MAX = 41
)
const (
SOCK_STREAM = 1 // stream socket
SOCK_DGRAM = 2 // datagram socket
SOCK_RAW = 3 // raw-protocol interface
SOCK_RDM = 4 // reliably-delivered message
SOCK_SEQPACKET = 5 // sequenced packet stream
)
type SockAddr struct {
Len uint8
Family uint8
Data [14]C.char
}
type AddrInfo struct {
Flags C.int
Family C.int
SockType C.int
Protocol C.int
AddrLen C.uint
CanOnName *C.char
Addr *SockAddr
Next *AddrInfo
}
//go:linkname Getaddrinfo C.getaddrinfo
func Getaddrinfo(host *C.char, port *C.char, addrInfo *AddrInfo, result **AddrInfo) C.int
//go:linkname Freeaddrinfo C.freeaddrinfo
func Freeaddrinfo(addrInfo *AddrInfo) C.int
//go:linkname GoString llgo.string
func GoString(cstr *C.char, __llgo_va_list /* n */ ...any) string
//go:linkname AllocaCStr llgo.allocaCStr
func AllocaCStr(s string) *C.char
//go:linkname Memset C.memset
func Memset(s unsafe.Pointer, c C.int, n uintptr) unsafe.Pointer
//go:linkname Read C.read
func Read(fd C.int, buf unsafe.Pointer, count uintptr) int
//go:linkname Write C.write
func Write(fd C.int, buf unsafe.Pointer, count uintptr) int
//go:linkname Close C.close
func Close(fd C.int) C.int
//go:linkname Strerror strerror
func Strerror(errnum C.int) *C.char
//go:linkname Errno C.cliteErrno
func Errno() C.int
//go:linkname Socket C.socket
func Socket(domain C.int, typ C.int, protocol C.int) C.int
//go:linkname Connect C.connect
func Connect(sockfd C.int, addr *SockAddr, addrlen C.uint) C.int
// -----------------------------------------------------------------------------
// An Error represents a numeric error response from a server.
type Error struct {
Code int
@@ -94,7 +204,7 @@ func Dial(network, addr string) (*Conn, error) {
}
type cConn struct {
socketFd c.Int
socketFd C.int
closed bool
}
@@ -106,9 +216,9 @@ func (conn *cConn) Read(p []byte) (n int, err error) {
return 0, nil
}
for n < len(p) {
result := os.Read(conn.socketFd, unsafe.Pointer(&p[n:][0]), uintptr(len(p)-n))
result := Read(conn.socketFd, unsafe.Pointer(&p[n:][0]), uintptr(len(p)-n))
if result < 0 {
if os.Errno() == c.Int(syscall.EINTR) {
if Errno() == C.int(syscall.EINTR) {
continue
}
return n, errors.New("read error")
@@ -126,9 +236,9 @@ func (conn *cConn) Write(p []byte) (n int, err error) {
return 0, fs.ErrClosed
}
for n < len(p) {
result := os.Write(conn.socketFd, unsafe.Pointer(&p[n:][0]), uintptr(len(p)-n))
result := Write(conn.socketFd, unsafe.Pointer(&p[n:][0]), uintptr(len(p)-n))
if result < 0 {
if os.Errno() == c.Int(syscall.EINTR) {
if Errno() == C.int(syscall.EINTR) {
continue
}
return n, errors.New("write error")
@@ -149,9 +259,9 @@ func (conn *cConn) Close() error {
return fs.ErrClosed
}
conn.closed = true
result := os.Close(conn.socketFd)
result := Close(conn.socketFd)
if result < 0 {
return errors.New(c.GoString(c.Strerror(os.Errno())))
return errors.New(GoString(Strerror(Errno())))
}
return nil
}
@@ -161,29 +271,29 @@ func dialNetWork(network, addr string) (*cConn, error) {
if err != nil {
return nil, err
}
var hints net.AddrInfo
var res *net.AddrInfo
c.Memset(unsafe.Pointer(&hints), 0, unsafe.Sizeof(hints))
hints.Family = net.AF_UNSPEC
hints.SockType = net.SOCK_STREAM
status := net.Getaddrinfo(c.AllocaCStr(host), c.AllocaCStr(port), &hints, &res)
var hints AddrInfo
var res *AddrInfo
Memset(unsafe.Pointer(&hints), 0, unsafe.Sizeof(hints))
hints.Family = AF_UNSPEC
hints.SockType = SOCK_STREAM
status := Getaddrinfo(AllocaCStr(host), AllocaCStr(port), &hints, &res)
if status != 0 {
return nil, errors.New("getaddrinfo error")
}
socketFd := net.Socket(res.Family, res.SockType, res.Protocol)
socketFd := Socket(res.Family, res.SockType, res.Protocol)
if socketFd == -1 {
net.Freeaddrinfo(res)
Freeaddrinfo(res)
return nil, errors.New("socket error")
}
if net.Connect(socketFd, res.Addr, res.AddrLen) == -1 {
os.Close(socketFd)
net.Freeaddrinfo(res)
if Connect(socketFd, res.Addr, res.AddrLen) == -1 {
Close(socketFd)
Freeaddrinfo(res)
return nil, errors.New("connect error")
}
net.Freeaddrinfo(res)
Freeaddrinfo(res)
return &cConn{
socketFd: socketFd,
}, nil