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