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