]> Zhao Yanbai Git Server - minix.git/commitdiff
generate sys_errlist without holes
authorBen Gras <ben@minix3.org>
Wed, 13 Jul 2011 20:34:37 +0000 (22:34 +0200)
committerBen Gras <ben@minix3.org>
Wed, 13 Jul 2011 21:42:07 +0000 (23:42 +0200)
. strerror() assumes this
. remove generated libminc/errlist.c
. errno's in <sys/errno.h> have to be in sorted order
. filtering out some errno.h in Makefile lets us use near-stock
  errlist.awk

commands/syslogd/syslogd.c
lib/libminc/Makefile
lib/libminc/errlist.c [deleted file]
lib/nbsd_libc/gen/Makefile.inc
lib/nbsd_libc/gen/errlist-minix.awk [deleted file]
lib/nbsd_libc/gen/errlist.awk
lib/nbsd_libc/minix-port.patch
nbsd_include/sys/errno.h

index 1156aea1fd1198c22fc84de611cf25e2ff8591ee..44927a46b678364c7404a71b4956d20147da231f 100644 (file)
@@ -377,11 +377,7 @@ void logerror(char *type)
 
   if (errno == 0) sprintf(buf, "%s %s", ProgName, type);
 
-  else if (errno >= _NERROR)
-       sprintf(buf, "%s %s - error %d", ProgName, type, errno);
-
-  else
-       sprintf(buf, "%s %s - %s", ProgName, type, strerror(errno));
+  sprintf(buf, "%s %s - %s", ProgName, type, strerror(errno));
 
   errno = 0;
   dprintf("%s\n", buf);
index aac2f2644a960599c113d8accf7bbd18445a0d84..a20f5ef67c4db3711e0dbdd8581e6b586a0fc1c6 100644 (file)
@@ -73,9 +73,9 @@ CPPFLAGS.${i}+= -I${LIBCSRCDIR}/stdlib -I${LIBCSRCDIR}/include
 .endfor
 # Import from gen
 
-errlist.c: ${LIBCSRCDIR}/gen/errlist-minix.awk \
+errlist.c: ${LIBCSRCDIR}/gen/errlist.awk \
           ${MINIXSRCDIR}/nbsd_include/sys/errno.h
-       ${TOOL_AWK} -f ${.ALLSRC} > ${.TARGET}
+       cat ${MINIXSRCDIR}/nbsd_include/sys/errno.h | ${TOOL_SED} 's/(_SIGN//' | ${TOOL_AWK} -f ${LIBCSRCDIR}/gen/errlist.awk > ${.TARGET}
 
 .for i in assert.c _errno.c errno.c _env.c errlist.c \
        execle.c getprogname.c sleep.c time.c \
