/* * irc_std.h: header to define things used in all the programs ircii * comes with * * hacked together from various other files by matthew green * * Copyright (c) 1992-2004 Matthew R. Green. * All rights reserved. * * 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. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHORS 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. * * @(#)$eterna: irc_std.h,v 1.46 2004/07/03 10:22:35 mrg Exp $ */ #ifndef __irc_std_h #define __irc_std_h /* * these things help with converting to/from char* and u_char* */ #define UP(s) ((u_char *)(s)) #define UPP(s) ((u_char **)(s)) #define CP(s) ((char *)(s)) #define CPP(s) ((char **)(s)) #define my_strlen(s) strlen(CP(s)) #define my_strcmp(d,s) strcmp(CP(d), CP(s)) #define my_strncmp(d,s,n) strncmp(CP(d), CP(s), (n)) #define my_strcat(d,s) strcat(CP(d), CP(s)) #define my_strncat(d,s,n) strncat(CP(d), CP(s), (n)) #define my_strmcat(d,s,n) strmcat(UP(d), UP(s), (n)) #define my_strcpy(d,s) strcpy(CP(d), CP(s)) #define my_strncpy(d,s,n) strncpy(CP(d), CP(s), (n)) #define my_strmcpy(d,s,n) strmcpy(UP(d), UP(s), (n)) #define my_index(s,c) UP(index(CP(s), (c))) #define my_rindex(s,c) UP(rindex(CP(s), (c))) #define my_atoi(s) atoi(CP(s)) #define my_atol(s) atol(CP(s)) #define my_getenv(s) UP(getenv(CP(s))) #if !defined(__GNUC__) || __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) #define __attribute__(x) /* delete __attribute__ if non-gcc or gcc1 */ #endif #ifndef lint #define IRCII_RCSID_NAMED(x,n) static const char n[] __attribute__((__unused__)) = x #else #define IRCII_RCSID_NAMED(x,n) #endif #define IRCII_RCSID(x) IRCII_RCSID_NAMED(x,rcsid) #ifdef _IBMR2 # include # include #else # include #ifndef ERRNO_DECLARED extern int errno; #endif #endif /* _IBMR2 */ #ifndef NBBY # define NBBY 8 /* number of bits in a byte */ #endif /* NBBY */ #ifndef NFDBITS # define NFDBITS (sizeof(long) * NBBY) /* bits per mask */ #endif /* NFDBITS */ #ifndef FD_SET # define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) #endif /* FD_SET */ #ifndef FD_CLR # define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) #endif /* FD_CLR */ #ifndef FD_ISSET # define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) #endif /* FD_ISSET */ #ifndef FD_ZERO # define FD_ZERO(p) bzero((char *)(p), sizeof(*(p))) #endif /* FD_ZERO */ #ifndef FD_SETSIZE # define FD_SETSIZE 32 #endif /* FD_SETSIZE */ typedef RETSIGTYPE sigfunc(int); #ifdef USE_SIGACTION sigfunc *my_signal(int, sigfunc *, int); # define MY_SIGNAL(s_n, s_h, m_f) my_signal(s_n, s_h, m_f) #else # if USE_SIGSET # define MY_SIGNAL(s_n, s_h, m_f) sigset(s_n, s_h) # else # define MY_SIGNAL(s_n, s_h, m_f) signal(s_n, s_h) # endif /* USE_SIGSET */ #endif /* USE_SIGACTION */ #if defined(USE_SIGACTION) || defined(USE_SIGSET) # undef SYSVSIGNALS #endif /* USE_SIGACTION || USE_SIGSET */ #if defined(__svr4__) || defined(SVR4) || defined(__SVR4) # if !defined(__svr4__) # define __svr4__ # endif /* __svr4__ */ # if !defined(SVR4) # define SVR4 # endif /* SVR4 */ # if !defined(__SVR4) # define __SVR4 # endif /* __SVR4 */ #endif /* __svr4__ || SVR4 || __SVR4 */ #ifdef _SEQUENT_ # define u_short ushort # define u_char unchar # define u_long ulong # define u_int uint # define USE_TERMIO # ifndef POSIX # define POSIX # endif /* POSIX */ #endif /* _SEQUENT_ */ #ifndef NeXT # if defined(STDC_HEADERS) || defined(HAVE_STRING_H) # include # if defined(STDC_HEADERS) # include # endif /* HAVE_STDLIB_H */ # if defined(HAVE_MEMORY_H) # include # endif /* HAVE_MEMORY_H */ # undef index # undef rindex # undef bcopy # undef bzero # undef bcmp # define index strchr # define rindex strrchr # ifdef HAVE_MEMMOVE # define bcopy(s, d, n) memmove((d), (s), (n)) # else # define bcopy(s, d, n) memcpy ((d), (s), (n)) # endif /* HAVE_MEMMOVE */ # define bcmp(s, t, n) memcmp ((s), (t), (n)) # define bzero(s, n) memset ((s), 0, (n)) # else /* STDC_HEADERS || HAVE_STRING_H */ # include # endif /* STDC_HEADERS || HAVE_STRING_H */ #endif /* !NeXT */ #ifdef _Windows # define IS_ABSOLUTE_PATH(file) ((file)[0] == '/' || (file)[0] == '\\' || ((file)[0] && (file)[1] == ':')) #else # define IS_ABSOLUTE_PATH(file) ((file)[0] == '/') #endif #if !defined(SYS_ERRLIST_DECLARED) && !defined(_Windows) extern char *sys_errlist[]; extern int sys_nerr; #endif #ifdef _Windows extern char FAR * FAR winsock_errors[]; # define strerror(e) ((e) >= 0 && (e) < sys_nerr ? sys_errlist[e] : ((e) >=WSABASEERR ? winsock_errors[(e) - WSABASEERR] : "(unknown)")) #else # ifdef NEED_STRERROR # undef strerror # define strerror(e) ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e]) # endif #endif /* we need an unsigned 32 bit integer for dcc, how lame */ #ifdef UNSIGNED_LONG32 typedef unsigned long u_32int; #else # ifdef UNSIGNED_INT32 typedef unsigned int u_32int; # else typedef unsigned long u_32int; # endif /* UNSIGNED_INT32 */ #endif /* UNSIGNED_LONG32 */ #if ! HAVE_RFC2553_NETDB /* RFC 2553 */ #undef EAI_ADDRFAMILY #define EAI_ADDRFAMILY 1 /* address family for hostname not supported */ #undef EAI_AGAIN #define EAI_AGAIN 2 /* temporary failure in name resolution */ #undef EAI_BADFLAGS #define EAI_BADFLAGS 3 /* invalid value for ai_flags */ #undef EAI_FAIL #define EAI_FAIL 4 /* non-recoverable failure in name resolution */ #undef EAI_FAMILY #define EAI_FAMILY 5 /* ai_family not supported */ #undef EAI_MEMORY #define EAI_MEMORY 6 /* memory allocation failure */ #undef EAI_NODATA #define EAI_NODATA 7 /* no address associated with hostname */ #undef EAI_NONAME #define EAI_NONAME 8 /* hostname nor servname provided, or not known */ #undef EAI_SERVICE #define EAI_SERVICE 9 /* servname not supported for ai_socktype */ #undef EAI_SOCKTYPE #define EAI_SOCKTYPE 10 /* ai_socktype not supported */ #undef EAI_SYSTEM #define EAI_SYSTEM 11 /* system error returned in errno */ /* KAME extensions? */ #undef EAI_BADHINTS #define EAI_BADHINTS 12 #undef EAI_PROTOCOL #define EAI_PROTOCOL 13 #undef EAI_MAX #define EAI_MAX 14 /* RFC 2553 */ #undef NI_MAXHOST #define NI_MAXHOST 1025 #undef NI_MAXSERV #define NI_MAXSERV 32 #undef NI_NOFQDN #define NI_NOFQDN 0x00000001 #undef NI_NUMERICHOST #define NI_NUMERICHOST 0x00000002 #undef NI_NAMEREQD #define NI_NAMEREQD 0x00000004 #undef NI_NUMERICSERV #define NI_NUMERICSERV 0x00000008 #undef NI_DGRAM #define NI_DGRAM 0x00000010 /* RFC 2553 */ #undef AI_PASSIVE #define AI_PASSIVE 0x00000001 /* get address to use bind() */ #undef AI_CANONNAME #define AI_CANONNAME 0x00000002 /* fill ai_canonname */ /* KAME extensions ? */ #undef AI_NUMERICHOST #define AI_NUMERICHOST 0x00000004 /* prevent name resolution */ #undef AI_MASK #define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST) /* RFC 2553 */ #undef AI_ALL #define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */ #undef AI_V4MAPPED_CFG #define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */ #undef AI_ADDRCONFIG #define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */ #undef AI_V4MAPPED #define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */ #endif /* ! HAVE_RFC2553_NETDB */ #if ! HAVE_SOCKLEN_T typedef int socklen_t; #endif /* HAVE_SOCKLEN_T */ #if ! HAVE_RFC2553_NETDB && ! HAVE_ADDRINFO struct addrinfo { int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */ int ai_family; /* PF_xxx */ int ai_socktype; /* SOCK_xxx */ int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ size_t ai_addrlen; /* length of ai_addr */ char *ai_canonname; /* canonical name for hostname */ struct sockaddr *ai_addr; /* binary address */ struct addrinfo *ai_next; /* next structure in linked list */ }; int getaddrinfo(const char *, const char *, const struct addrinfo *, struct addrinfo **); int getnameinfo(const struct sockaddr *, socklen_t, char *, size_t, char *, size_t, int); void freeaddrinfo(struct addrinfo *); char *gai_strerror(int); #endif /* ! HAVE_RFC2553_NETDB && ! HAVE_ADDRINFO */ #ifndef HAVE_SNPRINTF int snprintf(char *str, size_t count, const char *fmt, ...); #endif /* HAVE_SNPRINTF */ #ifndef HAVE_VSNPRINTF int vsnprintf(char *str, size_t count, const char *fmt, va_list args); #endif /* HAVE_VSNPRINTF */ #ifdef INET6 # define SOCKADDR_STORAGE struct sockaddr_storage # define SS_FAMILY(ss) (ss)->ss_family #else # define SOCKADDR_STORAGE struct sockaddr_in # define SS_FAMILY(ss) (ss)->sin_family #endif #endif /* __irc_std_h */