* io/Versions (__dup2, __pipe): Added to GLIBC_2.0 for
[kopensolaris-gnu/glibc.git] / posix / annexc.c
index dbc5e28..e9e1ac9 100644 (file)
@@ -22,6 +22,8 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <signal.h>
+#include <sys/wait.h>
 
 #define TMPFILE             "/tmp/macros"
 #define HEADER_MAX          256
@@ -93,7 +95,7 @@ static const char *const dirent_maybe[] =
 /* <errno.h>.  */
 static const char *const errno_syms[] =
 {
-  "E2BIG", "EACCESS", "EAGAIN", "EBADF", "EBADMSG", "EBUSY", "ECANCELED",
+  "E2BIG", "EACCES", "EAGAIN", "EBADF", "EBADMSG", "EBUSY", "ECANCELED",
   "ECHILD", "EDEADLK", "EDOM", "EEXIST", "EFAULT", "EFBIG", "EINPROGRESS",
   "EINTR", "EINVAL", "EIO", "EISDIR", "EMFILE", "EMLINK", "EMSGSIZE",
   "ENAMETOOLONG", "ENFILE", "ENODEV", "ENOENT", "ENOEXEC", "ENOLCK",
@@ -160,8 +162,10 @@ static const char *const limits_syms[] =
   "_POSIX_THREAD_DESTRUCTOR_ITERATIONS", "_POSIX_THREAD_KEYS_MAX",
   "_POSIX_THREAD_THREADS_MAX", "_POSIX_TIMER_MAX", "_POSIX_TTY_NAME_MAX",
   "_POSIX_TZNAME_MAX", "_POSIX_THREAD_DESTRUCTOR_ITERATIONS",
-  "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "INT_MAX", "INT_MIN", "MB_LEN_MAX",
-  "NGROUPS_MAX", "PAGESIZE", "SCHAR_MIN", "SCHAR_MAX"
+  "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "INT_MAX", "INT_MIN", "LONG_MAX",
+  "LONG_MIN", "MB_LEN_MAX", "NGROUPS_MAX", "PAGESIZE", "SCHAR_MAX",
+  "SCHAR_MIN", "SHRT_MAX", "SHRT_MIN", "UCHAR_MAX", "UINT_MAX",
+  "ULONG_MAX", "USHRT_MAX"
 };
 static const char *const limits_maybe[] =
 {
@@ -316,7 +320,7 @@ static const char *const setjmp_maybe[] =
 static const char *const signal_syms[] =
 {
   "SA_NOCLDSTOP", "SA_SIGINFO", "SIGABRT", "SIGALRM", "SIGBUS", "SIGCHLD",
-  "SIGCONT", "SIGEV_NONE", "SIGEV_SIGNAL", "SIGEV_SIGNAL", "SIGEV_THREAD",
+  "SIGCONT", "SIGEV_NONE", "SIGEV_SIGNAL", "SIGEV_THREAD",
   "SIGFPE", "SIGHUP", "SIGILL", "SIGINT", "SIGKILL", "SIGPIPE", "SIGQUIT",
   "SIGRTMAX", "SIGRTMIN", "SIGSEGV", "SIGSTOP", "SIGTERM", "SIGTSTP",
   "SIGTTIN", "SIGTTOU", "SIGUSR1", "SIGUSR2", "SIG_BLOCK", "SIG_DFL",
@@ -333,10 +337,11 @@ static const char *const signal_maybe[] =
 /* <stdarg.h>.  */
 static const char *const stdarg_syms[] =
 {
-  "va_arg", "va_end", "va_list", "va_start"
+  "va_arg", "va_end", "va_start"
 };
 static const char *const stdarg_maybe[] =
 {
+  "va_list"
 };
 
 /* <stddef.h>.  */
@@ -351,9 +356,9 @@ static const char *const stddef_maybe[] =
 /* <stdio.h>.  */
 static const char *const stdio_syms[] =
 {
-  "BUFSIZ", "EOF", "FILENAME_MAX", "L_ctermid", "L_cuserid", "L_tmpnam",
-  "NULL", "SEEK_CUR", "SEEK_END", "SEEK_SET", "STREAM_MAX", "TMP_MAX",
-  "stderr", "stdin", "stdout", "_IOFBF", "_IOLBF", "_IONBF"
+  "BUFSIZ", "EOF", "FILENAME_MAX", "FOPEN_MAX", "L_ctermid", "L_cuserid",
+  "L_tmpnam", "NULL", "SEEK_CUR", "SEEK_END", "SEEK_SET", "STREAM_MAX",
+  "TMP_MAX", "stderr", "stdin", "stdout", "_IOFBF", "_IOLBF", "_IONBF"
 };
 static const char *const stdio_maybe[] =
 {
@@ -397,8 +402,8 @@ static const char *const string_maybe[] =
 static const char *const mman_syms[] =
 {
   "MAP_FAILED", "MAP_FIXED", "MAP_PRIVATE", "MAP_SHARED", "MCL_CURRENT",
-  "MCL_FUTURE", "MS_ASYNC", "MS_INVALIDATE", "MS_ASYNC", "MS_INVALIDATE",
-  "MS_SYNC", "PROT_EXEC", "PROT_NONE", "PROT_READ", "PROT_WRITE"
+  "MCL_FUTURE", "MS_ASYNC", "MS_INVALIDATE", "MS_SYNC", "PROT_EXEC",
+  "PROT_NONE", "PROT_READ", "PROT_WRITE"
 };
 static const char *const mman_maybe[] =
 {
@@ -609,12 +614,12 @@ static struct header
 /* Format string to build command to invoke compiler.  */
 static const char fmt[] = "\
 echo \"#include <%s>\" |\
-%s -E -dM -D_POSIX_SOURCE %s \
+%s -E -dM -D_POSIX_SOURCE -D_LIBC %s \
 -isystem `%s --print-prog-name=include` - > %s";
 
 static const char testfmt[] = "\
 echo \"#include <unistd.h>\n#ifndef %s\n#error not defined\n#endif\n\" |\
-%s -E -dM -D_POSIX_SOURCE %s \
+%s -E -dM -D_POSIX_SOURCE -D_LIBC %s \
 -isystem `%s --print-prog-name=include` - 2> /dev/null > %s";
 
 
@@ -626,6 +631,7 @@ const char *INC;
 static char *xstrndup (const char *, size_t);
 static const char **get_null_defines (void);
 static int check_header (const struct header *, const char **);
+static int xsystem (const char *);
 
 int
 main (int argc, char *argv[])
@@ -671,6 +677,31 @@ xstrndup (const char *s, size_t n)
 }
 
 
+/* Like system but propagate interrupt and quit signals.  */
+int
+xsystem (const char *cmd)
+{
+  int status;
+
+  status = system (cmd);
+  if (status != -1)
+    {
+      if (WIFSIGNALED (status))
+       {
+         if (WTERMSIG (status) == SIGINT || WTERMSIG (status) == SIGQUIT)
+           raise (WTERMSIG (status));
+       }
+      else if (WIFEXITED (status))
+       {
+         if (WEXITSTATUS (status) == SIGINT + 128
+             || WEXITSTATUS (status) == SIGQUIT + 128)
+           raise (WEXITSTATUS (status) - 128);
+       }
+    }
+  return status;
+}
+
+
 static const char **
 get_null_defines (void)
 {
@@ -692,7 +723,7 @@ get_null_defines (void)
 
   sprintf (command, fmt, "/dev/null", CC, INC, CC, TMPFILE);
 
-  if (system (command))
+  if (xsystem (command))
     {
       puts ("system() returned nonzero");
       return NULL;
@@ -709,7 +740,7 @@ get_null_defines (void)
 
   while (fgets (line, sizeof line, input) != NULL)
     {
-      char *start, *end;
+      char *start;
       if (strlen (line) < 9 || line[7] != ' ')
        { /* "#define A" */
          printf ("Malformed input, expected '#define MACRO'\ngot '%s'\n",
@@ -730,9 +761,7 @@ get_null_defines (void)
            }
        }
       start = &line[8];
-      for (end = start + 1; !isspace (*end) && *end != '\0'; ++end)
-       ;
-      result[result_len++] = xstrndup (start, end - start);
+      result[result_len++] = xstrndup (start, strcspn (start, " ("));
 
       if (first)
        {
@@ -786,14 +815,14 @@ check_header (const struct header *header, const char **except)
   if (header->subset != NULL)
     {
       sprintf (line, testfmt, header->subset, CC, INC, CC, TMPFILE);
-      if (system (line))
+      if (xsystem (line))
        {
          printf ("!! not available\n");
          return 0;
        }
     }
 
-  if (system (command))
+  if (xsystem (command))
     {
       puts ("system() returned nonzero");
       result = 1;
@@ -809,7 +838,6 @@ check_header (const struct header *header, const char **except)
 
   while (fgets (line, sizeof line, input) != NULL)
     {
-      char *endmac;
       const char **ignore;
       if (strlen (line) < 9 || line[7] != ' ')
        { /* "#define A" */
@@ -819,9 +847,13 @@ check_header (const struct header *header, const char **except)
          continue;
        }
 
+      /* Find next char after the macro identifier; this can be either
+        a space or an open parenthesis.  */
+      line[8 + strcspn (&line[8], " (")] = '\0';
+
       /* Now check whether it's one of the required macros.  */
       for (i = 0; i < header->nsyms; ++i)
-       if (!strncmp (&line[8], header->syms[i], strlen (header->syms[i])))
+       if (!strcmp (&line[8], header->syms[i]))
          break;
       if (i < header->nsyms)
        {
@@ -833,12 +865,6 @@ check_header (const struct header *header, const char **except)
       if (line[8] == '_')
        continue;
 
-      /* Find next char after the macro identifier; this can be either
-        a space or an open parenthesis.  */
-      endmac = strpbrk (&line[8], " (");
-      if (endmac != NULL)
-       *endmac = '\0';
-
       /* Maybe one of the symbols which are always defined.  */
       for (ignore = except; *ignore != NULL; ++ignore)
        if (! strcmp (&line[8], *ignore))