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
12typedef 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>
76typedef 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
88extern 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
106typedef int socklen_t;
107#endif
108
109/* XXX should only be done if sockaddr_storage not found */
110#ifndef HAVE_STRUCT_SOCKADDR_STORAGE
111struct 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
128typedef 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
184extern int socket (int, int, int) /*@*/;
185# endif
186#endif
187
188#endif /*_PORT_SOCKET_H*/
189