Fixes glibc's errno strings (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 27 Feb 2013 20:53:05 +0000 (12:53 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 27 Feb 2013 20:53:05 +0000 (12:53 -0800)
Whenever you change ros/errno.h, you need to rerun the script and
rebuild the glibc.

Rebuild glibc if you want to get proper error messages from calls like
perror().

kern/include/ros/errno.h
scripts/make_errlist.sh [new file with mode: 0755]
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/errlist.c

index 6bda045..4f3b6b3 100644 (file)
@@ -1,19 +1,23 @@
 #ifndef _ROS_ERRNO_H
 #define _ROS_ERRNO_H
 
+/* If you edit this file, be careful of tabs vs spaces.  This is processed by
+ * scripts/make_errlist.c, which you need to run if you want glibc strerrno() to
+ * know about your changes. */
+
 // See below for the rest of the new error codes for ROS
-#define ESUCCESS        0  /* Success */
+#define        ESUCCESS        0       /* Success */
 
 // For compatibility with POSIX
-#define        EPERM            1      /* Operation not permitted */
-#define        ENOENT           2      /* No such file or directory */
-#define        ESRCH            3      /* No such process */
-#define        EINTR            4      /* Interrupted system call */
-#define        EIO              5      /* I/O error */
-#define        ENXIO            6      /* No such device or address */
-#define        E2BIG            7      /* Argument list too long */
-#define        ENOEXEC          8      /* Exec format error */
-#define        EBADF            9      /* Bad file number */
+#define        EPERM                 /* Operation not permitted */
+#define        ENOENT                /* No such file or directory */
+#define        ESRCH                 /* No such process */
+#define        EINTR                 /* Interrupted system call */
+#define        EIO                     5       /* I/O error */
+#define        ENXIO                 /* No such device or address */
+#define        E2BIG                 /* Argument list too long */
+#define        ENOEXEC               /* Exec format error */
+#define        EBADF                 /* Bad file number */
 #define        ECHILD          10      /* No child processes */
 #define        EAGAIN          11      /* Try again */
 #define        ENOMEM          12      /* Out of memory */
 #define        EPROTONOSUPPORT 93      /* Protocol not supported */
 #define        ESOCKTNOSUPPORT 94      /* Socket type not supported */
 #define        EOPNOTSUPP      95      /* Operation not supported on transport endpoint */
-#define ENOTSUP                EOPNOTSUPP
+#define        ENOTSUP         EOPNOTSUPP
 #define        EPFNOSUPPORT    96      /* Protocol family not supported */
 #define        EAFNOSUPPORT    97      /* Address family not supported by protocol */
 #define        EADDRINUSE      98      /* Address already in use */
 #define        EOWNERDEAD      130     /* Owner died */
 #define        ENOTRECOVERABLE 131     /* State not recoverable */
 
-// New with ROS
-#define EFAIL                  132 /* Generic Failure */
-#define ENOCACHE               133 /* No memory available */
-#define ENOFREEPID             135 /* No free pid */
-#define EUNSPECIFIED   136 /* Unspecified */
-#define EMORON                 137 /* Moron */
+/* Old half-assed ROS erronos */
+#define        EFAIL                   132     /* Generic Failure */
+#define        ENOCACHE                133     /* No memory available */
+#define        ENOFREEPID              135     /* No free pid */
+#define        EUNSPECIFIED    136     /* Unspecified */
+#define        EMORON                  137     /* Moron */
 
 #endif
