From 65e1f261c0fb47373cb419c60df373d60d351b49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E8=8B=B1=E6=9D=B0?= <2635879218@qq.com> Date: Thu, 25 Jul 2024 15:40:02 +0800 Subject: [PATCH] refactor(c-libuv): Ajust Errno --- c/libuv/_demo/async_fs/async_fs.go | 10 +- c/libuv/_demo/echo_server/echo_server.go | 8 +- c/libuv/error.go | 181 ++++++++++++----------- c/net/net.go | 17 +++ 4 files changed, 117 insertions(+), 99 deletions(-) diff --git a/c/libuv/_demo/async_fs/async_fs.go b/c/libuv/_demo/async_fs/async_fs.go index 6a549441..6f715974 100644 --- a/c/libuv/_demo/async_fs/async_fs.go +++ b/c/libuv/_demo/async_fs/async_fs.go @@ -40,7 +40,7 @@ func main() { func onOpen(req *libuv.Fs) { // Check for errors if libuv.FsGetResult(req) < 0 { - c.Fprintf(c.Stderr, c.Str("Error opening file: %s\n"), libuv.Strerror(libuv.LoopClose(loop))) + c.Fprintf(c.Stderr, c.Str("Error opening file: %s\n"), libuv.Strerror(libuv.Errno(libuv.LoopClose(loop)))) libuv.LoopClose(loop) return } @@ -49,7 +49,7 @@ func onOpen(req *libuv.Fs) { // Read the file readRes := libuv.FsRead(loop, &readReq, libuv.UvFile(libuv.FsGetResult(req)), &iov, 1, -1, onRead) if readRes != 0 { - c.Printf(c.Str("Error in FsRead: %s (code: %d)\n"), libuv.Strerror(c.Int(readRes)), readRes) + c.Printf(c.Str("Error in FsRead: %s (code: %d)\n"), libuv.Strerror(libuv.Errno(readRes)), readRes) libuv.LoopClose(loop) return } @@ -58,7 +58,7 @@ func onOpen(req *libuv.Fs) { func onRead(req *libuv.Fs) { // Check for errors if libuv.FsGetResult(req) < 0 { - c.Fprintf(c.Stderr, c.Str("Read error: %s\n"), libuv.Strerror(libuv.FsGetResult(req))) + c.Fprintf(c.Stderr, c.Str("Read error: %s\n"), libuv.Strerror(libuv.Errno(libuv.FsGetResult(req)))) libuv.LoopClose(loop) } else if libuv.FsGetResult(req) == 0 { c.Printf(c.Str("EOF\n")) @@ -66,7 +66,7 @@ func onRead(req *libuv.Fs) { closeRes := libuv.FsClose(loop, &closeReq, libuv.UvFile(libuv.FsGetResult(&openReq)), onClose) if closeRes != 0 { // Print the content - c.Printf(c.Str("Error in FsClose: %s (code: %d)\n"), libuv.Strerror(c.Int(closeRes)), closeRes) + c.Printf(c.Str("Error in FsClose: %s (code: %d)\n"), libuv.Strerror(libuv.Errno(closeRes)), closeRes) libuv.LoopClose(loop) return } @@ -80,7 +80,7 @@ func onRead(req *libuv.Fs) { func onClose(req *libuv.Fs) { // Check for errors if libuv.FsGetResult(req) < 0 { - c.Fprintf(c.Stderr, c.Str("Error closing file: %s\n"), libuv.Strerror(libuv.FsGetResult(req))) + c.Fprintf(c.Stderr, c.Str("Error closing file: %s\n"), libuv.Strerror(libuv.Errno(libuv.FsGetResult(req)))) } else { c.Printf(c.Str("\nFile closed successfully.\n")) } diff --git a/c/libuv/_demo/echo_server/echo_server.go b/c/libuv/_demo/echo_server/echo_server.go index fdb04b5b..ee7faafc 100644 --- a/c/libuv/_demo/echo_server/echo_server.go +++ b/c/libuv/_demo/echo_server/echo_server.go @@ -35,7 +35,7 @@ func main() { (&server).Bind((*net.SockAddr)(c.Pointer(&addr)), 0) res := (*libuv.Stream)(&server).Listen(DEFAULT_BACKLOG, OnNewConnection) if res != 0 { - c.Fprintf(c.Stderr, c.Str("Listen error: %s\n"), libuv.Strerror(res)) + c.Fprintf(c.Stderr, c.Str("Listen error: %s\n"), libuv.Strerror((libuv.Errno(res)))) return } @@ -58,7 +58,7 @@ func AllocBuffer(handle *libuv.Handle, suggestedSize uintptr, buf *libuv.Buf) { func EchoWrite(req *libuv.Write, status c.Int) { if status != 0 { - c.Fprintf(c.Stderr, c.Str("Write error: %s\n"), libuv.Strerror(status)) + c.Fprintf(c.Stderr, c.Str("Write error: %s\n"), libuv.Strerror((libuv.Errno(status)))) } FreeWriteReq(req) } @@ -80,7 +80,7 @@ func EchoRead(client *libuv.Stream, nread c.Long, buf *libuv.Buf) { if nread < 0 { // Handle read errors and EOF. if (libuv.Errno)(nread) != libuv.EOF { - c.Fprintf(c.Stderr, c.Str("Read error: %s\n"), libuv.Strerror(c.Int(nread))) + c.Fprintf(c.Stderr, c.Str("Read error: %s\n"), libuv.Strerror((libuv.Errno)(nread))) } (*libuv.Handle)(c.Pointer(client)).Close(nil) } @@ -92,7 +92,7 @@ func EchoRead(client *libuv.Stream, nread c.Long, buf *libuv.Buf) { func OnNewConnection(server *libuv.Stream, status c.Int) { if status < 0 { - c.Fprintf(c.Stderr, c.Str("New connection error: %s\n"), libuv.Strerror(status)) + c.Fprintf(c.Stderr, c.Str("New connection error: %s\n"), libuv.Strerror(libuv.Errno(status))) return } diff --git a/c/libuv/error.go b/c/libuv/error.go index b9397cf9..beb286a2 100644 --- a/c/libuv/error.go +++ b/c/libuv/error.go @@ -2,110 +2,111 @@ package libuv import ( "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/net" + "github.com/goplus/llgo/c/syscall" _ "unsafe" ) const ( - E2BIG Errno = iota - EACCES - EADDRINUSE - EADDRNOTAVAIL - EAFNOSUPPORT - EAGAIN - EAI_ADDRFAMILY - EAI_AGAIN - EAI_BADFLAGS - EAI_BADHINTS - EAI_CANCELED - EAI_FAIL - EAI_FAMILY - EAI_MEMORY - EAI_NODATA - EAI_NONAME - EAI_OVERFLOW - EAI_PROTOCOL - EAI_SERVICE - EAI_SOCKTYPE - EALREADY - EBADF - EBUSY - ECANCELED - ECHARSET - ECONNABORTED - ECONNREFUSED - ECONNRESET - EDESTADDRREQ - EEXIST - EFAULT - EFBIG - EHOSTUNREACH - EINTR - EINVAL - EIO - EISCONN - EISDIR - ELOOP - EMFILE - EMSGSIZE - ENAMETOOLONG - ENETDOWN - ENETUNREACH - ENFILE - ENOBUFS - ENODEV - ENOENT - ENOMEM - ENONET - ENOPROTOOPT - ENOSPC - ENOSYS - ENOTCONN - ENOTDIR - ENOTEMPTY - ENOTSOCK - ENOTSUP - EOVERFLOW - EPERM - EPIPE - EPROTO - EPROTONOSUPPORT - EPROTOTYPE - ERANGE - EROFS - ESHUTDOWN - ESPIPE - ESRCH - ETIMEDOUT - ETXTBSY - EXDEV - UNKNOWN - EOF - ENXIO - EMLINK - EHOSTDOWN - EREMOTEIO - ENOTTY - EFTYPE - EILSEQ - ESOCKTNOSUPPORT - ENODATA - EUNATCH - ERRNO_MAX + E2BIG Errno = (Errno)(syscall.E2BIG) + EACCES Errno = (Errno)(syscall.EACCES) + EADDRINUSE Errno = (Errno)(syscall.EADDRINUSE) + EADDRNOTAVAIL Errno = (Errno)(syscall.EADDRNOTAVAIL) + EAFNOSUPPORT Errno = (Errno)(syscall.EAFNOSUPPORT) + EAGAIN Errno = (Errno)(syscall.EAGAIN) + EAI_ADDRFAMILY Errno = net.EAI_ADDRFAMILY + EAI_AGAIN Errno = net.EAI_AGAIN + EAI_BADFLAGS Errno = net.EAI_BADFLAGS + EAI_BADHINTS Errno = net.EAI_BADHINTS + EAI_CANCELED Errno = -3003 + EAI_FAIL Errno = net.EAI_FAIL + EAI_FAMILY Errno = net.EAI_FAMILY + EAI_MEMORY Errno = net.EAI_MEMORY + EAI_NODATA Errno = net.EAI_NODATA + EAI_NONAME Errno = net.EAI_NONAME + EAI_OVERFLOW Errno = net.EAI_OVERFLOW + EAI_PROTOCOL Errno = net.EAI_PROTOCOL + EAI_SERVICE Errno = net.EAI_SERVICE + EAI_SOCKTYPE Errno = net.EAI_SOCKTYPE + EALREADY Errno = (Errno)(syscall.EALREADY) + EBADF Errno = (Errno)(syscall.EBADF) + EBUSY Errno = (Errno)(syscall.EBUSY) + ECANCELED Errno = (Errno)(syscall.ECANCELED) + ECHARSET Errno = -4080 + ECONNABORTED Errno = (Errno)(syscall.ECONNABORTED) + ECONNREFUSED Errno = (Errno)(syscall.ECONNREFUSED) + ECONNRESET Errno = (Errno)(syscall.ECONNRESET) + EDESTADDRREQ Errno = (Errno)(syscall.EDESTADDRREQ) + EEXIST Errno = (Errno)(syscall.EEXIST) + EFAULT Errno = (Errno)(syscall.EFAULT) + EFBIG Errno = (Errno)(syscall.EFBIG) + EHOSTUNREACH Errno = (Errno)(syscall.EHOSTUNREACH) + EINTR Errno = (Errno)(syscall.EINTR) + EINVAL Errno = (Errno)(syscall.EINVAL) + EIO Errno = (Errno)(syscall.EIO) + EISCONN Errno = (Errno)(syscall.EISCONN) + EISDIR Errno = (Errno)(syscall.EISDIR) + ELOOP Errno = (Errno)(syscall.ELOOP) + EMFILE Errno = (Errno)(syscall.EMFILE) + EMSGSIZE Errno = (Errno)(syscall.EMSGSIZE) + ENAMETOOLONG Errno = (Errno)(syscall.ENAMETOOLONG) + ENETDOWN Errno = (Errno)(syscall.ENETDOWN) + ENETUNREACH Errno = (Errno)(syscall.ENETUNREACH) + ENFILE Errno = (Errno)(syscall.ENFILE) + ENOBUFS Errno = (Errno)(syscall.ENOBUFS) + ENODEV Errno = (Errno)(syscall.ENODEV) + ENOENT Errno = (Errno)(syscall.ENOENT) + ENOMEM Errno = (Errno)(syscall.ENOMEM) + ENONET Errno = -4056 + ENOPROTOOPT Errno = (Errno)(syscall.ENOPROTOOPT) + ENOSPC Errno = (Errno)(syscall.ENOSPC) + ENOSYS Errno = (Errno)(syscall.ENOSYS) + ENOTCONN Errno = (Errno)(syscall.ENOTCONN) + ENOTDIR Errno = (Errno)(syscall.ENOTDIR) + ENOTEMPTY Errno = (Errno)(syscall.ENOTEMPTY) + ENOTSOCK Errno = (Errno)(syscall.ENOTSOCK) + ENOTSUP Errno = (Errno)(syscall.ENOTSUP) + EOVERFLOW Errno = (Errno)(syscall.EOVERFLOW) + EPERM Errno = (Errno)(syscall.EPERM) + EPIPE Errno = (Errno)(syscall.EPIPE) + EPROTO Errno = (Errno)(syscall.EPROTO) + EPROTONOSUPPORT Errno = (Errno)(syscall.EPROTONOSUPPORT) + EPROTOTYPE Errno = (Errno)(syscall.EPROTOTYPE) + ERANGE Errno = (Errno)(syscall.ERANGE) + EROFS Errno = (Errno)(syscall.EROFS) + ESHUTDOWN Errno = (Errno)(syscall.ESHUTDOWN) + ESPIPE Errno = (Errno)(syscall.ESPIPE) + ESRCH Errno = (Errno)(syscall.ESRCH) + ETIMEDOUT Errno = (Errno)(syscall.ETIMEDOUT) + ETXTBSY Errno = (Errno)(syscall.ETXTBSY) + EXDEV Errno = (Errno)(syscall.EXDEV) + UNKNOWN Errno = -4094 + EOF Errno = -1 + ENXIO Errno = (Errno)(syscall.ENXIO) + EMLINK Errno = (Errno)(syscall.EMLINK) + EHOSTDOWN Errno = (Errno)(syscall.EHOSTDOWN) + EREMOTEIO Errno = -4030 + ENOTTY Errno = (Errno)(syscall.ENOTTY) + EFTYPE Errno = (Errno)(syscall.EFTYPE) + EILSEQ Errno = (Errno)(syscall.EILSEQ) + ESOCKTNOSUPPORT Errno = (Errno)(syscall.ESOCKTNOSUPPORT) + + ERRNO_MAX = EOF - 1 ) type Errno c.Int //go:linkname TranslateSysError C.uv_translate_sys_error -func TranslateSysError(sysErrno c.Int) c.Int +func TranslateSysError(sysErrno c.Int) Errno //go:linkname Strerror C.uv_strerror -func Strerror(err c.Int) *c.Char +func Strerror(err Errno) *c.Char //go:linkname StrerrorR C.uv_strerror_r -func StrerrorR(err c.Int, buf *c.Char, bufLen uintptr) *c.Char +func StrerrorR(err Errno, buf *c.Char, bufLen uintptr) *c.Char //go:linkname ErrName C.uv_err_name -func ErrName(err c.Int) *c.Char +func ErrName(err Errno) *c.Char //go:linkname ErrNameR C.uv_err_name_r -func ErrNameR(err c.Int, buf *c.Char, bufLen uintptr) *c.Char +func ErrNameR(err Errno, buf *c.Char, bufLen uintptr) *c.Char diff --git a/c/net/net.go b/c/net/net.go index 0b794084..e811d316 100644 --- a/c/net/net.go +++ b/c/net/net.go @@ -80,6 +80,23 @@ const ( SOCK_SEQPACKET = 5 // sequenced packet stream ) +const ( + EAI_ADDRFAMILY = iota + 1 /* address family for hostname not supported */ + EAI_AGAIN /* temporary failure in name resolution */ + EAI_BADFLAGS /* invalid value for ai_flags */ + EAI_FAIL /* non-recoverable failure in name resolution */ + EAI_FAMILY /* ai_family not supported */ + EAI_MEMORY /* memory allocation failure */ + EAI_NODATA /* no address associated with hostname */ + EAI_NONAME /* hostname nor servname provided, or not known */ + EAI_SERVICE /* servname not supported for ai_socktype */ + EAI_SOCKTYPE /* ai_socktype not supported */ + EAI_SYSTEM /* system error returned in errno */ + EAI_BADHINTS /* invalid value for hints */ + EAI_PROTOCOL /* resolved protocol is unknown */ + EAI_OVERFLOW /* argument buffer overflow */ +) + // (TODO) merge to inet const INET_ADDRSTRLEN = 16