ref: a4bb45eb606a3d28d405f37d029a86327d136586
parent: 50b61aefb480b94a4a4dd69c6ffb05addc2912a3
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sun Sep 2 10:03:09 EDT 2018
[lib/c] Add actual system errno codes
--- /dev/null
+++ b/lib/c/target/.gitignore
@@ -1,0 +1,1 @@
+_sys_errlist.c
--- a/lib/c/target/amd64-sysv-linux/Makefile
+++ b/lib/c/target/amd64-sysv-linux/Makefile
@@ -3,9 +3,12 @@
PROJECTDIR = ../../../..
include $(PROJECTDIR)/rules.mk
-SYSNAME = amd64-sysv-linux
-SCC_CFLAGS = -static -nostdinc -I$(INCDIR) -I$(INCDIR)/bits/amd64-sysv/ -I.
-SYSOBJ = raise.o signal.o
+SYS = linux
+ARCH = amd64
+ABI = sysv
+SYSOBJ = raise.o signal.o
+SYSERRTBL = ../posix/linux.e
+MORECFLAGS = -g -static -nostdinc
include syscall.mk
include ../script/objlst.mk
--- a/lib/c/target/amd64-sysv-netbsd/Makefile
+++ b/lib/c/target/amd64-sysv-netbsd/Makefile
@@ -3,9 +3,12 @@
PROJECTDIR = ../../../..
include $(PROJECTDIR)/rules.mk
-SYSNAME = amd64-sysv-netbsd
-SCC_CFLAGS = -g -static -nostdinc -I$(INCDIR) -I$(INCDIR)/bits/amd64-sysv/ -I.
-SYSOBJ = raise.o signal.o _sigaction.o _sigaction2.o _setcontext.o
+SYS = netbsd
+ARCH = amd64
+ABI = sysv
+SYSOBJ = raise.o signal.o _sigaction.o _sigaction2.o _setcontext.o
+SYSERRTBL = ../posix/netbsd.e
+MORECFLAGS = -g -static -nostdinc
include syscall.mk
include ../script/objlst.mk
--- a/lib/c/target/amd64-sysv-openbsd/Makefile
+++ b/lib/c/target/amd64-sysv-openbsd/Makefile
@@ -3,9 +3,12 @@
PROJECTDIR = ../../../..
include $(PROJECTDIR)/rules.mk
-SYSNAME = amd64-sysv-openbsd
-SCC_CFLAGS = -g -nopie -fno-stack-protector -static -nostdinc -I$(INCDIR) -I$(INCDIR)/bits/amd64-sysv/ -I.
+SYS = openbsd
+ARCH = amd64
+ABI = sysv
SYSOBJ = raise.o signal.o _sigaction.o
+SYSERRTBL = ../posix/netbsd.e
+MORECFLAGS = -g -static -nostdinc
include syscall.mk
include ../script/objlst.mk
--- /dev/null
+++ b/lib/c/target/posix/geterrno.sh
@@ -1,0 +1,8 @@
+#!/bin/sh
+
+awk '/define[ ]*E/ && $3 ~ /[0-9]+/ && $3 > 0 {
+ sub(/\#define[ ]*/, "")
+ sub(/\/\*/, "")
+ sub(/\*\//, "")
+}' /usr/include/sys/errno.h
--- /dev/null
+++ b/lib/c/target/posix/linux.e
@@ -1,0 +1,131 @@
+EPERM 1 Operation not permitted
+ENOENT 2 No such file or directory
+ESRCH 3 No such process
+EINTR 4 Interrupted system call
+EIO 5 I/O error
+ENXIO 6 No such device or address
+E2BIG 7 Argument list too long
+ENOEXEC 8 Exec format error
+EBADF 9 Bad file number
+ECHILD 10 No child processes
+EAGAIN 11 Try again
+ENOMEM 12 Out of memory
+EACCES 13 Permission denied
+EFAULT 14 Bad address
+ENOTBLK 15 Block device required
+EBUSY 16 Device or resource busy
+EEXIST 17 File exists
+EXDEV 18 Cross-device link
+ENODEV 19 No such device
+ENOTDIR 20 Not a directory
+EISDIR 21 Is a directory
+EINVAL 22 Invalid argument
+ENFILE 23 File table overflow
+EMFILE 24 Too many open files
+ENOTTY 25 Not a typewriter
+ETXTBSY 26 Text file busy
+EFBIG 27 File too large
+ENOSPC 28 No space left on device
+ESPIPE 29 Illegal seek
+EROFS 30 Read-only file system
+EMLINK 31 Too many links
+EPIPE 32 Broken pipe
+EDOM 33 Math argument out of domain of func
+ERANGE 34 Math result not representable
+EDEADLK 35 Resource deadlock would occur
+ENAMETOOLONG 36 File name too long
+ENOLCK 37 No record locks available
+ENOSYS 38 Invalid system call number
+ENOTEMPTY 39 Directory not empty
+ELOOP 40 Too many symbolic links encountered
+ENOMSG 42 No message of desired type
+EIDRM 43 Identifier removed
+ECHRNG 44 Channel number out of range
+EL2NSYNC 45 Level 2 not synchronized
+EL3HLT 46 Level 3 halted
+EL3RST 47 Level 3 reset
+ELNRNG 48 Link number out of range
+EUNATCH 49 Protocol driver not attached
+ENOCSI 50 No CSI structure available
+EL2HLT 51 Level 2 halted
+EBADE 52 Invalid exchange
+EBADR 53 Invalid request descriptor
+EXFULL 54 Exchange full
+ENOANO 55 No anode
+EBADRQC 56 Invalid request code
+EBADSLT 57 Invalid slot
+EBFONT 59 Bad font file format
+ENOSTR 60 Device not a stream
+ENODATA 61 No data available
+ETIME 62 Timer expired
+ENOSR 63 Out of streams resources
+ENONET 64 Machine is not on the network
+ENOPKG 65 Package not installed
+EREMOTE 66 Object is remote
+ENOLINK 67 Link has been severed
+EADV 68 Advertise error
+ESRMNT 69 Srmount error
+ECOMM 70 Communication error on send
+EPROTO 71 Protocol error
+EMULTIHOP 72 Multihop attempted
+EDOTDOT 73 RFS specific error
+EBADMSG 74 Not a data message
+EOVERFLOW 75 Value too large for defined data type
+ENOTUNIQ 76 Name not unique on network
+EBADFD 77 File descriptor in bad state
+EREMCHG 78 Remote address changed
+ELIBACC 79 Can not access a needed shared library
+ELIBBAD 80 Accessing a corrupted shared library
+ELIBSCN 81 .lib section in a.out corrupted
+ELIBMAX 82 Attempting to link in too many shared libraries
+ELIBEXEC 83 Cannot exec a shared library directly
+EILSEQ 84 Illegal byte sequence
+ERESTART 85 Interrupted system call should be restarted
+ESTRPIPE 86 Streams pipe error
+EUSERS 87 Too many users
+ENOTSOCK 88 Socket operation on non-socket
+EDESTADDRREQ 89 Destination address required
+EMSGSIZE 90 Message too long
+EPROTOTYPE 91 Protocol wrong type for socket
+ENOPROTOOPT 92 Protocol not available
+EPROTONOSUPPORT 93 Protocol not supported
+ESOCKTNOSUPPORT 94 Socket type not supported
+EOPNOTSUPP 95 Operation not supported on transport endpoint
+EPFNOSUPPORT 96 Protocol family not supported
+EAFNOSUPPORT 97 Address family not supported by protocol
+EADDRINUSE 98 Address already in use
+EADDRNOTAVAIL 99 Cannot assign requested address
+ENETDOWN 100 Network is down
+ENETUNREACH 101 Network is unreachable
+ENETRESET 102 Network dropped connection because of reset
+ECONNABORTED 103 Software caused connection abort
+ECONNRESET 104 Connection reset by peer
+ENOBUFS 105 No buffer space available
+EISCONN 106 Transport endpoint is already connected
+ENOTCONN 107 Transport endpoint is not connected
+ESHUTDOWN 108 Cannot send after transport endpoint shutdown
+ETOOMANYREFS 109 Too many references: cannot splice
+ETIMEDOUT 110 Connection timed out
+ECONNREFUSED 111 Connection refused
+EHOSTDOWN 112 Host is down
+EHOSTUNREACH 113 No route to host
+EALREADY 114 Operation already in progress
+EINPROGRESS 115 Operation now in progress
+ESTALE 116 Stale file handle
+EUCLEAN 117 Structure needs cleaning
+ENOTNAM 118 Not a XENIX named type file
+ENAVAIL 119 No XENIX semaphores available
+EISNAM 120 Is a named type file
+EREMOTEIO 121 Remote I/O error
+EDQUOT 122 Quota exceeded
+ENOMEDIUM 123 No medium found
+EMEDIUMTYPE 124 Wrong medium type
+ECANCELED 125 Operation Canceled
+ENOKEY 126 Required key not available
+EKEYEXPIRED 127 Key has expired
+EKEYREVOKED 128 Key has been revoked
+EKEYREJECTED 129 Key was rejected by service
+EOWNERDEAD 130 Owner died
+ENOTRECOVERABLE 131 State not recoverable
+ERFKILL 132 Operation not possible due to RF-kill
+EHWPOISON 133 Memory page has hardware error
--- /dev/null
+++ b/lib/c/target/posix/netbsd.e
@@ -1,0 +1,98 @@
+EPERM 1 Operation not permitted
+ENOENT 2 No such file or directory
+ESRCH 3 No such process
+EINTR 4 Interrupted system call
+EIO 5 Input/output error
+ENXIO 6 Device not configured
+E2BIG 7 Argument list too long
+ENOEXEC 8 Exec format error
+EBADF 9 Bad file descriptor
+ECHILD 10 No child processes
+EDEADLK 11 Resource deadlock avoided
+ENOMEM 12 Cannot allocate memory
+EACCES 13 Permission denied
+EFAULT 14 Bad address
+ENOTBLK 15 Block device required
+EBUSY 16 Device busy
+EEXIST 17 File exists
+EXDEV 18 Cross-device link
+ENODEV 19 Operation not supported by device
+ENOTDIR 20 Not a directory
+EISDIR 21 Is a directory
+EINVAL 22 Invalid argument
+ENFILE 23 Too many open files in system
+EMFILE 24 Too many open files
+ENOTTY 25 Inappropriate ioctl for device
+ETXTBSY 26 Text file busy
+EFBIG 27 File too large
+ENOSPC 28 No space left on device
+ESPIPE 29 Illegal seek
+EROFS 30 Read-only file system
+EMLINK 31 Too many links
+EPIPE 32 Broken pipe
+EDOM 33 Numerical argument out of domain
+ERANGE 34 Result too large or too small
+EAGAIN 35 Resource temporarily unavailable
+EWOULDBLOCK EAGAIN Operation would block
+EINPROGRESS 36 Operation now in progress
+EALREADY 37 Operation already in progress
+ENOTSOCK 38 Socket operation on non-socket
+EDESTADDRREQ 39 Destination address required
+EMSGSIZE 40 Message too long
+EPROTOTYPE 41 Protocol wrong type for socket
+ENOPROTOOPT 42 Protocol option not available
+EPROTONOSUPPORT 43 Protocol not supported
+ESOCKTNOSUPPORT 44 Socket type not supported
+EOPNOTSUPP 45 Operation not supported
+EPFNOSUPPORT 46 Protocol family not supported
+EAFNOSUPPORT 47 Address family not supported by protocol family
+EADDRINUSE 48 Address already in use
+EADDRNOTAVAIL 49 Can't assign requested address
+ENETDOWN 50 Network is down
+ENETUNREACH 51 Network is unreachable
+ENETRESET 52 Network dropped connection on reset
+ECONNABORTED 53 Software caused connection abort
+ECONNRESET 54 Connection reset by peer
+ENOBUFS 55 No buffer space available
+EISCONN 56 Socket is already connected
+ENOTCONN 57 Socket is not connected
+ESHUTDOWN 58 Can't send after socket shutdown
+ETOOMANYREFS 59 Too many references: can't splice
+ETIMEDOUT 60 Operation timed out
+ECONNREFUSED 61 Connection refused
+ELOOP 62 Too many levels of symbolic links
+ENAMETOOLONG 63 File name too long
+EHOSTDOWN 64 Host is down
+EHOSTUNREACH 65 No route to host
+ENOTEMPTY 66 Directory not empty
+EPROCLIM 67 Too many processes
+EUSERS 68 Too many users
+EDQUOT 69 Disc quota exceeded
+ESTALE 70 Stale NFS file handle
+EREMOTE 71 Too many levels of remote in path
+EBADRPC 72 RPC struct is bad
+ERPCMISMATCH 73 RPC version wrong
+EPROGUNAVAIL 74 RPC prog. not avail
+EPROGMISMATCH 75 Program version wrong
+EPROCUNAVAIL 76 Bad procedure for program
+ENOLCK 77 No locks available
+ENOSYS 78 Function not implemented
+EFTYPE 79 Inappropriate file type or format
+EAUTH 80 Authentication error
+ENEEDAUTH 81 Need authenticator
+EIDRM 82 Identifier removed
+ENOMSG 83 No message of desired type
+EOVERFLOW 84 Value too large to be stored in data type
+EILSEQ 85 Illegal byte sequence
+ENOTSUP 86 Not supported
+ECANCELED 87 Operation canceled
+EBADMSG 88 Bad or Corrupt message
+ENODATA 89 No message available
+ENOSR 90 No STREAM resources
+ENOSTR 91 Not a STREAM
+ETIME 92 STREAM ioctl timeout
+ENOATTR 93 Attribute not found
+EMULTIHOP 94 Multihop attempted
+ENOLINK 95 Link has been severed
+EPROTO 96 Protocol error
+ELAST 96 Must equal largest errno
--- /dev/null
+++ b/lib/c/target/posix/openbsd.e
@@ -1,0 +1,96 @@
+EPERM 1 Operation not permitted
+ENOENT 2 No such file or directory
+ESRCH 3 No such process
+EINTR 4 Interrupted system call
+EIO 5 Input/output error
+ENXIO 6 Device not configured
+E2BIG 7 Argument list too long
+ENOEXEC 8 Exec format error
+EBADF 9 Bad file descriptor
+ECHILD 10 No child processes
+EDEADLK 11 Resource deadlock avoided
+ENOMEM 12 Cannot allocate memory
+EACCES 13 Permission denied
+EFAULT 14 Bad address
+ENOTBLK 15 Block device required
+EBUSY 16 Device busy
+EEXIST 17 File exists
+EXDEV 18 Cross-device link
+ENODEV 19 Operation not supported by device
+ENOTDIR 20 Not a directory
+EISDIR 21 Is a directory
+EINVAL 22 Invalid argument
+ENFILE 23 Too many open files in system
+EMFILE 24 Too many open files
+ENOTTY 25 Inappropriate ioctl for device
+ETXTBSY 26 Text file busy
+EFBIG 27 File too large
+ENOSPC 28 No space left on device
+ESPIPE 29 Illegal seek
+EROFS 30 Read-only file system
+EMLINK 31 Too many links
+EPIPE 32 Broken pipe
+EDOM 33 Numerical argument out of domain
+ERANGE 34 Result too large
+EAGAIN 35 Resource temporarily unavailable
+EINPROGRESS 36 Operation now in progress
+EALREADY 37 Operation already in progress
+ENOTSOCK 38 Socket operation on non-socket
+EDESTADDRREQ 39 Destination address required
+EMSGSIZE 40 Message too long
+EPROTOTYPE 41 Protocol wrong type for socket
+ENOPROTOOPT 42 Protocol not available
+EPROTONOSUPPORT 43 Protocol not supported
+ESOCKTNOSUPPORT 44 Socket type not supported
+EOPNOTSUPP 45 Operation not supported
+EPFNOSUPPORT 46 Protocol family not supported
+EAFNOSUPPORT 47 Address family not supported by protocol family
+EADDRINUSE 48 Address already in use
+EADDRNOTAVAIL 49 Can't assign requested address
+ENETDOWN 50 Network is down
+ENETUNREACH 51 Network is unreachable
+ENETRESET 52 Network dropped connection on reset
+ECONNABORTED 53 Software caused connection abort
+ECONNRESET 54 Connection reset by peer
+ENOBUFS 55 No buffer space available
+EISCONN 56 Socket is already connected
+ENOTCONN 57 Socket is not connected
+ESHUTDOWN 58 Can't send after socket shutdown
+ETOOMANYREFS 59 Too many references: can't splice
+ETIMEDOUT 60 Operation timed out
+ECONNREFUSED 61 Connection refused
+ELOOP 62 Too many levels of symbolic links
+ENAMETOOLONG 63 File name too long
+EHOSTDOWN 64 Host is down
+EHOSTUNREACH 65 No route to host
+ENOTEMPTY 66 Directory not empty
+EPROCLIM 67 Too many processes
+EUSERS 68 Too many users
+EDQUOT 69 Disk quota exceeded
+ESTALE 70 Stale NFS file handle
+EREMOTE 71 Too many levels of remote in path
+EBADRPC 72 RPC struct is bad
+ERPCMISMATCH 73 RPC version wrong
+EPROGUNAVAIL 74 RPC program not available
+EPROGMISMATCH 75 Program version wrong
+EPROCUNAVAIL 76 Bad procedure for program
+ENOLCK 77 No locks available
+ENOSYS 78 Function not implemented
+EFTYPE 79 Inappropriate file type or format
+EAUTH 80 Authentication error
+ENEEDAUTH 81 Need authenticator
+EIPSEC 82 IPsec processing failure
+ENOATTR 83 Attribute not found
+EILSEQ 84 Illegal byte sequence
+ENOMEDIUM 85 No medium found
+EMEDIUMTYPE 86 Wrong medium type
+EOVERFLOW 87 Value too large to be stored in data type
+ECANCELED 88 Operation canceled
+EIDRM 89 Identifier removed
+ENOMSG 90 No message of desired type
+ENOTSUP 91 Not supported
+EBADMSG 92 Bad message
+ENOTRECOVERABLE 93 State not recoverable
+EOWNERDEAD 94 Previous owner died
+EPROTO 95 Protocol error
+ELAST 95 Must be equal largest errno
--- a/lib/c/target/script/common.mk
+++ b/lib/c/target/script/common.mk
@@ -1,14 +1,33 @@
-SYSASM = $(SYSCALL:.o=.s)
-TARGET = $(LIBDIR)/$(SYSNAME)/libc.a
+SYSNAME = $(ARCH)-$(ABI)-$(SYS)
+SYSASM = $(SYSCALL:.o=.s)
+TARGET = $(LIBDIR)/$(SYSNAME)/libc.a
+INCLUDE = -I$(INCDIR) \
+ -I$(INCDIR)/bits/$(ARCH)-$(ABI) \
+ -I$(INCDIR)/bits/$(SYS) \
+ -I.
+SYSERRNO = $(INCDIR)/bits/$(SYS)/sys/errno.h
+OBJ = $(LIBOBJ) $(SYSOBJ) $(SYSCALL)
+SCC_CFLAGS = $(MORECFLAGS) $(INCLUDE)
+
all: $(TARGET)
-$(TARGET): $(LIBOBJ) $(SYSOBJ) $(SYSCALL)
+$(OBJ): $(SYSERRNO)
+
+$(SYSERRNO): $(SYSERRTBL)
+ trap "rm -f $$$$.tmp" 0 2 3 4; \
+ ../script/generrno.sh $(SYSERRTBL) > $$$$.tmp && mv $$$$.tmp $@
+
+_sys_errlist.c: $(SYSERRTBL) $(SYSERRNO)
+ trap "rm -f $$$$.tmp" 0 2 3 4; \
+ ../script/generrstr.sh $(SYSERRTBL) > $$$$.tmp && mv $$$$.tmp $@
+
+$(TARGET): $(OBJ)
$(AR) $(ARFLAGS) $@ $?
ranlib $@
clean:
- rm -f *.o *.a
+ rm -f *.o *.a _sys_errlist.c $(SYSERRNO)
rm -f $(SYSASM)
rm -f $(TARGET)
--- /dev/null
+++ b/lib/c/target/script/generrno.sh
@@ -1,0 +1,12 @@
+#!/bin/sh
+
+awk '
+/^E/ && $2 > 0 {
+ errno[$1] = $2
+}
+
+END {
+ for (i in errno)
+ print "#define", i, errno[i] | "sort -n -k3"
+ close "sort -n -k3"
+}' $@
--- /dev/null
+++ b/lib/c/target/script/generrstr.sh
@@ -1,0 +1,21 @@
+#!/bin/sh
+
+awk '
+/^E/ && $2 > 0 {
+ str = ""
+ for (i = 3; i <= NF; i++)
+ str = str " " $i
+ sub(/^ /, "", str)
+ errstr[$1] = str
+ if ($2 > max)
+ max = $2;
+}
+
+END {
+ print "#include <errno.h>\n"
+ print "char *_sys_errstr[] = {"
+ for (i in errstr)
+ printf "\t%-20.20s = \"%s\",\n", "[" i "]", errstr[i]
+ print "};"
+ print "int _sys_nerr =", $2 + 1 ";"
+}' $@
--- a/lib/c/target/script/objlst.mk
+++ b/lib/c/target/script/objlst.mk
@@ -20,7 +20,7 @@
isgraph.o islower.o isprint.o ispunct.o isspace.o isupper.o \
isxdigit.o toupper.o tolower.o ctype.o setlocale.o \
localeconv.o atoi.o atol.o atoll.o atexit.o abort.o exit.o \
- errno.o strnlen.o wcsnlen.o
+ errno.o _sys_errlist.o strnlen.o wcsnlen.o
#rules
__abs.o: ../../__abs.c
--- /dev/null
+++ b/rootdir/include/scc/bits/.gitignore
@@ -1,0 +1,1 @@
+errno.h
--- /dev/null
+++ b/rootdir/include/scc/bits/linux/sys/README
@@ -1,0 +1,1 @@
+This is a placeholder for VCS
--- /dev/null
+++ b/rootdir/include/scc/bits/netbsd/sys/README
@@ -1,0 +1,1 @@
+This is a placeholder for VCS
--- /dev/null
+++ b/rootdir/include/scc/bits/openbsd/sys/README
@@ -1,0 +1,1 @@
+This is a placeholder for VCS
--- a/rootdir/include/scc/errno.h
+++ b/rootdir/include/scc/errno.h
@@ -1,12 +1,7 @@
#ifndef _ERRNO_H
#define _ERRNO_H
-#define EDOM 1
-#define EILSEQ 2
-#define ERANGE 3
-#define ENOMEM 4
-#define EBADF 5
-#define EINVAL 6
+#include <sys/errno.h>
extern int errno;
extern char *_sys_errlist[];