Home | History | Annotate | Line # | Download | only in ac
      1 /*	$NetBSD: socket.h,v 1.4 2025/09/05 21:16:20 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-2024 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 defined(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 defined(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 defined(HAVE_PCNFS)
    122 #	define tcp_close( s )	close( s )
    123 #	define tcp_read( s, buf, len )	recv( s, buf, len, 0 )
    124 #	define tcp_write( s, buf, len )	send( s, buf, len, 0 )
    125 
    126 #elif defined(HAVE_NCSA)
    127 #	define tcp_close( s )	do { netclose( s ); netshut() } while(0)
    128 #	define tcp_read( s, buf, len )	nread( s, buf, len )
    129 #	define tcp_write( s, buf, len )	netwrite( s, buf, len )
    130 
    131 #elif defined(HAVE_CLOSESOCKET)
    132 #	define tcp_close( s )		closesocket( s )
    133 
    134 #	ifdef __BEOS__
    135 #		define tcp_read( s, buf, len )	recv( s, buf, len, 0 )
    136 #		define tcp_write( s, buf, len )	send( s, buf, len, 0 )
    137 #	endif
    138 
    139 #else
    140 #	define tcp_read( s, buf, len)	read( s, buf, len )
    141 #	define tcp_write( s, buf, len)	write( s, buf, len )
    142 
    143 #	ifdef SHUT_RDWR
    144 #		define tcp_close( s )	(shutdown( s, SHUT_RDWR ), close( s ))
    145 #	else
    146 #		define tcp_close( s )	close( s )
    147 #	endif
    148 
    149 #ifdef HAVE_PIPE
    150 /*
    151  * Only use pipe() on systems where file and socket descriptors
    152  * are interchangeable
    153  */
    154 #	define USE_PIPE HAVE_PIPE
    155 #endif
    156 
    157 #endif /* MACOS */
    158 
    159 #ifndef ioctl_t
    160 #	define ioctl_t				int
    161 #endif
    162 
    163 #ifndef AC_SOCKET_INVALID
    164 #	define AC_SOCKET_INVALID	(-1)
    165 #endif
    166 #ifndef AC_SOCKET_ERROR
    167 #	define AC_SOCKET_ERROR		(-1)
    168 #endif
    169 
    170 #if !defined( HAVE_INET_ATON ) && !defined( inet_aton )
    171 #	define inet_aton ldap_pvt_inet_aton
    172 struct in_addr;
    173 LDAP_F (int) ldap_pvt_inet_aton LDAP_P(( const char *, struct in_addr * ));
    174 #endif
    175 
    176 #if	defined(__WIN32) && defined(_ALPHA)
    177 /* NT on Alpha is hosed. */
    178 #	define AC_HTONL( l ) \
    179         ((((l)&0xffU)<<24) + (((l)&0xff00U)<<8) + \
    180          (((l)&0xff0000U)>>8) + (((l)&0xff000000U)>>24))
    181 #	define AC_NTOHL(l) AC_HTONL(l)
    182 
    183 #else
    184 #	define AC_HTONL( l ) htonl( l )
    185 #	define AC_NTOHL( l ) ntohl( l )
    186 #endif
    187 
    188 /* htons()/ntohs() may be broken much like htonl()/ntohl() */
    189 #define AC_HTONS( s ) htons( s )
    190 #define AC_NTOHS( s ) ntohs( s )
    191 
    192 #ifdef LDAP_PF_LOCAL
    193 #  if !defined( AF_LOCAL ) && defined( AF_UNIX )
    194 #    define AF_LOCAL	AF_UNIX
    195 #  endif
    196 #  if !defined( PF_LOCAL ) && defined( PF_UNIX )
    197 #    define PF_LOCAL	PF_UNIX
    198 #  endif
    199 #endif
    200 
    201 #ifndef INET_ADDRSTRLEN
    202 #	define INET_ADDRSTRLEN 16
    203 #endif
    204 #ifndef INET6_ADDRSTRLEN
    205 #	define INET6_ADDRSTRLEN 46
    206 #endif
    207 
    208 #if defined( HAVE_GETADDRINFO ) || defined( HAVE_GETNAMEINFO )
    209 #	ifdef HAVE_GAI_STRERROR
    210 #		define AC_GAI_STRERROR(x)	(gai_strerror((x)))
    211 #	else
    212 #		define AC_GAI_STRERROR(x)	(ldap_pvt_gai_strerror((x)))
    213 		LDAP_F (char *) ldap_pvt_gai_strerror( int );
    214 #	endif
    215 #endif
    216 
    217 #if defined(LDAP_PF_LOCAL) && \
    218 	!defined(HAVE_GETPEEREID) && \
    219 	!defined(HAVE_GETPEERUCRED) && \
    220 	!defined(SO_PEERCRED) && !defined(LOCAL_PEERCRED) && \
    221 	defined(HAVE_SENDMSG) && (defined(HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTSLEN) || \
    222 	defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL))
    223 #	define LDAP_PF_LOCAL_SENDMSG 1
    224 #endif
    225 
    226 #ifdef HAVE_GETPEEREID
    227 #define	LUTIL_GETPEEREID( s, uid, gid, bv )	getpeereid( s, uid, gid )
    228 #elif defined(LDAP_PF_LOCAL_SENDMSG)
    229 struct berval;
    230 LDAP_LUTIL_F( int ) lutil_getpeereid( int s, uid_t *, gid_t *, struct berval *bv );
    231 #define	LUTIL_GETPEEREID( s, uid, gid, bv )	lutil_getpeereid( s, uid, gid, bv )
    232 #else
    233 LDAP_LUTIL_F( int ) lutil_getpeereid( int s, uid_t *, gid_t * );
    234 #define	LUTIL_GETPEEREID( s, uid, gid, bv )	lutil_getpeereid( s, uid, gid )
    235 #endif
    236 
    237 typedef union Sockaddr {
    238 	struct sockaddr sa_addr;
    239 	struct sockaddr_in sa_in_addr;
    240 #ifdef LDAP_PF_INET6
    241 	struct sockaddr_storage sa_storage;
    242 	struct sockaddr_in6 sa_in6_addr;
    243 #endif
    244 #ifdef LDAP_PF_LOCAL
    245 	struct sockaddr_un sa_un_addr;
    246 #endif
    247 } Sockaddr;
    248 
    249 /* DNS RFC defines max host name as 255. New systems seem to use 1024 */
    250 #ifndef NI_MAXHOST
    251 #define	NI_MAXHOST	256
    252 #endif
    253 
    254 #ifdef HAVE_POLL
    255 # ifndef INFTIM
    256 #  define INFTIM (-1)
    257 # endif
    258 #undef POLL_OTHER
    259 #define POLL_OTHER   (POLLERR|POLLHUP)
    260 #undef POLL_READ
    261 #define POLL_READ    (POLLIN|POLLPRI|POLL_OTHER)
    262 #undef POLL_WRITE
    263 #define POLL_WRITE   (POLLOUT|POLL_OTHER)
    264 #endif
    265 
    266 #endif /* _AC_SOCKET_H_ */
    267