diff --git a/scripts/make_errlist.sh b/scripts/make_errlist.sh
new file mode 100755 (executable)
index 0000000..6acf0e0
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+ERRLIST="tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/errlist.c"
+ERRNO_FILE="kern/include/ros/errno.h"
+
+echo "// This was automatically generated with make_errlist.sh, do not edit" > $ERRLIST
+echo ""                                   >> $ERRLIST
+echo "#include <stddef.h>"                >> $ERRLIST
+echo ""                                   >> $ERRLIST
+echo "const char *const _sys_errlist[] =" >> $ERRLIST
+echo "{"                                  >> $ERRLIST
+
+# here's the guts of it.  Get the #define E's, compress the extra tabs, cut to
+# get from the numbers to the end, remove the aliases (number is EWHATEVER),
+# then awk it.  The awk script does some fancy formatting.  NF is the number of
+# items on the line.  The last item on the line is */, which we never print.
+# The second to last is printed without a trailing space.
+
+grep "^#define\sE" $ERRNO_FILE | sed 's/\t\+/\t/g' | cut -f 3- | grep -v "^E" | awk '{printf "\t[ %s ] = \"", $1; for (i=3; i<NF-1; i++) printf "%s ", $i; printf "%s", $(NF-1); printf "\",\n"}' >> $ERRLIST
+
+echo "};"                                 >> $ERRLIST
+echo ""                                   >> $ERRLIST
+echo "const int _sys_nerr = sizeof (_sys_errlist) / sizeof (_sys_errlist[0]);" >> $ERRLIST
+echo ""                                   >> $ERRLIST
+echo "strong_alias(_sys_errlist,_sys_errlist_internal);"                       >> $ERRLIST
+echo "strong_alias(_sys_nerr,_sys_nerr_internal);"                             >> $ERRLIST
index 0ff7b04..124232f 100644 (file)
-/* Copyright (C) 1991, 1994, 1997, 2005 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+// This was automatically generated with make_errlist.sh, do not edit
 
 #include <stddef.h>
 
-
 const char *const _sys_errlist[] =
-  {
-    "Error 0",                 /* 0 */
-    "Argument out of function's domain", /* 1 = EDOM */
-    "Result out of range",     /* 2 = ERANGE */
-    "Operation not implemented", /* 3 = ENOSYS */
-    "Invalid argument",                /* 4 = EINVAL */
-    "Illegal seek",            /* 5 = ESPIPE */
-    "Bad file descriptor",     /* 6 = EBADF */
-    "Cannot allocate memory",  /* 7 = ENOMEM */
-    "Permission denied",       /* 8 = EACCES */
-    "Too many open files in system", /* 9 = ENFILE */
-    "Too many open files",     /* 10 = EMFILE */
-  };
+{
+       [ 0 ] = "Success",
+       [ 1 ] = "Operation not permitted",
+       [ 2 ] = "No such file or directory",
+       [ 3 ] = "No such process",
+       [ 4 ] = "Interrupted system call",
+       [ 5 ] = "I/O error",
+       [ 6 ] = "No such device or address",
+       [ 7 ] = "Argument list too long",
+       [ 8 ] = "Exec format error",
+       [ 9 ] = "Bad file number",
+       [ 10 ] = "No child processes",
+       [ 11 ] = "Try again",
+       [ 12 ] = "Out of memory",
+       [ 13 ] = "Permission denied",
+       [ 14 ] = "Bad address",
+       [ 15 ] = "Block device required",
+       [ 16 ] = "Device or resource busy",
+       [ 17 ] = "File exists",
+       [ 18 ] = "Cross-device link",
+       [ 19 ] = "No such device",
+       [ 20 ] = "Not a directory",
+       [ 21 ] = "Is a directory",
+       [ 22 ] = "Invalid argument",
+       [ 23 ] = "File table overflow",
+       [ 24 ] = "Too many open files",
+       [ 25 ] = "Not a typewriter",
+       [ 26 ] = "Text file busy",
+       [ 27 ] = "File too large",
+       [ 28 ] = "No space left on device",
+       [ 29 ] = "Illegal seek",
+       [ 30 ] = "Read-only file system",
+       [ 31 ] = "Too many links",
+       [ 32 ] = "Broken pipe",
+       [ 33 ] = "Math argument out of domain of func",
+       [ 34 ] = "Math result not representable",
+       [ 35 ] = "Resource deadlock would occur",
+       [ 36 ] = "File name too long",
+       [ 37 ] = "No record locks available",
+       [ 38 ] = "Function not implemented",
+       [ 39 ] = "Directory not empty",
+       [ 40 ] = "Too many symbolic links encountered",
+       [ 42 ] = "No message of desired type",
+       [ 43 ] = "Identifier removed",
+       [ 44 ] = "Channel number out of range",
+       [ 45 ] = "Level 2 not synchronized",
+       [ 46 ] = "Level 3 halted",
+       [ 47 ] = "Level 3 reset",
+       [ 48 ] = "Link number out of range",
+       [ 49 ] = "Protocol driver not attached",
+       [ 50 ] = "No CSI structure available",
+       [ 51 ] = "Level 2 halted",
+       [ 52 ] = "Invalid exchange",
+       [ 53 ] = "Invalid request descriptor",
+       [ 54 ] = "Exchange full",
+       [ 55 ] = "No anode",
+       [ 56 ] = "Invalid request code",
+       [ 57 ] = "Invalid slot",
+       [ 59 ] = "Bad font file format",
+       [ 60 ] = "Device not a stream",
+       [ 61 ] = "No data available",
+       [ 62 ] = "Timer expired",
+       [ 63 ] = "Out of streams resources",
+       [ 64 ] = "Machine is not on the network",
+       [ 65 ] = "Package not installed",
+       [ 66 ] = "Object is remote",
+       [ 67 ] = "Link has been severed",
+       [ 68 ] = "Advertise error",
+       [ 69 ] = "Srmount error",
+       [ 70 ] = "Communication error on send",
+       [ 71 ] = "Protocol error",
+       [ 72 ] = "Multihop attempted",
+       [ 73 ] = "RFS specific error",
+       [ 74 ] = "Not a data message",
+       [ 75 ] = "Value too large for defined data type",
+       [ 76 ] = "Name not unique on network",
+       [ 77 ] = "File descriptor in bad state",
+       [ 78 ] = "Remote address changed",
+       [ 79 ] = "Can not access a needed shared library",
+       [ 80 ] = "Accessing a corrupted shared library",
+       [ 81 ] = ".lib section in a.out corrupted",
+       [ 82 ] = "Attempting to link in too many shared libraries",
+       [ 83 ] = "Cannot exec a shared library directly",
+       [ 84 ] = "Illegal byte sequence",
+       [ 85 ] = "Interrupted system call should be restarted",
+       [ 86 ] = "Streams pipe error",
+       [ 87 ] = "Too many users",
+       [ 88 ] = "Socket operation on non-socket",
+       [ 89 ] = "Destination address required",
+       [ 90 ] = "Message too long",
+       [ 91 ] = "Protocol wrong type for socket",
+       [ 92 ] = "Protocol not available",
+       [ 93 ] = "Protocol not supported",
+       [ 94 ] = "Socket type not supported",
+       [ 95 ] = "Operation not supported on transport endpoint",
+       [ 96 ] = "Protocol family not supported",
+       [ 97 ] = "Address family not supported by protocol",
+       [ 98 ] = "Address already in use",
+       [ 99 ] = "Cannot assign requested address",
+       [ 100 ] = "Network is down",
+       [ 101 ] = "Network is unreachable",
+       [ 102 ] = "Network dropped connection because of reset",
+       [ 103 ] = "Software caused connection abort",
+       [ 104 ] = "Connection reset by peer",
+       [ 105 ] = "No buffer space available",
+       [ 106 ] = "Transport endpoint is already connected",
+       [ 107 ] = "Transport endpoint is not connected",
+       [ 108 ] = "Cannot send after transport endpoint shutdown",
+       [ 109 ] = "Too many references: cannot splice",
+       [ 110 ] = "Connection timed out",
+       [ 111 ] = "Connection refused",
+       [ 112 ] = "Host is down",
+       [ 113 ] = "No route to host",
+       [ 114 ] = "Operation already in progress",
+       [ 115 ] = "Operation now in progress",
+       [ 116 ] = "Stale NFS file handle",
+       [ 117 ] = "Structure needs cleaning",
+       [ 118 ] = "Not a XENIX named type file",
+       [ 119 ] = "No XENIX semaphores available",
+       [ 120 ] = "Is a named type file",
+       [ 121 ] = "Remote I/O error",
+       [ 122 ] = "Quota exceeded",
+       [ 123 ] = "No medium found",
+       [ 124 ] = "Wrong medium type",
+       [ 125 ] = "Operation Canceled",
+       [ 126 ] = "Required key not available",
+       [ 127 ] = "Key has expired",
+       [ 128 ] = "Key has been revoked",
+       [ 129 ] = "Key was rejected by service",
+       [ 130 ] = "Owner died",
+       [ 131 ] = "State not recoverable",
+       [ 132 ] = "Generic Failure",
+       [ 133 ] = "No memory available",
+       [ 135 ] = "No free pid",
+       [ 136 ] = "Unspecified",
+       [ 137 ] = "Moron",
+};
 
 const int _sys_nerr = sizeof (_sys_errlist) / sizeof (_sys_errlist[0]);
 
 strong_alias(_sys_errlist,_sys_errlist_internal);
 strong_alias(_sys_nerr,_sys_nerr_internal);
-