1 /*        $NetBSD: socket.h,v 1.3 2021/08/14 16:14:55 christos Exp $  */
2 
3 /* Generic socket.h */
4 /* $OpenLDAP$ */
5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6  *
7  * Copyright 1998-2021 The OpenLDAP Foundation.
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted only as authorized by the OpenLDAP
12  * Public License.
13  *
14  * A copy of this license is available in file LICENSE in the
15  * top-level directory of the distribution or, alternatively, at
16  * <http://www.OpenLDAP.org/license.html>.
17  */
18 
19 #ifndef _AC_SOCKET_H_
20 #define _AC_SOCKET_H_
21 
22 #ifdef HAVE_SYS_TYPES_H
23 #include <sys/types.h>
24 #endif
25 
26 #ifdef HAVE_POLL_H
27 #include <poll.h>
28 #elif defined(HAVE_SYS_POLL_H)
29 #include <sys/poll.h>
30 #endif
31 
32 #ifdef HAVE_SYS_SOCKET_H
33 #include <sys/socket.h>
34 
35 #ifdef HAVE_SYS_UN_H
36 #include <sys/un.h>
37 #endif
38 
39 #ifdef HAVE_SYS_SELECT_H
40 #include <sys/select.h>
41 #endif
42 
43 #include <netinet/in.h>
44 
45 #ifdef HAVE_NETINET_TCP_H
46 #include <netinet/tcp.h>
47 #endif
48 
49 #ifdef HAVE_ARPA_INET_H
50 #include <arpa/inet.h>
51 #endif
52 
53 #ifdef HAVE_ARPA_NAMESER_H
54 #include <arpa/nameser.h>
55 #endif
56 
57 #include <netdb.h>
58 
59 #ifdef HAVE_RESOLV_H
60 #include <resolv.h>
61 #endif
62 
63 #endif /* HAVE_SYS_SOCKET_H */
64 
65 #ifdef HAVE_WINSOCK2
66 #include <winsock2.h>
67 #include <ws2tcpip.h>
68 #elif HAVE_WINSOCK
69 #include <winsock.h>
70 #endif
71 
72 #ifdef HAVE_PCNFS
73 #include <tklib.h>
74 #endif /* HAVE_PCNFS */
75 
76 #ifndef INADDR_LOOPBACK
77 #define INADDR_LOOPBACK       (0x7f000001UL)
78 #endif
79 
80 #ifndef MAXHOSTNAMELEN
81 #define MAXHOSTNAMELEN  64
82 #endif
83 
84 #undef    sock_errno
85 #undef    sock_errstr
86 #define sock_errno()          errno
87 #define sock_errstr(e, b, l)  AC_STRERROR_R(e, b, l)
88 #define sock_errset(e)        ((void) (errno = (e)))
89 
90 #ifdef HAVE_WINSOCK
91 #         define tcp_read( s, buf, len )          recv( s, buf, len, 0 )
92 #         define tcp_write( s, buf, len )         send( s, buf, len, 0 )
93 #         define ioctl( s, c, a )                 ioctlsocket( (s), (c), (a) )
94 #         define ioctl_t                                    u_long
95 #         define AC_SOCKET_INVALID      ((unsigned int) -1)
96 
97 #         ifdef SD_BOTH
98 #                   define tcp_close( s )         (shutdown( s, SD_BOTH ), closesocket( s ))
99 #         else
100 #                   define tcp_close( s )                   closesocket( s )
101 #         endif
102 
103 #define EWOULDBLOCK WSAEWOULDBLOCK
104 #define EINPROGRESS WSAEINPROGRESS
105 #define ETIMEDOUT   WSAETIMEDOUT
106 
107 #undef    sock_errno
108 #undef    sock_errstr
109 #undef    sock_errset
110 #define   sock_errno()        WSAGetLastError()
111 #define   sock_errstr(e, b, l)          ber_pvt_wsa_err2string(e)
112 #define   sock_errset(e)      WSASetLastError(e)
113 
114 LBER_F( char * ) ber_pvt_wsa_err2string LDAP_P((int));
115 
116 #elif MACOS
117 #         define tcp_close( s )                   tcpclose( s )
118 #         define tcp_read( s, buf, len )          tcpread( s, buf, len )
119 #         define tcp_write( s, buf, len )         tcpwrite( s, buf, len )
120 
121 #elif DOS
122 #         ifdef PCNFS
123 #                   define tcp_close( s )         close( s )
124 #                   define tcp_read( s, buf, len )          recv( s, buf, len, 0 )
125 #                   define tcp_write( s, buf, len )         send( s, buf, len, 0 )
126 #         endif /* PCNFS */
127 #         ifdef NCSA
128 #                   define tcp_close( s )         do { netclose( s ); netshut() } while(0)
129 #                   define tcp_read( s, buf, len )          nread( s, buf, len )
130 #                   define tcp_write( s, buf, len )         netwrite( s, buf, len )
131 #         endif /* NCSA */
132 
133 #elif defined(HAVE_CLOSESOCKET)
134 #         define tcp_close( s )                   closesocket( s )
135 
136 #         ifdef __BEOS__
137 #                   define tcp_read( s, buf, len )          recv( s, buf, len, 0 )
138 #                   define tcp_write( s, buf, len )         send( s, buf, len, 0 )
139 #         endif
140 
141 #else
142 #         define tcp_read( s, buf, len) read( s, buf, len )
143 #         define tcp_write( s, buf, len)          write( s, buf, len )
144 
145 #         ifdef SHUT_RDWR
146 #                   define tcp_close( s )         (shutdown( s, SHUT_RDWR ), close( s ))
147 #         else
148 #                   define tcp_close( s )         close( s )
149 #         endif
150 
151 #ifdef HAVE_PIPE
152 /*
153  * Only use pipe() on systems where file and socket descriptors
154  * are interchangeable
155  */
156 #         define USE_PIPE HAVE_PIPE
157 #endif
158 
159 #endif /* MACOS */
160 
161 #ifndef ioctl_t
162 #         define ioctl_t                                    int
163 #endif
164 
165 #ifndef AC_SOCKET_INVALID
166 #         define AC_SOCKET_INVALID      (-1)
167 #endif
168 #ifndef AC_SOCKET_ERROR
169 #         define AC_SOCKET_ERROR                  (-1)
170 #endif
171 
172 #if !defined( HAVE_INET_ATON ) && !defined( inet_aton )
173 #         define inet_aton ldap_pvt_inet_aton
174 struct in_addr;
175 LDAP_F (int) ldap_pvt_inet_aton LDAP_P(( const char *, struct in_addr * ));
176 #endif
177 
178 #if       defined(__WIN32) && defined(_ALPHA)
179 /* NT on Alpha is hosed. */
180 #         define AC_HTONL( l ) \
181         ((((l)&0xffU)<<24) + (((l)&0xff00U)<<8) + \
182          (((l)&0xff0000U)>>8) + (((l)&0xff000000U)>>24))
183 #         define AC_NTOHL(l) AC_HTONL(l)
184 
185 #else
186 #         define AC_HTONL( l ) htonl( l )
187 #         define AC_NTOHL( l ) ntohl( l )
188 #endif
189 
190 /* htons()/ntohs() may be broken much like htonl()/ntohl() */
191 #define AC_HTONS( s ) htons( s )
192 #define AC_NTOHS( s ) ntohs( s )
193 
194 #ifdef LDAP_PF_LOCAL
195 #  if !defined( AF_LOCAL ) && defined( AF_UNIX )
196 #    define AF_LOCAL          AF_UNIX
197 #  endif
198 #  if !defined( PF_LOCAL ) && defined( PF_UNIX )
199 #    define PF_LOCAL          PF_UNIX
200 #  endif
201 #endif
202 
203 #ifndef INET_ADDRSTRLEN
204 #         define INET_ADDRSTRLEN 16
205 #endif
206 #ifndef INET6_ADDRSTRLEN
207 #         define INET6_ADDRSTRLEN 46
208 #endif
209 
210 #if defined( HAVE_GETADDRINFO ) || defined( HAVE_GETNAMEINFO )
211 #         ifdef HAVE_GAI_STRERROR
212 #                   define AC_GAI_STRERROR(x)     (gai_strerror((x)))
213 #         else
214 #                   define AC_GAI_STRERROR(x)     (ldap_pvt_gai_strerror((x)))
215                     LDAP_F (char *) ldap_pvt_gai_strerror( int );
216 #         endif
217 #endif
218 
219 #if defined(LDAP_PF_LOCAL) && \
220           !defined(HAVE_GETPEEREID) && \
221           !defined(HAVE_GETPEERUCRED) && \
222           !defined(SO_PEERCRED) && !defined(LOCAL_PEERCRED) && \
223           defined(HAVE_SENDMSG) && (defined(HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTSLEN) || \
224           defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL))
225 #         define LDAP_PF_LOCAL_SENDMSG 1
226 #endif
227 
228 #ifdef HAVE_GETPEEREID
229 #define   LUTIL_GETPEEREID( s, uid, gid, bv )     getpeereid( s, uid, gid )
230 #elif defined(LDAP_PF_LOCAL_SENDMSG)
231 struct berval;
232 LDAP_LUTIL_F( int ) lutil_getpeereid( int s, uid_t *, gid_t *, struct berval *bv );
233 #define   LUTIL_GETPEEREID( s, uid, gid, bv )     lutil_getpeereid( s, uid, gid, bv )
234 #else
235 LDAP_LUTIL_F( int ) lutil_getpeereid( int s, uid_t *, gid_t * );
236 #define   LUTIL_GETPEEREID( s, uid, gid, bv )     lutil_getpeereid( s, uid, gid )
237 #endif
238 
239 union Sockaddr {
240           struct sockaddr sa_addr;
241           struct sockaddr_in sa_in_addr;
242 #ifdef LDAP_PF_INET6
243           struct sockaddr_storage sa_storage;
244           struct sockaddr_in6 sa_in6_addr;
245 #endif
246 #ifdef LDAP_PF_LOCAL
247           struct sockaddr_un sa_un_addr;
248 #endif
249 };
250 
251 /* DNS RFC defines max host name as 255. New systems seem to use 1024 */
252 #ifndef NI_MAXHOST
253 #define   NI_MAXHOST          256
254 #endif
255 
256 #ifdef HAVE_POLL
257 # ifndef INFTIM
258 #  define INFTIM (-1)
259 # endif
260 #undef POLL_OTHER
261 #define POLL_OTHER   (POLLERR|POLLHUP)
262 #undef POLL_READ
263 #define POLL_READ    (POLLIN|POLLPRI|POLL_OTHER)
264 #undef POLL_WRITE
265 #define POLL_WRITE   (POLLOUT|POLL_OTHER)
266 #endif
267 
268 #endif /* _AC_SOCKET_H_ */
269