Blame posix/annexc.c

Packit 6c4009
/* Copyright (C) 1998-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <ctype.h>
Packit 6c4009
#include <fnmatch.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
#include <signal.h>
Packit 6c4009
#include <sys/wait.h>
Packit 6c4009
Packit 6c4009
#define HEADER_MAX          256
Packit 6c4009
Packit 6c4009
static char macrofile[] = "/tmp/annexc.XXXXXX";
Packit 6c4009
Packit 6c4009
/* <aio.h>.  */
Packit 6c4009
static const char *const aio_syms[] =
Packit 6c4009
{
Packit 6c4009
  "AIO_ALLDONE", "AIO_CANCELED", "AIO_NOTCANCELED", "LIO_NOP", "LIO_NOWAIT",
Packit 6c4009
  "LIO_READ", "LIO_WAIT", "LIO_WRITE",
Packit 6c4009
  /* From <fcntl.h>.  */
Packit 6c4009
  "FD_CLOEXEC", "F_DUPFD", "F_GETFD", "F_GETFL", "F_GETLK", "F_RDLCK",
Packit 6c4009
  "F_SETFD", "F_SETFL", "F_SETLK", "F_SETLKW", "F_UNLCK", "F_WRLCK",
Packit 6c4009
  "O_ACCMODE", "O_APPEND", "O_CREAT", "O_DSYNC", "O_EXCL", "O_NOCTTY",
Packit 6c4009
  "O_NONBLOCK", "O_RDONLY", "O_RDWR", "O_RSYNC", "O_SYNC", "O_TRUNC",
Packit 6c4009
  "O_WRONLY",
Packit 6c4009
  /* From <signal.h>.  */
Packit 6c4009
  "SA_NOCLDSTOP", "SA_SIGINFO", "SIGABRT", "SIGALRM", "SIGBUS", "SIGCHLD",
Packit 6c4009
  "SIGCONT", "SIGEV_NONE", "SIGEV_SIGNAL", "SIGEV_SIGNAL", "SIGEV_THREAD",
Packit 6c4009
  "SIGFPE", "SIGHUP", "SIGILL", "SIGINT", "SIGKILL", "SIGPIPE", "SIGQUIT",
Packit 6c4009
  "SIGRTMAX", "SIGRTMIN", "SIGSEGV", "SIGSTOP", "SIGTERM", "SIGTSTP",
Packit 6c4009
  "SIGTTIN", "SIGTTOU", "SIGUSR1", "SIGUSR2", "SIG_BLOCK", "SIG_DFL",
Packit 6c4009
  "SIG_ERR", "SIG_IGN", "SIG_SETMASK", "SIG_UNBLOCK", "SI_ASYNCIO",
Packit 6c4009
  "SI_MESGQ", "SI_QUEUE", "SI_TIMER", "SI_USER"
Packit 6c4009
};
Packit 6c4009
static const char *const aio_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "aio_cancel", "aio_error", "aio_fsync", "aio_read", "aio_return",
Packit 6c4009
  "aio_suspend", "aio_write", "lio_listio",
Packit 6c4009
  /* From <fcntl.h>.  */
Packit 6c4009
  "creat", "fcntl", "open", "SEEK_CUR", "SEEK_END", "SEEK_SET", "S_IRGRP",
Packit 6c4009
  "S_IROTH", "S_IRUSR", "S_IRWXG", "S_IRWXO", "S_IRWXU", "S_ISBLK",
Packit 6c4009
  "S_ISCHR", "S_ISDIR", "S_ISFIFO", "S_ISGID", "S_ISREG", "S_ISUID",
Packit 6c4009
  "S_IWGRP", "S_IWOTH", "S_IWUSR", "S_IXGRP", "S_IXOTH", "S_IXUSR",
Packit 6c4009
  /* From <signal.h>.  */
Packit 6c4009
  "kill", "raise", "sigaction", "sigaddset", "sigdelset", "sigemptyset",
Packit 6c4009
  "sigfillset", "sigismember", "signal", "sigpending", "sigprocmask",
Packit 6c4009
  "sigqueue", "sigsuspend", "sigtimedwait", "sigwait", "sigwaitinfo"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <assert.h>.  */
