1/*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 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 * SPDX-License-Identifier: curl 22 * 23 ***************************************************************************/ 24 25#include "curl_setup.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#include "warnless.h" 39 40#ifdef _WIN32 41#undef read 42#undef write 43#endif 44 45#include <limits.h> 46 47#define CURL_MASK_UCHAR ((unsigned char)~0) 48#define CURL_MASK_SCHAR (CURL_MASK_UCHAR >> 1) 49 50#define CURL_MASK_USHORT ((unsigned short)~0) 51#define CURL_MASK_SSHORT (CURL_MASK_USHORT >> 1) 52 53#define CURL_MASK_UINT ((unsigned int)~0) 54#define CURL_MASK_SINT (CURL_MASK_UINT >> 1) 55 56#define CURL_MASK_ULONG ((unsigned long)~0) 57#define CURL_MASK_SLONG (CURL_MASK_ULONG >> 1) 58 59#define CURL_MASK_UCOFFT ((unsigned CURL_TYPEOF_CURL_OFF_T)~0) 60#define CURL_MASK_SCOFFT (CURL_MASK_UCOFFT >> 1) 61 62#define CURL_MASK_USIZE_T ((size_t)~0) 63#define CURL_MASK_SSIZE_T (CURL_MASK_USIZE_T >> 1) 64 65/* 66** unsigned long to unsigned short 67*/ 68 69unsigned short curlx_ultous(unsigned long ulnum) 70{ 71#ifdef __INTEL_COMPILER 72# pragma warning(push) 73# pragma warning(disable:810) /* conversion may lose significant bits */ 74#endif 75 76 DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_USHORT); 77 return (unsigned short)(ulnum & (unsigned long) CURL_MASK_USHORT); 78 79#ifdef __INTEL_COMPILER 80# pragma warning(pop) 81#endif 82} 83 84/* 85** unsigned long to unsigned char 86*/ 87 88unsigned char curlx_ultouc(unsigned long ulnum) 89{ 90#ifdef __INTEL_COMPILER 91# pragma warning(push) 92# pragma warning(disable:810) /* conversion may lose significant bits */ 93#endif 94 95 DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_UCHAR); 96 return (unsigned char)(ulnum & (unsigned long) CURL_MASK_UCHAR); 97 98#ifdef __INTEL_COMPILER 99# pragma warning(pop) 100#endif 101} 102 103/* 104** unsigned size_t to signed curl_off_t 105*/ 106 107curl_off_t curlx_uztoso(size_t uznum) 108{ 109#ifdef __INTEL_COMPILER 110# pragma warning(push) 111# pragma warning(disable:810) /* conversion may lose significant bits */ 112#elif defined(_MSC_VER) 113# pragma warning(push) 114# pragma warning(disable:4310) /* cast truncates constant value */ 115#endif 116 117 DEBUGASSERT(uznum <= (size_t) CURL_MASK_SCOFFT); 118 return (curl_off_t)(uznum & (size_t) CURL_MASK_SCOFFT); 119 120#if defined(__INTEL_COMPILER) || defined(_MSC_VER) 121# pragma warning(pop) 122#endif 123} 124 125/* 126** unsigned size_t to signed int 127*/ 128 129int curlx_uztosi(size_t uznum) 130{ 131#ifdef __INTEL_COMPILER 132# pragma warning(push) 133# pragma warning(disable:810) /* conversion may lose significant bits */ 134#endif 135 136 DEBUGASSERT(uznum <= (size_t) CURL_MASK_SINT); 137 return (int)(uznum & (size_t) CURL_MASK_SINT); 138 139#ifdef __INTEL_COMPILER 140# pragma warning(pop) 141#endif 142} 143 144/* 145** unsigned size_t to unsigned long 146*/ 147 148unsigned long curlx_uztoul(size_t uznum) 149{ 150#ifdef __INTEL_COMPILER 151# pragma warning(push) 152# pragma warning(disable:810) /* conversion may lose significant bits */ 153#endif 154 155#if ULONG_MAX < SIZE_T_MAX 156 DEBUGASSERT(uznum <= (size_t) CURL_MASK_ULONG); 157#endif 158 return (unsigned long)(uznum & (size_t) CURL_MASK_ULONG); 159 160#ifdef __INTEL_COMPILER 161# pragma warning(pop) 162#endif 163} 164 165/* 166** unsigned size_t to unsigned int 167*/ 168 169unsigned int curlx_uztoui(size_t uznum) 170{ 171#ifdef __INTEL_COMPILER 172# pragma warning(push) 173# pragma warning(disable:810) /* conversion may lose significant bits */ 174#endif 175 176#if UINT_MAX < SIZE_T_MAX 177 DEBUGASSERT(uznum <= (size_t) CURL_MASK_UINT); 178#endif 179 return (unsigned int)(uznum & (size_t) CURL_MASK_UINT); 180 181#ifdef __INTEL_COMPILER 182# pragma warning(pop) 183#endif 184} 185 186/* 187** signed long to signed int 188*/ 189 190int curlx_sltosi(long slnum) 191{ 192#ifdef __INTEL_COMPILER 193# pragma warning(push) 194# pragma warning(disable:810) /* conversion may lose significant bits */ 195#endif 196 197 DEBUGASSERT(slnum >= 0); 198#if INT_MAX < LONG_MAX 199 DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_SINT); 200#endif 201 return (int)(slnum & (long) CURL_MASK_SINT); 202 203#ifdef __INTEL_COMPILER 204# pragma warning(pop) 205#endif 206} 207 208/* 209** signed long to unsigned int 210*/ 211 212unsigned int curlx_sltoui(long slnum) 213{ 214#ifdef __INTEL_COMPILER 215# pragma warning(push) 216# pragma warning(disable:810) /* conversion may lose significant bits */ 217#endif 218 219 DEBUGASSERT(slnum >= 0); 220#if UINT_MAX < LONG_MAX 221 DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_UINT); 222#endif 223 return (unsigned int)(slnum & (long) CURL_MASK_UINT); 224 225#ifdef __INTEL_COMPILER 226# pragma warning(pop) 227#endif 228} 229 230/* 231** signed long to unsigned short 232*/ 233 234unsigned short curlx_sltous(long slnum) 235{ 236#ifdef __INTEL_COMPILER 237# pragma warning(push) 238# pragma warning(disable:810) /* conversion may lose significant bits */ 239#endif 240 241 DEBUGASSERT(slnum >= 0); 242 DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_USHORT); 243 return (unsigned short)(slnum & (long) CURL_MASK_USHORT); 244 245#ifdef __INTEL_COMPILER 246# pragma warning(pop) 247#endif 248} 249 250/* 251** unsigned size_t to signed ssize_t 252*/ 253 254ssize_t curlx_uztosz(size_t uznum) 255{ 256#ifdef __INTEL_COMPILER 257# pragma warning(push) 258# pragma warning(disable:810) /* conversion may lose significant bits */ 259#endif 260 261 DEBUGASSERT(uznum <= (size_t) CURL_MASK_SSIZE_T); 262 return (ssize_t)(uznum & (size_t) CURL_MASK_SSIZE_T); 263 264#ifdef __INTEL_COMPILER 265# pragma warning(pop) 266#endif 267} 268 269/* 270** signed curl_off_t to unsigned size_t 271*/ 272 273size_t curlx_sotouz(curl_off_t sonum) 274{ 275#ifdef __INTEL_COMPILER 276# pragma warning(push) 277# pragma warning(disable:810) /* conversion may lose significant bits */ 278#endif 279 280 DEBUGASSERT(sonum >= 0); 281 return (size_t)(sonum & (curl_off_t) CURL_MASK_USIZE_T); 282 283#ifdef __INTEL_COMPILER 284# pragma warning(pop) 285#endif 286} 287 288/* 289** signed ssize_t to signed int 290*/ 291 292int curlx_sztosi(ssize_t sznum) 293{ 294#ifdef __INTEL_COMPILER 295# pragma warning(push) 296# pragma warning(disable:810) /* conversion may lose significant bits */ 297#endif 298 299 DEBUGASSERT(sznum >= 0); 300#if INT_MAX < SSIZE_T_MAX 301 DEBUGASSERT((size_t) sznum <= (size_t) CURL_MASK_SINT); 302#endif 303 return (int)(sznum & (ssize_t) CURL_MASK_SINT); 304 305#ifdef __INTEL_COMPILER 306# pragma warning(pop) 307#endif 308} 309 310/* 311** unsigned int to unsigned short 312*/ 313 314unsigned short curlx_uitous(unsigned int uinum) 315{ 316#ifdef __INTEL_COMPILER 317# pragma warning(push) 318# pragma warning(disable:810) /* conversion may lose significant bits */ 319#endif 320 321 DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_USHORT); 322 return (unsigned short) (uinum & (unsigned int) CURL_MASK_USHORT); 323 324#ifdef __INTEL_COMPILER 325# pragma warning(pop) 326#endif 327} 328 329/* 330** signed int to unsigned size_t 331*/ 332 333size_t curlx_sitouz(int sinum) 334{ 335#ifdef __INTEL_COMPILER 336# pragma warning(push) 337# pragma warning(disable:810) /* conversion may lose significant bits */ 338#endif 339 340 DEBUGASSERT(sinum >= 0); 341 return (size_t) sinum; 342 343#ifdef __INTEL_COMPILER 344# pragma warning(pop) 345#endif 346} 347 348#ifdef USE_WINSOCK 349 350/* 351** curl_socket_t to signed int 352*/ 353 354int curlx_sktosi(curl_socket_t s) 355{ 356 return (int)((ssize_t) s); 357} 358 359/* 360** signed int to curl_socket_t 361*/ 362 363curl_socket_t curlx_sitosk(int i) 364{ 365 return (curl_socket_t)((ssize_t) i); 366} 367 368#endif /* USE_WINSOCK */ 369 370#if defined(_WIN32) 371 372ssize_t curlx_read(int fd, void *buf, size_t count) 373{ 374 return (ssize_t)read(fd, buf, curlx_uztoui(count)); 375} 376 377ssize_t curlx_write(int fd, const void *buf, size_t count) 378{ 379 return (ssize_t)write(fd, buf, curlx_uztoui(count)); 380} 381 382#endif /* _WIN32 */ 383 384/* Ensure that warnless.h redefinitions continue to have an effect 385 in "unity" builds. */ 386#undef HEADER_CURL_WARNLESS_H_REDEFS 387