/* source: procan-cdefs.c */
/* Copyright Gerhard Rieger and contributors (see file CHANGES) */
/* Published under the GNU General Public License V.2, see file COPYING */

/* a function that prints compile time parameters */
/* the set of parameters is only a small subset of the available defines and
   will be extended on demand */


#include "xiosysincludes.h"
#include "mytypes.h"
#include "compat.h"
#include "error.h"

#include "procan.h"

int procan_cdefs(FILE *outfile) {
   /* System constants */
#ifdef __KERNEL__
   fprintf(outfile, "__KERNEL__                = \"%s\"\n", __KERNEL__);
#endif
#ifdef __GLIBC__
   fprintf(outfile, "__GLIBC__                 = %d\n", __GLIBC__);
#endif
   /* Basic C/system constants */
#ifdef FD_SETSIZE
   fprintf(outfile, "#define FD_SETSIZE  %u\n", FD_SETSIZE);
#endif
#ifdef NFDBITS
   fprintf(outfile, "#define NFDBITS     %d\n", (int)NFDBITS);
#endif
#ifdef O_RDONLY
   fprintf(outfile, "#define O_RDONLY    %u\n", O_RDONLY);
#endif
#ifdef O_WRONLY
   fprintf(outfile, "#define O_WRONLY    %u\n", O_WRONLY);
#endif
#ifdef O_RDWR
   fprintf(outfile, "#define O_RDWR      %u\n", O_RDWR);
#endif
#ifdef O_CREAT
   fprintf(outfile, "#define O_CREAT     0x%06x  /* 0%08o */\n", O_CREAT, O_CREAT);
#endif
#ifdef O_EXCL
   fprintf(outfile, "#define O_EXCL      0x%06x  /* 0%08o */\n", O_EXCL, O_EXCL);
#endif
#ifdef O_NOCTTY
   fprintf(outfile, "#define O_NOCTTY    0x%06x  /* 0%08o */\n", O_NOCTTY, O_NOCTTY);
#endif
#ifdef O_TRUNC
   fprintf(outfile, "#define O_TRUNC     0x%06x  /* 0%08o */\n", O_TRUNC, O_TRUNC);
#endif
#ifdef O_APPEND
   fprintf(outfile, "#define O_APPEND    0x%06x  /* 0%08o */\n", O_APPEND, O_APPEND);
#endif
#ifdef O_NONBLOCK
   fprintf(outfile, "#define O_NONBLOCK  0x%06x  /* 0%08o */\n", O_NONBLOCK, O_NONBLOCK);
#endif
#ifdef O_NDELAY
   fprintf(outfile, "#define O_NDELAY    0x%06x  /* 0%08o */\n", O_NDELAY, O_NDELAY);
#endif
#ifdef O_SYNC
   fprintf(outfile, "#define O_SYNC      0x%06x  /* 0%08o */\n", O_SYNC, O_SYNC);
#endif
#ifdef O_FSYNC
   fprintf(outfile, "#define O_FSYNC     0x%06x  /* 0%08o */\n", O_FSYNC, O_FSYNC);
#endif
#ifdef O_LARGEFILE
   fprintf(outfile, "#define O_LARGEFILE 0x%06x  /* 0%08o */\n", O_LARGEFILE, O_LARGEFILE);
#endif
#ifdef O_DIRECTORY
   fprintf(outfile, "#define O_DIRECTORY 0x%06x  /* 0%08o */\n", O_DIRECTORY, O_DIRECTORY);
#endif
#ifdef O_NOFOLLOW
   fprintf(outfile, "#define O_NOFOLLOW  0x%06x  /* 0%08o */\n", O_NOFOLLOW, O_NOFOLLOW);
#endif
#ifdef O_CLOEXEC
   fprintf(outfile, "#define O_CLOEXEC   0x%06x  /* 0%08o */\n", O_CLOEXEC, O_CLOEXEC);
#endif
#ifdef O_DIRECT
   fprintf(outfile, "#define O_DIRECT    0x%06x  /* 0%08o */\n", O_DIRECT, O_DIRECT);
#endif
#ifdef O_NOATIME
   fprintf(outfile, "#define O_NOATIME   0x%06x  /* 0%08o */\n", O_NOATIME, O_NOATIME);
#endif
#ifdef O_PATH
   fprintf(outfile, "#define O_PATH      0x%06x  /* 0%08o */\n", O_PATH, O_PATH);
#endif
#ifdef O_DSYNC
   fprintf(outfile, "#define O_DSYNC     0x%06x  /* 0%08o */\n", O_SYNC, O_SYNC);
#endif
#ifdef O_TMPFILE
   fprintf(outfile, "#define O_TMPFILE   0x%06x  /* 0%08o */\n", O_TMPFILE, O_TMPFILE);
#endif
#ifdef SHUT_RD
   fprintf(outfile, "#define SHUT_RD     %u\n", SHUT_RD);
#endif
#ifdef SHUT_WR
   fprintf(outfile, "#define SHUT_WR     %u\n", SHUT_WR);
#endif
#ifdef SHUT_RDWR
   fprintf(outfile, "#define SHUT_RDWR   %u\n", SHUT_RDWR);
#endif

   /* Compile time controls */
#ifdef _FILE_OFFSET_BITS
   fprintf(outfile, "#define _FILE_OFFSET_BITS %u\n", _FILE_OFFSET_BITS);
#endif
#ifdef _LARGE_FILES
   fprintf(outfile, "#define _LARGE_FILES %u\n", _LARGE_FILES);
#endif

   /* termios constants */
#ifdef CRDLY
   fprintf(outfile, "#define CRDLY       0x%08x  /* 0%011o */\n", CRDLY, CRDLY);
#endif
#ifdef CR0
   fprintf(outfile, "#define CR0         0x%08x  /* 0%011o */\n", CR0, CR0);
#endif
#ifdef CR1
   fprintf(outfile, "#define CR1         0x%08x  /* 0%011o */\n", CR1, CR1);
#endif
#ifdef CR2
   fprintf(outfile, "#define CR2         0x%08x  /* 0%011o */\n", CR2, CR2);
#endif
#ifdef CR3
   fprintf(outfile, "#define CR3         0x%08x  /* 0%011o */\n", CR3, CR3);
#endif
#ifdef TABDLY
   fprintf(outfile, "#define TABDLY      0x%08x  /* 0%011o */\n", TABDLY, TABDLY);
#endif
#ifdef TAB0
   fprintf(outfile, "#define TAB0        0x%08x  /* 0%011o */\n", TAB0, TAB0);
#endif
#ifdef TAB1
   fprintf(outfile, "#define TAB1        0x%08x  /* 0%011o */\n", TAB1, TAB1);
#endif
#ifdef TAB2
   fprintf(outfile, "#define TAB2        0x%08x  /* 0%011o */\n", TAB2, TAB2);
#endif
#ifdef TAB3
   fprintf(outfile, "#define TAB3        0x%08x  /* 0%011o */\n", TAB3, TAB3);
#endif
#ifdef CSIZE
   fprintf(outfile, "#define CSIZE       0x%08x  /* 0%011o */\n", CSIZE, CSIZE);
#endif
#ifdef TIOCEXCL
   fprintf(outfile, "#define TIOCEXCL    0x%lx\n", (unsigned long)TIOCEXCL);
#endif

   /* stdio constants */
#ifdef FOPEN_MAX
   fprintf(outfile, "#define FOPEN_MAX %u\n", FOPEN_MAX);
#endif

   /* socket constants */
#ifdef PF_UNSPEC
   fprintf(outfile, "#define PF_UNSPEC %d\n", PF_UNSPEC);
#endif
#ifdef PF_UNIX
   fprintf(outfile, "#define PF_UNIX %d\n", PF_UNIX);
#elif defined(PF_LOCAL)
   fprintf(outfile, "#define PF_LOCAL %d\n", PF_LOCAL);
#endif
#ifdef PF_INET
   fprintf(outfile, "#define PF_INET %d\n", PF_INET);
#endif
#ifdef PF_INET6
   fprintf(outfile, "#define PF_INET6 %d\n", PF_INET6);
#endif
#ifdef PF_APPLETALK
   fprintf(outfile, "#define PF_APPLETALK %d\n", PF_APPLETALK);
#endif
#ifdef PF_PACKET
   fprintf(outfile, "#define PF_PACKET %d\n", PF_PACKET);
#endif
#ifdef PF_VSOCK
   fprintf(outfile, "#define PF_VSOCK %d\n", PF_VSOCK);
#endif
#ifdef SOCK_STREAM
   fprintf(outfile, "#define SOCK_STREAM %d\n", SOCK_STREAM);
#endif
#ifdef SOCK_DGRAM
   fprintf(outfile, "#define SOCK_DGRAM %d\n", SOCK_DGRAM);
#endif
#ifdef SOCK_RAW
   fprintf(outfile, "#define SOCK_RAW %d\n", SOCK_RAW);
#endif
#ifdef SOCK_SEQPACKET
   fprintf(outfile, "#define SOCK_SEQPACKET %d\n", SOCK_SEQPACKET);
#endif
#ifdef SOCK_PACKET
   fprintf(outfile, "#define SOCK_PACKET %d\n", SOCK_PACKET);
#endif
#ifdef IPPROTO_IP
   fprintf(outfile, "#define IPPROTO_IP %d\n", IPPROTO_IP);
#endif
#ifdef IPPROTO_TCP
   fprintf(outfile, "#define IPPROTO_TCP %d\n", IPPROTO_TCP);
#endif
#ifdef IPPROTO_UDP
   fprintf(outfile, "#define IPPROTO_UDP %d\n", IPPROTO_UDP);
#endif
#ifdef IPPROTO_DCCP
   fprintf(outfile, "#define IPPROTO_DCCP %d\n", IPPROTO_DCCP);
#endif
#ifdef IPPROTO_SCTP
   fprintf(outfile, "#define IPPROTO_SCTP %d\n", IPPROTO_SCTP);
#endif
#ifdef IPPROTO_UDPLITE
   fprintf(outfile, "#define IPPROTO_UDPLITE %d\n", IPPROTO_UDPLITE);
#endif
#ifdef IPPROTO_RAW
   fprintf(outfile, "#define IPPROTO_RAW %d\n", IPPROTO_RAW);
#endif
#ifdef SOL_SOCKET
   fprintf(outfile, "#define SOL_SOCKET 0x%x\n", SOL_SOCKET);
#endif
#ifdef SOL_PACKET
   fprintf(outfile, "#define SOL_PACKET 0x%x\n", SOL_PACKET);
#endif
#ifdef SOL_IP
   fprintf(outfile, "#define SOL_IP 0x%x\n", SOL_IP);
#endif
#ifdef SOL_IPV6
   fprintf(outfile, "#define SOL_IPV6 0x%x\n", SOL_IPV6);
#endif
#ifdef SOL_TCP
   fprintf(outfile, "#define SOL_TCP 0x%x\n", SOL_TCP);
#endif
#ifdef SOL_UDP
   fprintf(outfile, "#define SOL_UDP 0x%x\n", SOL_UDP);
#endif
#ifdef SOL_SCTP
   fprintf(outfile, "#define SOL_SCTP 0x%x\n", SOL_SCTP);
#endif
#ifdef SOL_DCCP
   fprintf(outfile, "#define SOL_DCCP 0x%x\n", SOL_DCCP);
#endif
#ifdef SO_PROTOCOL
   fprintf(outfile, "#define SO_PROTOCOL %d\n", SO_PROTOCOL);
#endif
#ifdef SO_PROTOTYPE
   fprintf(outfile, "#define SO_PROTOTYPE %d\n", SO_PROTOTYPE);
#endif
#ifdef SO_REUSEADDR
   fprintf(outfile, "#define SO_REUSEADDR %d\n", SO_REUSEADDR);
#endif
#ifdef TCP_MAXSEG
   fprintf(outfile, "#define TCP_MAXSEG %d\n",   TCP_MAXSEG);
#endif

   /* netlink */
#ifdef RTM_NEWLINK
   fprintf(outfile, "#define %24s %d\n", "RTM_NEWLINK", RTM_NEWLINK);
#endif
#ifdef RTM_DELLINK
   fprintf(outfile, "#define %24s %d\n", "RTM_DELLINK", RTM_DELLINK);
#endif
#ifdef RTM_GETLINK
   fprintf(outfile, "#define %24s %d\n", "RTM_GETLINK", RTM_GETLINK);
#endif
#ifdef RTM_SETLINK
   fprintf(outfile, "#define %24s %d\n", "RTM_SETLINK", RTM_SETLINK);
#endif

#ifdef AI_PASSIVE
   fprintf(outfile, "#define AI_PASSIVE     0x%02x\n", AI_PASSIVE);
#endif
#ifdef AI_CANONNAME
   fprintf(outfile, "#define AI_CANONNAME   0x%02x\n", AI_CANONNAME);
#endif
#ifdef AI_NUMERICHOST
   fprintf(outfile, "#define AI_NUMERICHOST 0x%02x\n", AI_NUMERICHOST);
#endif
#ifdef AI_V4MAPPED
   fprintf(outfile, "#define AI_V4MAPPED    0x%02x\n", AI_V4MAPPED);
#endif
#ifdef AI_ALL
   fprintf(outfile, "#define AI_ALL         0x%02x\n", AI_ALL);
#endif
#ifdef AI_ADDRCONFIG
   fprintf(outfile, "#define AI_ADDRCONFIG  0x%02x\n", AI_ADDRCONFIG);
#endif
#ifdef EAI_BADFLAGS
   fprintf(outfile, "#define EAI_BADFLAGS    %d\n", EAI_BADFLAGS);
#endif
#ifdef EAI_NONAME
   fprintf(outfile, "#define EAI_NONAME      %d\n", EAI_NONAME);
#endif
#ifdef EAI_AGAIN
   fprintf(outfile, "#define EAI_AGAIN       %d\n", EAI_AGAIN);
#endif
#ifdef EAI_FAIL
   fprintf(outfile, "#define EAI_FAIL        %d\n", EAI_FAIL);
#endif
#ifdef EAI_FAMILY
   fprintf(outfile, "#define EAI_FAMILY      %d\n", EAI_FAMILY);
#endif
#ifdef EAI_SOCKTYPE
   fprintf(outfile, "#define EAI_SOCKTYPE    %d\n", EAI_SOCKTYPE);
#endif
#ifdef EAI_SERVICE
   fprintf(outfile, "#define EAI_SERVICE     %d\n", EAI_SERVICE);
#endif
#ifdef EAI_MEMORY
   fprintf(outfile, "#define EAI_MEMORY      %d\n", EAI_MEMORY);
#endif
#ifdef EAI_SYSTEM
   fprintf(outfile, "#define EAI_SYSTEM      %d\n", EAI_SYSTEM);
#endif
#ifdef EAI_OVERFLOW
   fprintf(outfile, "#define EAI_OVERFLOW    %d\n", EAI_OVERFLOW);
#endif
#ifdef EAI_NODATA
   fprintf(outfile, "#define EAI_NODATA      %d\n", EAI_NODATA);
#endif
#ifdef EAI_ADDRFAMILY
   fprintf(outfile, "#define EAI_ADDRFAMILY  %d\n", EAI_ADDRFAMILY);
#endif
#ifdef EAI_INPROGRESS
   fprintf(outfile, "#define EAI_INPROGRESS  %d\n", EAI_INPROGRESS);
#endif
#ifdef EAI_CANCELED
   fprintf(outfile, "#define EAI_CANCELED    %d\n", EAI_CANCELED);
#endif
#ifdef EAI_NOTCANCELED
   fprintf(outfile, "#define EAI_NOTCANCELED %d\n", EAI_NOTCANCELED);
#endif
#ifdef EAI_ALLDONE
   fprintf(outfile, "#define EAI_ALLDONE     %d\n", EAI_ALLDONE);
#endif
#ifdef EAI_INTR
   fprintf(outfile, "#define EAI_INTR        %d\n", EAI_INTR);
#endif
#ifdef EAI_IDN_ENCODE
   fprintf(outfile, "#define EAI_IDN_ENCODE  %d\n", EAI_IDN_ENCODE);
#endif

   /* template */
#ifdef XXXX
   fprintf(outfile, "#define %24s %d\n", "XXXX", XXXX);
#endif
   return 0;
}
