Raymond Toy pushed to branch issue-365-add-strerror at cmucl / cmucl

Commits:

8 changed files:

Changes:

  • bin/build.sh
    ... ... @@ -129,6 +129,8 @@ buildit ()
    129 129
         if [ "$ENABLE" = "yes" ]; 
    
    130 130
         then
    
    131 131
     	$TOOLDIR/clean-target.sh $CLEAN_FLAGS $TARGET || { echo "Failed: $TOOLDIR/clean-target.sh"; exit 1; }
    
    132
    +	# Generate code/unix-errno.lisp
    
    133
    +	$MAKE -C $TARGET/lisp ../code/unix-errno.lisp
    
    132 134
     	time $BUILDWORLD $TARGET $OLDLISP $BOOT || { echo "Failed: $BUILDWORLD"; exit 1; }
    
    133 135
     	if [ "$REBUILD_LISP" = "yes" ]; then
    
    134 136
     	    $TOOLDIR/rebuild-lisp.sh $TARGET
    

  • src/code/unix.lisp
    ... ... @@ -1742,13 +1742,16 @@
    1742 1742
     
    
    1743 1743
     (defparameter *compiler-unix-errors* nil)
    
    1744 1744
     
    
    1745
    -(defmacro def-unix-error (name number description)
    
    1745
    +(defmacro def-unix-error (name number &optional description)
    
    1746
    +  "Define a constant named Name corresponding to the Unix errno value
    
    1747
    +  Number.  A description of the errno is optional in Description."
    
    1746 1748
       `(progn
    
    1747 1749
          (eval-when (compile eval)
    
    1748 1750
            (push (cons ,number ,description) *compiler-unix-errors*))
    
    1749 1751
          (defconstant ,name ,number ,description)
    
    1750 1752
          (export ',name)))
    
    1751 1753
     
    
    1754
    +#-linux
    
    1752 1755
     (defmacro emit-unix-errors ()
    
    1753 1756
       (let* ((max (apply #'max (mapcar #'car *compiler-unix-errors*)))
    
    1754 1757
     	 (array (make-array (1+ max) :initial-element nil)))
    
    ... ... @@ -1760,6 +1763,10 @@
    1760 1763
     
    
    1761 1764
     ) ;eval-when
    
    1762 1765
     
    
    1766
    +;;; For Linux, the def-unix-error forms are auto-generated and are not
    
    1767
    +;;; defined here.
    
    1768
    +#-linux
    
    1769
    +(progn
    
    1763 1770
     ;;; 
    
    1764 1771
     ;;; From <errno.h>
    
    1765 1772
     ;;; 
    
    ... ... @@ -1945,101 +1952,11 @@
    1945 1952
     (def-unix-error EINPROGRESS 150 _N"Operation now in progress")
    
    1946 1953
     (def-unix-error ESTALE 151 _N"Stale NFS file handle")
    
    1947 1954
     )
    
    1948
    -#+linux
    
    1949
    -(progn
    
    1950
    -(def-unix-error  EDEADLK         35     _N"Resource deadlock would occur")
    
    1951
    -(def-unix-error  ENAMETOOLONG    36     _N"File name too long")
    
    1952
    -(def-unix-error  ENOLCK          37     _N"No record locks available")
    
    1953
    -(def-unix-error  ENOSYS          38     _N"Function not implemented")
    
    1954
    -(def-unix-error  ENOTEMPTY       39     _N"Directory not empty")
    
    1955
    -(def-unix-error  ELOOP           40     _N"Too many symbolic links encountered")
    
    1956
    -(def-unix-error  EWOULDBLOCK     11     _N"Operation would block")
    
    1957
    -(def-unix-error  ENOMSG          42     _N"No message of desired type")
    
    1958
    -(def-unix-error  EIDRM           43     _N"Identifier removed")
    
    1959
    -(def-unix-error  ECHRNG          44     _N"Channel number out of range")
    
    1960
    -(def-unix-error  EL2NSYNC        45     _N"Level 2 not synchronized")
    
    1961
    -(def-unix-error  EL3HLT          46     _N"Level 3 halted")
    
    1962
    -(def-unix-error  EL3RST          47     _N"Level 3 reset")
    
    1963
    -(def-unix-error  ELNRNG          48     _N"Link number out of range")
    
    1964
    -(def-unix-error  EUNATCH         49     _N"Protocol driver not attached")
    
    1965
    -(def-unix-error  ENOCSI          50     _N"No CSI structure available")
    
    1966
    -(def-unix-error  EL2HLT          51     _N"Level 2 halted")
    
    1967
    -(def-unix-error  EBADE           52     _N"Invalid exchange")
    
    1968
    -(def-unix-error  EBADR           53     _N"Invalid request descriptor")
    
    1969
    -(def-unix-error  EXFULL          54     _N"Exchange full")
    
    1970
    -(def-unix-error  ENOANO          55     _N"No anode")
    
    1971
    -(def-unix-error  EBADRQC         56     _N"Invalid request code")
    
    1972
    -(def-unix-error  EBADSLT         57     _N"Invalid slot")
    
    1973
    -(def-unix-error  EDEADLOCK       EDEADLK     _N"File locking deadlock error")
    
    1974
    -(def-unix-error  EBFONT          59     _N"Bad font file format")
    
    1975
    -(def-unix-error  ENOSTR          60     _N"Device not a stream")
    
    1976
    -(def-unix-error  ENODATA         61     _N"No data available")
    
    1977
    -(def-unix-error  ETIME           62     _N"Timer expired")
    
    1978
    -(def-unix-error  ENOSR           63     _N"Out of streams resources")
    
    1979
    -(def-unix-error  ENONET          64     _N"Machine is not on the network")
    
    1980
    -(def-unix-error  ENOPKG          65     _N"Package not installed")
    
    1981
    -(def-unix-error  EREMOTE         66     _N"Object is remote")
    
    1982
    -(def-unix-error  ENOLINK         67     _N"Link has been severed")
    
    1983
    -(def-unix-error  EADV            68     _N"Advertise error")
    
    1984
    -(def-unix-error  ESRMNT          69     _N"Srmount error")
    
    1985
    -(def-unix-error  ECOMM           70     _N"Communication error on send")
    
    1986
    -(def-unix-error  EPROTO          71     _N"Protocol error")
    
    1987
    -(def-unix-error  EMULTIHOP       72     _N"Multihop attempted")
    
    1988
    -(def-unix-error  EDOTDOT         73     _N"RFS specific error")
    
    1989
    -(def-unix-error  EBADMSG         74     _N"Not a data message")
    
    1990
    -(def-unix-error  EOVERFLOW       75     _N"Value too large for defined data type")
    
    1991
    -(def-unix-error  ENOTUNIQ        76     _N"Name not unique on network")
    
    1992
    -(def-unix-error  EBADFD          77     _N"File descriptor in bad state")
    
    1993
    -(def-unix-error  EREMCHG         78     _N"Remote address changed")
    
    1994
    -(def-unix-error  ELIBACC         79     _N"Can not access a needed shared library")
    
    1995
    -(def-unix-error  ELIBBAD         80     _N"Accessing a corrupted shared library")
    
    1996
    -(def-unix-error  ELIBSCN         81     _N".lib section in a.out corrupted")
    
    1997
    -(def-unix-error  ELIBMAX         82     _N"Attempting to link in too many shared libraries")
    
    1998
    -(def-unix-error  ELIBEXEC        83     _N"Cannot exec a shared library directly")
    
    1999
    -(def-unix-error  EILSEQ          84     _N"Illegal byte sequence")
    
    2000
    -(def-unix-error  ERESTART        85     _N"Interrupted system call should be restarted _N")
    
    2001
    -(def-unix-error  ESTRPIPE        86     _N"Streams pipe error")
    
    2002
    -(def-unix-error  EUSERS          87     _N"Too many users")
    
    2003
    -(def-unix-error  ENOTSOCK        88     _N"Socket operation on non-socket")
    
    2004
    -(def-unix-error  EDESTADDRREQ    89     _N"Destination address required")
    
    2005
    -(def-unix-error  EMSGSIZE        90     _N"Message too long")
    
    2006
    -(def-unix-error  EPROTOTYPE      91     _N"Protocol wrong type for socket")
    
    2007
    -(def-unix-error  ENOPROTOOPT     92     _N"Protocol not available")
    
    2008
    -(def-unix-error  EPROTONOSUPPORT 93     _N"Protocol not supported")
    
    2009
    -(def-unix-error  ESOCKTNOSUPPORT 94     _N"Socket type not supported")
    
    2010
    -(def-unix-error  EOPNOTSUPP      95     _N"Operation not supported on transport endpoint")
    
    2011
    -(def-unix-error  EPFNOSUPPORT    96     _N"Protocol family not supported")
    
    2012
    -(def-unix-error  EAFNOSUPPORT    97     _N"Address family not supported by protocol")
    
    2013
    -(def-unix-error  EADDRINUSE      98     _N"Address already in use")
    
    2014
    -(def-unix-error  EADDRNOTAVAIL   99     _N"Cannot assign requested address")
    
    2015
    -(def-unix-error  ENETDOWN        100    _N"Network is down")
    
    2016
    -(def-unix-error  ENETUNREACH     101    _N"Network is unreachable")
    
    2017
    -(def-unix-error  ENETRESET       102    _N"Network dropped connection because of reset")
    
    2018
    -(def-unix-error  ECONNABORTED    103    _N"Software caused connection abort")
    
    2019
    -(def-unix-error  ECONNRESET      104    _N"Connection reset by peer")
    
    2020
    -(def-unix-error  ENOBUFS         105    _N"No buffer space available")
    
    2021
    -(def-unix-error  EISCONN         106    _N"Transport endpoint is already connected")
    
    2022
    -(def-unix-error  ENOTCONN        107    _N"Transport endpoint is not connected")
    
    2023
    -(def-unix-error  ESHUTDOWN       108    _N"Cannot send after transport endpoint shutdown")
    
    2024
    -(def-unix-error  ETOOMANYREFS    109    _N"Too many references: cannot splice")
    
    2025
    -(def-unix-error  ETIMEDOUT       110    _N"Connection timed out")
    
    2026
    -(def-unix-error  ECONNREFUSED    111    _N"Connection refused")
    
    2027
    -(def-unix-error  EHOSTDOWN       112    _N"Host is down")
    
    2028
    -(def-unix-error  EHOSTUNREACH    113    _N"No route to host")
    
    2029
    -(def-unix-error  EALREADY        114    _N"Operation already in progress")
    
    2030
    -(def-unix-error  EINPROGRESS     115    _N"Operation now in progress")
    
    2031
    -(def-unix-error  ESTALE          116    _N"Stale NFS file handle")
    
    2032
    -(def-unix-error  EUCLEAN         117    _N"Structure needs cleaning")
    
    2033
    -(def-unix-error  ENOTNAM         118    _N"Not a XENIX named type file")
    
    2034
    -(def-unix-error  ENAVAIL         119    _N"No XENIX semaphores available")
    
    2035
    -(def-unix-error  EISNAM          120    _N"Is a named type file")
    
    2036
    -(def-unix-error  EREMOTEIO       121    _N"Remote I/O error")
    
    2037
    -(def-unix-error  EDQUOT          122    _N"Quota exceeded")
    
    2038
    -)
    
    2039 1955
     
    
    2040 1956
     ;;;
    
    2041 1957
     ;;; And now for something completely different ...
    
    2042 1958
     (emit-unix-errors)
    
    1959
    +)
    
    2043 1960
     
    
    2044 1961
     (def-alien-routine ("os_get_errno" unix-get-errno) int)
    
    2045 1962
     (def-alien-routine ("os_set_errno" unix-set-errno) int (newvalue int))
    

  • src/lisp/Config.x86_linux
    ... ... @@ -14,3 +14,6 @@ OS_LINK_FLAGS = -m32 -rdynamic -Xlinker --export-dynamic -Xlinker -Map -Xlinker
    14 14
     OS_LINK_FLAGS += -Wl,-z,noexecstack
    
    15 15
     
    
    16 16
     EXEC_FINAL_OBJ = exec-final.o
    
    17
    +
    
    18
    +../code/unix-errno.lisp : create-errno
    
    19
    +	./create-errno /usr/include/asm-generic/errno* | uniq > $@

  • src/lisp/Config.x86_linux_clang
    ... ... @@ -19,3 +19,6 @@ OS_LINK_FLAGS = -m32 -rdynamic -Xlinker --export-dynamic -Xlinker -Map -Xlinker
    19 19
     OS_LINK_FLAGS += -Wl,-z,noexecstack
    
    20 20
     
    
    21 21
     EXEC_FINAL_OBJ = exec-final.o
    
    22
    +
    
    23
    +../code/unix-errno.lisp : create-errno
    
    24
    +	./create-errno /usr/include/asm-generic/errno* | uniq > $@

  • src/lisp/GNUmakefile
    ... ... @@ -66,9 +66,9 @@ endif
    66 66
     version:
    
    67 67
     	echo 0 > version
    
    68 68
     
    
    69
    -internals.h internals.inc:
    
    70
    -	@echo "You must run genesis to create internals.h!"
    
    71
    -	@false
    
    69
    +#internals.h internals.inc:
    
    70
    +#	@echo "You must run genesis to create internals.h!"
    
    71
    +#	@false
    
    72 72
     
    
    73 73
     clean:
    
    74 74
     	$(RM) Depends *.o lisp lisp.nm core lisp.a
    
    ... ... @@ -139,3 +139,7 @@ translations-update:
    139 139
     	  done; done
    
    140 140
     
    
    141 141
     
    
    142
    +# Compile program that creates the unix-error.lisp file.  Actual
    
    143
    +# generation of the file is OS-dependent.
    
    144
    +create-errno : create-errno.c
    
    145
    +	$(CC) -o $@ $^

  • src/lisp/create-errno.c
    1
    +#include <regex.h>
    
    2
    +#include <stdio.h>
    
    3
    +#include <stdlib.h>
    
    4
    +#include <string.h>
    
    5
    +
    
    6
    +struct Err {
    
    7
    +    char *name;
    
    8
    +    int num;
    
    9
    +#if 0
    
    10
    +    char *descr;
    
    11
    +#endif    
    
    12
    +} err[256];
    
    13
    +
    
    14
    +int nerr = 0;
    
    15
    +
    
    16
    +regex_t reg;
    
    17
    +
    
    18
    +void match(const char *line) {
    
    19
    +    regmatch_t match[3];
    
    20
    +    regoff_t len;
    
    21
    +
    
    22
    +    if (regexec(&reg, line, 3, match, 0) == REG_NOMATCH)
    
    23
    +	return;
    
    24
    +
    
    25
    +    len = match[1].rm_eo - match[1].rm_so;
    
    26
    +    err[nerr].name = malloc(len + 1);
    
    27
    +    sprintf(err[nerr].name, "%.*s", len, line + match[1].rm_so);
    
    28
    +
    
    29
    +    err[nerr].num = atoi(line + match[2].rm_so);
    
    30
    +
    
    31
    +#if 0
    
    32
    +    err[nerr].descr = strerror(err[nerr].num);
    
    33
    +#endif    
    
    34
    +
    
    35
    +    nerr++;
    
    36
    +}
    
    37
    +
    
    38
    +int cmp(const void *a, const void *b) {
    
    39
    +    return ((struct Err *)a)->num - ((struct Err *)b)->num;
    
    40
    +}
    
    41
    +
    
    42
    +int main(int argc, char **argv)
    
    43
    +{
    
    44
    +    int i;
    
    45
    +    FILE *fp;
    
    46
    +    char line[1024];
    
    47
    +
    
    48
    +    regcomp(&reg, "^#define[ \t]*(E[A-Z0-9]+)[ \t]*([0-9]+)", REG_EXTENDED);
    
    49
    +
    
    50
    +    for (i = 1; i < argc; i++) {
    
    51
    +	if ((fp = fopen(argv[i], "r")) == NULL) {
    
    52
    +	    perror("fopen");
    
    53
    +	    exit(1);
    
    54
    +	}
    
    55
    +	while (fgets(line, sizeof(line), fp) != NULL)
    
    56
    +	    match(line);
    
    57
    +	fclose(fp);
    
    58
    +    }
    
    59
    +
    
    60
    +    qsort(err, nerr, sizeof(*err), cmp);
    
    61
    +
    
    62
    +    /*
    
    63
    +     * Print out CMUCL-style file header
    
    64
    +     */
    
    65
    +    puts(";;; -*- Package: UNIX -*-\n\
    
    66
    +;;;\n\
    
    67
    +;;; **********************************************************************\n\
    
    68
    +;;; This code was written as part of the CMU Common Lisp project at\n\
    
    69
    +;;; Carnegie Mellon University, and has been placed in the public domain.\n\
    
    70
    +;;;\n\
    
    71
    +(ext:file-comment\n\
    
    72
    +  \"$Header: src/code/unix-errno.lisp $\")\n\
    
    73
    +;;;\n\
    
    74
    +;;; **********************************************************************\n\
    
    75
    +;;;\n\
    
    76
    +;;; This file contains the values of the UNIX errno values.\n\
    
    77
    +;;;\n							     \
    
    78
    +;;; DO NOT EDIT!  This is auto-generated from create-errno.\n\
    
    79
    +;;;\n");
    
    80
    +
    
    81
    +    puts("(in-package \"UNIX\")\n");
    
    82
    +    for (i = 0; i < nerr; i++) {
    
    83
    +#if 0
    
    84
    +	printf("(def-unix-error %s %d \"%s\")\n", err[i].name, err[i].num, err[i].descr);
    
    85
    +#else	
    
    86
    +	printf("(def-unix-error %s %d)\n", err[i].name, err[i].num);
    
    87
    +#endif	
    
    88
    +    }
    
    89
    +
    
    90
    +    return 0;
    
    91
    +}

  • src/tools/worldbuild.lisp
    ... ... @@ -136,6 +136,10 @@
    136 136
         "target:code/c-call"
    
    137 137
         "target:code/sap"
    
    138 138
         "target:code/unix"
    
    139
    +    ,@(when (or (c:backend-featurep :linux))
    
    140
    +	;; This is currently only available for some OSes.  Ideally,
    
    141
    +	;; it should be available for all OSes.
    
    142
    +	"target:code/unix-errno")
    
    139 143
         ,@(when (c:backend-featurep :mach)
    
    140 144
     	'("target:code/mach"
    
    141 145
     	  "target:code/mach-os"))
    

  • src/tools/worldcom.lisp
    ... ... @@ -163,6 +163,10 @@
    163 163
     (comf "target:code/mipsstrops")
    
    164 164
     
    
    165 165
     (comf "target:code/unix" :proceed t)
    
    166
    +(when (or (c:backend-featurep :linux))
    
    167
    +  ;; This is currently only available for some OSes.  Ideally, it
    
    168
    +  ;; should be available for all OSes.
    
    169
    +  (comf "target:code/unix-errno" :proceed t))
    
    166 170
     
    
    167 171
     (when (c:backend-featurep :mach)
    
    168 172
       (comf "target:code/mach")