diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/Makefile.in | 16 | ||||
-rw-r--r-- | src/io.c | 43 | ||||
-rw-r--r-- | src/rand.c | 4 | ||||
-rw-r--r-- | src/socket.c | 6 | ||||
-rw-r--r-- | src/string.c | 2 | ||||
-rw-r--r-- | src/tc-socket.c | 4 |
7 files changed, 62 insertions, 16 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 676cd73..11a240e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,6 +13,9 @@ libHX_la_LDFLAGS = -no-undefined -version-info 39:0:7 if WITH_GNU_LD libHX_la_LDFLAGS += -Wl,--version-script=${srcdir}/libHX.map endif +if WITH_SUN_LD +libHX_la_LDFLAGS += -Wl,-M,${srcdir}/libHX.map +endif EXTRA_libHX_la_DEPENDENCIES = libHX.map if MINGW32 diff --git a/src/Makefile.in b/src/Makefile.in index 7e1bd81..22766b5 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -91,8 +91,9 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @WITH_GNU_LD_TRUE@am__append_1 = -Wl,--version-script=${srcdir}/libHX.map -@MINGW32_TRUE@am__append_2 = ux-file.c ux-mmap.c -@MINGW32_TRUE@am__append_3 = -lws2_32 +@WITH_SUN_LD_TRUE@am__append_2 = -Wl,-M,${srcdir}/libHX.map +@MINGW32_TRUE@am__append_3 = ux-file.c ux-mmap.c +@MINGW32_TRUE@am__append_4 = -lws2_32 check_PROGRAMS = tc-compile$(EXEEXT) tc-cast$(EXEEXT) \ tc-deque$(EXEEXT) tc-dir$(EXEEXT) tc-format$(EXEEXT) \ tc-io$(EXEEXT) tc-list$(EXEEXT) tc-list2$(EXEEXT) \ @@ -104,13 +105,13 @@ check_PROGRAMS = tc-compile$(EXEEXT) tc-cast$(EXEEXT) \ $(am__EXEEXT_1) TESTS = tc-format$(EXEEXT) tc-option$(EXEEXT) tc-strchr2$(EXEEXT) \ tc-string$(EXEEXT) tc-strquote$(EXEEXT) $(am__EXEEXT_2) -@HAVE_CXX_TRUE@am__append_4 = tx-compile tx-cast tx-deque tx-dir \ +@HAVE_CXX_TRUE@am__append_5 = tx-compile tx-cast tx-deque tx-dir \ @HAVE_CXX_TRUE@ tx-intdiff tx-list tx-list2 \ @HAVE_CXX_TRUE@ tx-misc tx-netio \ @HAVE_CXX_TRUE@ tx-option tx-proc tx-rand tx-strchr2 tx-string \ @HAVE_CXX_TRUE@ tx-strquote tx-time -@HAVE_CXX_TRUE@am__append_5 = tx-strchr2 tx-strquote +@HAVE_CXX_TRUE@am__append_6 = tx-strchr2 tx-strquote subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gcc4_visibility.m4 \ @@ -767,10 +768,11 @@ AM_CFLAGS = ${regular_CFLAGS} AM_CXXFLAGS = ${regular_CXXFLAGS} lib_LTLIBRARIES = libHX.la libHX_la_SOURCES = deque.c dl.c format.c io.c map.c mc.c misc.c opt.c \ - proc.c rand.c socket.c string.c time.c $(am__append_2) + proc.c rand.c socket.c string.c time.c $(am__append_3) libHX_la_LIBADD = ${libdl_LIBS} -lm ${libpthread_LIBS} ${librt_LIBS} \ - ${libsocket_LIBS} $(am__append_3) -libHX_la_LDFLAGS = -no-undefined -version-info 39:0:7 $(am__append_1) + ${libsocket_LIBS} $(am__append_4) +libHX_la_LDFLAGS = -no-undefined -version-info 39:0:7 $(am__append_1) \ + $(am__append_2) EXTRA_libHX_la_DEPENDENCIES = libHX.map EXTRA_DIST = internal.h map_int.h libHX.map uxcompat.h analyze.sh tc_cast_CFLAGS = ${AM_CFLAGS} -std=gnu99 @@ -7,6 +7,7 @@ * General Public License as published by the Free Software Foundation; * either version 2.1 or (at your option) any later version. */ +#define _GNU_SOURCE 1 #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -630,15 +631,37 @@ EXPORT_SYMBOL ssize_t HXio_fullwrite(int fd, const void *vbuf, size_t size) } #if __linux__ -static ssize_t HX_sendfile_linux(int dst, int src, size_t count) +#ifdef HAVE_COPY_FILE_RANGE +static ssize_t HX_cfr_linux(int dst, int src, size_t count) { - long pagesize = sysconf(_SC_PAGE_SIZE); - size_t xfersize; ssize_t ret, xferd = 0; + /* + * Use INT(32)_MAX rather than SSIZE_MAX, as there is an issue with + * overflow detection pending. + * https://lore.kernel.org/linux-man/38nr2286-1o9q-0004-2323-799587773o15@vanv.qr/ + */ + size_t xfersize = INT_MAX; + if (count > xfersize) + count = xfersize; + while ((ret = copy_file_range(src, nullptr, dst, nullptr, count, 0)) > 0) + xferd += ret; + if (xferd > 0) + return xferd; + if (ret < 0) + return -errno; + return 0; +} +#endif - if (pagesize < 0) - pagesize = 4096; - xfersize = SSIZE_MAX - pagesize; +static ssize_t HX_sendfile_linux(int dst, int src, size_t count) +{ + ssize_t ret, xferd = 0; + /* + * Use INT(32)_MAX rather than SSIZE_MAX, as there is an issue with + * overflow detection pending. + * https://lore.kernel.org/linux-man/38nr2286-1o9q-0004-2323-799587773o15@vanv.qr/ + */ + size_t xfersize = INT_MAX; if (count > xfersize) count = xfersize; while ((ret = sendfile(dst, src, nullptr, count)) > 0) @@ -686,7 +709,13 @@ static ssize_t HX_sendfile_rw(int dst, int src, size_t count) EXPORT_SYMBOL ssize_t HX_sendfile(int dst, int src, size_t count) { #if __linux__ - ssize_t ret = HX_sendfile_linux(dst, src, count); + ssize_t ret; +#ifdef HAVE_COPY_FILE_RANGE + ret = HX_cfr_linux(dst, src, count); + if (ret != -ENOSYS && ret != -EXDEV) + return ret; +#endif + ret = HX_sendfile_linux(dst, src, count); if (ret != -ENOSYS) return ret; #endif @@ -18,6 +18,10 @@ #ifdef __unix__ # include <unistd.h> #endif +#ifdef __APPLE__ +# include <sys/types.h> +# include <unistd.h> +#endif #ifdef _WIN32 # include <process.h> #endif diff --git a/src/socket.c b/src/socket.c index 9fdd903..fe813f5 100644 --- a/src/socket.c +++ b/src/socket.c @@ -41,7 +41,7 @@ #else # define STUPIDWIN(x) (x) #endif -#if defined(__sun) && !defined(SO_PROTOCOL) +#if defined(__sun) && !defined(SO_PROTOCOL) && defined(SO_PROTOTYPE) # define SO_PROTOCOL SO_PROTOTYPE #endif #ifndef AI_V4MAPPED @@ -333,18 +333,22 @@ static int try_sk_from_env(int fd, const struct addrinfo *ai, const char *intf) return -1; #else optlen = sizeof(value); +#ifdef SO_DOMAIN ret = getsockopt(fd, SOL_SOCKET, SO_DOMAIN, &value, &optlen); if (ret < 0 || value != ai->ai_family) return -1; +#endif optlen = sizeof(value); ret = getsockopt(fd, SOL_SOCKET, SO_TYPE, &value, &optlen); if (ret < 0 || value != ai->ai_socktype) return -1; optlen = sizeof(value); +#ifdef SO_PROTOCOL ret = getsockopt(fd, SOL_SOCKET, SO_PROTOCOL, &value, &optlen); if (ret < 0 || value != ai->ai_protocol) return -1; #endif +#endif struct sockaddr_storage addr; memset(&addr, 0, sizeof(addr)); optlen = sizeof(addr); diff --git a/src/string.c b/src/string.c index 06066ce..e468063 100644 --- a/src/string.c +++ b/src/string.c @@ -1036,7 +1036,7 @@ EXPORT_SYMBOL unsigned long long HX_strtoull_unit(const char *s, * UB. Thus check for range and apply the negation after the * conversion to ULL. */ - if (q > ULLONG_MAX) { + if (q >= static_cast(double, ULLONG_MAX)) { errno = ERANGE; return ULLONG_MAX; } diff --git a/src/tc-socket.c b/src/tc-socket.c index 3cdeb90..2c140a1 100644 --- a/src/tc-socket.c +++ b/src/tc-socket.c @@ -17,6 +17,7 @@ static int t_parse(void) { char host[32] = "bogus"; + uint16_t port = 4321; if (HX_addrport_split("[::1]", host, sizeof(host), nullptr) != 1 || strcmp(host, "::1") != 0) return 1; @@ -26,6 +27,9 @@ static int t_parse(void) if (HX_addrport_split("", host, sizeof(host), nullptr) != 1 || strcmp(host, "") != 0) return 1; + if (HX_addrport_split("[]:", host, sizeof(host), &port) != 1 || + strcmp(host, "") != 0 || port != 0) + return 1; return 0; } |