1 /* Our own header. Tabs are set for 4 spaces, not 8 */ 2 #ifndef __unp_h 3 #define __unp_h 4 #include "../config.h" /* configuration options for current OS */ 5 /* "../config.h" is generated by configure */ 6 /* If anything changes in the following list of #includes, must change 7 acsite.m4 also, for configure's tests. */ 8 #include <sys/types.h> /* basic system data types */ 9 #include <sys/socket.h> /* basic socket definitions */ 10 #include <sys/time.h> /* timeval{} for select() */ 11 #include <time.h> /* timespec{} for pselect() */ 12 #include <netinet/in.h> /* sockaddr_in{} and other Internet defns */ 13 #include <arpa/inet.h> /* inet(3) functions */ 14 #include <errno.h> 15 #include <fcntl.h> /* for nonblocking */ 16 #include <netdb.h> 17 #include <signal.h> 18 #include <stdio.h> 19 #include <stdlib.h> 20 #include <string.h> 21 #include <sys/stat.h> /* for S_xxx file mode constants */ 22 #include <sys/uio.h> /* for iovec{} and readv/writev */ 23 #include <unistd.h> 24 #include <sys/wait.h> 25 #include <sys/un.h> /* for Unix domain sockets */ 26 #ifdef HAVE_SYS_SELECT_H 27 # include <sys/select.h> /* for convenience */ 28 #endif 29 #ifdef HAVE_SYS_SYSCTL_H 30 # include <sys/sysctl.h> 31 #endif 32 #ifdef HAVE_POLL_H 33 # include <poll.h> /* for convenience */ 34 #endif 35 #ifdef HAVE_SYS_EVENT_H 36 # include <sys/event.h> /* for kqueue */ 37 #endif 38 #ifdef HAVE_STRINGS_H 39 # include <strings.h> /* for convenience */ 40 #endif 41 /* Three headers are normally needed for socket/file ioctl's: 42 * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>. 43 */ 44 #ifdef HAVE_SYS_IOCTL_H 45 # include <sys/ioctl.h> 46 #endif 47 #ifdef HAVE_SYS_FILIO_H 48 # include <sys/filio.h> 49 #endif 50 #ifdef HAVE_SYS_SOCKIO_H 51 # include <sys/sockio.h> 52 #endif 53 #ifdef HAVE_PTHREAD_H 54 # include <pthread.h> 55 #endif 56 #ifdef HAVE_NET_IF_DL_H 57 # include <net/if_dl.h> 58 #endif 59 #ifdef HAVE_NETINET_SCTP_H 60 #include <netinet/sctp.h> 61 #endif 62 /* OSF/1 actually disables recv() and send() in <sys/socket.h> */ 63 #ifdef __osf__ 64 #undef recv 65 #undef send 66 #define recv(a,b,c,d) recvfrom(a,b,c,d,0,0) 67 #define send(a,b,c,d) sendto(a,b,c,d,0,0) 68 #endif 69 #ifndef INADDR_NONE 70 #define INADDR_NONE 0xffffffff /* should have been in <netinet/in.h> */ 71 #endif 72 #ifndef SHUT_RD /* these three POSIX names are new */ 73 #define SHUT_RD 0 /* shutdown for reading */ 74 #define SHUT_WR 1 /* shutdown for writing */ 75 #define SHUT_RDWR 2 /* shutdown for reading and writing */ 76 #endif 77 #ifndef INET_ADDRSTRLEN 78 #define INET_ADDRSTRLEN 16 /* "ddd.ddd.ddd.ddd\0" 79 1234567890123456 */ 80 #endif 81 /* Define following even if IPv6 not supported, so we can always allocate 82 an adequately sized buffer without #ifdefs in the code. */ 83 #ifndef INET6_ADDRSTRLEN 84 #define INET6_ADDRSTRLEN 46 /* max size of IPv6 address string: 85 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or 86 "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\0" 87 1234567890123456789012345678901234567890123456 */ 88 #endif 89 /* Define bzero() as a macro if it's not in standard C library. */ 90 #ifndef HAVE_BZERO 91 #define bzero(ptr,n) memset (ptr, 0, n) 92 #endif 93 /* Older resolvers do not have gethostbyname2() */ 94 #ifndef HAVE_GETHOSTBYNAME2 95 #define gethostbyname2(host,family) gethostbyname((host)) 96 #endif 97 /* The structure returned by recvfrom_flags() */ 98 struct unp_in_pktinfo { 99 struct in_addr ipi_addr; /* dst IPv4 address */ 100 int ipi_ifindex; /* received interface index */ 101 }; 102 /* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few 103 implementations support them today. These two macros really need 104 an ALIGN() macro, but each implementation does this differently. */ 105 #ifndef CMSG_LEN 106 #define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size)) 107 #endif 108 #ifndef CMSG_SPACE 109 #define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size)) 110 #endif 111 /* POSIX requires the SUN_LEN() macro, but not all implementations define 112 it (yet). Note that this 4.4BSD macro works regardless whether there is 113 a length field or not. */ 114 #ifndef SUN_LEN 115 # define SUN_LEN (su) \ 116 (sizeof (*(su)) - sizeof ((su)->sun_path) + strlen((su)->sun_path)) 117 #endif 118 /* POSIX renames "Unix domain" as "local IPC." 119 Not all systems define AF_LOCAL and PF_LOCAL (yet). */ 120 #ifndef AF_LOCAL 121 #define AF_LOCAL AF_UNIX 122 #endif 123 #ifndef PF_LOCAL 124 #define PF_LOCAL PF_UNIX 125 #endif 126 /* POSIX requires that an #include of <poll.h> define INFTIM, but many 127 systems still define it in <sys/stropts.h>. We don't want to include 128 all the STREAMS stuff if it's not needed, so we just define INFTIM here. 129 This is the standard value, but there's no guarantee it is -1. */ 130 #ifndef INFTIM 131 #define INFTIM (-1) /* infinite poll timeout */ 132 #ifdef HAVE_POLL_H 133 #define INFTIM_UNPH /* tell unpxti.h we defined it */ 134 #endif 135 #endif 136 /* Following could be derived from SOMAXCONN in <sys/socket.h>, but many 137 kernels still #define it as 5, while actually supporting many more */ 138 #define LISTENQ 1024 /* 2nd argument to listen () */ 139 /* Miscellaneous constants */ 140 #define MAXLINE 4096 /* max text line length */ 141 #define BUFFSIZE 8192 /* buffer size for reads and writes */ 142 /* Define some port number that can be used for our examples */ 143 #define SERV_PORT 9877 /* TCP and UDP */ 144 #define SERV_PORT_STR "9877" /* TCP and UDP */ 145 #define UNIXSTR_PATH "/tmp/unix.str" /* Unix domain stream */ 146 #define UNIXDG_PATH "/tmp/unix.dg" /* Unix domain datagram */ 147 /* Following shortens all the typecasts of pointer arguments: */ 148 #define SA struct sockaddr 149 #define HAVE_STRUCT_SOCKADDR_STORAGE 150 #ifndef HAVE_STRUCT_SOCKADDR_STORAGE 151 /* 152 * RFC 3493: protocol-independent placeholder for socket addresses 153 */ 154 #define __SS_MAXSIZE 128 155 #define __SS_ALIGNSIZE (sizeof(int64_t)) 156 #ifdef HAVE_SOCKADDR_SA_LEN 157 #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(u_char) - sizeof(sa_family_t)) 158 #else 159 #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(sa_family_t)) 160 #endif 161 #define __SS_PAD2SIZE (__SS_MAXSIZE - 2*__SS_ALIGNSIZE) 162 struct sockaddr_storage { 163 #ifdef HAVE_SOCKADDR_SA_LEN 164 u_char ss_len; 165 #endif 166 sa_family_t ss_family; 167 char __ss_pad1[__SS_PAD1SIZE]; 168 int64_t __ss_align; 169 char __ss_pad2[__SS_PAD2SIZE]; 170 }; 171 #endif 172 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) 173 /* default file access permissions for new files */ 174 #define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH) 175 /* default permissions for new directories */ 176 typedef void Sigfunc (int); /* for signal handlers */ 177 #define min(a,b) ((a) < (b) ? (a) : (b)) 178 #define max(a,b) ((a) > (b) ? (a) : (b)) 179 #ifndef HAVE_ADDRINFO_STRUCT 180 # include "../lib/addrinfo.h" 181 #endif 182 #ifndef HAVE_IF_NAMEINDEX_STRUCT 183 struct if_nameindex { 184 unsigned int if_index; /* 1, 2, ... */ 185 char *if_name; /* null-terminated name: "le0", ... */ 186 }; 187 #endif 188 #ifndef HAVE_TIMESPEC_STRUCT 189 struct timespec { 190 time_t tv_sec; /* seconds */ 191 long tv_nsec; /* and nanoseconds */ 192 }; 193 #endif