Packit 6c4009
static const char *const assert_syms[] =
Packit 6c4009
{
Packit 6c4009
  "assert"
Packit 6c4009
};
Packit 6c4009
static const char *const assert_maybe[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <ctype.h>.   */
Packit 6c4009
static const char *const ctype_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const ctype_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower",
Packit 6c4009
  "isprint", "ispunct", "isspace", "isupper", "isxdigit", "tolower",
Packit 6c4009
  "toupper"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <dirent.h>.  */
Packit 6c4009
static const char *const dirent_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const dirent_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "closedir", "opendir", "readdir", "readdir_r", "rewinddir"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <errno.h>.  */
Packit 6c4009
static const char *const errno_syms[] =
Packit 6c4009
{
Packit 6c4009
  "E2BIG", "EACCES", "EAGAIN", "EBADF", "EBADMSG", "EBUSY", "ECANCELED",
Packit 6c4009
  "ECHILD", "EDEADLK", "EDOM", "EEXIST", "EFAULT", "EFBIG", "EINPROGRESS",
Packit 6c4009
  "EINTR", "EINVAL", "EIO", "EISDIR", "EMFILE", "EMLINK", "EMSGSIZE",
Packit 6c4009
  "ENAMETOOLONG", "ENFILE", "ENODEV", "ENOENT", "ENOEXEC", "ENOLCK",
Packit 6c4009
  "ENOMEM", "ENOSPC", "ENOSYS", "ENOTDIR", "ENOTEMPTY", "ENOTSUP",
Packit 6c4009
  "ENOTTY", "ENXIO", "EPERM", "EPIPE", "ERANGE", "EROFS", "ESPIPE",
Packit 6c4009
  "ESRCH", "ETIMEDOUT", "EXDEV"
Packit 6c4009
};
Packit 6c4009
static const char *const errno_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "errno", "E*"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <fcntl.h>.  */
Packit 6c4009
static const char *const fcntl_syms[] =
Packit 6c4009
{
Packit 6c4009
  "FD_CLOEXEC", "F_DUPFD", "F_GETFD", "F_GETFL", "F_GETLK", "F_RDLCK",
Packit 6c4009
  "F_SETFD", "F_SETFL", "F_SETLK", "F_SETLKW", "F_UNLCK", "F_WRLCK",
Packit 6c4009
  "O_ACCMODE", "O_APPEND", "O_CREAT", "O_DSYNC", "O_EXCL", "O_NOCTTY",
Packit 6c4009
  "O_NONBLOCK", "O_RDONLY", "O_RDWR", "O_RSYNC", "O_SYNC", "O_TRUNC",
Packit 6c4009
  "O_WRONLY"
Packit 6c4009
};
Packit 6c4009
static const char *const fcntl_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "creat", "fcntl", "open", "SEEK_CUR", "SEEK_END", "SEEK_SET", "S_IRGRP",
Packit 6c4009
  "S_IROTH", "S_IRUSR", "S_IRWXG", "S_IRWXO", "S_IRWXU", "S_ISBLK",
Packit 6c4009
  "S_ISCHR", "S_ISDIR", "S_ISFIFO", "S_ISGID", "S_ISREG", "S_ISUID",
Packit 6c4009
  "S_IWGRP", "S_IWOTH", "S_IWUSR", "S_IXGRP", "S_IXOTH", "S_IXUSR"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <float.h>.  */
Packit 6c4009
static const char *const float_syms[] =
Packit 6c4009
{
Packit 6c4009
  "DBL_DIG", "DBL_EPSILON", "DBL_MANT_DIG", "DBL_MAX", "DBL_MAX_10_EXP",
Packit 6c4009
  "DBL_MAX_EXP", "DBL_MIN", "DBL_MIN_10_EXP", "DBL_MIN_EXP", "FLT_DIG",
Packit 6c4009
  "FLT_EPSILON", "FLT_MANT_DIG", "FLT_MAX", "FLT_MAX_10_EXP", "FLT_MAX_EXP",
Packit 6c4009
  "FLT_MIN", "FLT_MIN_10_EXP", "FLT_MIN_EXP", "FLT_RADIX", "FLT_ROUNDS",
Packit 6c4009
  "LDBL_DIG", "LDBL_EPSILON", "LDBL_MANT_DIG", "LDBL_MAX", "LDBL_MAX_10_EXP",
Packit 6c4009
  "LDBL_MAX_EXP", "LDBL_MIN", "LDBL_MIN_10_EXP", "LDBL_MIN_EXP"
Packit 6c4009
};
Packit 6c4009
static const char *const float_maybe[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <grp.h>.  */
Packit 6c4009
static const char *const grp_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const grp_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "getgrgid", "getgrgid_r", "getgrnam", "getgrnam_r"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <limits.h>.  */
Packit 6c4009
static const char *const limits_syms[] =
Packit 6c4009
{
Packit 6c4009
  "_POSIX_AIO_LISTIO_MAX", "_POSIX_AIO_MAX", "_POSIX_ARG_MAX",
Packit 6c4009
  "_POSIX_CHILD_MAX", "_POSIX_CLOCKRES_MAX", "_POSIX_DELAYTIMER_MAX",
Packit 6c4009
  "_POSIX_LINK_MAX", "_POSIX_LOGIN_NAME_MAX", "_POSIX_MAX_CANON",
Packit 6c4009
  "_POSIX_MAX_INPUT", "_POSIX_MQ_OPEN_MAX", "_POSIX_MQ_PRIO_MAX",
Packit 6c4009
  "_POSIX_NAME_MAX", "_POSIX_NGROUPS_MAX", "_POSIX_OPEN_MAX",
Packit 6c4009
  "_POSIX_PATH_MAX", "_POSIX_PIPE_BUF", "_POSIX_RTSIG_MAX",
Packit 6c4009
  "_POSIX_SEM_NSEMS_MAX", "_POSIX_SEM_VALUE_MAX", "_POSIX_SIGQUEUE_MAX",
Packit 6c4009
  "_POSIX_SSIZE_MAX", "_POSIX_STREAM_MAX",
Packit 6c4009
  "_POSIX_THREAD_DESTRUCTOR_ITERATIONS", "_POSIX_THREAD_KEYS_MAX",
Packit 6c4009
  "_POSIX_THREAD_THREADS_MAX", "_POSIX_TIMER_MAX", "_POSIX_TTY_NAME_MAX",
Packit 6c4009
  "_POSIX_TZNAME_MAX", "_POSIX_THREAD_DESTRUCTOR_ITERATIONS",
Packit 6c4009
  "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "INT_MAX", "INT_MIN", "LONG_MAX",
Packit 6c4009
  "LONG_MIN", "MB_LEN_MAX", "NGROUPS_MAX", "PAGESIZE", "SCHAR_MAX",
Packit 6c4009
  "SCHAR_MIN", "SHRT_MAX", "SHRT_MIN", "UCHAR_MAX", "UINT_MAX",
Packit 6c4009
  "ULONG_MAX", "USHRT_MAX"
Packit 6c4009
};
Packit 6c4009
static const char *const limits_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "AIO_LISTIO_MAX", "AIO_MAX", "ARG_MAX", "CHILD_MAX", "DELAYTIMER_MAX",
Packit 6c4009
  "LINK_MAX", "LOGIN_NAME_MAX", "LONG_MAX", "LONG_MIN", "MAX_CANON",
Packit 6c4009
  "MAX_INPUT", "MQ_OPEN_MAX", "MQ_PRIO_MAX", "NAME_MAX", "OPEN_MAX",
Packit 6c4009
  "PATH_MAX", "PIPE_BUF", "RTSIG_MAX", "PTHREAD_DESTRUCTOR_ITERATIONS",
Packit 6c4009
  "PTHREAD_KEYS_MAX", "PTHREAD_STACK_MIN", "PTHREAD_THREADS_MAX"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <locale.h>.  */
Packit 6c4009
static const char *const locale_syms[] =
Packit 6c4009
{
Packit 6c4009
  "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MONETARY", "LC_NUMERIC",
Packit 6c4009
  "LC_TIME", "NULL"
Packit 6c4009
};
Packit 6c4009
static const char *const locale_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "LC_*", "localeconv", "setlocale"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <math.h>.  */
Packit 6c4009
static const char *const math_syms[] =
Packit 6c4009
{
Packit 6c4009
  "HUGE_VAL"
Packit 6c4009
};
Packit 6c4009
static const char *const math_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "acos", "asin", "atan2", "atan", "ceil", "cos", "cosh", "exp",
Packit 6c4009
  "fabs", "floor", "fmod", "frexp", "ldexp", "log10", "log", "modf",
Packit 6c4009
  "pow", "sin", "sinh", "sqrt", "tan", "tanh",
Packit 6c4009
  "acosf", "asinf", "atan2f", "atanf", "ceilf", "cosf", "coshf", "expf",
Packit 6c4009
  "fabsf", "floorf", "fmodf", "frexpf", "ldexpf", "log10f", "logf", "modff",
Packit 6c4009
  "powf", "sinf", "sinhf", "sqrtf", "tanf", "tanhf",
Packit 6c4009
  "acosl", "asinl", "atan2l", "atanl", "ceill", "cosl", "coshl", "expl",
Packit 6c4009
  "fabsl", "floorl", "fmodl", "frexpl", "ldexpl", "log10l", "logl", "modfl",
Packit 6c4009
  "powl", "sinl", "sinhl", "sqrtl", "tanl", "tanhl"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <mqueue.h>.  */
Packit 6c4009
static const char *const mqueue_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const mqueue_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "mq_close", "mq_getattr", "mq_notify", "mq_open", "mq_receive",
Packit 6c4009
  "mq_send", "mq_setattr", "mq_unlink"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <pthread.h>.  */
Packit 6c4009
static const char *const pthread_syms[] =
Packit 6c4009
{
Packit 6c4009
  "PTHREAD_CANCELED", "PTHREAD_CANCEL_ASYNCHRONOUS",
Packit 6c4009
  "PTHREAD_CANCEL_DEFERRED", "PTHREAD_CANCEL_DISABLE", "PTHREAD_CANCEL_ENABLE",
Packit 6c4009
  "PTHREAD_COND_INITIALIZER", "PTHREAD_CREATE_DETACHED",
Packit 6c4009
  "PTHREAD_CREATE_JOINABLE", "PTHREAD_EXPLICIT_SCHED",
Packit 6c4009
  "PTHREAD_INHERIT_SCHED", "PTHREAD_MUTEX_INITIALIZER",
Packit 6c4009
  "PTHREAD_ONCE_INIT", "PTHREAD_PRIO_INHERIT", "PTHREAD_PRIO_NONE",
Packit 6c4009
  "PTHREAD_PRIO_PROTECT", "PTHREAD_PROCESS_PRIVATE",
Packit 6c4009
  "PTHREAD_PROCESS_SHARED", "PTHREAD_SCOPE_PROCESS", "PTHREAD_SCOPE_SYSTEM",
Packit 6c4009
  /* These come from <sched.h>.  */
Packit 6c4009
  "SCHED_FIFO", "SCHED_OTHER", "SCHED_RR",
Packit 6c4009
  /* These come from <time.h>.  */
Packit 6c4009
  "CLK_TCK", "CLOCKS_PER_SEC", "CLOCK_REALTIME", "NULL", "TIMER_ABSTIME"
Packit 6c4009
};
Packit 6c4009
static const char *const pthread_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "pthread_atfork", "pthread_attr_destroy", "pthread_attr_getdetachstate",
Packit 6c4009
  "pthread_attr_getinheritsched", "pthread_attr_getschedparam",
Packit 6c4009
  "pthread_attr_getschedpolicy", "pthread_attr_getscope",
Packit 6c4009
  "pthread_attr_getstackaddr", "pthread_attr_getstacksize",
Packit 6c4009
  "pthread_attr_init", "pthread_attr_setdetachstate",
Packit 6c4009
  "pthread_attr_setinheritsched", "pthread_attr_setschedparam",
Packit 6c4009
  "pthread_attr_setschedpolicy", "pthread_attr_setscope",
Packit 6c4009
  "pthread_attr_setstackaddr", "pthread_attr_setstacksize",
Packit 6c4009
  "pthread_cleanup_pop", "pthread_cleanup_push", "pthread_cond_broadcast",
Packit 6c4009
  "pthread_cond_destroy", "pthread_cond_init", "pthread_cond_signal",
Packit 6c4009
  "pthread_cond_timedwait", "pthread_cond_wait", "pthread_condattr_destroy",
Packit 6c4009
  "pthread_condattr_getpshared", "pthread_condattr_init",
Packit 6c4009
  "pthread_condattr_setpshared", "pthread_create", "pthread_detach",
Packit 6c4009
  "pthread_equal", "pthread_exit", "pthread_getspecific", "pthread_join",
Packit 6c4009
  "pthread_key_create", "pthread_key_destroy", "pthread_kill",
Packit 6c4009
  "pthread_mutex_destroy", "pthread_mutex_getprioceiling",
Packit 6c4009
  "pthread_mutex_init", "pthread_mutex_lock", "pthread_mutex_setprioceiling",
Packit 6c4009
  "pthread_mutex_trylock", "pthread_mutex_unlock", "pthread_mutexattr_destroy",
Packit 6c4009
  "pthread_mutexattr_getprioceiling", "pthread_mutexattr_getprotocol",
Packit 6c4009
  "pthread_mutexattr_getpshared", "pthread_mutexattr_init",
Packit 6c4009
  "pthread_mutexattr_setprioceiling", "pthread_mutexattr_setprotocol",
Packit 6c4009
  "pthread_mutexattr_setpshared", "pthread_once", "pthread_self",
Packit 6c4009
  "pthread_setcancelstate", "pthread_setcanceltype", "pthread_setspecific",
Packit 6c4009
  "pthread_sigmask", "pthread_testcancel"
Packit 6c4009
  /* These come from <sched.h>.  */
Packit 6c4009
  "sched_get_priority_max", "sched_get_priority_min",
Packit 6c4009
  "sched_get_rr_interval", "sched_getparam", "sched_getscheduler",
Packit 6c4009
  "sched_setparam", "sched_setscheduler", "sched_yield",
Packit 6c4009
  /* These come from <time.h>.  */
Packit 6c4009
  "asctime", "asctime_r", "clock", "clock_getres", "clock_gettime",
Packit 6c4009
  "clock_settime", "ctime", "ctime_r", "difftime", "gmtime", "gmtime_r",
Packit 6c4009
  "localtime", "localtime_r", "mktime", "nanosleep", "strftime", "time",
Packit 6c4009
  "timer_create", "timer_delete", "timer_getoverrun", "timer_gettime",
Packit 6c4009
  "timer_settime", "tzset"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <pwd.h>.  */
Packit 6c4009
static const char *const pwd_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const pwd_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "getpwnam", "getpwnam_r", "getpwuid", "getpwuid_r"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <sched.h>.  */
Packit 6c4009
static const char *const sched_syms[] =
Packit 6c4009
{
Packit 6c4009
  "SCHED_FIFO", "SCHED_OTHER", "SCHED_RR",
Packit 6c4009
};
Packit 6c4009
static const char *const sched_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "sched_get_priority_max", "sched_get_priority_min",
Packit 6c4009
  "sched_get_rr_interval", "sched_getparam", "sched_getscheduler",
Packit 6c4009
  "sched_setparam", "sched_setscheduler", "sched_yield",
Packit 6c4009
  /* These come from <time.h>.  */
Packit 6c4009
  "CLK_TCK", "CLOCKS_PER_SEC", "CLOCK_REALTIME", "NULL", "TIMER_ABSTIME"
Packit 6c4009
  "asctime", "asctime_r", "clock", "clock_getres", "clock_gettime",
Packit 6c4009
  "clock_settime", "ctime", "ctime_r", "difftime", "gmtime", "gmtime_r",
Packit 6c4009
  "localtime", "localtime_r", "mktime", "nanosleep", "strftime", "time",
Packit 6c4009
  "timer_create", "timer_delete", "timer_getoverrun", "timer_gettime",
Packit 6c4009
  "timer_settime", "tzset"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <semaphore.h>.  */
Packit 6c4009
static const char *const semaphore_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const semaphore_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "sem_close", "sem_destroy", "sem_getvalue", "sem_init", "sem_open",
Packit 6c4009
  "sen_post", "sem_trywait", "sem_unlink", "sem_wait"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <setjmp.h>.  */
Packit 6c4009
static const char *const setjmp_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const setjmp_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "longjmp", "setjmp", "siglongjmp", "sigsetjmp"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <signal.h>.  */
Packit 6c4009
static const char *const signal_syms[] =
Packit 6c4009
{
Packit 6c4009
  "SA_NOCLDSTOP", "SA_SIGINFO", "SIGABRT", "SIGALRM", "SIGBUS", "SIGCHLD",
Packit 6c4009
  "SIGCONT", "SIGEV_NONE", "SIGEV_SIGNAL", "SIGEV_THREAD",
Packit 6c4009
  "SIGFPE", "SIGHUP", "SIGILL", "SIGINT", "SIGKILL", "SIGPIPE", "SIGQUIT",
Packit 6c4009
  "SIGRTMAX", "SIGRTMIN", "SIGSEGV", "SIGSTOP", "SIGTERM", "SIGTSTP",
Packit 6c4009
  "SIGTTIN", "SIGTTOU", "SIGUSR1", "SIGUSR2", "SIG_BLOCK", "SIG_DFL",
Packit 6c4009
  "SIG_ERR", "SIG_IGN", "SIG_SETMASK", "SIG_UNBLOCK", "SI_ASYNCIO",
Packit 6c4009
  "SI_MESGQ", "SI_QUEUE", "SI_TIMER", "SI_USER"
Packit 6c4009
};
Packit 6c4009
static const char *const signal_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "kill", "raise", "sigaction", "sigaddset", "sigdelset", "sigemptyset",
Packit 6c4009
  "sigfillset", "sigismember", "signal", "sigpending", "sigprocmask",
Packit 6c4009
  "sigqueue", "sigsuspend", "sigtimedwait", "sigwait", "sigwaitinfo"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <stdarg.h>.  */
Packit 6c4009
static const char *const stdarg_syms[] =
Packit 6c4009
{
Packit 6c4009
  "va_arg", "va_end", "va_start"
Packit 6c4009
};
Packit 6c4009
static const char *const stdarg_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "va_list"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <stddef.h>.  */
Packit 6c4009
static const char *const stddef_syms[] =
Packit 6c4009
{
Packit 6c4009
  "NULL", "offsetof"
Packit 6c4009
};
Packit 6c4009
static const char *const stddef_maybe[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <stdio.h>.  */
Packit 6c4009
static const char *const stdio_syms[] =
Packit 6c4009
{
Packit 6c4009
  "BUFSIZ", "EOF", "FILENAME_MAX", "FOPEN_MAX", "L_ctermid", "L_cuserid",
Packit 6c4009
  "L_tmpnam", "NULL", "SEEK_CUR", "SEEK_END", "SEEK_SET", "STREAM_MAX",
Packit 6c4009
  "TMP_MAX", "stderr", "stdin", "stdout", "_IOFBF", "_IOLBF", "_IONBF"
Packit 6c4009
};
Packit 6c4009
static const char *const stdio_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "clearerr", "fclose", "fdopen", "feof", "ferror", "fflush", "fgetc",
Packit 6c4009
  "fgetpos", "fgets", "fileno", "flockfile", "fopen", "fprintf", "fputc",
Packit 6c4009
  "fputs", "fread", "freopen", "fscanf", "fseek", "fsetpos", "ftell",
Packit 6c4009
  "ftrylockfile", "funlockfile", "fwrite", "getc", "getchar",
Packit 6c4009
  "getchar_unlocked", "getc_unlocked", "gets", "perror", "printf", "putc",
Packit 6c4009
  "putchar", "putchar_unlocked", "putc_unlocked", "puts", "remove", "rename",
Packit 6c4009
  "rewind", "scanf", "setbuf", "setvbuf", "sprintf", "sscanf", "tmpfile",
Packit 6c4009
  "tmpnam", "ungetc", "vfprintf", "vprintf", "vsprintf"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <stdlib.h>.  */
Packit 6c4009
static const char *const stdlib_syms[] =
Packit 6c4009
{
Packit 6c4009
  "EXIT_FAILURE", "EXIT_SUCCESS", "MB_CUR_MAX", "NULL", "RAND_MAX"
Packit 6c4009
};
Packit 6c4009
static const char *const stdlib_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "abort", "abs", "atexit", "atof", "atoi", "atol", "bsearch", "calloc",
Packit 6c4009
  "div", "exit", "free", "getenv", "labs", "ldiv", "malloc", "mblen",
Packit 6c4009
  "mbstowcs", "mbtowc", "qsort", "rand", "rand_r", "realloc", "srand",
Packit 6c4009
  "strtod", "strtol", "strtoul", "system", "wcstombs", "wctomb"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <string.h>.  */
Packit 6c4009
static const char *const string_syms[] =
Packit 6c4009
{
Packit 6c4009
  "NULL"
Packit 6c4009
};
Packit 6c4009
static const char *const string_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "memchr", "memcmp", "memcpy", "memmove", "memset", "strcat", "strchr",
Packit 6c4009
  "strcmp", "strcoll", "strcpy", "strcspn", "strerror", "strlen",
Packit 6c4009
  "strncat", "strncmp", "strncpy", "strpbrk", "strrchr", "strspn",
Packit 6c4009
  "strstr", "strtok", "strtok_r", "strxfrm"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <sys/mman.h>.  */
Packit 6c4009
static const char *const mman_syms[] =
Packit 6c4009
{
Packit 6c4009
  "MAP_FAILED", "MAP_FIXED", "MAP_PRIVATE", "MAP_SHARED", "MCL_CURRENT",
Packit 6c4009
  "MCL_FUTURE", "MS_ASYNC", "MS_INVALIDATE", "MS_SYNC", "PROT_EXEC",
Packit 6c4009
  "PROT_NONE", "PROT_READ", "PROT_WRITE"
Packit 6c4009
};
Packit 6c4009
static const char *const mman_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "mlock", "mlockall", "mmap", "mprotect", "msync", "munlock", "munlockall",
Packit 6c4009
  "munmap", "shm_open", "shm_unlock"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <sys/stat.h>.  */
Packit 6c4009
static const char *const stat_syms[] =
Packit 6c4009
{
Packit 6c4009
  "S_IRGRP", "S_IROTH", "S_IRUSR", "S_IRWXG", "S_IRWXO", "S_IRWXU",
Packit 6c4009
  "S_ISBLK", "S_ISCHR", "S_ISDIR", "S_ISFIFO", "S_ISGID", "S_ISREG",
Packit 6c4009
  "S_ISUID", "S_IWGRP", "S_IWOTH", "S_IWUSR", "S_IXGRP", "S_IXOTH",
Packit 6c4009
  "S_IXUSR", "S_TYPEISMQ", "S_TYPEISSEM", "S_TYPEISSHM"
Packit 6c4009
};
Packit 6c4009
static const char *const stat_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "chmod", "fchmod", "fstat", "mkdir", "mkfifo", "stat", "umask"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <sys/times.h>.  */
Packit 6c4009
static const char *const times_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const times_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "times"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <sys/types.h>.  */
Packit 6c4009
static const char *const types_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const types_maybe[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <sys/utsname.h>.  */
Packit 6c4009
static const char *const utsname_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const utsname_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "uname"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <sys/wait.h>.  */
Packit 6c4009
static const char *const wait_syms[] =
Packit 6c4009
{
Packit 6c4009
  "WEXITSTATUS", "WIFEXITED", "WIFSIGNALED", "WIFSTOPPED", "WNOHANG",
Packit 6c4009
  "WSTOPSIG", "WTERMSIG", "WUNTRACED"
Packit 6c4009
};
Packit 6c4009
static const char *const wait_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "wait", "waitpid"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <termios.h>.  */
Packit 6c4009
static const char *const termios_syms[] =
Packit 6c4009
{
Packit 6c4009
  "B0", "B110", "B1200", "B134", "B150", "B1800", "B19200", "B200", "B2400",
Packit 6c4009
  "B300", "B38400", "B4800", "B50", "B600", "B75", "B9600", "BRKINT", "CLOCAL",
Packit 6c4009
  "CREAD", "CS5", "CS6", "CS7", "CS8", "CSIZE", "CSTOPN", "ECHO", "ECHOE",
Packit 6c4009
  "ECHOK", "ECHONL", "HUPCL", "ICANON", "ICRNL", "IEXTEN", "IGNBRK", "IGNCR",
Packit 6c4009
  "IGNPAR", "INCLR", "INPCK", "ISIG", "ISTRIP", "IXOFF", "IXON", "NCCS",
Packit 6c4009
  "NOFLSH", "OPOST", "PARENB", "PARMRK", "PARODD", "TCIFLUSH", "TCIOFF",
Packit 6c4009
  "TCIOFLUSH", "TCOFLUSH", "TCOOFF", "TCOON", "TCSADRAIN", "TCSAFLUSH",
Packit 6c4009
  "TCSANOW", "TOSTOP", "VEOF", "VEOL", "VERASE", "VINTR", "VKILL", "VMIN",
Packit 6c4009
  "VQUIT", "VSTART", "VSTOP", "VSUSP", "VTIME"
Packit 6c4009
};
Packit 6c4009
static const char *const termios_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "cfgetispeed", "cfgetospeed", "cfsetispeed", "cfsetospeed", "tcdrain",
Packit 6c4009
  "tcflow", "tcflush", "tcgetattr", "tcsendbrk", "tcsetattr"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <time.h>.  */
Packit 6c4009
static const char *const time_syms[] =
Packit 6c4009
{
Packit 6c4009
  "CLK_TCK", "CLOCKS_PER_SEC", "CLOCK_REALTIME", "NULL", "TIMER_ABSTIME"
Packit 6c4009
};
Packit 6c4009
static const char *const time_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "asctime", "asctime_r", "clock", "clock_getres", "clock_gettime",
Packit 6c4009
  "clock_settime", "ctime", "ctime_r", "difftime", "gmtime", "gmtime_r",
Packit 6c4009
  "localtime", "localtime_r", "mktime", "nanosleep", "strftime", "time",
Packit 6c4009
  "timer_create", "timer_delete", "timer_getoverrun", "timer_gettime",
Packit 6c4009
  "timer_settime", "tzset"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <unistd.h>.  */
Packit 6c4009
static const char *const unistd_syms[] =
Packit 6c4009
{
Packit 6c4009
  "F_OK", "NULL", "R_OK", "SEEK_CUR", "SEEK_END", "SEEK_SET", "STDERR_FILENO",
Packit 6c4009
  "STDIN_FILENO", "STDOUT_FILENO", "W_OK", "X_OK",
Packit 6c4009
  "_PC_ASYNC_IO", "_PC_CHOWN_RESTRICTED", "_PC_LINK_MAX", "_PC_MAX_CANON",
Packit 6c4009
  "_PC_MAX_INPUT", "_PC_NAME_MAX", "_PC_NO_TRUNC", "_PC_PATH_MAX",
Packit 6c4009
  "_PC_PIPE_BUF", "_PC_PRIO_IO", "_PC_SYNC_IO", "_PC_VDISABLE",
Packit 6c4009
  "_SC_AIO_LISTIO_MAX", "_SC_AIO_MAX", "_SC_AIO_PRIO_DELTA_MAX",
Packit 6c4009
  "_SC_ARG_MAX", "_SC_ASYNCHRONOUS_IO", "_SC_CHILD_MAX", "_SC_CLK_TCK",
Packit 6c4009
  "_SC_DELAYTIMER_MAX", "_SC_FSYNC", "_SC_GETGR_R_SIZE_MAX",
Packit 6c4009
  "_SC_GETPW_R_SIZE_MAX", "_SC_JOB_CONTROL", "_SC_LOGIN_NAME_MAX",
Packit 6c4009
  "_SC_MAPPED_FILES", "_SC_MEMLOCK", "_SC_MEMLOCK_RANGE",
Packit 6c4009
  "_SC_MEMORY_PROTECTION", "_SC_MESSAGE_PASSING", "_SC_MQ_OPEN_MAX",
Packit 6c4009
  "_SC_MQ_PRIO_MAX", "_SC_NGROUPS_MAX", "_SC_OPEN_MAX", "_SC_PAGESIZE",
Packit 6c4009
  "_SC_PRIORITIZED_IO", "_SC_PRIORITY_SCHEDULING", "_SC_REALTIME_SIGNALS",
Packit 6c4009
  "_SC_RTSIG_MAX", "_SC_SAVED_IDS", "_SC_SEMAPHORES", "_SC_SEM_NSEMS_MAX",
Packit 6c4009
  "_SC_SEM_VALUE_MAX", "_SC_SHARED_MEMORY_OBJECTS", "_SC_SIGQUEUE_MAX",
Packit 6c4009
  "_SC_STREAM_MAX", "_SC_SYNCHRONIZED_IO", "_SC_THREADS",
Packit 6c4009
  "_SC_THREAD_ATTR_STACKADDR", "_SC_THREAD_ATTR_STACKSIZE",
Packit 6c4009
  "_SC_THREAD_DESTRUCTOR_ITERATIONS", "_SC_THREAD_PRIO_INHERIT",
Packit 6c4009
  "_SC_THREAD_PRIORITY_SCHEDULING", "_SC_THREAD_PRIO_PROTECT",
Packit 6c4009
  "_SC_THREAD_PROCESS_SHARED", "_SC_THREAD_SAFE_FUNCTIONS",
Packit 6c4009
  "_SC_THREAD_STACK_MIN", "_SC_THREAD_THREADS_MAX", "_SC_TIMERS",
Packit 6c4009
  "_SC_TIMER_MAX", "_SC_TTY_NAME_MAX", "_SC_TZNAME_MAX", "_SC_VERSION"
Packit 6c4009
};
Packit 6c4009
static const char *const unistd_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "_POSIX_ASYNCHRONOUS_IO", "_POSIX_ASYNC_IO", "_POSIX_CHOWN_RESTRICTED",
Packit 6c4009
  "_POSIX_FSYNC", "_POSIX_JOB_CONTROL", "_POSIX_MAPPED_FILES",
Packit 6c4009
  "_POSIX_MEMLOCK", "_POSIX_MEMLOCK_RANGE", "_MEMORY_PROTECTION",
Packit 6c4009
  "_POSIX_MESSAGE_PASSING", "_POSIX_NO_TRUNC", "_POSIX_PRIORITIZED_IO",
Packit 6c4009
  "_POSIX_PRIORITY_SCHEDULING", "_POSIX_PRIO_IO", "_POSIX_REATIME_SIGNALS",
Packit 6c4009
  "_POSIX_SAVED_IDS", "_POSIX_SEMAPHORES", "_POSIX_SHARED_MEMORY_OBJECTS",
Packit 6c4009
  "_POSIX_SYNCHRONIZED_IO", "_POSIX_SYNC_IO", "_POSIX_THREADS",
Packit 6c4009
  "_POSIX_THREAD_ATTR_STACKADDR", "_POSIX_THREAD_ATTR_STACKSIZE",
Packit 6c4009
  "_POSIX_THREAD_PRIO_INHERIT", "_POSIX_THREAD_PRIO_PROTECT",
Packit 6c4009
  "_POSIX_THREAD_PROCESS_SHARED", "_POSIX_THREAD_SAFE_FUNCTIONS",
Packit 6c4009
  "_POSIX_THREAD_PRIORITY_SCHEDULING", "_POSIX_TIMERS",
Packit 6c4009
  "_POSIX_VDISABLE", "_POSIX_VERSION",
Packit 6c4009
  "_exit", "access", "alarm", "chdir", "chown", "close", "ctermid", "cuserid",
Packit 6c4009
  "dup2", "dup", "execl", "execle", "execlp", "execv", "execve", "execvp",
Packit 6c4009
  "fdatasync", "fork", "fpathconf", "fsync", "ftruncate", "getcwd", "getegid",
Packit 6c4009
  "geteuid", "getgid", "getgroups", "getlogin", "getlogin_r", "getpgrp",
Packit 6c4009
  "getpid", "getppid", "getuid", "isatty", "link", "lseek", "pathconf",
Packit 6c4009
  "pause", "pipe", "read", "rmdir", "setgid", "setgpid", "setsid", "setuid",
Packit 6c4009
  "sleep", "sleep", "sysconf", "tcgetpgrp", "tcsetpgrp", "ttyname",
Packit 6c4009
  "ttyname_r", "unlink", "write"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* <utime.h>.  */
Packit 6c4009
static const char *const utime_syms[] =
Packit 6c4009
{
Packit 6c4009
};
Packit 6c4009
static const char *const utime_maybe[] =
Packit 6c4009
{
Packit 6c4009
  "utime"
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
Packit 6c4009
static struct header
Packit 6c4009
{
Packit 6c4009
  const char *name;
Packit 6c4009
  const char *const *syms;
Packit 6c4009
  size_t nsyms;
Packit 6c4009
  const char *const *maybe;
Packit 6c4009
  size_t nmaybe;
Packit 6c4009
  const char *subset;
Packit 6c4009
} headers[] =
Packit 6c4009
{
Packit 6c4009
#define H(n) \
Packit 6c4009
  { #n ".h", n##_syms, sizeof (n##_syms) / sizeof (n##_syms[0]), \
Packit 6c4009
    n##_maybe, sizeof (n##_maybe) / sizeof (n##_maybe[0]), NULL }
Packit 6c4009
#define Hc(n, s) \
Packit 6c4009
  { #n ".h", n##_syms, sizeof (n##_syms) / sizeof (n##_syms[0]), \
Packit 6c4009
    n##_maybe, sizeof (n##_maybe) / sizeof (n##_maybe[0]), s }
Packit 6c4009
#define Hs(n) \
Packit 6c4009
  { "sys/" #n ".h", n##_syms, sizeof (n##_syms) / sizeof (n##_syms[0]), \
Packit 6c4009
    n##_maybe, sizeof (n##_maybe) / sizeof (n##_maybe[0]), NULL }
Packit 6c4009
  H(aio),
Packit 6c4009
  H(assert),
Packit 6c4009
  H(ctype),
Packit 6c4009
  H(dirent),
Packit 6c4009
  H(errno),
Packit 6c4009
  H(fcntl),
Packit 6c4009
  H(float),
Packit 6c4009
  H(grp),
Packit 6c4009
  H(limits),
Packit 6c4009
  H(locale),
Packit 6c4009
  H(math),
Packit 6c4009
  Hc(mqueue, "_POSIX_MESSAGE_PASSING"),
Packit 6c4009
  H(pthread),
Packit 6c4009
  H(pwd),
Packit 6c4009
  H(sched),
Packit 6c4009
  H(semaphore),
Packit 6c4009
  H(setjmp),
Packit 6c4009
  H(signal),
Packit 6c4009
  H(stdarg),
Packit 6c4009
  H(stddef),
Packit 6c4009
  H(stdio),
Packit 6c4009
  H(stdlib),
Packit 6c4009
  H(string),
Packit 6c4009
  Hs(mman),
Packit 6c4009
  Hs(stat),
Packit 6c4009
  Hs(times),
Packit 6c4009
  Hs(types),
Packit 6c4009
  Hs(utsname),
Packit 6c4009
  Hs(wait),
Packit 6c4009
  H(termios),
Packit 6c4009
  H(time),
Packit 6c4009
  H(unistd),
Packit 6c4009
  H(utime)
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
#define NUMBER_OF_HEADERS              (sizeof headers / sizeof *headers)
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* Format string to build command to invoke compiler.  */
Packit 6c4009
static const char fmt[] = "\
Packit 6c4009
echo \"#include <%s>\" |\
Packit 6c4009
%s -E -dM -D_POSIX_SOURCE %s \
Packit 6c4009
-isystem `%s --print-prog-name=include` - > %s";
Packit 6c4009
Packit 6c4009
static const char testfmt[] = "\
Packit 6c4009
echo \"#include <unistd.h>\n#if !defined %s || %s == -1\n#error not defined\n#endif\n\" |\
Packit 6c4009
%s -E -dM -D_POSIX_SOURCE %s \
Packit 6c4009
-isystem `%s --print-prog-name=include` - 2> /dev/null > %s";
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* The compiler we use (given on the command line).  */
Packit 6c4009
const char *CC;
Packit 6c4009
/* The -I parameters for CC to find all headers.  */
Packit 6c4009
const char *INC;
Packit 6c4009
Packit 6c4009
static char *xstrndup (const char *, size_t);
Packit 6c4009
static const char **get_null_defines (void);
Packit 6c4009
static int check_header (const struct header *, const char **);
Packit 6c4009
static int xsystem (const char *);
Packit 6c4009
Packit 6c4009
int
Packit 6c4009
main (int argc, char *argv[])
Packit 6c4009
{
Packit 6c4009
  int h;
Packit 6c4009
  int result = 0;
Packit 6c4009
  const char **ignore_list;
Packit 6c4009
Packit 6c4009
  CC = argc > 1 ? argv[1] : "gcc";
Packit 6c4009
  INC = argc > 2 ? argv[2] : "";
Packit 6c4009
Packit 6c4009
  if (system (NULL) == 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("Sorry, no command processor.");
Packit 6c4009
      return EXIT_FAILURE;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  /* First get list of symbols which are defined by the compiler.  */
Packit 6c4009
  ignore_list = get_null_defines ();
Packit 6c4009
Packit 6c4009
  fputs ("Tested files:\n", stdout);
Packit 6c4009
Packit 6c4009
  for (h = 0; h < NUMBER_OF_HEADERS; ++h)
Packit 6c4009
    result |= check_header (&headers[h], ignore_list);
Packit 6c4009
Packit 6c4009
  remove (macrofile);
Packit 6c4009
Packit 6c4009
  /* The test suite should return errors but for now this is not
Packit 6c4009
     practical.  Give a warning and ask the user to correct the bugs.  */
Packit 6c4009
  return result;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static char *
Packit 6c4009
xstrndup (const char *s, size_t n)
Packit 6c4009
{
Packit 6c4009
  size_t len = n;
Packit 6c4009
  char *new = malloc (len + 1);
Packit 6c4009
Packit 6c4009
  if (new == NULL)
Packit 6c4009
    return NULL;
Packit 6c4009
Packit 6c4009
  new[len] = '\0';
Packit 6c4009
  return memcpy (new, s, len);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* Like system but propagate interrupt and quit signals.  */
Packit 6c4009
int
Packit 6c4009
xsystem (const char *cmd)
Packit 6c4009
{
Packit 6c4009
  int status;
Packit 6c4009
Packit 6c4009
  status = system (cmd);
Packit 6c4009
  if (status != -1)
Packit 6c4009
    {
Packit 6c4009
      if (WIFSIGNALED (status))
Packit 6c4009
	{
Packit 6c4009
	  if (WTERMSIG (status) == SIGINT || WTERMSIG (status) == SIGQUIT)
Packit 6c4009
	    raise (WTERMSIG (status));
Packit 6c4009
	}
Packit 6c4009
      else if (WIFEXITED (status))
Packit 6c4009
	{
Packit 6c4009
	  if (WEXITSTATUS (status) == SIGINT + 128
Packit 6c4009
	      || WEXITSTATUS (status) == SIGQUIT + 128)
Packit 6c4009
	    raise (WEXITSTATUS (status) - 128);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
  return status;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static const char **
Packit 6c4009
get_null_defines (void)
Packit 6c4009
{
Packit 6c4009
  char line[BUFSIZ], *command;
Packit 6c4009
  char **result = NULL;
Packit 6c4009
  size_t result_len = 0;
Packit 6c4009
  size_t result_max = 0;
Packit 6c4009
  FILE *input;
Packit 6c4009
  int first = 1;
Packit 6c4009
Packit 6c4009
  int fd = mkstemp (macrofile);
Packit 6c4009
  if (fd == -1)
Packit 6c4009
    {
Packit 6c4009
      printf ("mkstemp failed: %m\n");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
  close (fd);
Packit 6c4009
Packit 6c4009
  command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC)
Packit 6c4009
		    + strlen (INC) + strlen (macrofile));
Packit 6c4009
Packit 6c4009
  if (command == NULL)
Packit 6c4009
    {
Packit 6c4009
      puts ("No more memory.");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile);
Packit 6c4009
Packit 6c4009
  if (xsystem (command))
Packit 6c4009
    {
Packit 6c4009
      puts ("system() returned nonzero");
Packit 6c4009
      return NULL;
Packit 6c4009
    }
Packit 6c4009
  free (command);
Packit 6c4009
  input = fopen (macrofile, "r");
Packit 6c4009
Packit 6c4009
  if (input == NULL)
Packit 6c4009
    {
Packit 6c4009
      printf ("Could not read %s: ", macrofile);
Packit 6c4009
      perror (NULL);
Packit 6c4009
      return NULL;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  while (fgets (line, sizeof line, input) != NULL)
Packit 6c4009
    {
Packit 6c4009
      char *start;
Packit 6c4009
      if (strlen (line) < 9 || line[7] != ' ')
Packit 6c4009
	{ /* "#define A" */
Packit 6c4009
	  printf ("Malformed input, expected '#define MACRO'\ngot '%s'\n",
Packit 6c4009
		  line);
Packit 6c4009
	  continue;
Packit 6c4009
	}
Packit 6c4009
      if (line[8] == '_')
Packit 6c4009
	/* It's a safe identifier.  */
Packit 6c4009
	continue;
Packit 6c4009
      if (result_len == result_max)
Packit 6c4009
	{
Packit 6c4009
	  result_max += 10;
Packit 6c4009
	  result = realloc (result, result_max * sizeof (char **));
Packit 6c4009
	  if (result == NULL)
Packit 6c4009
	    {
Packit 6c4009
	      puts ("No more memory.");
Packit 6c4009
	      exit (1);
Packit 6c4009
	    }
Packit 6c4009
	}
Packit 6c4009
      start = &line[8];
Packit 6c4009
      result[result_len++] = xstrndup (start, strcspn (start, " ("));
Packit 6c4009
Packit 6c4009
      if (first)
Packit 6c4009
	{
Packit 6c4009
	  fputs ("The following identifiers will be ignored since the compiler defines them\nby default:\n", stdout);
Packit 6c4009
	  first = 0;
Packit 6c4009
	}
Packit 6c4009
      puts (result[result_len - 1]);
Packit 6c4009
    }
Packit 6c4009
  if (result_len == result_max)
Packit 6c4009
    {
Packit 6c4009
      result_max += 1;
Packit 6c4009
      result = realloc (result, result_max * sizeof (char **));
Packit 6c4009
      if (result == NULL)
Packit 6c4009
	{
Packit 6c4009
	  puts ("No more memory.");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
  result[result_len] = NULL;
Packit 6c4009
  fclose (input);
Packit 6c4009
Packit 6c4009
  return (const char **) result;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
check_header (const struct header *header, const char **except)
Packit 6c4009
{
Packit 6c4009
  char line[BUFSIZ], command[sizeof fmt + strlen (header->name)
Packit 6c4009
			     + 2 * strlen (CC)
Packit 6c4009
			     + strlen (INC) + strlen (macrofile)];
Packit 6c4009
  FILE *input;
Packit 6c4009
  int result = 0;
Packit 6c4009
  int found[header->nsyms];
Packit 6c4009
  int i;
Packit 6c4009
Packit 6c4009
  memset (found, '\0', header->nsyms * sizeof (int));
Packit 6c4009
Packit 6c4009
  printf ("=== %s ===\n", header->name);
Packit 6c4009
  sprintf (command, fmt, header->name, CC, INC, CC, macrofile);
Packit 6c4009
Packit 6c4009
  /* First see whether this subset is supported at all.  */
Packit 6c4009
  if (header->subset != NULL)
Packit 6c4009
    {
Packit 6c4009
      sprintf (line, testfmt, header->subset, header->subset, CC, INC, CC,
Packit 6c4009
	       macrofile);
Packit 6c4009
      if (xsystem (line))
Packit 6c4009
	{
Packit 6c4009
	  printf ("!! not available\n");
Packit 6c4009
	  return 0;
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (xsystem (command))
Packit 6c4009
    {
Packit 6c4009
      puts ("system() returned nonzero");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
  input = fopen (macrofile, "r");
Packit 6c4009
Packit 6c4009
  if (input == NULL)
Packit 6c4009
    {
Packit 6c4009
      printf ("Could not read %s: ", macrofile);
Packit 6c4009
      perror (NULL);
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  while (fgets (line, sizeof line, input) != NULL)
Packit 6c4009
    {
Packit 6c4009
      const char **ignore;
Packit 6c4009
      if (strlen (line) < 9 || line[7] != ' ')
Packit 6c4009
	{ /* "#define A" */
Packit 6c4009
	  printf ("Malformed input, expected '#define MACRO'\ngot '%s'\n",
Packit 6c4009
		  line);
Packit 6c4009
	  result = 1;
Packit 6c4009
	  continue;
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      /* Find next char after the macro identifier; this can be either
Packit 6c4009
	 a space or an open parenthesis.  */
Packit 6c4009
      line[8 + strcspn (&line[8], " (")] = '\0';
Packit 6c4009
Packit 6c4009
      /* Now check whether it's one of the required macros.  */
Packit 6c4009
      for (i = 0; i < header->nsyms; ++i)
Packit 6c4009
	if (!strcmp (&line[8], header->syms[i]))
Packit 6c4009
	  break;
Packit 6c4009
      if (i < header->nsyms)
Packit 6c4009
	{
Packit 6c4009
	  found[i] = 1;
Packit 6c4009
	  continue;
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      /* Symbols starting with "_" are ok.  */
Packit 6c4009
      if (line[8] == '_')
Packit 6c4009
	continue;
Packit 6c4009
Packit 6c4009
      /* Maybe one of the symbols which are always defined.  */
Packit 6c4009
      for (ignore = except; *ignore != NULL; ++ignore)
Packit 6c4009
	if (! strcmp (&line[8], *ignore))
Packit 6c4009
	  break;
Packit 6c4009
      if (*ignore != NULL)
Packit 6c4009
	continue;
Packit 6c4009
Packit 6c4009
      /* Otherwise the symbol better should match one of the following.  */
Packit 6c4009
      for (i = 0; i < header->nmaybe; ++i)
Packit 6c4009
	if (fnmatch (header->maybe[i], &line[8], 0) == 0)
Packit 6c4009
	  break;
Packit 6c4009
      if (i < header->nmaybe)
Packit 6c4009
	continue;
Packit 6c4009
Packit 6c4009
      printf ("*  invalid macro `%s'\n", &line[8]);
Packit 6c4009
      result |= 1;
Packit 6c4009
    }
Packit 6c4009
  fclose (input);
Packit 6c4009
Packit 6c4009
  for (i = 0; i < header->nsyms; ++i)
Packit 6c4009
    if (found[i] == 0)
Packit 6c4009
      printf ("** macro `%s' not defined\n", header->syms[i]);
Packit 6c4009
Packit 6c4009
  return result;
Packit 6c4009
}