shithub: scc

Download patch

ref: a4bb45eb606a3d28d405f37d029a86327d136586
parent: 50b61aefb480b94a4a4dd69c6ffb05addc2912a3
author: Roberto E. Vargas Caballero <[email protected]>
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(/\*\//, "")
+	print
+}' /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[];