diff --git a/lib/libminc/errlist.c b/lib/libminc/errlist.c
deleted file mode 100644 (file)
index be77fba..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/* Automatically generated file; do not edit */
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: errlist.awk,v 1.4 2010/12/16 22:52:32 joerg Exp $");
-#include <errno.h>
-static const char *const errlist[] = {
-       [0] = "Undefined error: 0",                     /* 0 - ENOERROR */
-       [99] = "generic error",                 /* 99 - EGENERIC */
-       [1] = "operation not permitted",                /* 1 - EPERM */
-       [2] = "no such file or directory",              /* 2 - ENOENT */
-       [3] = "no such process",                        /* 3 - ESRCH */
-       [4] = "interrupted function call",              /* 4 - EINTR */
-       [5] = "input/output error",                     /* 5 - EIO */
-       [6] = "no such device or address",              /* 6 - ENXIO */
-       [7] = "arg list too long",                      /* 7 - E2BIG */
-       [8] = "exec format error",                      /* 8 - ENOEXEC */
-       [9] = "bad file descriptor",                    /* 9 - EBADF */
-       [10] = "no child process",                      /* 10 - ECHILD */
-       [11] = "resource temporarily unavailable",      /* 11 - EAGAIN */
-       [12] = "not enough space",                      /* 12 - ENOMEM */
-       [13] = "permission denied",                     /* 13 - EACCES */
-       [14] = "bad address",                           /* 14 - EFAULT */
-       [15] = "Extension: not a block special file",   /* 15 - ENOTBLK */
-       [16] = "resource busy",                 /* 16 - EBUSY */
-       [17] = "file exists",                           /* 17 - EEXIST */
-       [18] = "improper link",                 /* 18 - EXDEV */
-       [19] = "no such device",                        /* 19 - ENODEV */
-       [20] = "not a directory",                       /* 20 - ENOTDIR */
-       [21] = "is a directory",                        /* 21 - EISDIR */
-       [22] = "invalid argument",                      /* 22 - EINVAL */
-       [23] = "too many open files in system", /* 23 - ENFILE */
-       [24] = "too many open files",                   /* 24 - EMFILE */
-       [25] = "inappropriate I/O control operation",   /* 25 - ENOTTY */
-       [26] = "no longer used",                        /* 26 - ETXTBSY */
-       [27] = "file too large",                        /* 27 - EFBIG */
-       [28] = "no space left on device",               /* 28 - ENOSPC */
-       [29] = "invalid seek",                          /* 29 - ESPIPE */
-       [30] = "read-only file system",         /* 30 - EROFS */
-       [31] = "too many links",                        /* 31 - EMLINK */
-       [32] = "broken pipe",                           /* 32 - EPIPE */
-       [33] = "domain error            (from ANSI C std )",    /* 33 - EDOM */
-       [34] = "result too large        (from ANSI C std )",    /* 34 - ERANGE */
-       [35] = "resource deadlock avoided",             /* 35 - EDEADLK */
-       [36] = "file name too long",                    /* 36 - ENAMETOOLONG */
-       [37] = "no locks available",                    /* 37 - ENOLCK */
-       [38] = "function not implemented",              /* 38 - ENOSYS */
-       [39] = "directory not empty",                   /* 39 - ENOTEMPTY */
-       [40] = "too many levels of symlinks detected",  /* 40 - ELOOP */
-       [41] = "service restarted",                     /* 41 - ERESTART */
-       [43] = "Identifier removed",                    /* 43 - EIDRM */
-       [44] = "illegal byte sequence",         /* 44 - EILSEQ */
-       [45] = "No message of desired type",            /* 45 - ENOMSG */
-       [46] = "Value too large to be stored in data type",/* 46 - EOVERFLOW */
-       [50] = "invalid packet size for some protocol",/* 50 - EPACKSIZE */
-       [51] = "not enough buffers left",               /* 51 - ENOBUFS */
-       [52] = "illegal ioctl for device",              /* 52 - EBADIOCTL */
-       [53] = "badmode in ioctl",                      /* 53 - EBADMODE */
-       [54] = "call would block on nonblocking socket",/* 54 - EWOULDBLOCK */
-       [55] = "network unreachable",                   /* 55 - ENETUNREACH */
-       [56] = "host unreachable",                      /* 56 - EHOSTUNREACH */
-       [57] = "already connected",                     /* 57 - EISCONN */
-       [58] = "address in use",                        /* 58 - EADDRINUSE */
-       [59] = "connection refused",                    /* 59 - ECONNREFUSED */
-       [60] = "connection reset",                      /* 60 - ECONNRESET */
-       [61] = "connection timed out",                  /* 61 - ETIMEDOUT */
-       [62] = "urgent data present",                   /* 62 - EURG */
-       [63] = "no urgent data present",                /* 63 - ENOURG */
-       [64] = "no connection (yet or anymore )",       /* 64 - ENOTCONN */
-       [65] = "a write call to a shutdown connection",/* 65 - ESHUTDOWN */
-       [66] = "no such connection",                    /* 66 - ENOCONN */
-       [67] = "address family not supported",          /* 67 - EAFNOSUPPORT */
-       [68] = "protocol not supported by AF",          /* 68 - EPROTONOSUPPORT */
-       [69] = "Protocol wrong type for socket",        /* 69 - EPROTOTYPE */
-       [70] = "Operation now in progress",             /* 70 - EINPROGRESS */
-       [71] = "Can't assign requested address",        /* 71 - EADDRNOTAVAIL */
-       [72] = "Connection already in progress",        /* 72 - EALREADY */
-       [73] = "Message too long",                      /* 73 - EMSGSIZE */
-       [74] = "Socket operation on non-socket",        /* 74 - ENOTSOCK */
-       [75] = "Protocol not available",                /* 75 - ENOPROTOOPT */
-       [76] = "Operation not supported",               /* 76 - EOPNOTSUPP */
-       [77] = "network is down",                       /* 77 - ENETDOWN */
-       [78] = "Protocol family not supported", /* 78 - EPFNOSUPPORT */
-       [79] = "Destination address required",          /* 79 - EDESTADDRREQ */
-       [80] = "Host is down",                          /* 80 - EHOSTDOWN */
-       [81] = "Network dropped connection on reset",   /* 81 - ENETRESET */
-       [82] = "Socket type not supported",             /* 82 - ESOCKTNOSUPPORT */
-       [83] = "Software caused connection abort",      /* 83 - ECONNABORTED */
-       [84] = "Too many references: can't splice",     /* 84 - ETOOMANYREFS */
-       [101] = "can't send message due to deadlock",   /* 101 - ELOCKED */
-       [102] = "illegal system call number",           /* 102 - EBADCALL */
-       [103] = "bad source or destination process",    /* 103 - EBADSRCDST */
-       [104] = "no permission for system call",        /* 104 - ECALLDENIED */
-       [105] = "source or destination is not alive",   /* 105 - EDEADSRCDST */
-       [106] = "source or destination is not ready",   /* 106 - ENOTREADY */
-       [107] = "destination cannot handle request",    /* 107 - EBADREQUEST */
-       [110] = "IPC trap not allowed",                 /* 110 - ETRAPDENIED */
-       [201] = "pseudo-code: don't send a reply",      /* 201 - EDONTREPLY */
-       [150] = "Inappropriate file type or format",    /* 150 - EFTYPE */
-       [151] = "Authentication error",                 /* 151 - EAUTH */
-       [152] = "Need authenticator",                   /* 152 - ENEEDAUTH */
-       [153] = "Operation canceled",                   /* 153 - ECANCELED */
-       [160] = "Stale NFS file handle",                /* 160 - ESTALE */
-       [161] = "Too many levels of remote in path",    /* 161 - EREMOTE */
-       [162] = "RPC struct is bad",                    /* 162 - EBADRPC */
-       [163] = "RPC version wrong",                    /* 163 - ERPCMISMATCH */
-       [164] = "RPC prog. not avail",                  /* 164 - EPROGUNAVAIL */
-       [165] = "Program version wrong",                /* 165 - EPROGMISMATCH */
-       [166] = "Bad procedure for program",            /* 166 - EPROCUNAVAIL */
-       [170] = "Bad or Corrupt message",               /* 170 - EBADMSG */
-       [175] = "Too many processes",                   /* 175 - EPROCLIM */
-       [176] = "Too many users",                       /* 176 - EUSERS */
-       [177] = "Disc quota exceeded",                  /* 177 - EDQUOT */
-       [180] = "Multihop attempted ",                  /* 180 - EMULTIHOP */
-       [181] = "Link has been severed",                /* 181 - ENOLINK */
-       [182] = "Protocol error",                       /* 182 - EPROTO */
-       [185] = "Attribute not found",                  /* 185 - ENOATTR */
-       [190] = "No message available",                 /* 190 - ENODATA */
-       [191] = "No STREAM resources",                  /* 191 - ENOSR */
-       [192] = "Not a STREAM",                         /* 192 - ENOSTR */
-       [193] = "STREAM ioctl timeout",                 /* 193 - ETIME */
-       [301] = "specified endpoint is bad",            /* 301 - EBADEPT */
-       [302] = "specified endpoint is not alive",      /* 302 - EDEADEPT */
-};
-
-const int sys_nerr = sizeof(errlist) / sizeof(errlist[0]);
-const char * const *sys_errlist = errlist;
index 497052ad3d30b8275816279e777c92aa1641c03f..99e64064d26e6b8fab21c34f7acd6046526148fb 100644 (file)
@@ -213,8 +213,8 @@ CPPFLAGS.tolower_.c+=       -I${LIBCDIR}/locale
 CPPFLAGS.toupper_.c+=  -I${LIBCDIR}/locale
 
 .if defined(__MINIX)
