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