Home | History | Annotate | Download | only in include
      1 
      2 #ifndef _PORT_SOCKET_H
      3 #define _PORT_SOCKET_H
      4 #if defined(_WIN32)
      5 
      6 #include <winsock2.h>
      7 #include <ws2tcpip.h>
      8 
      9 /* Some of our own infrastructure where the WinSock stuff was too hairy
     10    to dump into a clean Unix program...  */
     11 
     12 typedef WSABUF sg_buf;
     13 
     14 #define SG_ADVANCE(SG, N) \
     15 	((SG)->len < (N)				\
     16 	 ? (abort(), 0)					\
     17 	 : ((SG)->buf += (N), (SG)->len -= (N), 0))
     18 
     19 #define SG_LEN(SG)		((SG)->len + 0)
     20 #define SG_BUF(SG)		((SG)->buf + 0)
     21 #define SG_SET(SG, B, N)	((SG)->buf = (char *)(B),(SG)->len = (N))
     22 
     23 #define SOCKET_INITIALIZE()     0
     24 #define SOCKET_CLEANUP()
     25 #define SOCKET_ERRNO            (WSAGetLastError())
     26 #define SOCKET_SET_ERRNO(x)     (WSASetLastError (x))
     27 #define SOCKET_NFDS(f)          (0)     /* select()'s first arg is ignored */
     28 #define SOCKET_READ(fd, b, l)   (recv(fd, b, l, 0))
     29 #define SOCKET_WRITE(fd, b, l)  (send(fd, b, l, 0))
     30 #define SOCKET_CONNECT		connect	/* XXX */
     31 #define SOCKET_GETSOCKNAME	getsockname /* XXX */
     32 #define SOCKET_CLOSE		close /* XXX */
     33 #define SOCKET_EINTR            WSAEINTR
     34 
     35 /* Return -1 for error or number of bytes written.
     36    TMP is a temporary variable; must be declared by the caller, and
     37    must be used by this macro (to avoid compiler warnings).  */
     38 /* WSASend returns 0 or SOCKET_ERROR.  */
     39 #define SOCKET_WRITEV_TEMP DWORD
     40 #define SOCKET_WRITEV(FD, SG, LEN, TMP)	\
     41 	(WSASend((FD), (SG), (LEN), &(TMP), 0, 0, 0) ? -1 : (TMP))
     42 
     43 #define SHUTDOWN_READ	SD_RECEIVE
     44 #define SHUTDOWN_WRITE	SD_SEND
     45 #define SHUTDOWN_BOTH	SD_BOTH
     46 
     47 #ifndef EINPROGRESS
     48 #define EINPROGRESS WSAEINPROGRESS
     49 #endif
     50 #ifndef EWOULDBLOCK
     51 #define EWOULDBLOCK WSAEWOULDBLOCK
     52 #endif
     53 #ifndef ECONNRESET
     54 #define ECONNRESET  WSAECONNRESET
     55 #endif
     56 #ifndef ECONNABORTED
     57 #define ECONNABORTED WSAECONNABORTED
     58 #endif
     59 #ifndef ECONNREFUSED
     60 #define ECONNREFUSED WSAECONNREFUSED
     61 #endif
     62 #ifndef EHOSTUNREACH
     63 #define EHOSTUNREACH WSAEHOSTUNREACH
     64 #endif
     65 #ifndef ETIMEDOUT
     66 #define ETIMEDOUT WSAETIMEDOUT
     67 #endif
     68 
     69 #elif defined(__palmos__)
     70 
     71 /* If this source file requires it, define struct sockaddr_in
     72    (and possibly other things related to network I/O).  */
     73 
     74 #include "autoconf.h"
     75 #include <netdb.h>
     76 typedef int socklen_t;
     77 
     78 #else /* UNIX variants */
     79 
     80 #include "autoconf.h"
     81 
     82 #include <sys/types.h>
     83 #include <netinet/in.h>		/* For struct sockaddr_in and in_addr */
     84 #include <arpa/inet.h>		/* For inet_ntoa */
     85 #include <netdb.h>
     86 
     87 #ifndef HAVE_NETDB_H_H_ERRNO
     88 extern int h_errno;		/* In case it's missing, e.g., HP-UX 10.20. */
     89 #endif
     90 
     91 #include <sys/param.h>		/* For MAXHOSTNAMELEN */
     92 #include <sys/socket.h>		/* For SOCK_*, AF_*, etc */
     93 #include <sys/time.h>		/* For struct timeval */
     94 #include <net/if.h>		/* For struct ifconf, for localaddr.c */
     95 #ifdef HAVE_SYS_UIO_H
     96 #include <sys/uio.h>		/* For struct iovec, for sg_buf */
     97 #endif
     98 #ifdef HAVE_SYS_FILIO_H
     99 #include <sys/filio.h>		/* For FIONBIO on Solaris.  */
    100 #endif
    101 
    102 /* Either size_t or int or unsigned int is probably right.  Under
    103    SunOS 4, it looks like int is desired, according to the accept man
    104    page.  */
    105 #ifndef HAVE_SOCKLEN_T
    106 typedef int socklen_t;
    107 #endif
    108 
    109 /* XXX should only be done if sockaddr_storage not found */
    110 #ifndef HAVE_STRUCT_SOCKADDR_STORAGE
    111 struct krb5int_sockaddr_storage {
    112     struct sockaddr_in s;
    113     /* Plenty of slop just in case we get an ipv6 address anyways.  */
    114     long extra[16];
    115 };
    116 #define sockaddr_storage krb5int_sockaddr_storage
    117 #endif
    118 
    119 /*
    120  * Compatability with WinSock calls on MS-Windows...
    121  */
    122 #define	SOCKET		int
    123 #define	INVALID_SOCKET	((SOCKET)~0)
    124 #define	closesocket	close
    125 #define	ioctlsocket	ioctl
    126 #define	SOCKET_ERROR	(-1)
    127 
    128 typedef struct iovec sg_buf;
    129 
    130 #define SG_ADVANCE(SG, N) \
    131 	((SG)->iov_len < (N)					\
    132 	 ? (abort(), 0)						\
    133 	 : ((SG)->iov_base = (char *) (SG)->iov_base + (N),	\
    134 	    (SG)->iov_len -= (N), 0))
    135 
    136 #define SG_LEN(SG)		((SG)->iov_len + 0)
    137 #define SG_BUF(SG)		((char*)(SG)->iov_base + 0)
    138 #define SG_SET(SG, B, L)	((SG)->iov_base = (char*)(B), (SG)->iov_len = (L))
    139 
    140 /* Some of our own infrastructure where the WinSock stuff was too hairy
    141    to dump into a clean Unix program...  */
    142 
    143 #define	SOCKET_INITIALIZE()	(0)	/* No error (or anything else) */
    144 #define	SOCKET_CLEANUP()	/* nothing */
    145 #define	SOCKET_ERRNO		errno
    146 #define	SOCKET_SET_ERRNO(x)	(errno = (x))
    147 #define SOCKET_NFDS(f)		((f)+1)	/* select() arg for a single fd */
    148 #define SOCKET_READ		read
    149 #define SOCKET_WRITE		write
    150 #define SOCKET_CONNECT		connect
    151 #define SOCKET_GETSOCKNAME	getsockname
    152 #define SOCKET_CLOSE		close
    153 #define SOCKET_EINTR		EINTR
    154 #define SOCKET_WRITEV_TEMP int
    155 /* Use TMP to avoid compiler warnings and keep things consistent with
    156    Windoze version.  */
    157 #define SOCKET_WRITEV(FD, SG, LEN, TMP) \
    158 	((TMP) = writev((FD), (SG), (LEN)), (TMP))
    159 
    160 #define SHUTDOWN_READ	0
    161 #define SHUTDOWN_WRITE	1
    162 #define SHUTDOWN_BOTH	2
    163 
    164 #ifndef HAVE_INET_NTOP
    165 #define inet_ntop(AF,SRC,DST,CNT)					    \
    166     ((AF) == AF_INET							    \
    167      ? ((CNT) < 16							    \
    168 	? (SOCKET_SET_ERRNO(ENOSPC), (const char *)NULL)		    \
    169 	: (sprintf((DST), "%d.%d.%d.%d",				    \
    170 		   ((const unsigned char *)(const void *)(SRC))[0] & 0xff,  \
    171 		   ((const unsigned char *)(const void *)(SRC))[1] & 0xff,  \
    172 		   ((const unsigned char *)(const void *)(SRC))[2] & 0xff,  \
    173 		   ((const unsigned char *)(const void *)(SRC))[3] & 0xff), \
    174 	   (DST)))							    \
    175      : (SOCKET_SET_ERRNO(EAFNOSUPPORT), (const char *)NULL))
    176 #define HAVE_INET_NTOP
    177 #endif
    178 
    179 #endif /* _WIN32 */
    180 
    181 #if !defined(_WIN32)
    182 /* UNIX or ...?  */
    183 # ifdef S_SPLINT_S
    184 extern int socket (int, int, int) /*@*/;
    185 # endif
    186 #endif
    187 
    188 #endif /*_PORT_SOCKET_H*/
    189