-errlist.c: errlist-minix.awk ${MINIXSRCDIR}/nbsd_include/sys/errno.h
-       ${TOOL_AWK} -f ${.ALLSRC} > ${.TARGET}
+errlist.c: errlist.awk ${MINIXSRCDIR}/nbsd_include/sys/errno.h
+       cat ${MINIXSRCDIR}/nbsd_include/sys/errno.h | ${TOOL_SED} 's/(_SIGN//' | ${TOOL_AWK} -f ${MINIXSRCDIR}/lib/nbsd_libc/gen/errlist.awk > ${.TARGET}
 .else
 errlist.c: errlist.awk ${NETBSDSRCDIR}/sys/sys/errno.h
        ${TOOL_AWK} -f ${.ALLSRC} > ${.TARGET}
diff --git a/lib/nbsd_libc/gen/errlist-minix.awk b/lib/nbsd_libc/gen/errlist-minix.awk
deleted file mode 100644 (file)
index afa7f92..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-#! /usr/bin/awk -f
-#      $NetBSD: errlist.awk,v 1.4 2010/12/16 22:52:32 joerg Exp $
-#
-# Copyright (c) 2010 The NetBSD Foundation, Inc.
-# All rights reserved.
-#
-# This code is derived from software contributed to The NetBSD Foundation
-# by Christos Zoulas.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-#    must display the following acknowledgement:
-#        This product includes software developed by the NetBSD
-#        Foundation, Inc. and its contributors.
-# 4. Neither the name of The NetBSD Foundation nor the names of its
-#    contributors may be used to endorse or promote products derived
-#    from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-function tabs(desc) {
-       l = length(desc) + 3;
-       if (concat)
-               l++
-       if (l < 16)
-               return "\t\t\t\t";
-       else if (l < 24)
-               return "\t\t\t";
-       else if (l < 32)
-               return "\t\t";
-       else if (l < 40)
-               return "\t";
-       else
-               return "";
-}
-function perror(name, number, desc)
-{
-       if (!concat) {
-               printf("\t[%d] = \"%s\",%s/* %d - %s */\n", number, desc, tabs(desc), number, name);
-       } else {
-               offsets[number] = offset;
-               offset += length(desc) + 1;
-               printf("\t[%d] = \"%s\\0\"%s/* %d - %s */\n", number, desc, tabs(desc), number, name);
-       }
-}
-BEGIN {
-       printf("/* Automatically generated file; do not edit */\n");
-       printf("#include <sys/cdefs.h>\n");
-       printf("__RCSID(\"$NetBSD: errlist.awk,v 1.4 2010/12/16 22:52:32 joerg Exp $\");\n");
-       printf("#include <errno.h>\n");
-       if (!concat) {
-               printf("static const char *const errlist[] = {\n");
-       } else {
-               printf("static const char concat_errlist[] = {\n");
-               offset = 0;
-       }
-       perror("ENOERROR", 0, "Undefined error: 0");
-       errno = 1;
-       last = 0;
-}
-/^#define/ {
-       if ( last ) next;
-
-       name = $2;
-       if (name == "ELAST") {
-               last = 1;
-               next;
-       }
-       number = $4;
-       if (number < 0 || number == "EAGAIN")
-               next;
-       desc = $0;
-       i1 = index(desc, "/*") + 3;
-       l = length(desc);
-       desc = substr(desc, i1, l - i1 - 2);
-#      if (number != errno) {
-#              printf("error number mismatch %d != %d\n", number, errno) > "/dev/stderr";
-#              exit(1);
-#      }
-       perror(name, number, desc);
-       errno=number;
-}
-END {
-       printf("};\n\n");
-       if (!concat) {
-               printf("const int sys_nerr = sizeof(errlist) / sizeof(errlist[0]);\n");
-               printf("const char * const *sys_errlist = errlist;\n");
-       } else {
-               printf("static const int concat_nerr = %d;\n", errno);
-               printf("static const unsigned short concat_offset[] = {\n");
-               offsets[errno++] = offset;
-               for (j = 0; j < errno; j++) {
-                       printf("\t%d,\n", offsets[j]);
-               }
-               printf("};\n");
-               if (offset > 65535) {
-                       printf("Total errlist size doesn't fit into 16bit\n") > "/dev/stderr";
-                       exit(1);
-               }
-       }
-}
index 81c43fc3c744d3a6560df520358eb7aa9f0ee863..a31ecab4efe138077480c05207b0669114219e78 100644 (file)
@@ -85,10 +85,14 @@ BEGIN {
        i1 = index(desc, "/*") + 3;
        l = length(desc);
        desc = substr(desc, i1, l - i1 - 2);
-       if (number != errno) {
-               printf("error number mismatch %d != %d\n", number, errno) > "/dev/stderr";
+       if (number < errno) {
+               printf("%s\n error number mismatch %d != %d\n", $0, number, errno) > "/dev/stderr";
                exit(1);
        }
+       while(errno < number) {
+               perror("UNDEFINED", errno, "Undefined error: " errno);
+               errno++;
+       }
        perror(name, number, desc);
        errno++;
 }
index 9ea5ac0ada94b927dd7baff0624c4d48cb46340c..70d3642eab825278e0ff00a1c9a2d1102312db56 100644 (file)
@@ -469,8 +469,8 @@ diff -ru nbsdsrc/src/lib/libc/gen/Makefile.inc lib/nbsd_libc/gen/Makefile.inc
  CPPFLAGS.toupper_.c+= -I${LIBCDIR}/locale
  
 +.if defined(__MINIX)
-+errlist.c: errlist-minix.awk ${MINIXSRCDIR}/nbsd_include/sys/errno.h
-+      ${TOOL_AWK} -f ${.ALLSRC} > ${.TARGET}
++errlist.c: errlist.awk ${MINIXSRCDIR}/nbsd_include/sys/errno.h
++      cat ${MINIXSRCDIR}/nbsd_include/sys/errno.h | ${TOOL_SED} 's/(_SIGN//' | ${TOOL_AWK} -f ${MINIXSRCDIR}/lib/nbsd_libc/gen/errlist.awk > ${.TARGET}
 +.else
  errlist.c: errlist.awk ${NETBSDSRCDIR}/sys/sys/errno.h
        ${TOOL_AWK} -f ${.ALLSRC} > ${.TARGET}
@@ -574,6 +574,25 @@ diff -ru nbsdsrc/src/lib/libc/gen/closedir.c lib/nbsd_libc/gen/closedir.c
  #include "namespace.h"
  #include "reentrant.h"
  #include "extern.h"
+diff -ru nbsdsrc/src/lib/libc/gen/errlist.awk lib/nbsd_libc/gen/errlist.awk
+--- nbsdsrc/src/lib/libc/gen/errlist.awk
++++ lib/nbsd_libc/gen/errlist.awk
+@@ -85,9 +85,13 @@
+       i1 = index(desc, "/*") + 3;
+       l = length(desc);
+       desc = substr(desc, i1, l - i1 - 2);
+-      if (number != errno) {
+-              printf("error number mismatch %d != %d\n", number, errno) > "/dev/stderr";
++      if (number < errno) {
++              printf("%s\n error number mismatch %d != %d\n", $0, number, errno) > "/dev/stderr";
+               exit(1);
++      }
++      while(errno < number) {
++              perror("UNDEFINED", errno, "Undefined error: " errno);
++              errno++;
+       }
+       perror(name, number, desc);
+       errno++;
 diff -ru nbsdsrc/src/lib/libc/gen/execl.c lib/nbsd_libc/gen/execl.c
 --- nbsdsrc/src/lib/libc/gen/execl.c
 +++ lib/nbsd_libc/gen/execl.c
index 2655772f639e658cf9fbdaed79323b03d72be2e8..b1b5d6a49e0f7b4f707a7d7ec0d997e67383c415 100644 (file)
@@ -30,7 +30,6 @@
 
 
 
-#define EGENERIC      (_SIGN 99 )  /* generic error */
 #define EPERM         (_SIGN  1 )  /* operation not permitted */
 #define ENOENT        (_SIGN  2 )  /* no such file or directory */
 #define ESRCH         (_SIGN  3 )  /* no such process */
 #define ENOTSOCK      (_SIGN 74 )  /* Socket operation on non-socket */
 #define ENOPROTOOPT   (_SIGN 75 )  /* Protocol not available */
 #define EOPNOTSUPP    (_SIGN 76 )  /* Operation not supported */
-#define ENOTSUP       EOPNOTSUPP  /* Not supported */
+#define ENOTSUP       ( EOPNOTSUPP )  /* Not supported */
 #define ENETDOWN      (_SIGN 77 )  /* network is down */
 #define        EPFNOSUPPORT  (_SIGN 78 ) /* Protocol family not supported */
 #define        EDESTADDRREQ  (_SIGN 79 )  /* Destination address required */
 #define        ECONNABORTED  (_SIGN 83 )  /* Software caused connection abort */
 #define        ETOOMANYREFS   (_SIGN 84 ) /* Too many references: can't splice */
 
+#define EGENERIC      (_SIGN 99 )  /* generic error */
+
 /* The following are not POSIX errors, but they can still happen. 
  * All of these are generated by the kernel and relate to message passing.
  */
 #define ENOTREADY    (_SIGN 106 )  /* source or destination is not ready */
 #define EBADREQUEST  (_SIGN 107 )  /* destination cannot handle request */
 #define ETRAPDENIED  (_SIGN 110 )  /* IPC trap not allowed */
-#define EDONTREPLY   (_SIGN 201 )  /* pseudo-code: don't send a reply */
 
 /* The following errors are NetBSD errors. */
 #define        EFTYPE       (_SIGN 150 )  /* Inappropriate file type or format */
 #define ENOSTR      (_SIGN 192 )  /* Not a STREAM */
 #define ETIME       (_SIGN 193 )  /* STREAM ioctl timeout */
 
+#define EDONTREPLY   (_SIGN 201 )  /* pseudo-code: don't send a reply */
+
 /* The following are non-POSIX server responses */
 #define EBADEPT      (_SIGN 301 )  /* specified endpoint is bad */
 #define EDEADEPT     (_SIGN 302 )  /* specified endpoint is not alive */
+#define EBADCPU             (_SIGN 303 )  /* requested CPU does not work */
 
-/* This define is put before EBADCPU to instruct errlist-minix.awk to
-   stop creating the errlist array here. '1000' infact is definitely
-   too large for an error number to be included in a fixed array, as
-   this would need ~700 empty array entries. */
-#define        ELAST        EBADCPU /* Must equal largest errno */
-
-#define EBADCPU             (_SIGN 1000 ) /* requested CPU does not work */
-
-
-
-/* Here are the numerical values of the error numbers. */
-#define _NERROR      1000       /* number of errors */  
 #endif /* _ERRNO_H */