1/***************************************************************************
2 *                                  _   _ ____  _
3 *  Project                     ___| | | |  _ \| |
4 *                             / __| | | | |_) | |
5 *                            | (__| |_| |  _ <| |___
6 *                             \___|\___/|_| \_\_____|
7 *
8 * Copyright (C) 1998 - 2016, 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.haxx.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#include "stdint.h"
25#include "limits.h"
26
27#if defined(__INTEL_COMPILER) && defined(__unix__)
28
29#ifdef HAVE_NETINET_IN_H
30#  include <netinet/in.h>
31#endif
32#ifdef HAVE_ARPA_INET_H
33#  include <arpa/inet.h>
34#endif
35
36#endif /* __INTEL_COMPILER && __unix__ */
37
38#define BUILDING_WARNLESS_C 1
39
40#include "warnless.h"
41
42#define CURL_MASK_SCHAR  0x7F
43#define CURL_MASK_UCHAR  0xFF
44
45#define CURL_MASK_USHORT  USHRT_MAX
46#define CURL_MASK_SSHORT  SHRT_MAX
47
48#define CURL_MASK_SINT  INT_MAX
49#define CURL_MASK_UINT  UINT_MAX
50
51#define CURL_MASK_SLONG  LONG_MAX
52#define CURL_MASK_ULONG  ULONG_MAX
53
54#define CURL_MASK_UCOFFT  UINT64_MAX
55#define CURL_MASK_SCOFFT  INT64_MAX
56
57/*
58** unsigned long to unsigned short
59*/
60
61unsigned short curlx_ultous(unsigned long ulnum)
62{
63#ifdef __INTEL_COMPILER
64#  pragma warning(push)
65#  pragma warning(disable:810) /* conversion may lose significant bits */
66#endif
67
68  DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_USHORT);
69  return (unsigned short)(ulnum & (unsigned long) CURL_MASK_USHORT);
70
71#ifdef __INTEL_COMPILER
72#  pragma warning(pop)
73#endif
74}
75
76/*
77** unsigned long to unsigned char
78*/
79
80unsigned char curlx_ultouc(unsigned long ulnum)
81{
82#ifdef __INTEL_COMPILER
83#  pragma warning(push)
84#  pragma warning(disable:810) /* conversion may lose significant bits */
85#endif
86
87  DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_UCHAR);
88  return (unsigned char)(ulnum & (unsigned long) CURL_MASK_UCHAR);
89
90#ifdef __INTEL_COMPILER
91#  pragma warning(pop)
92#endif
93}
94
95/*
96** unsigned long to signed int
97*/
98
99int curlx_ultosi(unsigned long ulnum)
100{
101#ifdef __INTEL_COMPILER
102#  pragma warning(push)
103#  pragma warning(disable:810) /* conversion may lose significant bits */
104#endif
105
106  DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_SINT);
107  return (int)(ulnum & (unsigned long) CURL_MASK_SINT);
108
109#ifdef __INTEL_COMPILER
110#  pragma warning(pop)
111#endif
112}
113
114/*
115** unsigned size_t to signed curl_off_t
116*/
117
118curl_off_t curlx_uztoso(size_t uznum)
119{
120#ifdef __INTEL_COMPILER
121#  pragma warning(push)
122#  pragma warning(disable:810) /* conversion may lose significant bits */
123#endif
124
125  DEBUGASSERT(uznum <= (size_t) CURL_MASK_SCOFFT);
126  return (curl_off_t)(uznum & (size_t) CURL_MASK_SCOFFT);
127
128#ifdef __INTEL_COMPILER
129#  pragma warning(pop)
130#endif
131}
132
133/*
134** unsigned size_t to signed int
135*/
136
137int curlx_uztosi(size_t uznum)
138{
139#ifdef __INTEL_COMPILER
140#  pragma warning(push)
141#  pragma warning(disable:810) /* conversion may lose significant bits */
142#endif
143
144  DEBUGASSERT(uznum <= (size_t) CURL_MASK_SINT);
145  return (int)(uznum & (size_t) CURL_MASK_SINT);
146
147#ifdef __INTEL_COMPILER
148#  pragma warning(pop)
149#endif
150}
151
152/*
153** unsigned size_t to unsigned long
154*/
155
156unsigned long curlx_uztoul(size_t uznum)
157{
158#ifdef __INTEL_COMPILER
159# pragma warning(push)
160# pragma warning(disable:810) /* conversion may lose significant bits */
161#endif
162
163#if (CURL_SIZEOF_LONG < SIZEOF_SIZE_T)
164  DEBUGASSERT(uznum <= (size_t) CURL_MASK_ULONG);
165#endif
166  return (unsigned long)(uznum & (size_t) CURL_MASK_ULONG);
167
168#ifdef __INTEL_COMPILER
169# pragma warning(pop)
170#endif
171}
172
173/*
174** unsigned size_t to unsigned int
175*/
176
177unsigned int curlx_uztoui(size_t uznum)
178{
179#ifdef __INTEL_COMPILER
180# pragma warning(push)
181# pragma warning(disable:810) /* conversion may lose significant bits */
182#endif
183
184#if (SIZEOF_INT < SIZEOF_SIZE_T)
185  DEBUGASSERT(uznum <= (size_t) CURL_MASK_UINT);
186#endif
187  return (unsigned int)(uznum & (size_t) CURL_MASK_UINT);
188
189#ifdef __INTEL_COMPILER
190# pragma warning(pop)
191#endif
192}
193
194/*
195** signed long to signed int
196*/
197
198int curlx_sltosi(long slnum)
199{
200#ifdef __INTEL_COMPILER
201#  pragma warning(push)
202#  pragma warning(disable:810) /* conversion may lose significant bits */
203#endif
204
205  DEBUGASSERT(slnum >= 0);
206#if (SIZEOF_INT < CURL_SIZEOF_LONG)
207  DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_SINT);
208#endif
209  return (int)(slnum & (long) CURL_MASK_SINT);
210
211#ifdef __INTEL_COMPILER
212#  pragma warning(pop)
213#endif
214}
215
216/*
217** signed long to unsigned int
218*/
219
220unsigned int curlx_sltoui(long slnum)
221{
222#ifdef __INTEL_COMPILER
223#  pragma warning(push)
224#  pragma warning(disable:810) /* conversion may lose significant bits */
225#endif
226
227  DEBUGASSERT(slnum >= 0);
228#if (SIZEOF_INT < CURL_SIZEOF_LONG)
229  DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_UINT);
230#endif
231  return (unsigned int)(slnum & (long) CURL_MASK_UINT);
232
233#ifdef __INTEL_COMPILER
234#  pragma warning(pop)
235#endif
236}
237
238/*
239** signed long to unsigned short
240*/
241
242unsigned short curlx_sltous(long slnum)
243{
244#ifdef __INTEL_COMPILER
245#  pragma warning(push)
246#  pragma warning(disable:810) /* conversion may lose significant bits */
247#endif
248
249  DEBUGASSERT(slnum >= 0);
250  DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_USHORT);
251  return (unsigned short)(slnum & (long) CURL_MASK_USHORT);
252
253#ifdef __INTEL_COMPILER
254#  pragma warning(pop)
255#endif
256}
257
258/*
259** unsigned size_t to signed ssize_t
260*/
261
262ssize_t curlx_uztosz(size_t uznum)
263{
264#ifdef __INTEL_COMPILER
265#  pragma warning(push)
266#  pragma warning(disable:810) /* conversion may lose significant bits */
267#endif
268
269  DEBUGASSERT(uznum <= (size_t) SSIZE_MAX);
270  return (ssize_t)(uznum & (size_t) SSIZE_MAX);
271
272#ifdef __INTEL_COMPILER
273#  pragma warning(pop)
274#endif
275}
276
277/*
278** signed curl_off_t to unsigned size_t
279*/
280
281size_t curlx_sotouz(curl_off_t sonum)
282{
283#ifdef __INTEL_COMPILER
284#  pragma warning(push)
285#  pragma warning(disable:810) /* conversion may lose significant bits */
286#endif
287
288  DEBUGASSERT(sonum >= 0);
289  return (size_t)(sonum & (curl_off_t) SIZE_MAX);
290
291#ifdef __INTEL_COMPILER
292#  pragma warning(pop)
293#endif
294}
295
296/*
297** signed ssize_t to signed int
298*/
299
300int curlx_sztosi(ssize_t sznum)
301{
302#ifdef __INTEL_COMPILER
303#  pragma warning(push)
304#  pragma warning(disable:810) /* conversion may lose significant bits */
305#endif
306
307  DEBUGASSERT(sznum >= 0);
308#if (SIZEOF_INT < SIZEOF_SIZE_T)
309  DEBUGASSERT((size_t) sznum <= (size_t) CURL_MASK_SINT);
310#endif
311  return (int)(sznum & (ssize_t) CURL_MASK_SINT);
312
313#ifdef __INTEL_COMPILER
314#  pragma warning(pop)
315#endif
316}
317
318/*
319** unsigned int to unsigned short
320*/
321
322unsigned short curlx_uitous(unsigned int uinum)
323{
324#ifdef __INTEL_COMPILER
325#  pragma warning(push)
326#  pragma warning(disable:810) /* conversion may lose significant bits */
327#endif
328
329  DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_USHORT);
330  return (unsigned short) (uinum & (unsigned int) CURL_MASK_USHORT);
331
332#ifdef __INTEL_COMPILER
333#  pragma warning(pop)
334#endif
335}
336
337/*
338** unsigned int to unsigned char
339*/
340
341unsigned char curlx_uitouc(unsigned int uinum)
342{
343#ifdef __INTEL_COMPILER
344#  pragma warning(push)
345#  pragma warning(disable:810) /* conversion may lose significant bits */
346#endif
347
348  DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_UCHAR);
349  return (unsigned char) (uinum & (unsigned int) CURL_MASK_UCHAR);
350
351#ifdef __INTEL_COMPILER
352#  pragma warning(pop)
353#endif
354}
355
356/*
357** unsigned int to signed int
358*/
359
360int curlx_uitosi(unsigned int uinum)
361{
362#ifdef __INTEL_COMPILER
363#  pragma warning(push)
364#  pragma warning(disable:810) /* conversion may lose significant bits */
365#endif
366
367  DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_SINT);
368  return (int) (uinum & (unsigned int) CURL_MASK_SINT);
369
370#ifdef __INTEL_COMPILER
371#  pragma warning(pop)
372#endif
373}
374
375/*
376** signed int to unsigned size_t
377*/
378
379size_t curlx_sitouz(int sinum)
380{
381#ifdef __INTEL_COMPILER
382#  pragma warning(push)
383#  pragma warning(disable:810) /* conversion may lose significant bits */
384#endif
385
386  DEBUGASSERT(sinum >= 0);
387  return (size_t) sinum;
388
389#ifdef __INTEL_COMPILER
390#  pragma warning(pop)
391#endif
392}
393
394#ifdef USE_WINSOCK
395
396/*
397** curl_socket_t to signed int
398*/
399
400int curlx_sktosi(curl_socket_t s)
401{
402  return (int)((ssize_t) s);
403}
404
405/*
406** signed int to curl_socket_t
407*/
408
409curl_socket_t curlx_sitosk(int i)
410{
411  return (curl_socket_t)((ssize_t) i);
412}
413
414#endif /* USE_WINSOCK */
415
416#if defined(WIN32) || defined(_WIN32)
417
418ssize_t curlx_read(int fd, void *buf, size_t count)
419{
420  return (ssize_t)read(fd, buf, curlx_uztoui(count));
421}
422
423ssize_t curlx_write(int fd, const void *buf, size_t count)
424{
425  return (ssize_t)write(fd, buf, curlx_uztoui(count));
426}
427
428#endif /* WIN32 || _WIN32 */
429
430#if defined(__INTEL_COMPILER) && defined(__unix__)
431
432int curlx_FD_ISSET(int fd, fd_set *fdset)
433{
434  #pragma warning(push)
435  #pragma warning(disable:1469) /* clobber ignored */
436  return FD_ISSET(fd, fdset);
437  #pragma warning(pop)
438}
439
440void curlx_FD_SET(int fd, fd_set *fdset)
441{
442  #pragma warning(push)
443  #pragma warning(disable:1469) /* clobber ignored */
444  FD_SET(fd, fdset);
445  #pragma warning(pop)
446}
447
448void curlx_FD_ZERO(fd_set *fdset)
449{
450  #pragma warning(push)
451  #pragma warning(disable:593) /* variable was set but never used */
452  FD_ZERO(fdset);
453  #pragma warning(pop)
454}
455
456unsigned short curlx_htons(unsigned short usnum)
457{
458#if (__INTEL_COMPILER == 910) && defined(__i386__)
459  return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF));
460#else
461  #pragma warning(push)
462  #pragma warning(disable:810) /* conversion may lose significant bits */
463  return htons(usnum);
464  #pragma warning(pop)
465#endif
466}
467
468unsigned short curlx_ntohs(unsigned short usnum)
469{
470#if (__INTEL_COMPILER == 910) && defined(__i386__)
471  return (unsigned short)(((usnum << 8) & 0xFF00) | ((usnum >> 8) & 0x00FF));
472#else
473  #pragma warning(push)
474  #pragma warning(disable:810) /* conversion may lose significant bits */
475  return ntohs(usnum);
476  #pragma warning(pop)
477#endif
478}
479
480#endif /* __INTEL_COMPILER && __unix__ */
481