FreeTDS API
sysdep_private.h
1 /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
2  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Brian Bruns
3  * Copyright (C) 2010 Frediano Ziglio
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 
21 #ifndef _tdsguard_gbdINUKdHN7rAOavGyKkWw_
22 #define _tdsguard_gbdINUKdHN7rAOavGyKkWw_
23 
24 #define TDS_ADDITIONAL_SPACE 16
25 
26 #ifdef MSG_NOSIGNAL
27 # define TDS_NOSIGNAL MSG_NOSIGNAL
28 #else
29 # define TDS_NOSIGNAL 0L
30 #endif
31 
32 #ifdef __cplusplus
33 #define TDS_EXTERN_C extern "C"
34 #else
35 #define TDS_EXTERN_C
36 #endif
37 
38 #ifdef __INCvxWorksh
39 #include <ioLib.h> /* for FIONBIO */
40 #endif /* __INCvxWorksh */
41 
42 #ifdef __MINGW32__
43 /* getpid() is defined as a function in MingW but this conflict with our definition as
44  * macro later in this file, so include unistd.h to get function definition earlier and
45  * avoid errors including unistd.h header later in the code */
46 #include <unistd.h>
47 #endif
48 
49 #if defined(DOS32X)
50 #define READSOCKET(a,b,c) recv((a), (b), (c), TDS_NOSIGNAL)
51 #define WRITESOCKET(a,b,c) send((a), (b), (c), TDS_NOSIGNAL)
52 #define CLOSESOCKET(a) closesocket((a))
53 #define IOCTLSOCKET(a,b,c) ioctlsocket((a), (b), (char*)(c))
54 #define SOCKLEN_T int
55 #define select select_s
56 typedef int pid_t;
57 #define strcasecmp stricmp
58 #define strncasecmp strnicmp
59 /* TODO this has nothing to do with ip ... */
60 #define getpid() _gethostid()
61 #endif /* defined(DOS32X) */
62 
63 #ifdef _WIN32
64 #include <freetds/windows.h>
65 #define READSOCKET(a,b,c) recv((a), (char *) (b), (c), TDS_NOSIGNAL)
66 #define WRITESOCKET(a,b,c) send((a), (const char *) (b), (c), TDS_NOSIGNAL)
67 #define CLOSESOCKET(a) closesocket((a))
68 #define IOCTLSOCKET(a,b,c) ioctlsocket((a), (b), (c))
69 #define SOCKLEN_T int
70 static inline int
71 tds_socket_init(void)
72 {
73  WSADATA wsadata;
74 
75  return WSAStartup(MAKEWORD(2, 2), &wsadata);
76 }
77 
78 static inline void
79 tds_socket_done(void)
80 {
81  WSACleanup();
82 }
83 #define NETDB_REENTRANT 1 /* BSD-style netdb interface is reentrant */
84 
85 #define TDSSOCK_EINTR WSAEINTR
86 #define TDSSOCK_EINPROGRESS WSAEWOULDBLOCK
87 #define TDSSOCK_ETIMEDOUT WSAETIMEDOUT
88 #define TDSSOCK_WOULDBLOCK(e) ((e)==WSAEWOULDBLOCK)
89 #define TDSSOCK_ECONNRESET WSAECONNRESET
90 #define sock_errno WSAGetLastError()
91 #define set_sock_errno(err) WSASetLastError(err)
92 #define sock_strerror(n) tds_prwsaerror(n)
93 #define sock_strerror_free(s) tds_prwsaerror_free(s)
94 #ifndef __MINGW32__
95 typedef DWORD pid_t;
96 #endif
97 #undef strcasecmp
98 #define strcasecmp stricmp
99 #undef strncasecmp
100 #define strncasecmp strnicmp
101 #if defined(HAVE__SNPRINTF) && !defined(HAVE_SNPRINTF)
102 #define snprintf _snprintf
103 #endif
104 
105 /* use macros to use new style names */
106 #if defined(__MSVCRT__) || defined(_MSC_VER)
107 /* Use API as always present and not causing problems */
108 #undef getpid
109 #define getpid() GetCurrentProcessId()
110 #ifndef strdup
111 #define strdup(s) _strdup(s)
112 #endif
113 #define unlink(f) _unlink(f)
114 #define putenv(s) _putenv(s)
115 #undef fileno
116 #define fileno(f) _fileno(f)
117 #undef close
118 #define close(f) _close(f)
119 #undef open
120 #define open(fn,...) _open(fn,__VA_ARGS__)
121 #undef dup2
122 #define dup2(o,n) _dup2(o,n)
123 #define stricmp(s1,s2) _stricmp(s1,s2)
124 #define strnicmp(s1,s2,n) _strnicmp(s1,s2,n)
125 #endif
126 
127 #endif /* defined(_WIN32) */
128 
129 #ifndef sock_errno
130 #define sock_errno errno
131 #endif
132 
133 #ifndef set_sock_errno
134 #define set_sock_errno(err) do { errno = (err); } while(0)
135 #endif
136 
137 #ifndef sock_strerror
138 #define sock_strerror(n) strerror(n)
139 #define sock_strerror_free(s) do {} while(0)
140 #endif
141 
142 #ifndef TDSSOCK_EINTR
143 #define TDSSOCK_EINTR EINTR
144 #endif
145 
146 #ifndef TDSSOCK_EINPROGRESS
147 #define TDSSOCK_EINPROGRESS EINPROGRESS
148 #endif
149 
150 #ifndef TDSSOCK_ETIMEDOUT
151 #define TDSSOCK_ETIMEDOUT ETIMEDOUT
152 #endif
153 
154 #ifndef TDSSOCK_WOULDBLOCK
155 # if defined(EWOULDBLOCK) && EAGAIN != EWOULDBLOCK
156 # define TDSSOCK_WOULDBLOCK(e) ((e)==EAGAIN||(e)==EWOULDBLOCK)
157 # else
158 # define TDSSOCK_WOULDBLOCK(e) ((e)==EAGAIN)
159 # endif
160 #endif
161 
162 #ifndef TDSSOCK_ECONNRESET
163 #define TDSSOCK_ECONNRESET ECONNRESET
164 #endif
165 
166 #ifndef _WIN32
167 static inline int
168 tds_socket_init(void)
169 {
170  return 0;
171 }
172 
173 static inline void
174 tds_socket_done(void)
175 {
176 }
177 #endif
178 
179 #ifndef READSOCKET
180 # ifdef MSG_NOSIGNAL
181 # define READSOCKET(s,b,l) recv((s), (b), (l), MSG_NOSIGNAL)
182 # else
183 # define READSOCKET(s,b,l) read((s), (b), (l))
184 # endif
185 #endif /* !READSOCKET */
186 
187 #ifndef WRITESOCKET
188 # ifdef MSG_NOSIGNAL
189 # define WRITESOCKET(s,b,l) send((s), (b), (l), MSG_NOSIGNAL)
190 # else
191 # define WRITESOCKET(s,b,l) write((s), (b), (l))
192 # endif
193 #endif /* !WRITESOCKET */
194 
195 #ifndef CLOSESOCKET
196 #define CLOSESOCKET(s) close((s))
197 #endif /* !CLOSESOCKET */
198 
199 #ifndef IOCTLSOCKET
200 #define IOCTLSOCKET(s,b,l) ioctl((s), (b), (l))
201 #endif /* !IOCTLSOCKET */
202 
203 #ifndef SOCKLEN_T
204 # define SOCKLEN_T socklen_t
205 #endif
206 
207 #ifndef _WIN32
208 typedef int TDS_SYS_SOCKET;
209 #define INVALID_SOCKET -1
210 #define TDS_IS_SOCKET_INVALID(s) ((s) < 0)
211 #else
212 typedef SOCKET TDS_SYS_SOCKET;
213 #define TDS_IS_SOCKET_INVALID(s) ((s) == INVALID_SOCKET)
214 #endif
215 
216 #define tds_accept accept
217 #define tds_getpeername getpeername
218 #define tds_getsockopt getsockopt
219 #define tds_getsockname getsockname
220 #define tds_recvfrom recvfrom
221 
222 #if defined(__hpux__) && SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
223 # if HAVE__XPG_ACCEPT
224 # undef tds_accept
225 # define tds_accept _xpg_accept
226 # elif HAVE___ACCEPT
227 # undef tds_accept
228 # define tds_accept __accept
229 # endif
230 # if HAVE__XPG_GETPEERNAME
231 # undef tds_getpeername
232 # define tds_getpeername _xpg_getpeername
233 # elif HAVE___GETPEERNAME
234 # undef tds_getpeername
235 # define tds_getpeername __getpeername
236 # endif
237 # if HAVE__XPG_GETSOCKOPT
238 # undef tds_getsockopt
239 # define tds_getsockopt _xpg_getsockopt
240 # elif HAVE___GETSOCKOPT
241 # undef tds_getsockopt
242 # define tds_getsockopt __getsockopt
243 # endif
244 # if HAVE__XPG_GETSOCKNAME
245 # undef tds_getsockname
246 # define tds_getsockname _xpg_getsockname
247 # elif HAVE___GETSOCKNAME
248 # undef tds_getsockname
249 # define tds_getsockname __getsockname
250 # endif
251 # if HAVE__XPG_RECVFROM
252 # undef tds_recvfrom
253 # define tds_recvfrom _xpg_recvfrom
254 # elif HAVE___RECVFROM
255 # undef tds_recvfrom
256 # define tds_recvfrom __recvfrom
257 # endif
258 #endif
259 
260 #ifdef HAVE_STDINT_H
261 #include <stdint.h>
262 #endif
263 
264 #ifdef HAVE_INTTYPES_H
265 #include <inttypes.h>
266 #endif
267 
268 #ifndef PRId64
269 #define PRId64 TDS_I64_PREFIX "d"
270 #endif
271 #ifndef PRIu64
272 #define PRIu64 TDS_I64_PREFIX "u"
273 #endif
274 #ifndef PRIx64
275 #define PRIx64 TDS_I64_PREFIX "x"
276 #endif
277 
278 #ifndef UINT64_C
279 # if SIZEOF_INT >= 8
280 # define UINT64_C(c) c ## U
281 # define INT64_C(c) c
282 # elif SIZEOF_LONG >= 8
283 # define UINT64_C(c) c ## UL
284 # define INT64_C(c) c ## L
285 # elif SIZEOF_LONG_LONG >= 8
286 # define UINT64_C(c) c ## ULL
287 # define INT64_C(c) c ## LL
288 # elif SIZEOF___INT64 >= 8
289 # define UINT64_C(c) c ## ui64
290 # define INT64_C(c) c ## i64
291 # else
292 # error Unable to understand how to define 64 bit constants
293 # endif
294 #endif
295 
296 #include <freetds/sysdep_types.h>
297 
298 #endif /* _tdsguard_gbdINUKdHN7rAOavGyKkWw_ */