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