From bf01d85e12ffd066271a990d14497bdaad191e9c Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 21 May 2008 15:54:02 -0500 Subject: [PATCH] Better Unix errors --- extra/unix/bsd/bsd.factor | 4 - extra/unix/bsd/freebsd/freebsd.factor | 95 +++++++++++++++++++++++ extra/unix/bsd/macosx/macosx.factor | 105 ++++++++++++++++++++++++++ extra/unix/bsd/netbsd/netbsd.factor | 99 ++++++++++++++++++++++++ extra/unix/bsd/openbsd/openbsd.factor | 90 ++++++++++++++++++++++ extra/unix/linux/linux.factor | 102 ++++++++++++++++++++++++- extra/unix/unix.factor | 31 ++++++-- 7 files changed, 511 insertions(+), 15 deletions(-) diff --git a/extra/unix/bsd/bsd.factor b/extra/unix/bsd/bsd.factor index 158dbeaddb..0c669d2258 100755 --- a/extra/unix/bsd/bsd.factor +++ b/extra/unix/bsd/bsd.factor @@ -48,10 +48,6 @@ C-STRUCT: sockaddr-un : max-un-path 104 ; inline -: EINTR HEX: 4 ; inline -: EAGAIN HEX: 23 ; inline -: EINPROGRESS HEX: 24 ; inline - : SOCK_STREAM 1 ; inline : SOCK_DGRAM 2 ; inline diff --git a/extra/unix/bsd/freebsd/freebsd.factor b/extra/unix/bsd/freebsd/freebsd.factor index f25cbd1537..34f0f0429c 100644 --- a/extra/unix/bsd/freebsd/freebsd.factor +++ b/extra/unix/bsd/freebsd/freebsd.factor @@ -12,3 +12,98 @@ C-STRUCT: addrinfo { "char*" "canonname" } { "void*" "addr" } { "addrinfo*" "next" } ; + +: EPERM 1 ; inline +: ENOENT 2 ; inline +: ESRCH 3 ; inline +: EINTR 4 ; inline +: EIO 5 ; inline +: ENXIO 6 ; inline +: E2BIG 7 ; inline +: ENOEXEC 8 ; inline +: EBADF 9 ; inline +: ECHILD 10 ; inline +: EDEADLK 11 ; inline +: ENOMEM 12 ; inline +: EACCES 13 ; inline +: EFAULT 14 ; inline +: ENOTBLK 15 ; inline +: EBUSY 16 ; inline +: EEXIST 17 ; inline +: EXDEV 18 ; inline +: ENODEV 19 ; inline +: ENOTDIR 20 ; inline +: EISDIR 21 ; inline +: EINVAL 22 ; inline +: ENFILE 23 ; inline +: EMFILE 24 ; inline +: ENOTTY 25 ; inline +: ETXTBSY 26 ; inline +: EFBIG 27 ; inline +: ENOSPC 28 ; inline +: ESPIPE 29 ; inline +: EROFS 30 ; inline +: EMLINK 31 ; inline +: EPIPE 32 ; inline +: EDOM 33 ; inline +: ERANGE 34 ; inline +: EAGAIN 35 ; inline +: EWOULDBLOCK EAGAIN ; inline +: EINPROGRESS 36 ; inline +: EALREADY 37 ; inline +: ENOTSOCK 38 ; inline +: EDESTADDRREQ 39 ; inline +: EMSGSIZE 40 ; inline +: EPROTOTYPE 41 ; inline +: ENOPROTOOPT 42 ; inline +: EPROTONOSUPPORT 43 ; inline +: ESOCKTNOSUPPORT 44 ; inline +: EOPNOTSUPP 45 ; inline +: ENOTSUP EOPNOTSUPP ; inline +: EPFNOSUPPORT 46 ; inline +: EAFNOSUPPORT 47 ; inline +: EADDRINUSE 48 ; inline +: EADDRNOTAVAIL 49 ; inline +: ENETDOWN 50 ; inline +: ENETUNREACH 51 ; inline +: ENETRESET 52 ; inline +: ECONNABORTED 53 ; inline +: ECONNRESET 54 ; inline +: ENOBUFS 55 ; inline +: EISCONN 56 ; inline +: ENOTCONN 57 ; inline +: ESHUTDOWN 58 ; inline +: ETOOMANYREFS 59 ; inline +: ETIMEDOUT 60 ; inline +: ECONNREFUSED 61 ; inline +: ELOOP 62 ; inline +: ENAMETOOLONG 63 ; inline +: EHOSTDOWN 64 ; inline +: EHOSTUNREACH 65 ; inline +: ENOTEMPTY 66 ; inline +: EPROCLIM 67 ; inline +: EUSERS 68 ; inline +: EDQUOT 69 ; inline +: ESTALE 70 ; inline +: EREMOTE 71 ; inline +: EBADRPC 72 ; inline +: ERPCMISMATCH 73 ; inline +: EPROGUNAVAIL 74 ; inline +: EPROGMISMATCH 75 ; inline +: EPROCUNAVAIL 76 ; inline +: ENOLCK 77 ; inline +: ENOSYS 78 ; inline +: EFTYPE 79 ; inline +: EAUTH 80 ; inline +: ENEEDAUTH 81 ; inline +: EIDRM 82 ; inline +: ENOMSG 83 ; inline +: EOVERFLOW 84 ; inline +: ECANCELED 85 ; inline +: EILSEQ 86 ; inline +: ENOATTR 87 ; inline +: EDOOFUS 88 ; inline +: EBADMSG 89 ; inline +: EMULTIHOP 90 ; inline +: ENOLINK 91 ; inline +: EPROTO 92 ; inline diff --git a/extra/unix/bsd/macosx/macosx.factor b/extra/unix/bsd/macosx/macosx.factor index 174dcbf632..6582d29687 100644 --- a/extra/unix/bsd/macosx/macosx.factor +++ b/extra/unix/bsd/macosx/macosx.factor @@ -25,3 +25,108 @@ C-STRUCT: passwd { "char*" "pw_shell" } { "time_t" "pw_expire" } { "int" "pw_fields" } ; + +: EPERM 1 ; inline +: ENOENT 2 ; inline +: ESRCH 3 ; inline +: EINTR 4 ; inline +: EIO 5 ; inline +: ENXIO 6 ; inline +: E2BIG 7 ; inline +: ENOEXEC 8 ; inline +: EBADF 9 ; inline +: ECHILD 10 ; inline +: EDEADLK 11 ; inline +: ENOMEM 12 ; inline +: EACCES 13 ; inline +: EFAULT 14 ; inline +: ENOTBLK 15 ; inline +: EBUSY 16 ; inline +: EEXIST 17 ; inline +: EXDEV 18 ; inline +: ENODEV 19 ; inline +: ENOTDIR 20 ; inline +: EISDIR 21 ; inline +: EINVAL 22 ; inline +: ENFILE 23 ; inline +: EMFILE 24 ; inline +: ENOTTY 25 ; inline +: ETXTBSY 26 ; inline +: EFBIG 27 ; inline +: ENOSPC 28 ; inline +: ESPIPE 29 ; inline +: EROFS 30 ; inline +: EMLINK 31 ; inline +: EPIPE 32 ; inline +: EDOM 33 ; inline +: ERANGE 34 ; inline +: EAGAIN 35 ; inline +: EWOULDBLOCK EAGAIN ; inline +: EINPROGRESS 36 ; inline +: EALREADY 37 ; inline +: ENOTSOCK 38 ; inline +: EDESTADDRREQ 39 ; inline +: EMSGSIZE 40 ; inline +: EPROTOTYPE 41 ; inline +: ENOPROTOOPT 42 ; inline +: EPROTONOSUPPORT 43 ; inline +: ESOCKTNOSUPPORT 44 ; inline +: ENOTSUP 45 ; inline +: EPFNOSUPPORT 46 ; inline +: EAFNOSUPPORT 47 ; inline +: EADDRINUSE 48 ; inline +: EADDRNOTAVAIL 49 ; inline +: ENETDOWN 50 ; inline +: ENETUNREACH 51 ; inline +: ENETRESET 52 ; inline +: ECONNABORTED 53 ; inline +: ECONNRESET 54 ; inline +: ENOBUFS 55 ; inline +: EISCONN 56 ; inline +: ENOTCONN 57 ; inline +: ESHUTDOWN 58 ; inline +: ETOOMANYREFS 59 ; inline +: ETIMEDOUT 60 ; inline +: ECONNREFUSED 61 ; inline +: ELOOP 62 ; inline +: ENAMETOOLONG 63 ; inline +: EHOSTDOWN 64 ; inline +: EHOSTUNREACH 65 ; inline +: ENOTEMPTY 66 ; inline +: EPROCLIM 67 ; inline +: EUSERS 68 ; inline +: EDQUOT 69 ; inline +: ESTALE 70 ; inline +: EREMOTE 71 ; inline +: EBADRPC 72 ; inline +: ERPCMISMATCH 73 ; inline +: EPROGUNAVAIL 74 ; inline +: EPROGMISMATCH 75 ; inline +: EPROCUNAVAIL 76 ; inline +: ENOLCK 77 ; inline +: ENOSYS 78 ; inline +: EFTYPE 79 ; inline +: EAUTH 80 ; inline +: ENEEDAUTH 81 ; inline +: EPWROFF 82 ; inline +: EDEVERR 83 ; inline +: EOVERFLOW 84 ; inline +: EBADEXEC 85 ; inline +: EBADARCH 86 ; inline +: ESHLIBVERS 87 ; inline +: EBADMACHO 88 ; inline +: ECANCELED 89 ; inline +: EIDRM 90 ; inline +: ENOMSG 91 ; inline +: EILSEQ 92 ; inline +: ENOATTR 93 ; inline +: EBADMSG 94 ; inline +: EMULTIHOP 95 ; inline +: ENODATA 96 ; inline +: ENOLINK 97 ; inline +: ENOSR 98 ; inline +: ENOSTR 99 ; inline +: EPROTO 100 ; inline +: ETIME 101 ; inline +: EOPNOTSUPP 102 ; inline +: ENOPOLICY 103 ; inline diff --git a/extra/unix/bsd/netbsd/netbsd.factor b/extra/unix/bsd/netbsd/netbsd.factor index 071daa682d..e646f87116 100644 --- a/extra/unix/bsd/netbsd/netbsd.factor +++ b/extra/unix/bsd/netbsd/netbsd.factor @@ -12,3 +12,102 @@ C-STRUCT: addrinfo { "char*" "canonname" } { "void*" "addr" } { "addrinfo*" "next" } ; + +: EPERM 1 ; inline +: ENOENT 2 ; inline +: ESRCH 3 ; inline +: EINTR 4 ; inline +: EIO 5 ; inline +: ENXIO 6 ; inline +: E2BIG 7 ; inline +: ENOEXEC 8 ; inline +: EBADF 9 ; inline +: ECHILD 10 ; inline +: EDEADLK 11 ; inline +: ENOMEM 12 ; inline +: EACCES 13 ; inline +: EFAULT 14 ; inline +: ENOTBLK 15 ; inline +: EBUSY 16 ; inline +: EEXIST 17 ; inline +: EXDEV 18 ; inline +: ENODEV 19 ; inline +: ENOTDIR 20 ; inline +: EISDIR 21 ; inline +: EINVAL 22 ; inline +: ENFILE 23 ; inline +: EMFILE 24 ; inline +: ENOTTY 25 ; inline +: ETXTBSY 26 ; inline +: EFBIG 27 ; inline +: ENOSPC 28 ; inline +: ESPIPE 29 ; inline +: EROFS 30 ; inline +: EMLINK 31 ; inline +: EPIPE 32 ; inline +: EDOM 33 ; inline +: ERANGE 34 ; inline +: EAGAIN 35 ; inline +: EWOULDBLOCK EAGAIN ; inline +: EINPROGRESS 36 ; inline +: EALREADY 37 ; inline +: ENOTSOCK 38 ; inline +: EDESTADDRREQ 39 ; inline +: EMSGSIZE 40 ; inline +: EPROTOTYPE 41 ; inline +: ENOPROTOOPT 42 ; inline +: EPROTONOSUPPORT 43 ; inline +: ESOCKTNOSUPPORT 44 ; inline +: EOPNOTSUPP 45 ; inline +: EPFNOSUPPORT 46 ; inline +: EAFNOSUPPORT 47 ; inline +: EADDRINUSE 48 ; inline +: EADDRNOTAVAIL 49 ; inline +: ENETDOWN 50 ; inline +: ENETUNREACH 51 ; inline +: ENETRESET 52 ; inline +: ECONNABORTED 53 ; inline +: ECONNRESET 54 ; inline +: ENOBUFS 55 ; inline +: EISCONN 56 ; inline +: ENOTCONN 57 ; inline +: ESHUTDOWN 58 ; inline +: ETOOMANYREFS 59 ; inline +: ETIMEDOUT 60 ; inline +: ECONNREFUSED 61 ; inline +: ELOOP 62 ; inline +: ENAMETOOLONG 63 ; inline +: EHOSTDOWN 64 ; inline +: EHOSTUNREACH 65 ; inline +: ENOTEMPTY 66 ; inline +: EPROCLIM 67 ; inline +: EUSERS 68 ; inline +: EDQUOT 69 ; inline +: ESTALE 70 ; inline +: EREMOTE 71 ; inline +: EBADRPC 72 ; inline +: ERPCMISMATCH 73 ; inline +: EPROGUNAVAIL 74 ; inline +: EPROGMISMATCH 75 ; inline +: EPROCUNAVAIL 76 ; inline +: ENOLCK 77 ; inline +: ENOSYS 78 ; inline +: EFTYPE 79 ; inline +: EAUTH 80 ; inline +: ENEEDAUTH 81 ; inline +: EIDRM 82 ; inline +: ENOMSG 83 ; inline +: EOVERFLOW 84 ; inline +: EILSEQ 85 ; inline +: ENOTSUP 86 ; inline +: ECANCELED 87 ; inline +: EBADMSG 88 ; inline +: ENODATA 89 ; inline +: ENOSR 90 ; inline +: ENOSTR 91 ; inline +: ETIME 92 ; inline +: ENOATTR 93 ; inline +: EMULTIHOP 94 ; inline +: ENOLINK 95 ; inline +: EPROTO 96 ; inline +: ELAST 96 ; inline diff --git a/extra/unix/bsd/openbsd/openbsd.factor b/extra/unix/bsd/openbsd/openbsd.factor index 29b44f7da6..31025a47e9 100644 --- a/extra/unix/bsd/openbsd/openbsd.factor +++ b/extra/unix/bsd/openbsd/openbsd.factor @@ -12,3 +12,93 @@ C-STRUCT: addrinfo { "void*" "addr" } { "char*" "canonname" } { "addrinfo*" "next" } ; + +: EPERM 1 ; inline +: ENOENT 2 ; inline +: ESRCH 3 ; inline +: EINTR 4 ; inline +: EIO 5 ; inline +: ENXIO 6 ; inline +: E2BIG 7 ; inline +: ENOEXEC 8 ; inline +: EBADF 9 ; inline +: ECHILD 10 ; inline +: EDEADLK 11 ; inline +: ENOMEM 12 ; inline +: EACCES 13 ; inline +: EFAULT 14 ; inline +: ENOTBLK 15 ; inline +: EBUSY 16 ; inline +: EEXIST 17 ; inline +: EXDEV 18 ; inline +: ENODEV 19 ; inline +: ENOTDIR 20 ; inline +: EISDIR 21 ; inline +: EINVAL 22 ; inline +: ENFILE 23 ; inline +: EMFILE 24 ; inline +: ENOTTY 25 ; inline +: ETXTBSY 26 ; inline +: EFBIG 27 ; inline +: ENOSPC 28 ; inline +: ESPIPE 29 ; inline +: EROFS 30 ; inline +: EMLINK 31 ; inline +: EPIPE 32 ; inline +: EDOM 33 ; inline +: ERANGE 34 ; inline +: EAGAIN 35 ; inline +: EWOULDBLOCK EAGAIN ; inline +: EINPROGRESS 36 ; inline +: EALREADY 37 ; inline +: ENOTSOCK 38 ; inline +: EDESTADDRREQ 39 ; inline +: EMSGSIZE 40 ; inline +: EPROTOTYPE 41 ; inline +: ENOPROTOOPT 42 ; inline +: EPROTONOSUPPORT 43 ; inline +: ESOCKTNOSUPPORT 44 ; inline +: EOPNOTSUPP 45 ; inline +: EPFNOSUPPORT 46 ; inline +: EAFNOSUPPORT 47 ; inline +: EADDRINUSE 48 ; inline +: EADDRNOTAVAIL 49 ; inline +: ENETDOWN 50 ; inline +: ENETUNREACH 51 ; inline +: ENETRESET 52 ; inline +: ECONNABORTED 53 ; inline +: ECONNRESET 54 ; inline +: ENOBUFS 55 ; inline +: EISCONN 56 ; inline +: ENOTCONN 57 ; inline +: ESHUTDOWN 58 ; inline +: ETOOMANYREFS 59 ; inline +: ETIMEDOUT 60 ; inline +: ECONNREFUSED 61 ; inline +: ELOOP 62 ; inline +: ENAMETOOLONG 63 ; inline +: EHOSTDOWN 64 ; inline +: EHOSTUNREACH 65 ; inline +: ENOTEMPTY 66 ; inline +: EPROCLIM 67 ; inline +: EUSERS 68 ; inline +: EDQUOT 69 ; inline +: ESTALE 70 ; inline +: EREMOTE 71 ; inline +: EBADRPC 72 ; inline +: ERPCMISMATCH 73 ; inline +: EPROGUNAVAIL 74 ; inline +: EPROGMISMATCH 75 ; inline +: EPROCUNAVAIL 76 ; inline +: ENOLCK 77 ; inline +: ENOSYS 78 ; inline +: EFTYPE 79 ; inline +: EAUTH 80 ; inline +: ENEEDAUTH 81 ; inline +: EIPSEC 82 ; inline +: ENOATTR 83 ; inline +: EILSEQ 84 ; inline +: ENOMEDIUM 85 ; inline +: EMEDIUMTYPE 86 ; inline +: EOVERFLOW 87 ; inline +: ECANCELED 88 ; inline diff --git a/extra/unix/linux/linux.factor b/extra/unix/linux/linux.factor index 9450663aaa..0d059d0374 100755 --- a/extra/unix/linux/linux.factor +++ b/extra/unix/linux/linux.factor @@ -59,10 +59,6 @@ C-STRUCT: sockaddr-un { "ushort" "family" } { { "char" max-un-path } "path" } ; -: EINTR HEX: 4 ; inline -: EAGAIN HEX: b ; inline -: EINPROGRESS HEX: 73 ; inline - : SOCK_STREAM 1 ; inline : SOCK_DGRAM 2 ; inline @@ -93,3 +89,101 @@ C-STRUCT: passwd { "char*" "pw_gecos" } { "char*" "pw_dir" } { "char*" "pw_shell" } ; + +: EDEADLK 35 ; inline +: ENAMETOOLONG 36 ; inline +: ENOLCK 37 ; inline +: ENOSYS 38 ; inline +: ENOTEMPTY 39 ; inline +: ELOOP 40 ; inline +: EWOULDBLOCK EAGAIN ; inline +: ENOMSG 42 ; inline +: EIDRM 43 ; inline +: ECHRNG 44 ; inline +: EL2NSYNC 45 ; inline +: EL3HLT 46 ; inline +: EL3RST 47 ; inline +: ELNRNG 48 ; inline +: EUNATCH 49 ; inline +: ENOCSI 50 ; inline +: EL2HLT 51 ; inline +: EBADE 52 ; inline +: EBADR 53 ; inline +: EXFULL 54 ; inline +: ENOANO 55 ; inline +: EBADRQC 56 ; inline +: EBADSLT 57 ; inline +: EDEADLOCK EDEADLK ; inline +: EBFONT 59 ; inline +: ENOSTR 60 ; inline +: ENODATA 61 ; inline +: ETIME 62 ; inline +: ENOSR 63 ; inline +: ENONET 64 ; inline +: ENOPKG 65 ; inline +: EREMOTE 66 ; inline +: ENOLINK 67 ; inline +: EADV 68 ; inline +: ESRMNT 69 ; inline +: ECOMM 70 ; inline +: EPROTO 71 ; inline +: EMULTIHOP 72 ; inline +: EDOTDOT 73 ; inline +: EBADMSG 74 ; inline +: EOVERFLOW 75 ; inline +: ENOTUNIQ 76 ; inline +: EBADFD 77 ; inline +: EREMCHG 78 ; inline +: ELIBACC 79 ; inline +: ELIBBAD 80 ; inline +: ELIBSCN 81 ; inline +: ELIBMAX 82 ; inline +: ELIBEXEC 83 ; inline +: EILSEQ 84 ; inline +: ERESTART 85 ; inline +: ESTRPIPE 86 ; inline +: EUSERS 87 ; inline +: ENOTSOCK 88 ; inline +: EDESTADDRREQ 89 ; inline +: EMSGSIZE 90 ; inline +: EPROTOTYPE 91 ; inline +: ENOPROTOOPT 92 ; inline +: EPROTONOSUPPORT 93 ; inline +: ESOCKTNOSUPPORT 94 ; inline +: EOPNOTSUPP 95 ; inline +: EPFNOSUPPORT 96 ; inline +: EAFNOSUPPORT 97 ; inline +: EADDRINUSE 98 ; inline +: EADDRNOTAVAIL 99 ; inline +: ENETDOWN 100 ; inline +: ENETUNREACH 101 ; inline +: ENETRESET 102 ; inline +: ECONNABORTED 103 ; inline +: ECONNRESET 104 ; inline +: ENOBUFS 105 ; inline +: EISCONN 106 ; inline +: ENOTCONN 107 ; inline +: ESHUTDOWN 108 ; inline +: ETOOMANYREFS 109 ; inline +: ETIMEDOUT 110 ; inline +: ECONNREFUSED 111 ; inline +: EHOSTDOWN 112 ; inline +: EHOSTUNREACH 113 ; inline +: EALREADY 114 ; inline +: EINPROGRESS 115 ; inline +: ESTALE 116 ; inline +: EUCLEAN 117 ; inline +: ENOTNAM 118 ; inline +: ENAVAIL 119 ; inline +: EISNAM 120 ; inline +: EREMOTEIO 121 ; inline +: EDQUOT 122 ; inline +: ENOMEDIUM 123 ; inline +: EMEDIUMTYPE 124 ; inline +: ECANCELED 125 ; inline +: ENOKEY 126 ; inline +: EKEYEXPIRED 127 ; inline +: EKEYREVOKED 128 ; inline +: EKEYREJECTED 129 ; inline +: EOWNERDEAD 130 ; inline +: ENOTRECOVERABLE 131 ; inline diff --git a/extra/unix/unix.factor b/extra/unix/unix.factor index f1f46fc184..07eb2950fa 100755 --- a/extra/unix/unix.factor +++ b/extra/unix/unix.factor @@ -5,7 +5,7 @@ USING: alien alien.c-types alien.syntax kernel libc structs sequences continuations byte-arrays strings math namespaces system combinators vocabs.loader qualified accessors inference macros locals shuffle arrays.lib - unix.types ; + unix.types debugger io prettyprint ; IN: unix @@ -23,9 +23,6 @@ TYPEDEF: uint socklen_t : MAP_FAILED -1 ; inline -: ESRCH 3 ; inline -: EEXIST 17 ; inline - : NGROUPS_MAX 16 ; inline C-STRUCT: group @@ -41,10 +38,30 @@ FUNCTION: int err_no ( ) ; LIBRARY: libc -ERROR: unix-system-call-error args message word ; - FUNCTION: char* strerror ( int errno ) ; +ERROR: unix-error errno message ; + +M: unix-error error. + "Unix system call failed:" print + nl + dup message>> write " (" write errno>> pprint ")" print ; + +: (io-error) ( -- * ) err_no dup strerror unix-error ; + +: io-error ( n -- ) 0 < [ (io-error) ] when ; + +ERROR: unix-system-call-error args errno message word ; + +M: unix-system-call-error error. + "Unix system call ``" write dup word>> pprint "'' failed:" print + nl + dup message>> write " (" write dup errno>> pprint ")" print + nl + "It was called with the following arguments:" print + nl + args>> stack. ; + MACRO:: unix-system-call ( quot -- ) [let | n [ quot infer in>> ] word [ quot first ] | @@ -52,7 +69,7 @@ MACRO:: unix-system-call ( quot -- ) n ndup quot call dup 0 < [ drop n narray - err_no strerror + err_no dup strerror word unix-system-call-error ] [ n nnip