113498266Sopenharmony_ci/*************************************************************************** 213498266Sopenharmony_ci * _ _ ____ _ 313498266Sopenharmony_ci * Project ___| | | | _ \| | 413498266Sopenharmony_ci * / __| | | | |_) | | 513498266Sopenharmony_ci * | (__| |_| | _ <| |___ 613498266Sopenharmony_ci * \___|\___/|_| \_\_____| 713498266Sopenharmony_ci * 813498266Sopenharmony_ci * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 913498266Sopenharmony_ci * 1013498266Sopenharmony_ci * This software is licensed as described in the file COPYING, which 1113498266Sopenharmony_ci * you should have received as part of this distribution. The terms 1213498266Sopenharmony_ci * are also available at https://curl.se/docs/copyright.html. 1313498266Sopenharmony_ci * 1413498266Sopenharmony_ci * You may opt to use, copy, modify, merge, publish, distribute and/or sell 1513498266Sopenharmony_ci * copies of the Software, and permit persons to whom the Software is 1613498266Sopenharmony_ci * furnished to do so, under the terms of the COPYING file. 1713498266Sopenharmony_ci * 1813498266Sopenharmony_ci * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 1913498266Sopenharmony_ci * KIND, either express or implied. 2013498266Sopenharmony_ci * 2113498266Sopenharmony_ci * SPDX-License-Identifier: curl 2213498266Sopenharmony_ci * 2313498266Sopenharmony_ci ***************************************************************************/ 2413498266Sopenharmony_ci 2513498266Sopenharmony_ci#include "curl_setup.h" 2613498266Sopenharmony_ci 2713498266Sopenharmony_ci#if defined(__INTEL_COMPILER) && defined(__unix__) 2813498266Sopenharmony_ci 2913498266Sopenharmony_ci#ifdef HAVE_NETINET_IN_H 3013498266Sopenharmony_ci# include <netinet/in.h> 3113498266Sopenharmony_ci#endif 3213498266Sopenharmony_ci#ifdef HAVE_ARPA_INET_H 3313498266Sopenharmony_ci# include <arpa/inet.h> 3413498266Sopenharmony_ci#endif 3513498266Sopenharmony_ci 3613498266Sopenharmony_ci#endif /* __INTEL_COMPILER && __unix__ */ 3713498266Sopenharmony_ci 3813498266Sopenharmony_ci#include "warnless.h" 3913498266Sopenharmony_ci 4013498266Sopenharmony_ci#ifdef _WIN32 4113498266Sopenharmony_ci#undef read 4213498266Sopenharmony_ci#undef write 4313498266Sopenharmony_ci#endif 4413498266Sopenharmony_ci 4513498266Sopenharmony_ci#include <limits.h> 4613498266Sopenharmony_ci 4713498266Sopenharmony_ci#define CURL_MASK_UCHAR ((unsigned char)~0) 4813498266Sopenharmony_ci#define CURL_MASK_SCHAR (CURL_MASK_UCHAR >> 1) 4913498266Sopenharmony_ci 5013498266Sopenharmony_ci#define CURL_MASK_USHORT ((unsigned short)~0) 5113498266Sopenharmony_ci#define CURL_MASK_SSHORT (CURL_MASK_USHORT >> 1) 5213498266Sopenharmony_ci 5313498266Sopenharmony_ci#define CURL_MASK_UINT ((unsigned int)~0) 5413498266Sopenharmony_ci#define CURL_MASK_SINT (CURL_MASK_UINT >> 1) 5513498266Sopenharmony_ci 5613498266Sopenharmony_ci#define CURL_MASK_ULONG ((unsigned long)~0) 5713498266Sopenharmony_ci#define CURL_MASK_SLONG (CURL_MASK_ULONG >> 1) 5813498266Sopenharmony_ci 5913498266Sopenharmony_ci#define CURL_MASK_UCOFFT ((unsigned CURL_TYPEOF_CURL_OFF_T)~0) 6013498266Sopenharmony_ci#define CURL_MASK_SCOFFT (CURL_MASK_UCOFFT >> 1) 6113498266Sopenharmony_ci 6213498266Sopenharmony_ci#define CURL_MASK_USIZE_T ((size_t)~0) 6313498266Sopenharmony_ci#define CURL_MASK_SSIZE_T (CURL_MASK_USIZE_T >> 1) 6413498266Sopenharmony_ci 6513498266Sopenharmony_ci/* 6613498266Sopenharmony_ci** unsigned long to unsigned short 6713498266Sopenharmony_ci*/ 6813498266Sopenharmony_ci 6913498266Sopenharmony_ciunsigned short curlx_ultous(unsigned long ulnum) 7013498266Sopenharmony_ci{ 7113498266Sopenharmony_ci#ifdef __INTEL_COMPILER 7213498266Sopenharmony_ci# pragma warning(push) 7313498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 7413498266Sopenharmony_ci#endif 7513498266Sopenharmony_ci 7613498266Sopenharmony_ci DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_USHORT); 7713498266Sopenharmony_ci return (unsigned short)(ulnum & (unsigned long) CURL_MASK_USHORT); 7813498266Sopenharmony_ci 7913498266Sopenharmony_ci#ifdef __INTEL_COMPILER 8013498266Sopenharmony_ci# pragma warning(pop) 8113498266Sopenharmony_ci#endif 8213498266Sopenharmony_ci} 8313498266Sopenharmony_ci 8413498266Sopenharmony_ci/* 8513498266Sopenharmony_ci** unsigned long to unsigned char 8613498266Sopenharmony_ci*/ 8713498266Sopenharmony_ci 8813498266Sopenharmony_ciunsigned char curlx_ultouc(unsigned long ulnum) 8913498266Sopenharmony_ci{ 9013498266Sopenharmony_ci#ifdef __INTEL_COMPILER 9113498266Sopenharmony_ci# pragma warning(push) 9213498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 9313498266Sopenharmony_ci#endif 9413498266Sopenharmony_ci 9513498266Sopenharmony_ci DEBUGASSERT(ulnum <= (unsigned long) CURL_MASK_UCHAR); 9613498266Sopenharmony_ci return (unsigned char)(ulnum & (unsigned long) CURL_MASK_UCHAR); 9713498266Sopenharmony_ci 9813498266Sopenharmony_ci#ifdef __INTEL_COMPILER 9913498266Sopenharmony_ci# pragma warning(pop) 10013498266Sopenharmony_ci#endif 10113498266Sopenharmony_ci} 10213498266Sopenharmony_ci 10313498266Sopenharmony_ci/* 10413498266Sopenharmony_ci** unsigned size_t to signed curl_off_t 10513498266Sopenharmony_ci*/ 10613498266Sopenharmony_ci 10713498266Sopenharmony_cicurl_off_t curlx_uztoso(size_t uznum) 10813498266Sopenharmony_ci{ 10913498266Sopenharmony_ci#ifdef __INTEL_COMPILER 11013498266Sopenharmony_ci# pragma warning(push) 11113498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 11213498266Sopenharmony_ci#elif defined(_MSC_VER) 11313498266Sopenharmony_ci# pragma warning(push) 11413498266Sopenharmony_ci# pragma warning(disable:4310) /* cast truncates constant value */ 11513498266Sopenharmony_ci#endif 11613498266Sopenharmony_ci 11713498266Sopenharmony_ci DEBUGASSERT(uznum <= (size_t) CURL_MASK_SCOFFT); 11813498266Sopenharmony_ci return (curl_off_t)(uznum & (size_t) CURL_MASK_SCOFFT); 11913498266Sopenharmony_ci 12013498266Sopenharmony_ci#if defined(__INTEL_COMPILER) || defined(_MSC_VER) 12113498266Sopenharmony_ci# pragma warning(pop) 12213498266Sopenharmony_ci#endif 12313498266Sopenharmony_ci} 12413498266Sopenharmony_ci 12513498266Sopenharmony_ci/* 12613498266Sopenharmony_ci** unsigned size_t to signed int 12713498266Sopenharmony_ci*/ 12813498266Sopenharmony_ci 12913498266Sopenharmony_ciint curlx_uztosi(size_t uznum) 13013498266Sopenharmony_ci{ 13113498266Sopenharmony_ci#ifdef __INTEL_COMPILER 13213498266Sopenharmony_ci# pragma warning(push) 13313498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 13413498266Sopenharmony_ci#endif 13513498266Sopenharmony_ci 13613498266Sopenharmony_ci DEBUGASSERT(uznum <= (size_t) CURL_MASK_SINT); 13713498266Sopenharmony_ci return (int)(uznum & (size_t) CURL_MASK_SINT); 13813498266Sopenharmony_ci 13913498266Sopenharmony_ci#ifdef __INTEL_COMPILER 14013498266Sopenharmony_ci# pragma warning(pop) 14113498266Sopenharmony_ci#endif 14213498266Sopenharmony_ci} 14313498266Sopenharmony_ci 14413498266Sopenharmony_ci/* 14513498266Sopenharmony_ci** unsigned size_t to unsigned long 14613498266Sopenharmony_ci*/ 14713498266Sopenharmony_ci 14813498266Sopenharmony_ciunsigned long curlx_uztoul(size_t uznum) 14913498266Sopenharmony_ci{ 15013498266Sopenharmony_ci#ifdef __INTEL_COMPILER 15113498266Sopenharmony_ci# pragma warning(push) 15213498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 15313498266Sopenharmony_ci#endif 15413498266Sopenharmony_ci 15513498266Sopenharmony_ci#if ULONG_MAX < SIZE_T_MAX 15613498266Sopenharmony_ci DEBUGASSERT(uznum <= (size_t) CURL_MASK_ULONG); 15713498266Sopenharmony_ci#endif 15813498266Sopenharmony_ci return (unsigned long)(uznum & (size_t) CURL_MASK_ULONG); 15913498266Sopenharmony_ci 16013498266Sopenharmony_ci#ifdef __INTEL_COMPILER 16113498266Sopenharmony_ci# pragma warning(pop) 16213498266Sopenharmony_ci#endif 16313498266Sopenharmony_ci} 16413498266Sopenharmony_ci 16513498266Sopenharmony_ci/* 16613498266Sopenharmony_ci** unsigned size_t to unsigned int 16713498266Sopenharmony_ci*/ 16813498266Sopenharmony_ci 16913498266Sopenharmony_ciunsigned int curlx_uztoui(size_t uznum) 17013498266Sopenharmony_ci{ 17113498266Sopenharmony_ci#ifdef __INTEL_COMPILER 17213498266Sopenharmony_ci# pragma warning(push) 17313498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 17413498266Sopenharmony_ci#endif 17513498266Sopenharmony_ci 17613498266Sopenharmony_ci#if UINT_MAX < SIZE_T_MAX 17713498266Sopenharmony_ci DEBUGASSERT(uznum <= (size_t) CURL_MASK_UINT); 17813498266Sopenharmony_ci#endif 17913498266Sopenharmony_ci return (unsigned int)(uznum & (size_t) CURL_MASK_UINT); 18013498266Sopenharmony_ci 18113498266Sopenharmony_ci#ifdef __INTEL_COMPILER 18213498266Sopenharmony_ci# pragma warning(pop) 18313498266Sopenharmony_ci#endif 18413498266Sopenharmony_ci} 18513498266Sopenharmony_ci 18613498266Sopenharmony_ci/* 18713498266Sopenharmony_ci** signed long to signed int 18813498266Sopenharmony_ci*/ 18913498266Sopenharmony_ci 19013498266Sopenharmony_ciint curlx_sltosi(long slnum) 19113498266Sopenharmony_ci{ 19213498266Sopenharmony_ci#ifdef __INTEL_COMPILER 19313498266Sopenharmony_ci# pragma warning(push) 19413498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 19513498266Sopenharmony_ci#endif 19613498266Sopenharmony_ci 19713498266Sopenharmony_ci DEBUGASSERT(slnum >= 0); 19813498266Sopenharmony_ci#if INT_MAX < LONG_MAX 19913498266Sopenharmony_ci DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_SINT); 20013498266Sopenharmony_ci#endif 20113498266Sopenharmony_ci return (int)(slnum & (long) CURL_MASK_SINT); 20213498266Sopenharmony_ci 20313498266Sopenharmony_ci#ifdef __INTEL_COMPILER 20413498266Sopenharmony_ci# pragma warning(pop) 20513498266Sopenharmony_ci#endif 20613498266Sopenharmony_ci} 20713498266Sopenharmony_ci 20813498266Sopenharmony_ci/* 20913498266Sopenharmony_ci** signed long to unsigned int 21013498266Sopenharmony_ci*/ 21113498266Sopenharmony_ci 21213498266Sopenharmony_ciunsigned int curlx_sltoui(long slnum) 21313498266Sopenharmony_ci{ 21413498266Sopenharmony_ci#ifdef __INTEL_COMPILER 21513498266Sopenharmony_ci# pragma warning(push) 21613498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 21713498266Sopenharmony_ci#endif 21813498266Sopenharmony_ci 21913498266Sopenharmony_ci DEBUGASSERT(slnum >= 0); 22013498266Sopenharmony_ci#if UINT_MAX < LONG_MAX 22113498266Sopenharmony_ci DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_UINT); 22213498266Sopenharmony_ci#endif 22313498266Sopenharmony_ci return (unsigned int)(slnum & (long) CURL_MASK_UINT); 22413498266Sopenharmony_ci 22513498266Sopenharmony_ci#ifdef __INTEL_COMPILER 22613498266Sopenharmony_ci# pragma warning(pop) 22713498266Sopenharmony_ci#endif 22813498266Sopenharmony_ci} 22913498266Sopenharmony_ci 23013498266Sopenharmony_ci/* 23113498266Sopenharmony_ci** signed long to unsigned short 23213498266Sopenharmony_ci*/ 23313498266Sopenharmony_ci 23413498266Sopenharmony_ciunsigned short curlx_sltous(long slnum) 23513498266Sopenharmony_ci{ 23613498266Sopenharmony_ci#ifdef __INTEL_COMPILER 23713498266Sopenharmony_ci# pragma warning(push) 23813498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 23913498266Sopenharmony_ci#endif 24013498266Sopenharmony_ci 24113498266Sopenharmony_ci DEBUGASSERT(slnum >= 0); 24213498266Sopenharmony_ci DEBUGASSERT((unsigned long) slnum <= (unsigned long) CURL_MASK_USHORT); 24313498266Sopenharmony_ci return (unsigned short)(slnum & (long) CURL_MASK_USHORT); 24413498266Sopenharmony_ci 24513498266Sopenharmony_ci#ifdef __INTEL_COMPILER 24613498266Sopenharmony_ci# pragma warning(pop) 24713498266Sopenharmony_ci#endif 24813498266Sopenharmony_ci} 24913498266Sopenharmony_ci 25013498266Sopenharmony_ci/* 25113498266Sopenharmony_ci** unsigned size_t to signed ssize_t 25213498266Sopenharmony_ci*/ 25313498266Sopenharmony_ci 25413498266Sopenharmony_cissize_t curlx_uztosz(size_t uznum) 25513498266Sopenharmony_ci{ 25613498266Sopenharmony_ci#ifdef __INTEL_COMPILER 25713498266Sopenharmony_ci# pragma warning(push) 25813498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 25913498266Sopenharmony_ci#endif 26013498266Sopenharmony_ci 26113498266Sopenharmony_ci DEBUGASSERT(uznum <= (size_t) CURL_MASK_SSIZE_T); 26213498266Sopenharmony_ci return (ssize_t)(uznum & (size_t) CURL_MASK_SSIZE_T); 26313498266Sopenharmony_ci 26413498266Sopenharmony_ci#ifdef __INTEL_COMPILER 26513498266Sopenharmony_ci# pragma warning(pop) 26613498266Sopenharmony_ci#endif 26713498266Sopenharmony_ci} 26813498266Sopenharmony_ci 26913498266Sopenharmony_ci/* 27013498266Sopenharmony_ci** signed curl_off_t to unsigned size_t 27113498266Sopenharmony_ci*/ 27213498266Sopenharmony_ci 27313498266Sopenharmony_cisize_t curlx_sotouz(curl_off_t sonum) 27413498266Sopenharmony_ci{ 27513498266Sopenharmony_ci#ifdef __INTEL_COMPILER 27613498266Sopenharmony_ci# pragma warning(push) 27713498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 27813498266Sopenharmony_ci#endif 27913498266Sopenharmony_ci 28013498266Sopenharmony_ci DEBUGASSERT(sonum >= 0); 28113498266Sopenharmony_ci return (size_t)(sonum & (curl_off_t) CURL_MASK_USIZE_T); 28213498266Sopenharmony_ci 28313498266Sopenharmony_ci#ifdef __INTEL_COMPILER 28413498266Sopenharmony_ci# pragma warning(pop) 28513498266Sopenharmony_ci#endif 28613498266Sopenharmony_ci} 28713498266Sopenharmony_ci 28813498266Sopenharmony_ci/* 28913498266Sopenharmony_ci** signed ssize_t to signed int 29013498266Sopenharmony_ci*/ 29113498266Sopenharmony_ci 29213498266Sopenharmony_ciint curlx_sztosi(ssize_t sznum) 29313498266Sopenharmony_ci{ 29413498266Sopenharmony_ci#ifdef __INTEL_COMPILER 29513498266Sopenharmony_ci# pragma warning(push) 29613498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 29713498266Sopenharmony_ci#endif 29813498266Sopenharmony_ci 29913498266Sopenharmony_ci DEBUGASSERT(sznum >= 0); 30013498266Sopenharmony_ci#if INT_MAX < SSIZE_T_MAX 30113498266Sopenharmony_ci DEBUGASSERT((size_t) sznum <= (size_t) CURL_MASK_SINT); 30213498266Sopenharmony_ci#endif 30313498266Sopenharmony_ci return (int)(sznum & (ssize_t) CURL_MASK_SINT); 30413498266Sopenharmony_ci 30513498266Sopenharmony_ci#ifdef __INTEL_COMPILER 30613498266Sopenharmony_ci# pragma warning(pop) 30713498266Sopenharmony_ci#endif 30813498266Sopenharmony_ci} 30913498266Sopenharmony_ci 31013498266Sopenharmony_ci/* 31113498266Sopenharmony_ci** unsigned int to unsigned short 31213498266Sopenharmony_ci*/ 31313498266Sopenharmony_ci 31413498266Sopenharmony_ciunsigned short curlx_uitous(unsigned int uinum) 31513498266Sopenharmony_ci{ 31613498266Sopenharmony_ci#ifdef __INTEL_COMPILER 31713498266Sopenharmony_ci# pragma warning(push) 31813498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 31913498266Sopenharmony_ci#endif 32013498266Sopenharmony_ci 32113498266Sopenharmony_ci DEBUGASSERT(uinum <= (unsigned int) CURL_MASK_USHORT); 32213498266Sopenharmony_ci return (unsigned short) (uinum & (unsigned int) CURL_MASK_USHORT); 32313498266Sopenharmony_ci 32413498266Sopenharmony_ci#ifdef __INTEL_COMPILER 32513498266Sopenharmony_ci# pragma warning(pop) 32613498266Sopenharmony_ci#endif 32713498266Sopenharmony_ci} 32813498266Sopenharmony_ci 32913498266Sopenharmony_ci/* 33013498266Sopenharmony_ci** signed int to unsigned size_t 33113498266Sopenharmony_ci*/ 33213498266Sopenharmony_ci 33313498266Sopenharmony_cisize_t curlx_sitouz(int sinum) 33413498266Sopenharmony_ci{ 33513498266Sopenharmony_ci#ifdef __INTEL_COMPILER 33613498266Sopenharmony_ci# pragma warning(push) 33713498266Sopenharmony_ci# pragma warning(disable:810) /* conversion may lose significant bits */ 33813498266Sopenharmony_ci#endif 33913498266Sopenharmony_ci 34013498266Sopenharmony_ci DEBUGASSERT(sinum >= 0); 34113498266Sopenharmony_ci return (size_t) sinum; 34213498266Sopenharmony_ci 34313498266Sopenharmony_ci#ifdef __INTEL_COMPILER 34413498266Sopenharmony_ci# pragma warning(pop) 34513498266Sopenharmony_ci#endif 34613498266Sopenharmony_ci} 34713498266Sopenharmony_ci 34813498266Sopenharmony_ci#ifdef USE_WINSOCK 34913498266Sopenharmony_ci 35013498266Sopenharmony_ci/* 35113498266Sopenharmony_ci** curl_socket_t to signed int 35213498266Sopenharmony_ci*/ 35313498266Sopenharmony_ci 35413498266Sopenharmony_ciint curlx_sktosi(curl_socket_t s) 35513498266Sopenharmony_ci{ 35613498266Sopenharmony_ci return (int)((ssize_t) s); 35713498266Sopenharmony_ci} 35813498266Sopenharmony_ci 35913498266Sopenharmony_ci/* 36013498266Sopenharmony_ci** signed int to curl_socket_t 36113498266Sopenharmony_ci*/ 36213498266Sopenharmony_ci 36313498266Sopenharmony_cicurl_socket_t curlx_sitosk(int i) 36413498266Sopenharmony_ci{ 36513498266Sopenharmony_ci return (curl_socket_t)((ssize_t) i); 36613498266Sopenharmony_ci} 36713498266Sopenharmony_ci 36813498266Sopenharmony_ci#endif /* USE_WINSOCK */ 36913498266Sopenharmony_ci 37013498266Sopenharmony_ci#if defined(_WIN32) 37113498266Sopenharmony_ci 37213498266Sopenharmony_cissize_t curlx_read(int fd, void *buf, size_t count) 37313498266Sopenharmony_ci{ 37413498266Sopenharmony_ci return (ssize_t)read(fd, buf, curlx_uztoui(count)); 37513498266Sopenharmony_ci} 37613498266Sopenharmony_ci 37713498266Sopenharmony_cissize_t curlx_write(int fd, const void *buf, size_t count) 37813498266Sopenharmony_ci{ 37913498266Sopenharmony_ci return (ssize_t)write(fd, buf, curlx_uztoui(count)); 38013498266Sopenharmony_ci} 38113498266Sopenharmony_ci 38213498266Sopenharmony_ci#endif /* _WIN32 */ 38313498266Sopenharmony_ci 38413498266Sopenharmony_ci/* Ensure that warnless.h redefinitions continue to have an effect 38513498266Sopenharmony_ci in "unity" builds. */ 38613498266Sopenharmony_ci#undef HEADER_CURL_WARNLESS_H_REDEFS 387