1 /***************************************************************************
2 * _ _ ____ _
3 * Project ___| | | | _ \| |
4 * / __| | | | |_) | |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
7 *
8 * Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
9 *
10 * This software is licensed as described in the file COPYING, which
11 * you should have received as part of this distribution. The terms
12 * are also available at https://curl.se/docs/copyright.html.
13 *
14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 * copies of the Software, and permit persons to whom the Software is
16 * furnished to do so, under the terms of the COPYING file.
17 *
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
20 *
21 ***************************************************************************/
22
23 #include "curl_setup.h"
24
25 #if defined(__INTEL_COMPILER) && defined(__unix__)
26
27 #ifdef HAVE_NETINET_IN_H
28 # include <netinet/in.h>
29 #endif
30 #ifdef HAVE_ARPA_INET_H
31 # include <arpa/inet.h>
32 #endif
33
34 #endif /* __INTEL_COMPILER && __unix__ */
35
36 #define BUILDING_WARNLESS_C 1
37
38 #include "warnless.h"
39
40 #define CURL_MASK_UCHAR ((unsigned char)~0)
41 #define CURL_MASK_SCHAR (CURL_MASK_UCHAR >> 1)
42
43 #define CURL_MASK_USHORT ((unsigned short)~0)
44 #define CURL_MASK_SSHORT (CURL_MASK_USHORT >> 1)
45
46 #define CURL_MASK_UINT ((unsigned int)~0)
47 #define CURL_MASK_SINT (CURL_MASK_UINT >> 1)
48
49 #define CURL_MASK_ULONG ((unsigned long)~0)
50 #define CURL_MASK_SLONG (CURL_MASK_ULONG >> 1)
51
52 #define CURL_MASK_UCOFFT ((unsigned CURL_TYPEOF_CURL_OFF_T)~0)
53 #define CURL_MASK_SCOFFT (CURL_MASK_UCOFFT >> 1)
54
55 #define CURL_MASK_USIZE_T ((size_t)~0)
56 #define CURL_MASK_SSIZE_T (CURL_MASK_USIZE_T >> 1)
57
58 /*
59 ** unsigned long to unsigned short
60 */
61
curlx_ultous(unsigned long ulnum)62 unsigned short curlx_ultous(unsigned long ulnum)
63 {
64 #ifdef __INTEL_COMPILER
65 # pragma warning(push)
66 # pragma warning(disable:810) /* conversion may lose significant bits */
67 #endif
68
69 DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_USHORT);
70 return (unsigned short)(ulnum & (unsigned long) CURL_MASK_USHORT);
71
72 #ifdef __INTEL_COMPILER
73 # pragma warning(pop)
74 #endif
75 }
76
77 /*
78 ** unsigned long to unsigned char
79 */
80
curlx_ultouc(unsigned long ulnum)81 unsigned char curlx_ultouc(unsigned long ulnum)
82 {
83 #ifdef __INTEL_COMPILER
84 # pragma warning(push)
85 # pragma warning(disable:810) /* conversion may lose significant bits */
86 #endif
87
88 DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_UCHAR);
89 return (unsigned char)(ulnum & (unsigned long) CURL_MASK_UCHAR);
90
91 #ifdef __INTEL_COMPILER
92 # pragma warning(pop)
93 #endif
94 }
95
96 /*
97 ** unsigned size_t to signed curl_off_t
98 */
99
curlx_uztoso(size_t uznum)100 curl_off_t curlx_uztoso(size_t uznum)
101 {
102 #ifdef __INTEL_COMPILER
103 # pragma warning(push)
104 # pragma warning(disable:810) /* conversion may lose significant bits */
105 #elif defined(_MSC_VER)
106 # pragma warning(push)
107 # pragma warning(disable:4310) /* cast truncates constant value */
108 #endif
109
110 DEBUGASSERT(uznum <= (size_t) CURL_MASK_SCOFFT);
111 return (curl_off_t)(uznum & (size_t) CURL_MASK_SCOFFT);
112
113 #if defined(__INTEL_COMPILER) || defined(_MSC_VER)
114 # pragma warning(pop)
115 #endif
116 }
117
118 /*
119 ** unsigned size_t to signed int
120 */
121
curlx_uztosi(size_t uznum)122 int curlx_uztosi(size_t uznum)
123 {
124 #ifdef __INTEL_COMPILER
125 # pragma warning(push)
126 # pragma warning(disable:810) /* conversion may lose significant bits */
127 #endif
128
129 DEBUGASSERT(uznum <= (size_t) CURL_MASK_SINT);
130 return (int)(uznum & (size_t) CURL_MASK_SINT);
131
132 #ifdef __INTEL_COMPILER
133 # pragma warning(pop)
134 #endif
135 }
136
137 /*
138 ** unsigned size_t to unsigned long
139 */
140
curlx_uztoul(size_t uznum)141 unsigned long curlx_uztoul(size_t uznum)
142 {
143 #ifdef __INTEL_COMPILER
144 # pragma warning(push)
145 # pragma warning(disable:810) /* conversion may lose significant bits */
146 #endif
147
148 #if ULONG_MAX < SIZE_T_MAX
149 DEBUGASSERT(uznum <= (size_t) CURL_MASK_ULONG);
150 #endif
151 return (unsigned long)(uznum & (size_t) CURL_MASK_ULONG);
152
153 #ifdef __INTEL_COMPILER
154 # pragma warning(pop)
155 #endif
156 }
157
158 /*
159 ** unsigned size_t to unsigned int
160 */
161
curlx_uztoui(size_t uznum)162 unsigned int curlx_uztoui(size_t uznum)
163 {
164 #ifdef __INTEL_COMPILER
165 # pragma warning(push)
166 # pragma warning(disable:810) /* conversion may lose significant bits */
167 #endif
168
169 #if UINT_MAX < SIZE_T_MAX
170 DEBUGASSERT(uznum <= (size_t) CURL_MASK_UINT);
171 #endif
172 return (unsigned int)(uznum & (size_t) CURL_MASK_UINT);
173
174 #ifdef __INTEL_COMPILER
175 # pragma warning(pop)
176 #endif
177 }
178
179 /*
180 ** signed long to signed int
181 */
182
curlx_sltosi(long slnum)183 int curlx_sltosi(long slnum)
184 {
185 #ifdef __INTEL_COMPILER
186 # pragma warning(push)
187 # pragma warning(disable:810) /* conversion may lose significant bits */
188 #endif
189
190 DEBUGASSERT(slnum >= 0);
191 #if INT_MAX < LONG_MAX
192 DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_SINT);
193 #endif
194 return (int)(slnum & (long) CURL_MASK_SINT);
195
196 #ifdef __INTEL_COMPILER
197 # pragma warning(pop)
198 #endif
199 }
200
201 /*
202 ** signed long to unsigned int
203 */
204
curlx_sltoui(long slnum)205 unsigned int curlx_sltoui(long slnum)
206 {
207 #ifdef __INTEL_COMPILER
208 # pragma warning(push)
209 # pragma warning(disable:810) /* conversion may lose significant bits */
210 #endif
211
212 DEBUGASSERT(slnum >= 0);
213 #if UINT_MAX < LONG_MAX
214 DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_UINT);
215 #endif
216 return (unsigned int)(slnum & (long) CURL_MASK_UINT);
217
218 #ifdef __INTEL_COMPILER
219 # pragma warning(pop)
220 #endif
221 }
222
223 /*
224 ** signed long to unsigned short
225 */
226
curlx_sltous(long slnum)227 unsigned short curlx_sltous(long slnum)
228 {
229 #ifdef __INTEL_COMPILER
230 # pragma warning(push)
231 # pragma warning(disable:810) /* conversion may lose significant bits */
232 #endif
233
234 DEBUGASSERT(slnum >= 0);
235 DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_USHORT);
236 return (unsigned short)(slnum & (long) CURL_MASK_USHORT);
237
238 #ifdef __INTEL_COMPILER
239 # pragma warning(pop)
240 #endif
241 }
242
243 /*
244 ** unsigned size_t to signed ssize_t
245 */
246
curlx_uztosz(size_t uznum)247 ssize_t curlx_uztosz(size_t uznum)
248 {
249 #ifdef __INTEL_COMPILER
250 # pragma warning(push)
251 # pragma warning(disable:810) /* conversion may lose significant bits */
252 #endif
253
254 DEBUGASSERT(uznum <= (size_t) CURL_MASK_SSIZE_T);
255 return (ssize_t)(uznum & (size_t) CURL_MASK_SSIZE_T);
256
257 #ifdef __INTEL_COMPILER
258 # pragma warning(pop)
259 #endif
260 }
261
262 /*
263 ** signed curl_off_t to unsigned size_t
264 */
265
curlx_sotouz(curl_off_t sonum)266 size_t curlx_sotouz(curl_off_t sonum)
267 {
268 #ifdef __INTEL_COMPILER
269 # pragma warning(push)
270 # pragma warning(disable:810) /* conversion may lose significant bits */
271 #endif
272
273 DEBUGASSERT(sonum >= 0);
274 return (size_t)(sonum & (curl_off_t) CURL_MASK_USIZE_T);
275
276 #ifdef __INTEL_COMPILER
277 # pragma warning(pop)
278 #endif
279 }
280
281 /*
282 ** signed ssize_t to signed int
283 */
284
curlx_sztosi(ssize_t sznum)285 int curlx_sztosi(ssize_t sznum)
286 {
287 #ifdef __INTEL_COMPILER
288 # pragma warning(push)
289 # pragma warning(disable:810) /* conversion may lose significant bits */
290 #endif
291
292 DEBUGASSERT(sznum >= 0);
293 #if INT_MAX < SSIZE_T_MAX
294 DEBUGASSERT((size_t) sznum <= (size_t) CURL_MASK_SINT);
295 #endif
296 return (int)(sznum & (ssize_t) CURL_MASK_SINT);
297
298 #ifdef __INTEL_COMPILER
299 # pragma warning(pop)
300 #endif
301 }
302
303 /*
304 ** unsigned int to unsigned short
305 */
306
curlx_uitous(unsigned int uinum)307 unsigned short curlx_uitous(unsigned int uinum)
308 {
309 #ifdef __INTEL_COMPILER
310 # pragma warning(push)
311 # pragma warning(disable:810) /* conversion may lose significant bits */
312 #endif
313
314 DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_USHORT);
315 return (unsigned short) (uinum & (unsigned int) CURL_MASK_USHORT);
316
317 #ifdef __INTEL_COMPILER
318 # pragma warning(pop)
319 #endif
320 }
321
322 /*
323 ** signed int to unsigned size_t
324 */
325
curlx_sitouz(int sinum)326 size_t curlx_sitouz(int sinum)
327 {
328 #ifdef __INTEL_COMPILER
329 # pragma warning(push)
330 # pragma warning(disable:810) /* conversion may lose significant bits */
331 #endif
332
333 DEBUGASSERT(sinum >= 0);
334 return (size_t) sinum;
335
336 #ifdef __INTEL_COMPILER
337 # pragma warning(pop)
338 #endif
339 }
340
341 #ifdef USE_WINSOCK
342
343 /*
344 ** curl_socket_t to signed int
345 */
346
curlx_sktosi(curl_socket_t s)347 int curlx_sktosi(curl_socket_t s)
348 {
349 return (int)((ssize_t) s);
350 }
351
352 /*
353 ** signed int to curl_socket_t
354 */
355
curlx_sitosk(int i)356 curl_socket_t curlx_sitosk(int i)
357 {
358 return (curl_socket_t)((ssize_t) i);
359 }
360
361 #endif /* USE_WINSOCK */
362
363 #if defined(WIN32) || defined(_WIN32)
364
curlx_read(int fd,void * buf,size_t count)365 ssize_t curlx_read(int fd, void *buf, size_t count)
366 {
367 return (ssize_t)read(fd, buf, curlx_uztoui(count));
368 }
369
curlx_write(int fd,const void * buf,size_t count)370 ssize_t curlx_write(int fd, const void *buf, size_t count)
371 {
372 return (ssize_t)write(fd, buf, curlx_uztoui(count));
373 }
374
375 #endif /* WIN32 || _WIN32 */
376
377 #if defined(__INTEL_COMPILER) && defined(__unix__)
378
curlx_FD_ISSET(int fd,fd_set * fdset)379 int curlx_FD_ISSET(int fd, fd_set *fdset)
380 {
381 #pragma warning(push)
382 #pragma warning(disable:1469) /* clobber ignored */
383 return FD_ISSET(fd, fdset);
384 #pragma warning(pop)
385 }
386
curlx_FD_SET(int fd,fd_set * fdset)387 void curlx_FD_SET(int fd, fd_set *fdset)
388 {
389 #pragma warning(push)
390 #pragma warning(disable:1469) /* clobber ignored */
391 FD_SET(fd, fdset);
392 #pragma warning(pop)
393 }
394
curlx_FD_ZERO(fd_set * fdset)395 void curlx_FD_ZERO(fd_set *fdset)
396 {
397 #pragma warning(push)
398 #pragma warning(disable:593) /* variable was set but never used */
399 FD_ZERO(fdset);
400 #pragma warning(pop)
401 }
402
curlx_htons(unsigned short usnum)403 unsigned short curlx_htons(unsigned short usnum)
404 {
405 #if (__INTEL_COMPILER == 910) && defined(__i386__)
406 return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF));
407 #else
408 #pragma warning(push)
409 #pragma warning(disable:810) /* conversion may lose significant bits */
410 return htons(usnum);
411 #pragma warning(pop)
412 #endif
413 }
414
curlx_ntohs(unsigned short usnum)415 unsigned short curlx_ntohs(unsigned short usnum)
416 {
417 #if (__INTEL_COMPILER == 910) && defined(__i386__)
418 return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF));
419 #else
420 #pragma warning(push)
421 #pragma warning(disable:810) /* conversion may lose significant bits */
422 return ntohs(usnum);
423 #pragma warning(pop)
424 #endif
425 }
426
427 #endif /* __INTEL_COMPILER && __unix__ */
428