Remove errstrings.h, in favor of error.c
authorKevin Klues <klueska@cs.berkeley.edu>
Wed, 7 Oct 2015 21:40:01 +0000 (14:40 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 14 Oct 2015 18:49:05 +0000 (14:49 -0400)
The errstrings.h file was only used to generate an error_strings[] table
in error.h.  Instead, we now generate an error.c file which defines a
table similar to this (called errno_strings[]), but is part of a .c file
instead of a .h file. We then extern this table in through error.h. The
error.c file is automatically generated if we ever change ros/errno.h.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/error.h
kern/include/errstrings.h [deleted file]
kern/src/Kbuild
kern/src/error.c [new file with mode: 0644]
kern/src/printfmt.c
scripts/make_errlist.sh
scripts/parse_errno.sh [new file with mode: 0755]

index 3aa8c3f..7bcd98a 100644 (file)
@@ -11,16 +11,7 @@ typedef int error_t;
 #define PTR_ERR(ptr)  ((uintptr_t)(ptr))
 #define IS_ERR(ptr)   ((uintptr_t)-(uintptr_t)(ptr) < 512)
 
-/* The special format for printk %e takes an integer
- * error code and prints a string describing the error.
- * The integer may be positive or negative,
- * so that -ENOMEM and ENOMEM are equivalent.
- */
-
-static const char *const error_string[] =
-{
-       #include <errstrings.h>
-};
-#define NUMERRORS (sizeof(error_string)/sizeof(error_string[0]))
+extern const char *const errno_strings[];
+extern const int MAX_ERRNO;
 
 #endif // !ROS_INC_ERROR_H */
diff --git a/kern/include/errstrings.h b/kern/include/errstrings.h
deleted file mode 100644 (file)
index fc0a16d..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
-"",
index ffdefcd..0981c66 100644 (file)
@@ -1,3 +1,12 @@
+
+$(src)/error.c: $(AKAROS_ROOT)/include/ros/errno.h
+       @echo "// This file was automatically generated not edit" > $(@)
+       @echo ""                               >> $(@)
+       @echo "const char *errno_strings[] = {" >> $(@)
+       @cat $(^) | $(AKAROS_ROOT)/scripts/parse_errno.sh >> $(@)
+       @echo "};"                             >> $(@)
+       @echo "const int MAX_ERRNO = sizeof(errno_strings)/sizeof(errno_strings[0]);" >> $(@)
+
 obj-y                                          += alarm.o
 obj-y                                          += apipe.o
 obj-y                                          += arsc.o
@@ -13,6 +22,7 @@ obj-y                                         += dmapool.o
 obj-y                                          += elf.o
 obj-y                                          += env.o
 obj-y                                          += err.o
+obj-y                                          += error.o
 obj-$(CONFIG_ETH_AUDIO)                += eth_audio.o
 obj-y                                          += event.o
 obj-y                                          += ext2fs.o
diff --git a/kern/src/error.c b/kern/src/error.c
new file mode 100644 (file)
index 0000000..4f42a78
--- /dev/null
@@ -0,0 +1,140 @@
+// This file was automatically generated not edit
+
+const char *errno_strings[] = {
+       [ 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 MAX_ERRNO = sizeof(errno_strings)/sizeof(errno_strings[0]);
index b597e75..493bf51 100644 (file)
@@ -136,10 +136,10 @@ void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
                        err = va_arg(ap, int);
                        if (err < 0)
                                err = -err;
-                       if (err >= NUMERRORS)
+                       if (err >= MAX_ERRNO)
                                printfmt(putch, putdat, "error %d(%s)", err, get_cur_errbuf());
                        else
-                               printfmt(putch, putdat, "%s (%s)", error_string[err], get_cur_errbuf());
+                               printfmt(putch, putdat, "%s (%s)", errno_strings[err], get_cur_errbuf());
                        break;
 
                case 'E': // ENET MAC
index 6acf0e0..fc85498 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-ERRLIST="tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/errlist.c"
+ERRLIST="tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/errlist.c"
 ERRNO_FILE="kern/include/ros/errno.h"
 
 echo "// This was automatically generated with make_errlist.sh, do not edit" > $ERRLIST
@@ -16,7 +16,7 @@ echo "{"                                  >> $ERRLIST
 # 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
+cat $ERRNO_FILE | ./scripts/parse_errno.sh >> $ERRLIST
 
 echo "};"                                 >> $ERRLIST
 echo ""                                   >> $ERRLIST
diff --git a/scripts/parse_errno.sh b/scripts/parse_errno.sh
new file mode 100755 (executable)
index 0000000..1fe3b46
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# Read from stdin lines formatted as:
+#
+#  #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 */
+#
+# And output them as:
+#
+#  [ 1 ] = "Operation not permitted",
+#  [ 2 ] = "No such file or directory",
+#  [ 3 ] = "No such process",
+#  [ 4 ] = "Interrupted system call",
+#  [ 5 ] = "I/O error",
+#
+
+grep "^#define\sE" | 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"}'