runtime: net/textproto/textproto.go overlay don't import llgo runtime
This commit is contained in:
@@ -24,6 +24,11 @@
|
|||||||
// with a single network connection.
|
// with a single network connection.
|
||||||
package textproto
|
package textproto
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <stdint.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
"errors"
|
||||||
@@ -33,12 +38,117 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"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.
|
// An Error represents a numeric error response from a server.
|
||||||
type Error struct {
|
type Error struct {
|
||||||
Code int
|
Code int
|
||||||
@@ -94,7 +204,7 @@ func Dial(network, addr string) (*Conn, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type cConn struct {
|
type cConn struct {
|
||||||
socketFd c.Int
|
socketFd C.int
|
||||||
closed bool
|
closed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,9 +216,9 @@ func (conn *cConn) Read(p []byte) (n int, err error) {
|
|||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
for n < len(p) {
|
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 result < 0 {
|
||||||
if os.Errno() == c.Int(syscall.EINTR) {
|
if Errno() == C.int(syscall.EINTR) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return n, errors.New("read error")
|
return n, errors.New("read error")
|
||||||
@@ -126,9 +236,9 @@ func (conn *cConn) Write(p []byte) (n int, err error) {
|
|||||||
return 0, fs.ErrClosed
|
return 0, fs.ErrClosed
|
||||||
}
|
}
|
||||||
for n < len(p) {
|
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 result < 0 {
|
||||||
if os.Errno() == c.Int(syscall.EINTR) {
|
if Errno() == C.int(syscall.EINTR) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return n, errors.New("write error")
|
return n, errors.New("write error")
|
||||||
@@ -149,9 +259,9 @@ func (conn *cConn) Close() error {
|
|||||||
return fs.ErrClosed
|
return fs.ErrClosed
|
||||||
}
|
}
|
||||||
conn.closed = true
|
conn.closed = true
|
||||||
result := os.Close(conn.socketFd)
|
result := Close(conn.socketFd)
|
||||||
if result < 0 {
|
if result < 0 {
|
||||||
return errors.New(c.GoString(c.Strerror(os.Errno())))
|
return errors.New(GoString(Strerror(Errno())))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -161,29 +271,29 @@ func dialNetWork(network, addr string) (*cConn, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var hints net.AddrInfo
|
var hints AddrInfo
|
||||||
var res *net.AddrInfo
|
var res *AddrInfo
|
||||||
c.Memset(unsafe.Pointer(&hints), 0, unsafe.Sizeof(hints))
|
Memset(unsafe.Pointer(&hints), 0, unsafe.Sizeof(hints))
|
||||||
hints.Family = net.AF_UNSPEC
|
hints.Family = AF_UNSPEC
|
||||||
hints.SockType = net.SOCK_STREAM
|
hints.SockType = SOCK_STREAM
|
||||||
status := net.Getaddrinfo(c.AllocaCStr(host), c.AllocaCStr(port), &hints, &res)
|
status := Getaddrinfo(AllocaCStr(host), AllocaCStr(port), &hints, &res)
|
||||||
if status != 0 {
|
if status != 0 {
|
||||||
return nil, errors.New("getaddrinfo error")
|
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 {
|
if socketFd == -1 {
|
||||||
net.Freeaddrinfo(res)
|
Freeaddrinfo(res)
|
||||||
return nil, errors.New("socket error")
|
return nil, errors.New("socket error")
|
||||||
}
|
}
|
||||||
|
|
||||||
if net.Connect(socketFd, res.Addr, res.AddrLen) == -1 {
|
if Connect(socketFd, res.Addr, res.AddrLen) == -1 {
|
||||||
os.Close(socketFd)
|
Close(socketFd)
|
||||||
net.Freeaddrinfo(res)
|
Freeaddrinfo(res)
|
||||||
return nil, errors.New("connect error")
|
return nil, errors.New("connect error")
|
||||||
}
|
}
|
||||||
|
|
||||||
net.Freeaddrinfo(res)
|
Freeaddrinfo(res)
|
||||||
return &cConn{
|
return &cConn{
|
||||||
socketFd: socketFd,
|
socketFd: socketFd,
|
||||||
}, nil
|
}, nil
|
||||||
|
|||||||
Reference in New Issue
Block a user