From b6c22e63e11aa3ac69c12fa726ec96ef383a21af Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sat, 20 Aug 2022 11:05:09 +0300 Subject: [PATCH 001/286] NET_SOFTERROR on UDP send EAGAIN/EINTR errno if no data was sent --- src/iperf_udp.c | 7 +++++-- src/net.c | 8 +++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/iperf_udp.c b/src/iperf_udp.c index b697c9729..45e2e6454 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -250,8 +250,11 @@ iperf_udp_send(struct iperf_stream *sp) r = Nwrite(sp->socket, sp->buffer, size, Pudp); - if (r < 0) - return r; + if (r < 0) { + if (r == NET_SOFTERROR && sp->test->debug_level >= DEBUG_LEVEL_INFO) + printf("UDP send failed on NET_SOFTERROR. errno=%s\n", strerror(errno)); + return r; + } sp->result->bytes_sent += r; sp->result->bytes_sent_this_interval += r; diff --git a/src/net.c b/src/net.c index 1a88155bc..caeca3422 100644 --- a/src/net.c +++ b/src/net.c @@ -409,12 +409,14 @@ Nwrite(int fd, const char *buf, size_t count, int prot) #if (EAGAIN != EWOULDBLOCK) case EWOULDBLOCK: #endif + if (count == nleft) + return NET_SOFTERROR; return count - nleft; - case ENOBUFS: - return NET_SOFTERROR; + case ENOBUFS : + return NET_SOFTERROR; - default: + default: return NET_HARDERROR; } } else if (r == 0) From 21c315df798ca0ee78de447e0202c6bd63dfe2e3 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sat, 20 Aug 2022 11:38:41 +0300 Subject: [PATCH 002/286] Fix #1367 - do not count UDP messages that were not sent --- src/iperf_udp.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/iperf_udp.c b/src/iperf_udp.c index b697c9729..afa4d5bd6 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -250,8 +250,15 @@ iperf_udp_send(struct iperf_stream *sp) r = Nwrite(sp->socket, sp->buffer, size, Pudp); - if (r < 0) - return r; + if (r <= 0) { + --sp->packet_count; /* Don't count messages that no data was sent from them. + * Allows "resending" a massage with the same numbering */ + if (r < 0) { + if (r == NET_SOFTERROR && sp->test->debug_level >= DEBUG_LEVEL_INFO) + printf("UDP send failed on NET_SOFTERROR. errno=%s\n", strerror(errno)); + return r; + } + } sp->result->bytes_sent += r; sp->result->bytes_sent_this_interval += r; From 9caff37f29e3817d7b03a54c8b029451049d91d5 Mon Sep 17 00:00:00 2001 From: Sebastian Gottschall Date: Tue, 7 Feb 2023 12:59:55 +0600 Subject: [PATCH 003/286] fix endian type of udp connect / reply messages for example. if you run a iperf3 server on a little endian host, but client is bug endian it will result in the following error if you try to start a udp bandwidth test Connect received for Socket 5, sz=4, buf=36373839, i=0, max_len_wait_for_reply=4 iperf3: error - unable to read from stream socket: Invalid argument the reason that that all messages are reversed. fix this by swapping the message values to little endian host order on big endian systems Signed-off-by: Sebastian Gottschall --- src/iperf.h | 8 ++++++++ src/iperf_udp.c | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/iperf.h b/src/iperf.h index e010c2d29..46034ba38 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -67,6 +67,7 @@ #include "queue.h" #include "cjson.h" #include "iperf_time.h" +#include "portable_endian.h" #if defined(HAVE_SSL) #include @@ -431,9 +432,16 @@ struct iperf_test extern int gerror; /* error value from getaddrinfo(3), for use in internal error handling */ /* UDP "connect" message and reply (textual value for Wireshark, etc. readability - legacy was numeric) */ + +#if BYTE_ORDER == BIG_ENDIAN +#define UDP_CONNECT_MSG 0x39383736 +#define UDP_CONNECT_REPLY 0x36373839 +#define LEGACY_UDP_CONNECT_REPLY 0xb168de3a +#else #define UDP_CONNECT_MSG 0x36373839 // "6789" - legacy value was 123456789 #define UDP_CONNECT_REPLY 0x39383736 // "9876" - legacy value was 987654321 #define LEGACY_UDP_CONNECT_REPLY 987654321 // Old servers may still reply with the legacy value +#endif /* In Reverse mode, maximum number of packets to wait for "accept" response - to handle out of order packets */ #define MAX_REVERSE_OUT_OF_ORDER_PACKETS 2 diff --git a/src/iperf_udp.c b/src/iperf_udp.c index d41a5690e..d48352338 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -47,7 +47,6 @@ #include "timer.h" #include "net.h" #include "cjson.h" -#include "portable_endian.h" #if defined(HAVE_INTTYPES_H) # include From 87cef9935bc388f56ea5c8b525a6756c1392a2b9 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sat, 8 Apr 2023 15:48:14 +0300 Subject: [PATCH 004/286] Per reviewer comment - reimplemented to support backward compatibility --- src/iperf.h | 1 + src/iperf_api.c | 70 ++++++++++++++++++++++++++++++++++++---------- src/iperf_locale.c | 3 ++ src/iperf_locale.h | 1 + 4 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index e010c2d29..0051a307e 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -201,6 +201,7 @@ struct iperf_stream */ int packet_count; int peer_packet_count; + int peer_omitted_packet_count; int omitted_packet_count; double jitter; double prev_transit; diff --git a/src/iperf_api.c b/src/iperf_api.c index c104be12d..a66fa74f8 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2410,7 +2410,9 @@ send_results(struct iperf_test *test) cJSON_AddNumberToObject(j_stream, "retransmits", retransmits); cJSON_AddNumberToObject(j_stream, "jitter", sp->jitter); cJSON_AddNumberToObject(j_stream, "errors", sp->cnt_error); + cJSON_AddNumberToObject(j_stream, "omitted_errors", sp->omitted_cnt_error); cJSON_AddNumberToObject(j_stream, "packets", sp->packet_count); + cJSON_AddNumberToObject(j_stream, "omitted_packets", sp->omitted_packet_count); iperf_time_diff(&sp->result->start_time, &sp->result->start_time, &temp_time); start_time = iperf_time_in_secs(&temp_time); @@ -2457,10 +2459,12 @@ get_results(struct iperf_test *test) cJSON *j_retransmits; cJSON *j_jitter; cJSON *j_errors; + cJSON *j_omitted_errors; cJSON *j_packets; + cJSON *j_omitted_packets; cJSON *j_server_output; cJSON *j_start_time, *j_end_time; - int sid, cerror, pcount; + int sid, cerror, pcount, omitted_cerror, omitted_pcount; double jitter; iperf_size_t bytes_transferred; int retransmits; @@ -2513,12 +2517,18 @@ get_results(struct iperf_test *test) j_retransmits = cJSON_GetObjectItem(j_stream, "retransmits"); j_jitter = cJSON_GetObjectItem(j_stream, "jitter"); j_errors = cJSON_GetObjectItem(j_stream, "errors"); + j_omitted_errors = cJSON_GetObjectItem(j_stream, "omitted_errors"); j_packets = cJSON_GetObjectItem(j_stream, "packets"); + j_omitted_packets = cJSON_GetObjectItem(j_stream, "omitted_packets"); j_start_time = cJSON_GetObjectItem(j_stream, "start_time"); j_end_time = cJSON_GetObjectItem(j_stream, "end_time"); if (j_id == NULL || j_bytes == NULL || j_retransmits == NULL || j_jitter == NULL || j_errors == NULL || j_packets == NULL) { i_errno = IERECVRESULTS; r = -1; + } else if ( (j_omitted_errors == NULL && j_omitted_packets != NULL) || (j_omitted_errors != NULL && j_omitted_packets == NULL) ) { + /* For backward compatibility allow to not receive "omitted" statistcs */ + i_errno = IERECVRESULTS; + r = -1; } else { sid = j_id->valueint; bytes_transferred = j_bytes->valueint; @@ -2526,6 +2536,10 @@ get_results(struct iperf_test *test) jitter = j_jitter->valuedouble; cerror = j_errors->valueint; pcount = j_packets->valueint; + if (j_omitted_packets != NULL) { + omitted_cerror = j_omitted_errors->valueint; + omitted_pcount = j_omitted_packets->valueint; + } SLIST_FOREACH(sp, &test->streams, streams) if (sp->id == sid) break; if (sp == NULL) { @@ -2537,6 +2551,18 @@ get_results(struct iperf_test *test) sp->cnt_error = cerror; sp->peer_packet_count = pcount; sp->result->bytes_received = bytes_transferred; + if (j_omitted_packets != NULL) { + sp->omitted_cnt_error = omitted_cerror; + sp->peer_omitted_packet_count = omitted_pcount; + } else { + sp->peer_omitted_packet_count = sp->omitted_packet_count; + if (sp->peer_omitted_packet_count > 0) { + /* -1 indicates unknown error count since it includes the omitted count */ + sp->omitted_cnt_error = (sp->cnt_error > 0) ? -1 : 0; + } else { + sp->omitted_cnt_error = sp->cnt_error; + } + } /* * We have to handle the possibility that * start_time and end_time might not be @@ -2556,6 +2582,11 @@ get_results(struct iperf_test *test) sp->peer_packet_count = pcount; sp->result->bytes_sent = bytes_transferred; sp->result->stream_retrans = retransmits; + if (j_omitted_packets != NULL) { + sp->peer_omitted_packet_count = omitted_pcount; + } else { + sp->peer_omitted_packet_count = sp->peer_packet_count; + } if (j_start_time && j_end_time) { sp->result->sender_time = j_end_time->valuedouble - j_start_time->valuedouble; } @@ -3583,6 +3614,7 @@ iperf_print_results(struct iperf_test *test) int total_retransmits = 0; int total_packets = 0, lost_packets = 0; int sender_packet_count = 0, receiver_packet_count = 0; /* for this stream, this interval */ + int sender_omitted_packet_count = 0, receiver_omitted_packet_count = 0; /* for this stream, this interval */ int sender_total_packets = 0, receiver_total_packets = 0; /* running total */ char ubuf[UNIT_LEN]; char nbuf[UNIT_LEN]; @@ -3593,7 +3625,7 @@ iperf_print_results(struct iperf_test *test) iperf_size_t bytes_received, total_received = 0; double start_time, end_time = 0.0, avg_jitter = 0.0, lost_percent = 0.0; double sender_time = 0.0, receiver_time = 0.0; - struct iperf_time temp_time; + struct iperf_time temp_time; double bandwidth; char mbuf[UNIT_LEN]; @@ -3631,8 +3663,8 @@ iperf_print_results(struct iperf_test *test) */ if (sp) { - iperf_time_diff(&sp->result->start_time, &sp->result->end_time, &temp_time); - end_time = iperf_time_in_secs(&temp_time); + iperf_time_diff(&sp->result->start_time, &sp->result->end_time, &temp_time); + end_time = iperf_time_in_secs(&temp_time); if (sp->sender) { sp->result->sender_time = end_time; if (sp->result->receiver_time == 0.0) { @@ -3663,11 +3695,15 @@ iperf_print_results(struct iperf_test *test) if (sp->sender) { sender_packet_count = sp->packet_count; + sender_omitted_packet_count = sp->omitted_packet_count; receiver_packet_count = sp->peer_packet_count; + receiver_omitted_packet_count = sp->peer_omitted_packet_count; } else { sender_packet_count = sp->peer_packet_count; + sender_omitted_packet_count = sp->peer_omitted_packet_count; receiver_packet_count = sp->packet_count; + receiver_omitted_packet_count = sp->omitted_packet_count; } if (test->protocol->id == Ptcp || test->protocol->id == Psctp) { @@ -3681,9 +3717,11 @@ iperf_print_results(struct iperf_test *test) */ int packet_count = sender_packet_count ? sender_packet_count : receiver_packet_count; total_packets += (packet_count - sp->omitted_packet_count); - sender_total_packets += (sender_packet_count - sp->omitted_packet_count); - receiver_total_packets += (receiver_packet_count - sp->omitted_packet_count); - lost_packets += (sp->cnt_error - sp->omitted_cnt_error); + sender_total_packets += (sender_packet_count - sender_omitted_packet_count); + receiver_total_packets += (receiver_packet_count - receiver_omitted_packet_count); + lost_packets += sp->cnt_error; + if (sp->omitted_cnt_error > -1) + lost_packets -= sp->omitted_cnt_error; avg_jitter += sp->jitter; } @@ -3723,15 +3761,15 @@ iperf_print_results(struct iperf_test *test) } } else { /* Sender summary, UDP. */ - if (sender_packet_count - sp->omitted_packet_count > 0) { - lost_percent = 100.0 * (sp->cnt_error - sp->omitted_cnt_error) / (sender_packet_count - sp->omitted_packet_count); + if (sender_packet_count - sender_omitted_packet_count > 0) { + lost_percent = 100.0 * (sp->cnt_error - sp->omitted_cnt_error) / (sender_packet_count - sender_omitted_packet_count); } else { lost_percent = 0.0; } if (test->json_output) { /* - * For hysterical raisins, we only emit one JSON + * For historical reasons, we only emit one JSON * object for the UDP summary, and it contains * information for both the sender and receiver * side. @@ -3762,7 +3800,7 @@ iperf_print_results(struct iperf_test *test) iperf_printf(test, report_sender_not_available_format, sp->socket); } else { - iperf_printf(test, report_bw_udp_format, sp->socket, mbuf, start_time, sender_time, ubuf, nbuf, 0.0, 0, (sender_packet_count - sp->omitted_packet_count), (double) 0, report_sender); + iperf_printf(test, report_bw_udp_format, sp->socket, mbuf, start_time, sender_time, ubuf, nbuf, 0.0, 0, (sender_packet_count - sender_omitted_packet_count), (double) 0, report_sender); } if ((sp->outoforder_packets - sp->omitted_outoforder_packets) > 0) iperf_printf(test, report_sum_outoforder, mbuf, start_time, sender_time, (sp->outoforder_packets - sp->omitted_outoforder_packets)); @@ -3819,8 +3857,8 @@ iperf_print_results(struct iperf_test *test) * data here. */ if (! test->json_output) { - if (receiver_packet_count - sp->omitted_packet_count > 0) { - lost_percent = 100.0 * (sp->cnt_error - sp->omitted_cnt_error) / (receiver_packet_count - sp->omitted_packet_count); + if (receiver_packet_count - receiver_omitted_packet_count > 0 && sp->omitted_cnt_error > -1) { + lost_percent = 100.0 * (sp->cnt_error - sp->omitted_cnt_error) / (receiver_packet_count - receiver_omitted_packet_count); } else { lost_percent = 0.0; @@ -3831,7 +3869,11 @@ iperf_print_results(struct iperf_test *test) iperf_printf(test, report_receiver_not_available_format, sp->socket); } else { - iperf_printf(test, report_bw_udp_format, sp->socket, mbuf, start_time, receiver_time, ubuf, nbuf, sp->jitter * 1000.0, (sp->cnt_error - sp->omitted_cnt_error), (receiver_packet_count - sp->omitted_packet_count), lost_percent, report_receiver); + if (sp->omitted_cnt_error > -1) { + iperf_printf(test, report_bw_udp_format, sp->socket, mbuf, start_time, receiver_time, ubuf, nbuf, sp->jitter * 1000.0, (sp->cnt_error - sp->omitted_cnt_error), (receiver_packet_count - receiver_omitted_packet_count), lost_percent, report_receiver); + } else { + iperf_printf(test, report_bw_udp_format_no_omitted_error, sp->socket, mbuf, start_time, receiver_time, ubuf, nbuf, sp->jitter * 1000.0, (receiver_packet_count - receiver_omitted_packet_count), report_receiver); + } } } } diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 62e3bc441..9eec77b29 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -384,6 +384,9 @@ const char report_bw_retrans_cwnd_format[] = const char report_bw_udp_format[] = "[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %d/%d (%.2g%%) %s\n"; +const char report_bw_udp_format_no_omitted_error[] = +"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms Unknown/%d %s\n"; + const char report_bw_udp_sender_format[] = "[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %s %d %s\n"; diff --git a/src/iperf_locale.h b/src/iperf_locale.h index 47cf416ae..bc9c96cb4 100644 --- a/src/iperf_locale.h +++ b/src/iperf_locale.h @@ -78,6 +78,7 @@ extern const char report_bw_format[] ; extern const char report_bw_retrans_format[] ; extern const char report_bw_retrans_cwnd_format[] ; extern const char report_bw_udp_format[] ; +extern const char report_bw_udp_format_no_omitted_error[] ; extern const char report_bw_udp_sender_format[] ; extern const char report_summary[] ; extern const char report_sum_bw_format[] ; From 25e483e9320689c0a7e357b559c3445e59f920cc Mon Sep 17 00:00:00 2001 From: Josh Bailey Date: Tue, 9 May 2023 19:43:26 +0000 Subject: [PATCH 005/286] add build test. --- .github/workflows/test.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..8c3e84b08 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: test +on: [push, pull_request] +jobs: + build-test-latest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: install dependencies + run: | + sudo apt-get -y update && sudo apt-get install -y build-essential + - name: build + run: | + ./configure && make && ./src/iperf3 --help + build-test-ubuntu-20_04: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + - name: install dependencies + run: | + sudo apt-get -y update && sudo apt-get install -y build-essential + - name: build + run: | + ./configure && make && ./src/iperf3 --help From 6f8084d5edf2fe06337039006e9c8dc34379f51e Mon Sep 17 00:00:00 2001 From: Josh Bailey Date: Tue, 9 May 2023 23:00:58 +0000 Subject: [PATCH 006/286] run make check/test commands. --- .github/workflows/test.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8c3e84b08..a013a035d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,9 @@ jobs: sudo apt-get -y update && sudo apt-get install -y build-essential - name: build run: | - ./configure && make && ./src/iperf3 --help + ./configure && make && make check + timeout 600 src/iperf3 -s & + ./test_commands.sh build-test-ubuntu-20_04: runs-on: ubuntu-20.04 steps: @@ -20,4 +22,6 @@ jobs: sudo apt-get -y update && sudo apt-get install -y build-essential - name: build run: | - ./configure && make && ./src/iperf3 --help + ./configure && make && make check + timeout 600 src/iperf3 -s & + ./test_commands.sh From 09909aa382b27d215abd0d0b657f6c16a9682643 Mon Sep 17 00:00:00 2001 From: Josh Bailey Date: Wed, 10 May 2023 02:48:42 +0000 Subject: [PATCH 007/286] run tests. --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a013a035d..3b3081531 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,8 +11,8 @@ jobs: - name: build run: | ./configure && make && make check - timeout 600 src/iperf3 -s & - ./test_commands.sh + timeout 300 src/iperf3 -s & + ./test_commands.sh localhost build-test-ubuntu-20_04: runs-on: ubuntu-20.04 steps: @@ -23,5 +23,5 @@ jobs: - name: build run: | ./configure && make && make check - timeout 600 src/iperf3 -s & - ./test_commands.sh + timeout 300 src/iperf3 -s & + ./test_commands.sh localhost From f73c85248a2d5ea13ae94a4254b101c5bd5d8c21 Mon Sep 17 00:00:00 2001 From: Josh Bailey Date: Wed, 17 May 2023 04:01:56 +0000 Subject: [PATCH 008/286] Add basic cppcheck checks, fix possible uninitialized pointer reuse in API, ignore sqrt() NaN definition warning. --- .github/workflows/test.yml | 8 ++++++++ src/cjson.c | 2 +- src/iperf_api.c | 7 +++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3b3081531..afc960d96 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,14 @@ name: test on: [push, pull_request] jobs: + cppcheck-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: install dependencies + run: | + sudo apt-get -y update && sudo apt-get install -y cppcheck && \ + cppcheck . --force --inline-suppr build-test-latest: runs-on: ubuntu-latest steps: diff --git a/src/cjson.c b/src/cjson.c index ed8c3fda6..70a88a03b 100644 --- a/src/cjson.c +++ b/src/cjson.c @@ -134,7 +134,7 @@ CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item) { if (!cJSON_IsNumber(item)) { - return (double) NAN; + return (double) NAN; // cppcheck-suppress invalidFunctionArg } return item->valuedouble; diff --git a/src/iperf_api.c b/src/iperf_api.c index a2cd53a2c..0759b2076 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -4487,12 +4487,15 @@ iperf_add_stream(struct iperf_test *test, struct iperf_stream *sp) // and changing it would break multi-stream tests between old // and new iperf3 versions. i = 2; + prev = NULL; SLIST_FOREACH(n, &test->streams, streams) { prev = n; ++i; } - SLIST_INSERT_AFTER(prev, sp, streams); - sp->id = i; + if (prev) { + SLIST_INSERT_AFTER(prev, sp, streams); + sp->id = i; + } } } From 9a7edb490986468c30e720daad912d2c20dd0453 Mon Sep 17 00:00:00 2001 From: Matt Johnson Date: Sat, 20 May 2023 13:27:31 -0700 Subject: [PATCH 009/286] Make iperf_api::iperf_json_finish alignment self consistent This commit should not change behavior. --- src/iperf_api.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index a2cd53a2c..86383cc6e 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -4725,27 +4725,31 @@ iperf_json_start(struct iperf_test *test) int iperf_json_finish(struct iperf_test *test) { - if (test->title) - cJSON_AddStringToObject(test->json_top, "title", test->title); - if (test->extra_data) - cJSON_AddStringToObject(test->json_top, "extra_data", test->extra_data); + if (test->title) { + cJSON_AddStringToObject(test->json_top, "title", test->title); + } + if (test->extra_data) { + cJSON_AddStringToObject(test->json_top, "extra_data", test->extra_data); + } /* Include server output */ if (test->json_server_output) { - cJSON_AddItemToObject(test->json_top, "server_output_json", test->json_server_output); + cJSON_AddItemToObject(test->json_top, "server_output_json", test->json_server_output); } if (test->server_output_text) { - cJSON_AddStringToObject(test->json_top, "server_output_text", test->server_output_text); + cJSON_AddStringToObject(test->json_top, "server_output_text", test->server_output_text); } // Get ASCII rendering of JSON structure. Then make our // own copy of it and return the storage that cJSON allocated // on our behalf. We keep our own copy around. char *str = cJSON_Print(test->json_top); - if (str == NULL) - return -1; + if (str == NULL) { + return -1; + } test->json_output_string = strdup(str); cJSON_free(str); - if (test->json_output_string == NULL) + if (test->json_output_string == NULL) { return -1; + } fprintf(test->outfile, "%s\n", test->json_output_string); iflush(test); cJSON_Delete(test->json_top); From b3e1ba35f396aa10adbdc1fe37d37d32cde59de4 Mon Sep 17 00:00:00 2001 From: Matt Johnson Date: Sat, 20 May 2023 13:43:32 -0700 Subject: [PATCH 010/286] Make iperf_api::iperf_json_finish idempotent to simplify error path This commit adds a check to only format output and flush to the output file if json_top is not yet null. The context of this check is not performance senstive, since it occurs only as the program is exiting and not on the primary data path. --- src/iperf_api.c | 59 ++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 86383cc6e..d47d18524 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -4725,35 +4725,38 @@ iperf_json_start(struct iperf_test *test) int iperf_json_finish(struct iperf_test *test) { - if (test->title) { - cJSON_AddStringToObject(test->json_top, "title", test->title); - } - if (test->extra_data) { - cJSON_AddStringToObject(test->json_top, "extra_data", test->extra_data); - } - /* Include server output */ - if (test->json_server_output) { - cJSON_AddItemToObject(test->json_top, "server_output_json", test->json_server_output); - } - if (test->server_output_text) { - cJSON_AddStringToObject(test->json_top, "server_output_text", test->server_output_text); - } - // Get ASCII rendering of JSON structure. Then make our - // own copy of it and return the storage that cJSON allocated - // on our behalf. We keep our own copy around. - char *str = cJSON_Print(test->json_top); - if (str == NULL) { - return -1; - } - test->json_output_string = strdup(str); - cJSON_free(str); - if (test->json_output_string == NULL) { - return -1; + if (test->json_top) { + if (test->title) { + cJSON_AddStringToObject(test->json_top, "title", test->title); + } + if (test->extra_data) { + cJSON_AddStringToObject(test->json_top, "extra_data", test->extra_data); + } + /* Include server output */ + if (test->json_server_output) { + cJSON_AddItemToObject(test->json_top, "server_output_json", test->json_server_output); + } + if (test->server_output_text) { + cJSON_AddStringToObject(test->json_top, "server_output_text", test->server_output_text); + } + // Get ASCII rendering of JSON structure. Then make our + // own copy of it and return the storage that cJSON allocated + // on our behalf. We keep our own copy around. + char *str = cJSON_Print(test->json_top); + if (str == NULL) { + return -1; + } + test->json_output_string = strdup(str); + cJSON_free(str); + if (test->json_output_string == NULL) { + return -1; + } + fprintf(test->outfile, "%s\n", test->json_output_string); + iflush(test); + cJSON_Delete(test->json_top); + test->json_top = NULL; } - fprintf(test->outfile, "%s\n", test->json_output_string); - iflush(test); - cJSON_Delete(test->json_top); - test->json_top = test->json_start = test->json_connected = test->json_intervals = test->json_server_output = test->json_end = NULL; + test->json_start = test->json_connected = test->json_intervals = test->json_server_output = test->json_end = NULL; return 0; } From 060cde6fcd72fd779495e7d738e8e4028f9f703f Mon Sep 17 00:00:00 2001 From: Matt Johnson Date: Sat, 20 May 2023 13:47:37 -0700 Subject: [PATCH 011/286] Return client_api error codes, even with json output enabled Previously on error, the client API would return 0 (success) in the cleanup and fail error handling path when outputting json to avoid double-closing the JSON output. With iperf_json_finish now idempotent, the client api can faithfully return an error when it fails, and the calling context will not double-close the output if it has already been closed. This addresses #1405 . --- src/iperf_client_api.c | 4 ---- src/iperf_error.c | 6 ++++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 583306880..8971ef15d 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -708,10 +708,6 @@ iperf_run_client(struct iperf_test * test) if (test->json_output) { cJSON_AddStringToObject(test->json_top, "error", iperf_strerror(i_errno)); iperf_json_finish(test); - iflush(test); - // Return 0 and not -1 since all terminating function were done here. - // Also prevents error message logging outside the already closed JSON output. - return 0; } iflush(test); return -1; diff --git a/src/iperf_error.c b/src/iperf_error.c index 13e9c1511..f7cae638e 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -96,8 +96,10 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) va_start(argp, format); vsnprintf(str, sizeof(str), format, argp); - if (test != NULL && test->json_output && test->json_top != NULL) { - cJSON_AddStringToObject(test->json_top, "error", str); + if (test != NULL && test->json_output) { + if (test->json_top != NULL) { + cJSON_AddStringToObject(test->json_top, "error", str); + } iperf_json_finish(test); } else if (test && test->outfile && test->outfile != stdout) { From 3bd0ddeef0f163224d654f031d4a90def62681e2 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Tue, 27 Jun 2023 08:38:14 -0700 Subject: [PATCH 012/286] Don't (incorrectly) suggest the -S option can set the ECN bits. --- src/iperf3.1 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/iperf3.1 b/src/iperf3.1 index b76bd8795..18ccfefc5 100644 --- a/src/iperf3.1 +++ b/src/iperf3.1 @@ -363,8 +363,7 @@ i.e. 52, 064 and 0x34 all specify the same value. .TP .BR "--dscp " \fIdscp\fR set the IP DSCP bits. Both numeric and symbolic values are accepted. Numeric -values can be specified in decimal, octal and hex (see --tos above). To set -both the DSCP bits and the ECN bits, use --tos. +values can be specified in decimal, octal and hex (see --tos above). .TP .BR -L ", " --flowlabel " \fIn\fR" set the IPv6 flow label (currently only supported on Linux) From dfe0ec5e13fbb5af1dd20fd3e6abf58effc947ec Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sat, 1 Jul 2023 15:50:35 +0300 Subject: [PATCH 013/286] Fix #1534 - prevent udp packet count and operations overflow --- src/iperf.h | 28 ++++++++++++++-------------- src/iperf_api.c | 29 +++++++++++++++-------------- src/iperf_locale.c | 22 +++++++++++++++++----- src/iperf_udp.c | 4 ++-- 4 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index 0051a307e..c3ce33383 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -85,13 +85,13 @@ struct iperf_interval_results float interval_duration; /* for UDP */ - int interval_packet_count; - int interval_outoforder_packets; - int interval_cnt_error; - int packet_count; + int64_t interval_packet_count; + int64_t interval_outoforder_packets; + int64_t interval_cnt_error; + int64_t packet_count; double jitter; - int outoforder_packets; - int cnt_error; + int64_t outoforder_packets; + int64_t cnt_error; int omitted; #if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && \ @@ -199,16 +199,16 @@ struct iperf_stream * for udp measurements - This can be a structure outside stream, and * stream can have a pointer to this */ - int packet_count; - int peer_packet_count; - int peer_omitted_packet_count; - int omitted_packet_count; + int64_t packet_count; + int64_t peer_packet_count; + int64_t peer_omitted_packet_count; + int64_t omitted_packet_count; double jitter; double prev_transit; - int outoforder_packets; - int omitted_outoforder_packets; - int cnt_error; - int omitted_cnt_error; + int64_t outoforder_packets; + int64_t omitted_outoforder_packets; + int64_t cnt_error; + int64_t omitted_cnt_error; uint64_t target; struct sockaddr_storage local_addr; diff --git a/src/iperf_api.c b/src/iperf_api.c index a2cd53a2c..f8c0a5675 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2472,7 +2472,8 @@ get_results(struct iperf_test *test) cJSON *j_omitted_packets; cJSON *j_server_output; cJSON *j_start_time, *j_end_time; - int sid, cerror, pcount, omitted_cerror, omitted_pcount; + int sid; + int64_t cerror, pcount, omitted_cerror, omitted_pcount; double jitter; iperf_size_t bytes_transferred; int retransmits; @@ -3437,7 +3438,7 @@ iperf_print_intermediate(struct iperf_test *test) int retransmits = 0; double start_time, end_time; - int total_packets = 0, lost_packets = 0; + int64_t total_packets = 0, lost_packets = 0; double avg_jitter = 0.0, lost_percent; int stream_must_be_sender = current_mode * current_mode; @@ -3619,11 +3620,11 @@ iperf_print_results(struct iperf_test *test) for (current_mode = lower_mode; current_mode <= upper_mode; ++current_mode) { cJSON *json_summary_stream = NULL; - int total_retransmits = 0; - int total_packets = 0, lost_packets = 0; - int sender_packet_count = 0, receiver_packet_count = 0; /* for this stream, this interval */ - int sender_omitted_packet_count = 0, receiver_omitted_packet_count = 0; /* for this stream, this interval */ - int sender_total_packets = 0, receiver_total_packets = 0; /* running total */ + int64_t total_retransmits = 0; + int64_t total_packets = 0, lost_packets = 0; + int64_t sender_packet_count = 0, receiver_packet_count = 0; /* for this stream, this interval */ + int64_t sender_omitted_packet_count = 0, receiver_omitted_packet_count = 0; /* for this stream, this interval */ + int64_t sender_total_packets = 0, receiver_total_packets = 0; /* running total */ char ubuf[UNIT_LEN]; char nbuf[UNIT_LEN]; struct stat sb; @@ -3723,7 +3724,7 @@ iperf_print_results(struct iperf_test *test) * Running total of the total number of packets. Use the sender packet count if we * have it, otherwise use the receiver packet count. */ - int packet_count = sender_packet_count ? sender_packet_count : receiver_packet_count; + int64_t packet_count = sender_packet_count ? sender_packet_count : receiver_packet_count; total_packets += (packet_count - sp->omitted_packet_count); sender_total_packets += (sender_packet_count - sender_omitted_packet_count); receiver_total_packets += (receiver_packet_count - receiver_omitted_packet_count); @@ -3745,7 +3746,7 @@ iperf_print_results(struct iperf_test *test) if (test->sender_has_retransmits) { /* Sender summary, TCP and SCTP with retransmits. */ if (test->json_output) - cJSON_AddItemToObject(json_summary_stream, "sender", iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d max_snd_cwnd: %d max_snd_wnd: %d max_rtt: %d min_rtt: %d mean_rtt: %d sender: %b", (int64_t) sp->socket, (double) start_time, (double) sender_time, (double) sender_time, (int64_t) bytes_sent, bandwidth * 8, (int64_t) sp->result->stream_retrans, (int64_t) sp->result->stream_max_snd_cwnd, (int64_t) sp->result->stream_max_snd_wnd, (int64_t) sp->result->stream_max_rtt, (int64_t) sp->result->stream_min_rtt, (int64_t) ((sp->result->stream_count_rtt == 0) ? 0 : sp->result->stream_sum_rtt / sp->result->stream_count_rtt), stream_must_be_sender)); + cJSON_AddItemToObject(json_summary_stream, report_sender, iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d max_snd_cwnd: %d max_snd_wnd: %d max_rtt: %d min_rtt: %d mean_rtt: %d sender: %b", (int64_t) sp->socket, (double) start_time, (double) sender_time, (double) sender_time, (int64_t) bytes_sent, bandwidth * 8, (int64_t) sp->result->stream_retrans, (int64_t) sp->result->stream_max_snd_cwnd, (int64_t) sp->result->stream_max_snd_wnd, (int64_t) sp->result->stream_max_rtt, (int64_t) sp->result->stream_min_rtt, (int64_t) ((sp->result->stream_count_rtt == 0) ? 0 : sp->result->stream_sum_rtt / sp->result->stream_count_rtt), stream_must_be_sender)); else if (test->role == 's' && !sp->sender) { if (test->verbose) @@ -3757,7 +3758,7 @@ iperf_print_results(struct iperf_test *test) } else { /* Sender summary, TCP and SCTP without retransmits. */ if (test->json_output) - cJSON_AddItemToObject(json_summary_stream, "sender", iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f sender: %b", (int64_t) sp->socket, (double) start_time, (double) sender_time, (double) sender_time, (int64_t) bytes_sent, bandwidth * 8, stream_must_be_sender)); + cJSON_AddItemToObject(json_summary_stream, report_sender, iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f sender: %b", (int64_t) sp->socket, (double) start_time, (double) sender_time, (double) sender_time, (int64_t) bytes_sent, bandwidth * 8, stream_must_be_sender)); else if (test->role == 's' && !sp->sender) { if (test->verbose) @@ -3792,7 +3793,7 @@ iperf_print_results(struct iperf_test *test) * is the case, then use the receiver's count of packets * instead. */ - int packet_count = sender_packet_count ? sender_packet_count : receiver_packet_count; + int64_t packet_count = sender_packet_count ? sender_packet_count : receiver_packet_count; cJSON_AddItemToObject(json_summary_stream, "udp", iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f jitter_ms: %f lost_packets: %d packets: %d lost_percent: %f out_of_order: %d sender: %b", (int64_t) sp->socket, (double) start_time, (double) sender_time, (double) sender_time, (int64_t) bytes_sent, bandwidth * 8, (double) sp->jitter * 1000.0, (int64_t) (sp->cnt_error - sp->omitted_cnt_error), (int64_t) (packet_count - sp->omitted_packet_count), (double) lost_percent, (int64_t) (sp->outoforder_packets - sp->omitted_outoforder_packets), stream_must_be_sender)); } else { @@ -3848,7 +3849,7 @@ iperf_print_results(struct iperf_test *test) if (test->protocol->id == Ptcp || test->protocol->id == Psctp) { /* Receiver summary, TCP and SCTP */ if (test->json_output) - cJSON_AddItemToObject(json_summary_stream, "receiver", iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f sender: %b", (int64_t) sp->socket, (double) start_time, (double) receiver_time, (double) end_time, (int64_t) bytes_received, bandwidth * 8, stream_must_be_sender)); + cJSON_AddItemToObject(json_summary_stream, report_receiver, iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f sender: %b", (int64_t) sp->socket, (double) start_time, (double) receiver_time, (double) end_time, (int64_t) bytes_received, bandwidth * 8, stream_must_be_sender)); else if (test->role == 's' && sp->sender) { if (test->verbose) @@ -3997,7 +3998,7 @@ iperf_print_results(struct iperf_test *test) */ if (! (test->role == 's' && !stream_must_be_sender) ) { unit_snprintf(ubuf, UNIT_LEN, (double) total_sent, 'A'); - iperf_printf(test, report_sum_bw_udp_format, mbuf, start_time, sender_time, ubuf, nbuf, 0.0, 0, sender_total_packets, 0.0, "sender"); + iperf_printf(test, report_sum_bw_udp_format, mbuf, start_time, sender_time, ubuf, nbuf, 0.0, 0, sender_total_packets, 0.0, report_sender); } if (! (test->role == 's' && stream_must_be_sender) ) { @@ -4010,7 +4011,7 @@ iperf_print_results(struct iperf_test *test) bandwidth = 0.0; } unit_snprintf(nbuf, UNIT_LEN, bandwidth, test->settings->unit_format); - iperf_printf(test, report_sum_bw_udp_format, mbuf, start_time, receiver_time, ubuf, nbuf, avg_jitter * 1000.0, lost_packets, receiver_total_packets, lost_percent, "receiver"); + iperf_printf(test, report_sum_bw_udp_format, mbuf, start_time, receiver_time, ubuf, nbuf, avg_jitter * 1000.0, lost_packets, receiver_total_packets, lost_percent, report_receiver); } } } diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 9eec77b29..838086e18 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -81,6 +81,18 @@ #include "version.h" +#if defined(HAVE_INTTYPES_H) +# include +#else +# ifndef PRIu64 +# if sizeof(long) == 8 +# define PRIu64 "lu" +# else +# define PRIu64 "llu" +# endif +# endif +#endif + #ifdef __cplusplus extern "C" { @@ -382,13 +394,13 @@ const char report_bw_retrans_cwnd_format[] = "[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %3u %ss %s\n"; const char report_bw_udp_format[] = -"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %d/%d (%.2g%%) %s\n"; +"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %" PRIu64 "/%" PRIu64 " (%.2g%%) %s\n"; const char report_bw_udp_format_no_omitted_error[] = -"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms Unknown/%d %s\n"; +"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms Unknown/%" PRIu64 " %s\n"; const char report_bw_udp_sender_format[] = -"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %s %d %s\n"; +"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %s %" PRIu64 " %s\n"; const char report_summary[] = "Test Complete. Summary Results:\n"; @@ -400,10 +412,10 @@ const char report_sum_bw_retrans_format[] = "[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %3d %s\n"; const char report_sum_bw_udp_format[] = -"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %d/%d (%.2g%%) %s\n"; +"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %" PRIu64 "/%" PRIu64 " (%.2g%%) %s\n"; const char report_sum_bw_udp_sender_format[] = -"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %s %d %s\n"; +"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %s %" PRIu64 " %s\n"; const char report_omitted[] = "(omitted)"; diff --git a/src/iperf_udp.c b/src/iperf_udp.c index 5dc1422dc..fca3a1b69 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -124,7 +124,7 @@ iperf_udp_recv(struct iperf_stream *sp) } if (sp->test->debug_level >= DEBUG_LEVEL_DEBUG) - fprintf(stderr, "pcount %" PRIu64 " packet_count %d\n", pcount, sp->packet_count); + fprintf(stderr, "pcount %" PRIu64 " packet_count %" PRIu64 "\n", pcount, sp->packet_count); /* * Try to handle out of order packets. The way we do this @@ -167,7 +167,7 @@ iperf_udp_recv(struct iperf_stream *sp) /* Log the out-of-order packet */ if (sp->test->debug) - fprintf(stderr, "OUT OF ORDER - incoming packet sequence %" PRIu64 " but expected sequence %d on stream %d", pcount, sp->packet_count + 1, sp->socket); + fprintf(stderr, "OUT OF ORDER - incoming packet sequence %" PRIu64 " but expected sequence %" PRIu64 " on stream %d", pcount, sp->packet_count + 1, sp->socket); } /* From ff458b2e736ad301ae82624f08742165255671bd Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Tue, 4 Jul 2023 09:34:35 +0300 Subject: [PATCH 014/286] Fix #1435 - print JSON number as signed --- src/cjson.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/cjson.c b/src/cjson.c index ed8c3fda6..1904708b6 100644 --- a/src/cjson.c +++ b/src/cjson.c @@ -99,6 +99,13 @@ # else # define PRIu64 "llu" # endif +# ifndef PRId64 +# if sizeof(long) == 8 +# define PRId64 "ld" +# else +# define PRId64 "lld" +# endif +# endif # endif #endif @@ -588,7 +595,7 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out } else if(d == (double)item->valueint) { - length = sprintf((char*)number_buffer, "%" PRIu64, item->valueint); + length = sprintf((char*)number_buffer, "%" PRId64, item->valueint); } else { From 0ef151550d96cc4460f98832df84b4a1e87c65e9 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 7 Jul 2023 11:35:02 -0700 Subject: [PATCH 015/286] Fix memory allocation hazard (#1542). (#1543) Reported by: @someusername123 on GitHub --- src/iperf_api.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index f2d416214..a95e02418 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2670,6 +2670,7 @@ static cJSON * JSON_read(int fd) { uint32_t hsize, nsize; + size_t strsize; char *str; cJSON *json = NULL; int rc; @@ -2682,7 +2683,9 @@ JSON_read(int fd) if (Nread(fd, (char*) &nsize, sizeof(nsize), Ptcp) >= 0) { hsize = ntohl(nsize); /* Allocate a buffer to hold the JSON */ - str = (char *) calloc(sizeof(char), hsize+1); /* +1 for trailing null */ + strsize = hsize + 1; /* +1 for trailing NULL */ + if (strsize) { + str = (char *) calloc(sizeof(char), strsize); if (str != NULL) { rc = Nread(fd, str, hsize, Ptcp); if (rc >= 0) { @@ -2701,6 +2704,10 @@ JSON_read(int fd) } } free(str); + } + else { + printf("WARNING: Data length overflow\n"); + } } return json; } From 99d738f496c96fd4fb50f45142e0bbc96bf71698 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 7 Jul 2023 14:47:03 -0700 Subject: [PATCH 016/286] Version number bumps for iperf-3.14. --- RELNOTES.md | 35 +++++++++++++++++++++++++++++++++++ configure.ac | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/RELNOTES.md b/RELNOTES.md index d621a5bb2..8c48cfd50 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,6 +1,41 @@ iperf3 Release Notes ==================== +iperf-3.14 2023-07-07 +--------------------- + +* Notable user-visible changes + + * A memory allocation hazard was fixed (Issue #1542/PR #1543). For + more information see: + https://downloads.es.net/pub/iperf/esnet-secadv-2023-0001.txt.asc + + * JSON output was improved, such as print JSON numbers as signed (PR + #1539, Issue #1435), the exit code when doing JSON output was + fixed (PR #1523), and client_api was fixed so that it still + returns an error code when JSON is enabled (Issue #1405). Also, + duplicate fields when using multiple streams was removed from the + JSON output (#1492). + + * Prevent UDP packet count and operations overflow (PR #1536/Issue + #1534). + + * Statistics are fixed when --omit is used (Issue #1489/PR #1498). + +* Developer-visible changes + + * CI builds and tests using GitHub actions have been added (PR + #1519). + + * A fix for Android "unable to create a new stream error" was added + (PR #1506). + + * Support for Voice Admit DSCP code point from RFC 5865 was added + (PR #1490). + + * A fix for preventing a crash when RSA public key path doesn't + exist was fixed (PR #1488/Issue #1471). + iperf-3.13 2023-02-16 --------------------- diff --git a/configure.ac b/configure.ac index a024adf79..fb0721db2 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.13],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.14],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/iperf_config_static_bin.m4]) AC_LANG(C) From a0be85934144bc04712a6695b14ea6e45c379e1d Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 7 Jul 2023 14:47:41 -0700 Subject: [PATCH 017/286] Regen. --- configure | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/configure b/configure index f6c9b00c6..72d9bca90 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for iperf 3.13. +# Generated by GNU Autoconf 2.71 for iperf 3.14. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.13' -PACKAGE_STRING='iperf 3.13' +PACKAGE_VERSION='3.14' +PACKAGE_STRING='iperf 3.14' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -1366,7 +1366,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures iperf 3.13 to adapt to many kinds of systems. +\`configure' configures iperf 3.14 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1437,7 +1437,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.13:";; + short | recursive ) echo "Configuration of iperf 3.14:";; esac cat <<\_ACEOF @@ -1555,7 +1555,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.13 +iperf configure 3.14 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -1833,7 +1833,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.13, which was +It was created by iperf $as_me 3.14, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3200,7 +3200,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.13' + VERSION='3.14' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -15579,7 +15579,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.13, which was +This file was extended by iperf $as_me 3.14, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -15648,7 +15648,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.13 +iperf config.status 3.14 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" From 679c77ad93d486131975ee45e38fa7791bc62691 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 7 Jul 2023 16:11:03 -0700 Subject: [PATCH 018/286] Update project news for iperf-3.14. Doesn't quite build due to some platform issues. --- docs/conf.py | 5 +++-- docs/news.rst | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 5ae7201f6..20d9c2a57 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -52,10 +52,10 @@ # built documents. # # The short X.Y version. -version = '3.13' +version = '3.14' # The full version, including alpha/beta/rc tags. -release = '3.13' +release = '3.14' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -131,6 +131,7 @@ html_logo = "_esnet/static/ESnet_Final_Logos_All_Blue_Circle_Stamp_RGB.png" + # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. diff --git a/docs/news.rst b/docs/news.rst index be69696f2..4cf1731df 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -1,6 +1,21 @@ iperf3 Project News =================== +2023-07-07: iperf-3.14 released +-------------------------------- +| URL: https://downloads.es.net/pub/iperf/iperf-3.14.tar.gz +| SHA256: ``723fcc430a027bc6952628fa2a3ac77584a1d0bd328275e573fc9b206c155004`` + +iperf 3.14 fixes a memory allocation hazard that allowed a remote user +to crash an iperf3 process (server or client). + +More information on this specific fix can be found at: + +https://downloads.es.net/pub/iperf/esnet-secadv-2023-0001.txt.asc + +This version of iperf3 also includes a number of minor bug fixes, +which are summarized in the release notes. + 2023-02-16: iperf-3.13 released ---------------------------------- | URL: https://downloads.es.net/pub/iperf/iperf-3.13.tar.gz From f8589b0d5970a4bf3f94906faf14582d0bee785f Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 10 Jul 2023 12:59:47 -0700 Subject: [PATCH 019/286] Unbreak documentation site build. --- docs/_esnet/templates/navbar.html | 2 -- docs/conf.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/_esnet/templates/navbar.html b/docs/_esnet/templates/navbar.html index 2b100398b..d458cf2e6 100644 --- a/docs/_esnet/templates/navbar.html +++ b/docs/_esnet/templates/navbar.html @@ -9,8 +9,6 @@ {%- block sidebarlogo %} - - {%- if logo %}{%- endif %} {%- endblock %} {% if theme_navbar_title -%}{{ theme_navbar_title|e }}{%- else -%}{{ project|e }}{%- endif -%} diff --git a/docs/conf.py b/docs/conf.py index 20d9c2a57..49b23be92 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -128,7 +128,7 @@ # The name of an image file (relative to this directory) to place at the top # of the sidebar. -html_logo = "_esnet/static/ESnet_Final_Logos_All_Blue_Circle_Stamp_RGB.png" +html_logo = "_static/esnet/ESnet_Final_Logos_All_Blue_Circle_Stamp_RGB.png" From 2ca047beffd12d3be6643d4f7844a4e95c18c436 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 21 Jul 2023 11:36:21 -0700 Subject: [PATCH 020/286] Add link to @davidBar-On Android binaries per #1549. While here, fix a small, unrelated mark-up glitch. --- docs/obtaining.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/obtaining.rst b/docs/obtaining.rst index 8a83cda7b..453e0b32b 100644 --- a/docs/obtaining.rst +++ b/docs/obtaining.rst @@ -16,7 +16,7 @@ of binary packages for various operating systems and distributions: * Fedora / RedHat Linux / CentOS / Rocky: `iperf3 `_ and `iperf3-devel - `_ in Fedora 19 and 20 and in Fedora EPEL 5, 6, and 7. iperf3 is included as a part of RedHat Enterprise Linux 7.4 and later (as well as CentOS 7.4 and later, and all versions of Rocky Linux), and can generally be @@ -31,6 +31,8 @@ of binary packages for various operating systems and distributions: locations, including ``_ (`discussion thread `_). +* Android: iperf3 binaries for Android can be found in several + locations, including ``_. Source Distributions -------------------- From 424009cc10524de92a959ce363d78f8901057fa8 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Mon, 31 Jul 2023 14:32:18 +0300 Subject: [PATCH 021/286] Fix #1554 - pass 0 in UDP output as int64_t for 32bits CPUs --- src/iperf_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index a95e02418..2452dec2a 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -3816,7 +3816,7 @@ iperf_print_results(struct iperf_test *test) iperf_printf(test, report_sender_not_available_format, sp->socket); } else { - iperf_printf(test, report_bw_udp_format, sp->socket, mbuf, start_time, sender_time, ubuf, nbuf, 0.0, 0, (sender_packet_count - sender_omitted_packet_count), (double) 0, report_sender); + iperf_printf(test, report_bw_udp_format, sp->socket, mbuf, start_time, sender_time, ubuf, nbuf, 0.0, (int64_t) 0, (sender_packet_count - sender_omitted_packet_count), (double) 0, report_sender); } if ((sp->outoforder_packets - sp->omitted_outoforder_packets) > 0) iperf_printf(test, report_sum_outoforder, mbuf, start_time, sender_time, (sp->outoforder_packets - sp->omitted_outoforder_packets)); @@ -4005,7 +4005,7 @@ iperf_print_results(struct iperf_test *test) */ if (! (test->role == 's' && !stream_must_be_sender) ) { unit_snprintf(ubuf, UNIT_LEN, (double) total_sent, 'A'); - iperf_printf(test, report_sum_bw_udp_format, mbuf, start_time, sender_time, ubuf, nbuf, 0.0, 0, sender_total_packets, 0.0, report_sender); + iperf_printf(test, report_sum_bw_udp_format, mbuf, start_time, sender_time, ubuf, nbuf, 0.0, (int64_t) 0, sender_total_packets, 0.0, report_sender); } if (! (test->role == 's' && stream_must_be_sender) ) { From 33a6a108e1bc86ec52fda136cda3e6af052fda58 Mon Sep 17 00:00:00 2001 From: Dee Date: Fri, 4 Aug 2023 04:34:13 +0800 Subject: [PATCH 022/286] Allow set iperf callback(on_new_stream/on_test_start/on_connect/on_test_finish) (#1508) --- src/iperf_api.c | 24 ++++++++++++++++++++++++ src/iperf_api.h | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/src/iperf_api.c b/src/iperf_api.c index a95e02418..8e2645f7d 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -593,6 +593,30 @@ iperf_set_mapped_v4(struct iperf_test *ipt, const int val) ipt->mapped_v4 = val; } +void +iperf_set_on_new_stream_callback(struct iperf_test* ipt, void (*callback)()) +{ + ipt->on_new_stream = callback; +} + +void +iperf_set_on_test_start_callback(struct iperf_test* ipt, void (*callback)()) +{ + ipt->on_test_start = callback; +} + +void +iperf_set_on_test_connect_callback(struct iperf_test* ipt, void (*callback)()) +{ + ipt->on_connect = callback; +} + +void +iperf_set_on_test_finish_callback(struct iperf_test* ipt, void (*callback)()) +{ + ipt->on_test_finish = callback; +} + static void check_sender_has_retransmits(struct iperf_test *ipt) { diff --git a/src/iperf_api.h b/src/iperf_api.h index 171006aeb..093ea9700 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -200,6 +200,10 @@ void iperf_set_dont_fragment( struct iperf_test* ipt, int dont_fragment ); void iperf_set_test_congestion_control(struct iperf_test* ipt, char* cc); void iperf_set_test_mss(struct iperf_test* ipt, int mss); void iperf_set_mapped_v4(struct iperf_test* ipt, const int val); +void iperf_set_on_new_stream_callback(struct iperf_test* ipt, void (*callback)()); +void iperf_set_on_test_start_callback(struct iperf_test* ipt, void (*callback)()); +void iperf_set_on_test_connect_callback(struct iperf_test* ipt, void (*callback)()); +void iperf_set_on_test_finish_callback(struct iperf_test* ipt, void (*callback)()); #if defined(HAVE_SSL) void iperf_set_test_client_username(struct iperf_test *ipt, const char *client_username); From 239c0a1cc1f59285ae278a566b9f331c29815f76 Mon Sep 17 00:00:00 2001 From: swlars <89053414+swlars@users.noreply.github.com> Date: Mon, 7 Aug 2023 15:16:41 -0700 Subject: [PATCH 023/286] Update README to include email contact for security issues (#1557) --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index da7cecbab..664b6f020 100644 --- a/README.md +++ b/README.md @@ -78,8 +78,8 @@ These flags include: -Z, --zerocopy use a 'zero copy' sendfile() method of sending data -A, --affinity n/n,m set CPU affinity -Bug Reports ------------ +Bug and Security Reports +------------------------ Before submitting a bug report, please make sure you're running the latest version of the code, and confirm that your issue has not @@ -99,6 +99,11 @@ sensitive information. If you have a question about usage or about the code, please do *not* submit an issue. Please use one of the mailing lists for that. +If you suspect there is a potential security issue, please contact the +developers at: + +iperf@es.net + Relation to iperf 2.x --------------------- From 5e3704dd850a5df2fb2b3eafd117963d017d07b4 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Tue, 1 Aug 2023 14:02:54 -0700 Subject: [PATCH 024/286] Implement fixes to make the control connection more robust. These include various timeouts in Nread() to guarantee that it will eventually exit, a 10-second timeout for each attempt to read data from the network and an approximately 30-second overall timeout per Nread() call. Also the iperf3 server now checks the length of the received session cookie, and errors out if this happens to be incorrect. Reported by Jorge Sancho Larraz - Canonical. --- src/iperf_server_api.c | 7 ++++- src/net.c | 62 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 18f105ded..ae916f586 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -140,7 +140,12 @@ iperf_accept(struct iperf_test *test) } #endif /* HAVE_TCP_USER_TIMEOUT */ - if (Nread(test->ctrl_sck, test->cookie, COOKIE_SIZE, Ptcp) < 0) { + if (Nread(test->ctrl_sck, test->cookie, COOKIE_SIZE, Ptcp) != COOKIE_SIZE) { + /* + * Note this error covers both the case of a system error + * or the inability to read the correct amount of data + * (i.e. timed out). + */ i_errno = IERECVCOOKIE; return -1; } diff --git a/src/net.c b/src/net.c index 1a88155bc..b80fb64aa 100644 --- a/src/net.c +++ b/src/net.c @@ -65,6 +65,9 @@ #include "net.h" #include "timer.h" +static int nread_read_timeout = 10; +static int nread_overall_timeout = 30; + /* * Declaration of gerror in iperf_error.c. Most other files in iperf3 can get this * by including "iperf.h", but net.c lives "below" this layer. Clearly the @@ -372,6 +375,32 @@ Nread(int fd, char *buf, size_t count, int prot) { register ssize_t r; register size_t nleft = count; + struct iperf_time ftimeout = { 0, 0 }; + + fd_set rfdset; + struct timeval timeout = { nread_read_timeout, 0 }; + + /* + * fd might not be ready for reading on entry. Check for this + * (with timeout) first. + * + * This check could go inside the while() loop below, except we're + * currently considering whether it might make sense to support a + * codepath that bypassese this check, for situations where we + * already know that fd has data on it (for example if we'd gotten + * to here as the result of a select() call. + */ + { + FD_ZERO(&rfdset); + FD_SET(fd, &rfdset); + r = select(fd + 1, &rfdset, NULL, NULL, &timeout); + if (r < 0) { + return NET_HARDERROR; + } + if (r == 0) { + return 0; + } + } while (nleft > 0) { r = read(fd, buf, nleft); @@ -385,6 +414,39 @@ Nread(int fd, char *buf, size_t count, int prot) nleft -= r; buf += r; + + /* + * We need some more bytes but don't want to wait around + * forever for them. In the case of partial results, we need + * to be able to read some bytes every nread_timeout seconds. + */ + if (nleft > 0) { + struct iperf_time now; + + /* + * Also, we have an approximate upper limit for the total time + * that a Nread call is supposed to take. We trade off accuracy + * of this timeout for a hopefully lower performance impact. + */ + iperf_time_now(&now); + if (ftimeout.secs == 0) { + ftimeout = now; + iperf_time_add_usecs(&ftimeout, nread_overall_timeout * 1000000L); + } + if (iperf_time_compare(&ftimeout, &now) < 0) { + break; + } + + FD_ZERO(&rfdset); + FD_SET(fd, &rfdset); + r = select(fd + 1, &rfdset, NULL, NULL, &timeout); + if (r < 0) { + return NET_HARDERROR; + } + if (r == 0) { + break; + } + } } return count - nleft; } From 61dd4fe6ed24ed2378d520e8970de7879ecc13c2 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 14 Sep 2023 11:37:38 -0700 Subject: [PATCH 025/286] Version number bumps for iperf-3.15. --- RELNOTES.md | 18 ++++++++++++++++++ configure.ac | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/RELNOTES.md b/RELNOTES.md index 8c48cfd50..48130e984 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,6 +1,24 @@ iperf3 Release Notes ==================== +iperf-3.15 2023-09-14 +--------------------- + +* Notable user-visible changes + + * Several bugs that could allow the iperf3 server to hang waiting + for input on the control connection has been fixed. ESnet thanks + Jorge Sancho Larraz from Canonical for reporting this issue. For + more information, see: + https://downloads.es.net/pub/iperf/esnet-secadv-2023-0002.txt.asc + + * A bug that caused garbled output with UDP tests on 32-bit hosts + has been fixed (PR #1554, PR #1556). This bug was introduced in + iperf-3.14. + + * A bug in counting UDP messages has been fixed (PR #1367, PR + #1380). + iperf-3.14 2023-07-07 --------------------- diff --git a/configure.ac b/configure.ac index fb0721db2..1b3c413f1 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.14],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.15],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/iperf_config_static_bin.m4]) AC_LANG(C) From 917d2f02188f6f4cdc443df7923a4bde72017d92 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 14 Sep 2023 11:38:11 -0700 Subject: [PATCH 026/286] Regen. --- configure | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 72d9bca90..727ab3456 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for iperf 3.14. +# Generated by GNU Autoconf 2.71 for iperf 3.15. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.14' -PACKAGE_STRING='iperf 3.14' +PACKAGE_VERSION='3.15' +PACKAGE_STRING='iperf 3.15' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -1366,7 +1366,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures iperf 3.14 to adapt to many kinds of systems. +\`configure' configures iperf 3.15 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1437,7 +1437,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.14:";; + short | recursive ) echo "Configuration of iperf 3.15:";; esac cat <<\_ACEOF @@ -1555,7 +1555,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.14 +iperf configure 3.15 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -1833,7 +1833,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.14, which was +It was created by iperf $as_me 3.15, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3200,7 +3200,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.14' + VERSION='3.15' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -15579,7 +15579,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.14, which was +This file was extended by iperf $as_me 3.15, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -15648,7 +15648,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.14 +iperf config.status 3.15 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" From 57bbb05a7a6c8e4cb4c5c6d98b9a4a1770c0d53d Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 15 Sep 2023 10:28:58 -0700 Subject: [PATCH 027/286] Update for iperf-3.15. --- docs/conf.py | 4 ++-- docs/news.rst | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 49b23be92..b03fcbda6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -52,10 +52,10 @@ # built documents. # # The short X.Y version. -version = '3.14' +version = '3.15' # The full version, including alpha/beta/rc tags. -release = '3.14' +release = '3.15' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/news.rst b/docs/news.rst index 4cf1731df..b0bcfacfe 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -1,6 +1,20 @@ iperf3 Project News =================== +2023-09-14: iperf-3.15 released +-------------------------------- +| URL: https://downloads.es.net/pub/iperf/iperf-3.15.tar.gz +| SHA256: ``bdb77c11f72bce90214883159577fa24412013e62b2083cf5f54391d79b1d8ff`` + +iperf 3.15 fixes that could cause an iperf3 server process to hang +waiting for input on the control connection. For more information, +please see: + +https://downloads.es.net/pub/iperf/esnet-secadv-2023-0002.txt.asc + +This version of iperf3 also includes several other minor bug fixes, +which are summarized in the release notes. + 2023-07-07: iperf-3.14 released -------------------------------- | URL: https://downloads.es.net/pub/iperf/iperf-3.14.tar.gz From 7e05ef25c89d4633b299328f0f3e254a17f29346 Mon Sep 17 00:00:00 2001 From: swlars <89053414+swlars@users.noreply.github.com> Date: Mon, 2 Oct 2023 11:13:18 -0700 Subject: [PATCH 028/286] Update release documentation. (#1580) Co-authored-by: Sarah Larsen --- README.md | 2 ++ docs/dev.rst | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 664b6f020..f569d3a38 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,8 @@ Source code and issue tracker: https://github.com/esnet/iperf Discussion forums: https://github.com/esnet/iperf/discussions +Reporting security vulnerabilities: iperf@es.net + Obtaining iperf3 ---------------- diff --git a/docs/dev.rst b/docs/dev.rst index 98548b478..c65524bc7 100644 --- a/docs/dev.rst +++ b/docs/dev.rst @@ -30,6 +30,9 @@ Then submit to the iperf3 issue tracker on GitHub: https://github.com/esnet/iperf/issues +For reporting potential security issues, please contact the developers at +iperf@es.net. + **Note:** Issues submitted to the old iperf3 issue tracker on Google Code (or comments to existing issues on the Google Code issue tracker) will be ignored. @@ -130,8 +133,8 @@ The developers increment the: Release Engineering Checklist ----------------------------- -1. Update the ``README`` and ``RELNOTES.md`` files to be accurate. Make sure - that the "Known Issues" section of the ``README`` file and in this document +1. Update the ``README.md`` and ``RELNOTES.md`` files to be accurate. Make sure + that the "Known Issues" section of the ``README.md`` file and in this document are up to date. 2. Compose a release announcement. Most of the release announcement @@ -214,12 +217,14 @@ Release Engineering Checklist sending process by sending a copy to oneself first and attempting to verify the signature is highly encouraged. -12. Update the iperf3 Project News section of the documentation site +12. Update GitHub Releases with the current release notes. + +13. Update the iperf3 Project News section of the documentation site to announce the new release (see ``docs/news.rst`` and ``docs/conf.py`` in the source tree) and deploy a new build of the documentation to GitHub Pages. -13. If an update to the on-line manual page is needed, it can be +14. If an update to the on-line manual page is needed, it can be generated with this sequence of commands (tested on CentOS 7) and import the result into ``invoking.rst``:: From a9a55e409d07537c6951f15d30885755d3d3cf29 Mon Sep 17 00:00:00 2001 From: David Bar-On <61089727+davidBar-On@users.noreply.github.com> Date: Mon, 23 Oct 2023 21:44:43 +0300 Subject: [PATCH 029/286] Per #1583 add check that server authorized users file is accessible (#1585) --- src/iperf_api.c | 14 +++++++++++++- src/iperf_api.h | 1 + src/iperf_error.c | 3 +++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 855c1c20d..ca1ad11ca 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1150,6 +1150,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) server_flag = client_flag = rate_flag = duration_flag = rcv_timeout_flag = snd_timeout_flag =0; #if defined(HAVE_SSL) char *client_username = NULL, *client_rsa_public_key = NULL, *server_rsa_private_key = NULL; + FILE *ptr_file; #endif /* HAVE_SSL */ while ((flag = getopt_long(argc, argv, "p:f:i:D1VJvsc:ub:t:n:k:l:P:Rw:B:M:N46S:L:ZO:F:A:T:C:dI:hX:", longopts, NULL)) != -1) { @@ -1684,7 +1685,18 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) !(server_rsa_private_key && test->server_authorized_users)) { i_errno = IESETSERVERAUTH; return -1; - } else if (test->role == 's' && server_rsa_private_key) { + } + + if (test->role == 's' && test->server_authorized_users) { + ptr_file =fopen(test->server_authorized_users, "r"); + if (!ptr_file) { + i_errno = IESERVERAUTHUSERS; + return -1; + } + fclose(ptr_file); + } + + if (test->role == 's' && server_rsa_private_key) { test->server_rsa_private_key = load_privkey_from_file(server_rsa_private_key); if (test->server_rsa_private_key == NULL){ iperf_err(test, "%s\n", ERR_error_string(ERR_get_error(), NULL)); diff --git a/src/iperf_api.h b/src/iperf_api.h index 093ea9700..0100d38fa 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -406,6 +406,7 @@ enum { IERVRSONLYRCVTIMEOUT = 32, // Client receive timeout is valid only in reverse mode IESNDTIMEOUT = 33, // Illegal message send timeout IEUDPFILETRANSFER = 34, // Cannot transfer file using UDP + IESERVERAUTHUSERS = 35, // Cannot access authorized users file /* Test errors */ IENEWTEST = 100, // Unable to create a new test (check perror) IEINITTEST = 101, // Test initialization failed (check perror) diff --git a/src/iperf_error.c b/src/iperf_error.c index f7cae638e..ea7955c67 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -178,6 +178,9 @@ iperf_strerror(int int_errno) case IESETSERVERAUTH: snprintf(errstr, len, "you must specify a path to a valid RSA private key and a user credential file"); break; + case IESERVERAUTHUSERS: + snprintf(errstr, len, "cannot access authorized users file"); + break; case IEBADFORMAT: snprintf(errstr, len, "bad format specifier (valid formats are in the set [kmgtKMGT])"); break; From ca7c87571dcd7991a263867fc345c0315339027b Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 27 Oct 2023 16:04:02 -0400 Subject: [PATCH 030/286] Bmah openssl3 (#1589) WIP for OpenSSL 3.0 support. We attempt to migrate off of APIs that are deprecated in OpenSSL 3.0, as detected by using OPENSSL_VERSION_MAJOR. In the case of sha256(), a series of deprecated library calls was replaced by a single macro that is supported on both OpenSSL 1.x and 3.x. Fixes #1300. --- src/iperf_auth.c | 95 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 23 deletions(-) diff --git a/src/iperf_auth.c b/src/iperf_auth.c index 595f730c8..c89bde7c3 100644 --- a/src/iperf_auth.c +++ b/src/iperf_auth.c @@ -1,5 +1,5 @@ /* - * iperf, Copyright (c) 2014-2020, The Regents of the University of + * iperf, Copyright (c) 2014-2023, The Regents of the University of * California, through Lawrence Berkeley National Laboratory (subject * to receipt of any required approvals from the U.S. Dept. of * Energy). All rights reserved. @@ -46,16 +46,18 @@ #include #include #include +#if OPENSSL_VERSION_MAJOR >= 3 +#include +#include +#endif const char *auth_text_format = "user: %s\npwd: %s\nts: %"PRId64; void sha256(const char *string, char outputBuffer[65]) { unsigned char hash[SHA256_DIGEST_LENGTH]; - SHA256_CTX sha256; - SHA256_Init(&sha256); - SHA256_Update(&sha256, string, strlen(string)); - SHA256_Final(hash, &sha256); + + SHA256((const unsigned char *) string, strlen(string), hash); int i = 0; for(i = 0; i < SHA256_DIGEST_LENGTH; i++) { @@ -229,57 +231,104 @@ int test_load_private_key_from_file(const char *file){ } int encrypt_rsa_message(const char *plaintext, EVP_PKEY *public_key, unsigned char **encryptedtext) { +#if OPENSSL_VERSION_MAJOR >= 3 + EVP_PKEY_CTX *ctx; +#else RSA *rsa = NULL; - unsigned char *rsa_buffer = NULL, pad = RSA_PKCS1_PADDING; - int keysize, encryptedtext_len, rsa_buffer_len; - +#endif + unsigned char *rsa_buffer = NULL; + size_t encryptedtext_len = 0; + int rsa_buffer_len, keysize; + +#if OPENSSL_VERSION_MAJOR >= 3 + int rc; + ctx = EVP_PKEY_CTX_new_from_pkey(NULL, public_key, ""); + /* See evp_pkey_rsa(7) and provider-keymgmt(7) */ + rc = EVP_PKEY_get_int_param(public_key, OSSL_PKEY_PARAM_MAX_SIZE, &keysize); /* XXX not really keysize */ + if (!rc) { + goto errreturn; + } +#else rsa = EVP_PKEY_get1_RSA(public_key); keysize = RSA_size(rsa); - +#endif rsa_buffer = OPENSSL_malloc(keysize * 2); *encryptedtext = (unsigned char*)OPENSSL_malloc(keysize); BIO *bioBuff = BIO_new_mem_buf((void*)plaintext, (int)strlen(plaintext)); rsa_buffer_len = BIO_read(bioBuff, rsa_buffer, keysize * 2); - encryptedtext_len = RSA_public_encrypt(rsa_buffer_len, rsa_buffer, *encryptedtext, rsa, pad); - +#if OPENSSL_VERSION_MAJOR >= 3 + EVP_PKEY_encrypt_init(ctx); + EVP_PKEY_encrypt(ctx, *encryptedtext, &encryptedtext_len, rsa_buffer, rsa_buffer_len); + EVP_PKEY_CTX_free(ctx); +#else + encryptedtext_len = RSA_public_encrypt(rsa_buffer_len, rsa_buffer, *encryptedtext, rsa, RSA_PKCS1_PADDING); RSA_free(rsa); +#endif + OPENSSL_free(rsa_buffer); BIO_free(bioBuff); - if (encryptedtext_len < 0) { - /* We probably shouldn't be printing stuff like this */ - fprintf(stderr, "%s\n", ERR_error_string(ERR_get_error(), NULL)); + if (encryptedtext_len <= 0) { + goto errreturn; } return encryptedtext_len; + + errreturn: + fprintf(stderr, "%s\n", ERR_error_string(ERR_get_error(), NULL)); + return 0; } int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedtext_len, EVP_PKEY *private_key, unsigned char **plaintext) { +#if OPENSSL_VERSION_MAJOR >= 3 + EVP_PKEY_CTX *ctx; +#else RSA *rsa = NULL; - unsigned char *rsa_buffer = NULL, pad = RSA_PKCS1_PADDING; - int plaintext_len, rsa_buffer_len, keysize; - +#endif + unsigned char *rsa_buffer = NULL; + size_t plaintext_len = 0; + int rsa_buffer_len, keysize; + +#if OPENSSL_VERSION_MAJOR >= 3 + int rc; + ctx = EVP_PKEY_CTX_new_from_pkey(NULL, private_key, ""); + /* See evp_pkey_rsa(7) and provider-keymgmt(7) */ + rc = EVP_PKEY_get_int_param(private_key, OSSL_PKEY_PARAM_MAX_SIZE, &keysize); /* XXX not really keysize */ + if (!rc) { + goto errreturn; + } +#else rsa = EVP_PKEY_get1_RSA(private_key); - keysize = RSA_size(rsa); +#endif rsa_buffer = OPENSSL_malloc(keysize * 2); *plaintext = (unsigned char*)OPENSSL_malloc(keysize); BIO *bioBuff = BIO_new_mem_buf((void*)encryptedtext, encryptedtext_len); rsa_buffer_len = BIO_read(bioBuff, rsa_buffer, keysize * 2); - plaintext_len = RSA_private_decrypt(rsa_buffer_len, rsa_buffer, *plaintext, rsa, pad); - +#if OPENSSL_VERSION_MAJOR >= 3 + plaintext_len = keysize; + EVP_PKEY_decrypt_init(ctx); + EVP_PKEY_decrypt(ctx, *plaintext, &plaintext_len, rsa_buffer, rsa_buffer_len); + EVP_PKEY_CTX_free(ctx); +#else + plaintext_len = RSA_private_decrypt(rsa_buffer_len, rsa_buffer, *plaintext, rsa, RSA_PKCS1_PADDING); RSA_free(rsa); +#endif + OPENSSL_free(rsa_buffer); BIO_free(bioBuff); - if (plaintext_len < 0) { - /* We probably shouldn't be printing stuff like this */ - fprintf(stderr, "%s\n", ERR_error_string(ERR_get_error(), NULL)); + if (plaintext_len <= 0) { + goto errreturn; } return plaintext_len; + + errreturn: + fprintf(stderr, "%s\n", ERR_error_string(ERR_get_error(), NULL)); + return 0; } int encode_auth_setting(const char *username, const char *password, EVP_PKEY *public_key, char **authtoken){ From 448ba7050ba849a5bcb0dcd0bbb64a7537394dee Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 22 Jul 2022 14:47:15 -0700 Subject: [PATCH 031/286] Add (nonfunctional) worker thread per stream. The worker threads don't actually do anything, but with this change we can create and destroy threads roughly right. Towards IPERF-124. --- src/iperf.h | 4 +++ src/iperf_client_api.c | 81 ++++++++++++++++++++++++++++++++++++++++++ src/iperf_server_api.c | 46 ++++++++++++++++++++++++ 3 files changed, 131 insertions(+) diff --git a/src/iperf.h b/src/iperf.h index c3ce33383..e1841714e 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -73,6 +73,8 @@ #include #endif // HAVE_SSL +#include + #if !defined(__IPERF_API_H) typedef uint64_t iperf_size_t; #endif // __IPERF_API_H @@ -175,6 +177,8 @@ struct iperf_stream { struct iperf_test* test; + pthread_t thr; + /* configurable members */ int local_port; int remote_port; diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 8971ef15d..7c927a360 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -51,6 +51,19 @@ #endif /* TCP_CA_NAME_MAX */ #endif /* HAVE_TCP_CONGESTION */ +void * +iperf_client_worker_start(void *s) { + struct iperf_stream *sp = (struct iperf_stream *) s; + struct iperf_test *test = sp->test; + + while (1) { + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d\n", sp->socket); + } + sleep(1); + } +} + int iperf_create_streams(struct iperf_test *test, int sender) { @@ -620,6 +633,23 @@ iperf_run_client(struct iperf_test * test) if (startup) { startup = 0; + /* Create and spin up threads */ + pthread_attr_t attr; + pthread_attr_init(&attr); + + SLIST_FOREACH(sp, &test->streams, streams) { + if (pthread_create(&(sp->thr), &attr, &iperf_client_worker_start, sp) != 0) { + perror("pthread_create"); + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d created\n", sp->socket); + } + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "All threads created\n"); + } + pthread_attr_destroy(&attr); + // Set non-blocking for non-UDP tests if (test->protocol->id != Pudp) { SLIST_FOREACH(sp, &test->streams, streams) { @@ -665,6 +695,22 @@ iperf_run_client(struct iperf_test * test) (test->settings->blocks != 0 && (test->blocks_sent >= test->settings->blocks || test->blocks_received >= test->settings->blocks)))) { + /* Cancel sender threads */ + SLIST_FOREACH(sp, &test->streams, streams) { + if (sp->sender) { + if (pthread_cancel(sp->thr) != 0) { + perror("pthread_cancel"); + } + sp->thr = 0; + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); + } + } + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Sender threads cancelled\n"); + } + // Unset non-blocking for non-UDP tests if (test->protocol->id != Pudp) { SLIST_FOREACH(sp, &test->streams, streams) { @@ -691,6 +737,25 @@ iperf_run_client(struct iperf_test * test) } } + /* Cancel receiver threads */ + SLIST_FOREACH(sp, &test->streams, streams) { + if (!sp->sender) { + if (pthread_cancel(sp->thr) != 0) { + perror("pthread_cancel"); + } + if (pthread_join(sp->thr, NULL) != 0) { + perror("pthread_join"); + } + sp->thr = 0; + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); + } + } + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Receiver threads cancelled\n"); + } + if (test->json_output) { if (iperf_json_finish(test) < 0) return -1; @@ -704,6 +769,22 @@ iperf_run_client(struct iperf_test * test) return 0; cleanup_and_fail: + /* Cancel all threads */ + SLIST_FOREACH(sp, &test->streams, streams) { + if (pthread_cancel(sp->thr) != 0) { + perror("pthread_cancel"); + } + if (pthread_join(sp->thr, NULL) != 0) { + perror("pthread_join"); + } + if (test->debug >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); + } + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "All threads cancelled\n"); + } + iperf_client_end(test); if (test->json_output) { cJSON_AddStringToObject(test->json_top, "error", iperf_strerror(i_errno)); diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index ae916f586..8ac3fd9e5 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -66,6 +66,19 @@ #endif /* TCP_CA_NAME_MAX */ #endif /* HAVE_TCP_CONGESTION */ +void * +iperf_server_worker_start(void *s) { + struct iperf_stream *sp = (struct iperf_stream *) s; + struct iperf_test *test = sp->test; + + while (1) { + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d\n", sp->socket); + } + sleep(1); + } +} + int iperf_server_listen(struct iperf_test *test) { @@ -388,6 +401,22 @@ cleanup_server(struct iperf_test *test) { struct iperf_stream *sp; + /* Cancel threads */ + SLIST_FOREACH(sp, &test->streams, streams) { + if (pthread_cancel(sp->thr) != 0) { + perror("pthread_cancel"); + } + if (pthread_join(sp->thr, NULL) != 0) { + perror("pthread_join"); + } + if (test->debug >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); + } + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "All threads cancelled\n"); + } + /* Close open streams */ SLIST_FOREACH(sp, &test->streams, streams) { if (sp->socket > -1) { @@ -803,6 +832,23 @@ iperf_run_server(struct iperf_test *test) cleanup_server(test); return -1; } + + /* Create and spin up threads */ + pthread_attr_t attr; + pthread_attr_init(&attr); + + SLIST_FOREACH(sp, &test->streams, streams) { + if (pthread_create(&(sp->thr), &attr, &iperf_server_worker_start, sp) != 0) { + perror("pthread_create"); + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d created\n", sp->socket); + } + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "All threads created\n"); + } + pthread_attr_destroy(&attr); } } From b4c23ab08c021452ba8cdcfe2723ae9764472226 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 25 Jul 2022 18:46:42 -0700 Subject: [PATCH 032/286] Add autoconf support for POSIX threads. --- config/ax_pthread.m4 | 522 +++++++++++++++++++++++++++++++++++++++++++ configure.ac | 10 + src/iperf_util.c | 10 + 3 files changed, 542 insertions(+) create mode 100644 config/ax_pthread.m4 diff --git a/config/ax_pthread.m4 b/config/ax_pthread.m4 new file mode 100644 index 000000000..9f35d1391 --- /dev/null +++ b/config/ax_pthread.m4 @@ -0,0 +1,522 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is +# needed for multi-threaded programs (defaults to the value of CC +# respectively CXX otherwise). (This is necessary on e.g. AIX to use the +# special cc_r/CC_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also to link with them as well. For example, you might link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threaded programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# CXX="$PTHREAD_CXX" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# Updated for Autoconf 2.68 by Daniel Richard G. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# Copyright (c) 2019 Marc Stevens +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 31 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) +AC_LANG_PUSH([C]) +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) + AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"]) + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) + AC_MSG_RESULT([$ax_pthread_ok]) + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], + [ +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + ], + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +AS_IF([test "x$ax_pthread_clang" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread"]) + + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) + + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + AC_MSG_RESULT([$ax_pthread_ok]) + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [ac_link="$ax_pthread_2step_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [break]) + ]) + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ]) + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], + [$ax_cv_PTHREAD_JOINABLE_ATTR], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + ax_pthread_joinable_attr_defined=yes + ]) + + AC_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) + + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT; + return i;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) + ax_pthread_prio_inherit_defined=yes + ]) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + AS_CASE(["x/$CC"], + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [ + AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"]) + AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])]) + ], + [ + AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC]) + AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])]) + ] + ) + ]) + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + +AC_SUBST([PTHREAD_LIBS]) +AC_SUBST([PTHREAD_CFLAGS]) +AC_SUBST([PTHREAD_CC]) +AC_SUBST([PTHREAD_CXX]) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_POP +])dnl AX_PTHREAD diff --git a/configure.ac b/configure.ac index 1b3c413f1..88671d45f 100644 --- a/configure.ac +++ b/configure.ac @@ -27,6 +27,7 @@ AC_PREREQ([2.71]) AC_INIT([iperf],[3.15],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) +m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) AC_LANG(C) @@ -83,6 +84,15 @@ exit 1 # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST +AX_PTHREAD( +[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.]) +LIBS="$PTHREAD_LIBS $LIBS" +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" +CC="$PTHREAD_CC" +CXX="$PTHREAD_CXX" +]) + # Check for poll.h (it's in POSIX so everyone should have it?) AC_CHECK_HEADERS([poll.h]) diff --git a/src/iperf_util.c b/src/iperf_util.c index d5795eed4..81e8da108 100644 --- a/src/iperf_util.c +++ b/src/iperf_util.c @@ -337,6 +337,16 @@ get_optional_features(void) numfeatures++; #endif /* HAVE_DONT_FRAGMENT */ +#if defined(HAVE_PTHREAD) + if (numfeatures > 0) { + strncat(features, ", ", + sizeof(features) - strlen(features) - 1); + } + strncat(features, "POSIX threads", + sizeof(features) - strlen(features) - 1); + numfeatures++; +#endif /* HAVE_PTHREAD */ + if (numfeatures == 0) { strncat(features, "None", sizeof(features) - strlen(features) - 1); From 6bcbb202a7f499d4da75518380b595b4bd38cd1b Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 25 Jul 2022 18:50:40 -0700 Subject: [PATCH 033/286] Minor configure.ac fixes (remove AC_PROG_RANLIB, only LT_INIT once, fix typo). --- configure.ac | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 88671d45f..7521f0d1c 100644 --- a/configure.ac +++ b/configure.ac @@ -49,9 +49,7 @@ AC_CANONICAL_HOST # Checks for tools: c compiler, ranlib (used for creating static libraries), # symlinks and libtool AC_PROG_CC -AC_PROG_RANLIB AC_PROG_LN_S -LT_INIT # Add -Wall if we are using GCC. if test "x$GCC" = "xyes"; then @@ -147,7 +145,7 @@ if test "x$with_openssl" = "xno"; then AC_MSG_WARN( [Building without OpenSSL; disabling iperf_auth functionality.] ) else # Check for OPENSSL support - havs_ssl=false + have_ssl=false AX_CHECK_OPENSSL( [ AC_DEFINE([HAVE_SSL], [1], [OpenSSL Is Available]) have_ssl=true ], From a360f70e7d5fcbbed12fe5dc7c35a889dcc14423 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 4 Aug 2022 11:19:41 -0700 Subject: [PATCH 034/286] Improve error handling. While here, also fix a place where we forgot to join after cancel. --- src/iperf_api.h | 3 +++ src/iperf_client_api.c | 25 +++++++++++++++++++------ src/iperf_error.c | 12 ++++++++++++ src/iperf_server_api.c | 13 ++++++++++--- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/iperf_api.h b/src/iperf_api.h index 0100d38fa..3dd61b38a 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -457,6 +457,9 @@ enum { IEBINDDEVNOSUPPORT = 146, // `ip%%dev` is not supported as system does not support bind to device IEHOSTDEV = 147, // host device name (ip%%) is supported (and required) only for IPv6 link-local address IESETUSERTIMEOUT = 148, // Unable to set TCP USER_TIMEOUT (check perror) + IEPTHREADCREATE=150, // Unable to create thread (check perror) + IEPTHREADCANCEL=151, // Unable to cancel thread (check perror) + IEPTHREADJOIN=152, // Unable to join thread (check perror) /* Stream errors */ IECREATESTREAM = 200, // Unable to create a new stream (check herror/perror) IEINITSTREAM = 201, // Unable to initialize stream (check herror/perror) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 7c927a360..e45339928 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -535,6 +535,7 @@ iperf_run_client(struct iperf_test * test) int64_t t_usecs; int64_t timeout_us; int64_t rcv_timeout_us; + int i_errno_save; if (NULL == test) { @@ -639,7 +640,8 @@ iperf_run_client(struct iperf_test * test) SLIST_FOREACH(sp, &test->streams, streams) { if (pthread_create(&(sp->thr), &attr, &iperf_client_worker_start, sp) != 0) { - perror("pthread_create"); + i_errno = IEPTHREADCREATE; + goto cleanup_and_fail; } if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d created\n", sp->socket); @@ -699,7 +701,12 @@ iperf_run_client(struct iperf_test * test) SLIST_FOREACH(sp, &test->streams, streams) { if (sp->sender) { if (pthread_cancel(sp->thr) != 0) { - perror("pthread_cancel"); + i_errno = IEPTHREADCANCEL; + goto cleanup_and_fail; + } + if (pthread_join(sp->thr, NULL) != 0) { + i_errno = IEPTHREADJOIN; + goto cleanup_and_fail; } sp->thr = 0; if (test->debug_level >= DEBUG_LEVEL_INFO) { @@ -741,10 +748,12 @@ iperf_run_client(struct iperf_test * test) SLIST_FOREACH(sp, &test->streams, streams) { if (!sp->sender) { if (pthread_cancel(sp->thr) != 0) { - perror("pthread_cancel"); + i_errno = IEPTHREADCANCEL; + goto cleanup_and_fail; } if (pthread_join(sp->thr, NULL) != 0) { - perror("pthread_join"); + i_errno = IEPTHREADJOIN; + goto cleanup_and_fail; } sp->thr = 0; if (test->debug_level >= DEBUG_LEVEL_INFO) { @@ -770,12 +779,15 @@ iperf_run_client(struct iperf_test * test) cleanup_and_fail: /* Cancel all threads */ + i_errno_save = i_errno; SLIST_FOREACH(sp, &test->streams, streams) { if (pthread_cancel(sp->thr) != 0) { - perror("pthread_cancel"); + i_errno = IEPTHREADCANCEL; + iperf_err(test, "cleanup_and_fail - %s", iperf_strerror(i_errno)); } if (pthread_join(sp->thr, NULL) != 0) { - perror("pthread_join"); + i_errno = IEPTHREADCANCEL; + iperf_err(test, "cleanup_and_fail - %s", iperf_strerror(i_errno)); } if (test->debug >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); @@ -784,6 +796,7 @@ iperf_run_client(struct iperf_test * test) if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "All threads cancelled\n"); } + i_errno = i_errno_save; iperf_client_end(test); if (test->json_output) { diff --git a/src/iperf_error.c b/src/iperf_error.c index ea7955c67..c16d4d13e 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -470,6 +470,18 @@ iperf_strerror(int int_errno) snprintf(errstr, len, "unable to set TCP USER_TIMEOUT"); perr = 1; break; + case IEPTHREADCREATE: + snprintf(errstr, len, "unable to create thread"); + perr = 1; + break; + case IEPTHREADCANCEL: + snprintf(errstr, len, "unable to cancel thread"); + perr = 1; + break; + case IEPTHREADJOIN: + snprintf(errstr, len, "unable to join thread"); + perr = 1; + break; default: snprintf(errstr, len, "int_errno=%d", int_errno); perr = 1; diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 8ac3fd9e5..6083d1496 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -402,17 +402,22 @@ cleanup_server(struct iperf_test *test) struct iperf_stream *sp; /* Cancel threads */ + int i_errno_save = i_errno; SLIST_FOREACH(sp, &test->streams, streams) { if (pthread_cancel(sp->thr) != 0) { - perror("pthread_cancel"); + i_errno = IEPTHREADCANCEL; + iperf_err(test, "cleanup_server - %s", iperf_strerror(i_errno)); } if (pthread_join(sp->thr, NULL) != 0) { - perror("pthread_join"); + i_errno = IEPTHREADJOIN; + iperf_err(test, "cleanup_server - %s", iperf_strerror(i_errno)); } if (test->debug >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); } } + i_errno = i_errno_save; + if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "All threads cancelled\n"); } @@ -839,7 +844,9 @@ iperf_run_server(struct iperf_test *test) SLIST_FOREACH(sp, &test->streams, streams) { if (pthread_create(&(sp->thr), &attr, &iperf_server_worker_start, sp) != 0) { - perror("pthread_create"); + i_errno = IEPTHREADCREATE; + cleanup_server(test); + return -1; } if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d created\n", sp->socket); From 0b1be2560ecf2949a51e7bd4c173d082907fb260 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 4 Aug 2022 18:37:18 -0700 Subject: [PATCH 035/286] Improve error handling around thread attribute calls. --- src/iperf_api.h | 2 ++ src/iperf_client_api.c | 10 ++++++++-- src/iperf_error.c | 8 ++++++++ src/iperf_server_api.c | 10 ++++++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/iperf_api.h b/src/iperf_api.h index 3dd61b38a..a6756e8de 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -460,6 +460,8 @@ enum { IEPTHREADCREATE=150, // Unable to create thread (check perror) IEPTHREADCANCEL=151, // Unable to cancel thread (check perror) IEPTHREADJOIN=152, // Unable to join thread (check perror) + IEPTHREADATTRINIT=153, // Unable to initialize thread attribute (check perror) + IEPTHREADATTRDESTROY=154, // Unable to destroy thread attribute (check perror) /* Stream errors */ IECREATESTREAM = 200, // Unable to create a new stream (check herror/perror) IEINITSTREAM = 201, // Unable to initialize stream (check herror/perror) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index e45339928..1a66c9649 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -636,7 +636,10 @@ iperf_run_client(struct iperf_test * test) /* Create and spin up threads */ pthread_attr_t attr; - pthread_attr_init(&attr); + if (pthread_attr_init(&attr) != 0) { + i_errno = IEPTHREADATTRINIT; + goto cleanup_and_fail; + } SLIST_FOREACH(sp, &test->streams, streams) { if (pthread_create(&(sp->thr), &attr, &iperf_client_worker_start, sp) != 0) { @@ -650,7 +653,10 @@ iperf_run_client(struct iperf_test * test) if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "All threads created\n"); } - pthread_attr_destroy(&attr); + if (pthread_attr_destroy(&attr) != 0) { + i_errno = IEPTHREADATTRDESTROY; + goto cleanup_and_fail; + } // Set non-blocking for non-UDP tests if (test->protocol->id != Pudp) { diff --git a/src/iperf_error.c b/src/iperf_error.c index c16d4d13e..2999d5d9e 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -482,6 +482,14 @@ iperf_strerror(int int_errno) snprintf(errstr, len, "unable to join thread"); perr = 1; break; + case IEPTHREADATTRINIT: + snprintf(errstr, len, "unable to create thread attributes"); + perr = 1; + break; + case IEPTHREADATTRDESTROY: + snprintf(errstr, len, "unable to destroy thread attributes"); + perr = 1; + break; default: snprintf(errstr, len, "int_errno=%d", int_errno); perr = 1; diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 6083d1496..236060ef6 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -840,7 +840,10 @@ iperf_run_server(struct iperf_test *test) /* Create and spin up threads */ pthread_attr_t attr; - pthread_attr_init(&attr); + if (pthread_attr_init(&attr) != 0) { + i_errno = IEPTHREADATTRINIT; + cleanup_server(test); + }; SLIST_FOREACH(sp, &test->streams, streams) { if (pthread_create(&(sp->thr), &attr, &iperf_server_worker_start, sp) != 0) { @@ -855,7 +858,10 @@ iperf_run_server(struct iperf_test *test) if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "All threads created\n"); } - pthread_attr_destroy(&attr); + if (pthread_attr_destroy(&attr) != 0) { + i_errno = IEPTHREADATTRDESTROY; + cleanup_server(test); + }; } } From fc86f850cc74aa18d9f78abe1dec46ae348a689d Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 4 Aug 2022 23:10:12 -0700 Subject: [PATCH 036/286] Locking around output operations. Allow threads to exit gracefully. --- src/iperf.h | 3 ++ src/iperf_api.c | 90 ++++++++++++++++++++++++++++++++++++------ src/iperf_client_api.c | 32 ++++++--------- src/iperf_error.c | 17 ++++++++ src/iperf_server_api.c | 12 +++--- 5 files changed, 115 insertions(+), 39 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index e1841714e..afdf1b6c4 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -178,6 +178,7 @@ struct iperf_stream struct iperf_test* test; pthread_t thr; + int done; /* configurable members */ int local_port; @@ -271,6 +272,8 @@ enum debug_level { struct iperf_test { + pthread_mutex_t print_mutex; + char role; /* 'c' lient or 's' erver */ enum iperf_mode mode; int sender_has_retransmits; diff --git a/src/iperf_api.c b/src/iperf_api.c index ca1ad11ca..df2f7d5d5 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2807,6 +2807,7 @@ struct iperf_test * iperf_new_test() { struct iperf_test *test; + int rc; test = (struct iperf_test *) malloc(sizeof(struct iperf_test)); if (!test) { @@ -2816,6 +2817,21 @@ iperf_new_test() /* initialize everything to zero */ memset(test, 0, sizeof(struct iperf_test)); + /* Initialize mutex for printing output */ + pthread_mutexattr_t mutexattr; + pthread_mutexattr_init(&mutexattr); + rc = pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK); + if (rc != 0) { + errno = rc; + perror("iperf_new_test: pthread_mutexattr_settype"); + } + + if (pthread_mutex_init(&(test->print_mutex), &mutexattr) != 0) { + perror("iperf_new_test: pthread_mutex_init"); + } + + pthread_mutexattr_destroy(&mutexattr); + test->settings = (struct iperf_settings *) malloc(sizeof(struct iperf_settings)); if (!test->settings) { free(test); @@ -3069,6 +3085,14 @@ iperf_free_test(struct iperf_test *test) free(prot); } + /* Destroy print mutex. iperf_printf() doesn't work after this point */ + int rc; + rc = pthread_mutex_destroy(&(test->print_mutex)); + if (rc != 0) { + errno = rc; + perror("iperf_free_test: pthread_mutex_destroy"); + } + if (test->logfile) { free(test->logfile); test->logfile = NULL; @@ -4798,7 +4822,14 @@ iperf_json_finish(struct iperf_test *test) if (test->json_output_string == NULL) { return -1; } + + if (pthread_mutex_lock(&(test->print_mutex)) != 0) { + perror("iperf_json_finish: pthread_mutex_lock"); + } fprintf(test->outfile, "%s\n", test->json_output_string); + if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { + perror("iperf_json_finish: pthread_mutex_unlock"); + } iflush(test); cJSON_Delete(test->json_top); test->json_top = NULL; @@ -4907,6 +4938,10 @@ iperf_printf(struct iperf_test *test, const char* format, ...) struct tm *ltm = NULL; char *ct = NULL; + if (pthread_mutex_lock(&(test->print_mutex)) != 0) { + perror("iperf_print: pthread_mutex_lock"); + } + /* Timestamp if requested */ if (iperf_get_test_timestamps(test)) { time(&now); @@ -4930,28 +4965,36 @@ iperf_printf(struct iperf_test *test, const char* format, ...) if (test->role == 'c') { if (ct) { r0 = fprintf(test->outfile, "%s", ct); - if (r0 < 0) - return r0; + if (r0 < 0) { + r = r0; + goto bottom; + } r += r0; } if (test->title) { r0 = fprintf(test->outfile, "%s: ", test->title); - if (r0 < 0) - return r0; + if (r0 < 0) { + r = r0; + goto bottom; + } r += r0; } va_start(argp, format); r0 = vfprintf(test->outfile, format, argp); va_end(argp); - if (r0 < 0) - return r0; + if (r0 < 0) { + r = r0; + goto bottom; + } r += r0; } else if (test->role == 's') { if (ct) { r0 = snprintf(linebuffer, sizeof(linebuffer), "%s", ct); - if (r0 < 0) - return r0; + if (r0 < 0) { + r = r0; + goto bottom; + } r += r0; } /* Should always be true as long as sizeof(ct) < sizeof(linebuffer) */ @@ -4959,8 +5002,10 @@ iperf_printf(struct iperf_test *test, const char* format, ...) va_start(argp, format); r0 = vsnprintf(linebuffer + r, sizeof(linebuffer) - r, format, argp); va_end(argp); - if (r0 < 0) - return r0; + if (r0 < 0) { + r = r0; + goto bottom; + } r += r0; } fprintf(test->outfile, "%s", linebuffer); @@ -4971,11 +5016,34 @@ iperf_printf(struct iperf_test *test, const char* format, ...) TAILQ_INSERT_TAIL(&(test->server_output_list), l, textlineentries); } } + + bottom: + if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { + perror("iperf_print: pthread_mutex_unlock"); + } + return r; } int iflush(struct iperf_test *test) { - return fflush(test->outfile); + int rc2; + + int rc; + rc = pthread_mutex_lock(&(test->print_mutex)); + if (rc != 0) { + errno = rc; + perror("iflush: pthread_mutex_lock"); + } + + rc2 = fflush(test->outfile); + + rc = pthread_mutex_unlock(&(test->print_mutex)); + if (rc != 0) { + errno = rc; + perror("iflush: pthread_mutex_unlock"); + } + + return rc2; } diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 1a66c9649..6e6afb698 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -56,12 +56,13 @@ iperf_client_worker_start(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; - while (1) { + while (! (test->done)) { if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d\n", sp->socket); } sleep(1); } + return NULL; } int @@ -706,22 +707,18 @@ iperf_run_client(struct iperf_test * test) /* Cancel sender threads */ SLIST_FOREACH(sp, &test->streams, streams) { if (sp->sender) { - if (pthread_cancel(sp->thr) != 0) { - i_errno = IEPTHREADCANCEL; - goto cleanup_and_fail; - } + sp->done = 1; if (pthread_join(sp->thr, NULL) != 0) { i_errno = IEPTHREADJOIN; goto cleanup_and_fail; } - sp->thr = 0; if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); + iperf_printf(test, "Thread FD %d stopped\n", sp->socket); } } } if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Sender threads cancelled\n"); + iperf_printf(test, "Sender threads stopped\n"); } // Unset non-blocking for non-UDP tests @@ -753,22 +750,18 @@ iperf_run_client(struct iperf_test * test) /* Cancel receiver threads */ SLIST_FOREACH(sp, &test->streams, streams) { if (!sp->sender) { - if (pthread_cancel(sp->thr) != 0) { - i_errno = IEPTHREADCANCEL; - goto cleanup_and_fail; - } + sp->done = 1; if (pthread_join(sp->thr, NULL) != 0) { i_errno = IEPTHREADJOIN; goto cleanup_and_fail; } - sp->thr = 0; if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); + iperf_printf(test, "Thread FD %d stopped\n", sp->socket); } } } if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Receiver threads cancelled\n"); + iperf_printf(test, "Receiver threads stopped\n"); } if (test->json_output) { @@ -787,20 +780,17 @@ iperf_run_client(struct iperf_test * test) /* Cancel all threads */ i_errno_save = i_errno; SLIST_FOREACH(sp, &test->streams, streams) { - if (pthread_cancel(sp->thr) != 0) { - i_errno = IEPTHREADCANCEL; - iperf_err(test, "cleanup_and_fail - %s", iperf_strerror(i_errno)); - } + sp->done = 1; if (pthread_join(sp->thr, NULL) != 0) { i_errno = IEPTHREADCANCEL; iperf_err(test, "cleanup_and_fail - %s", iperf_strerror(i_errno)); } if (test->debug >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); + iperf_printf(test, "Thread FD %d stopped\n", sp->socket); } } if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "All threads cancelled\n"); + iperf_printf(test, "All threads stopped\n"); } i_errno = i_errno_save; diff --git a/src/iperf_error.c b/src/iperf_error.c index 2999d5d9e..6426554cf 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -47,6 +47,10 @@ iperf_err(struct iperf_test *test, const char *format, ...) struct tm *ltm = NULL; char *ct = NULL; + if (pthread_mutex_lock(&(test->print_mutex)) != 0) { + perror("iperf_err: pthread_mutex_lock"); + } + /* Timestamp if requested */ if (test != NULL && test->timestamps) { time(&now); @@ -74,6 +78,10 @@ iperf_err(struct iperf_test *test, const char *format, ...) } } va_end(argp); + + if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { + perror("iperf_err: pthread_mutex_unlock"); + } } /* Do a printf to stderr or log file as appropriate, then exit. */ @@ -86,6 +94,10 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) struct tm *ltm = NULL; char *ct = NULL; + if (pthread_mutex_lock(&(test->print_mutex)) != 0) { + perror("iperf_errexit: pthread_mutex_lock"); + } + /* Timestamp if requested */ if (test != NULL && test->timestamps) { time(&now); @@ -114,6 +126,11 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) } fprintf(stderr, "iperf3: %s\n", str); } + + if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { + perror("iperf_errexit: pthread_mutex_unlock"); + } + va_end(argp); if (test) iperf_delete_pidfile(test); diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 236060ef6..33f4c0237 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -71,12 +71,13 @@ iperf_server_worker_start(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; - while (1) { + while (! (test->done)) { if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d\n", sp->socket); } sleep(1); } + return NULL; } int @@ -404,22 +405,19 @@ cleanup_server(struct iperf_test *test) /* Cancel threads */ int i_errno_save = i_errno; SLIST_FOREACH(sp, &test->streams, streams) { - if (pthread_cancel(sp->thr) != 0) { - i_errno = IEPTHREADCANCEL; - iperf_err(test, "cleanup_server - %s", iperf_strerror(i_errno)); - } + sp->done = 1; if (pthread_join(sp->thr, NULL) != 0) { i_errno = IEPTHREADJOIN; iperf_err(test, "cleanup_server - %s", iperf_strerror(i_errno)); } if (test->debug >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d cancelled\n", sp->socket); + iperf_printf(test, "Thread FD %d stopped\n", sp->socket); } } i_errno = i_errno_save; if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "All threads cancelled\n"); + iperf_printf(test, "All threads stopped\n"); } /* Close open streams */ From 0755cc4e12b41547c92ec0c826857fa86935c3ae Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 28 Oct 2022 11:52:25 -0700 Subject: [PATCH 037/286] Initial version of multi-threaded writers. * Create iperf_send_mt and iperf_recv_mt, the multi-threaded versions of network I/O functions. These handle a single connection only and do not attempt to coordinate timing (for flow control) with any other threads. * Make client and server thread functions call the new multi-threaded network I/O functions. * Remove all network I/O for the test streams from the main thread. * fd_set objects in test object only apply to sockets used by the main thread (not the test streams in the worker threads). Outstanding issues: * No locking of shared data structures at this point. Correctness may be compromised at this point. * Worker threads on the sender side will tend to busy-wait because they do not attempt to sleep while attempting to pace themeselves. * No support (for now) for ending conditions other than time-based (packet-based and byte-based don't work). --- src/iperf_api.c | 40 +++++++++++-------------------- src/iperf_api.h | 4 ++-- src/iperf_client_api.c | 54 +++++++++++++----------------------------- src/iperf_server_api.c | 51 +++++++++++++-------------------------- 4 files changed, 48 insertions(+), 101 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index df2f7d5d5..561a2cab6 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1861,10 +1861,8 @@ iperf_check_throttle(struct iperf_stream *sp, struct iperf_time *nowP) bits_per_second = sp->result->bytes_sent * 8 / seconds; if (bits_per_second < sp->test->settings->rate) { sp->green_light = 1; - FD_SET(sp->socket, &sp->test->write_set); } else { sp->green_light = 0; - FD_CLR(sp->socket, &sp->test->write_set); } } @@ -1909,10 +1907,10 @@ iperf_check_total_rate(struct iperf_test *test, iperf_size_t last_interval_bytes } int -iperf_send(struct iperf_test *test, fd_set *write_setP) +iperf_send_mt(struct iperf_stream *sp) { register int multisend, r, streams_active; - register struct iperf_stream *sp; + register struct iperf_test *test = sp->test; struct iperf_time now; int no_throttle_check; @@ -1931,13 +1929,14 @@ iperf_send(struct iperf_test *test, fd_set *write_setP) if (no_throttle_check) iperf_time_now(&now); streams_active = 0; - SLIST_FOREACH(sp, &test->streams, streams) { - if ((sp->green_light && sp->sender && - (write_setP == NULL || FD_ISSET(sp->socket, write_setP)))) { - if (multisend > 1 && test->settings->bytes != 0 && test->bytes_sent >= test->settings->bytes) - break; - if (multisend > 1 && test->settings->blocks != 0 && test->blocks_sent >= test->settings->blocks) - break; + { + if (sp->green_light && sp->sender) { + // XXX If we hit one of these ending conditions maybe + // want to stop even trying to send something? + if (multisend > 1 && test->settings->bytes != 0 && test->bytes_sent >= test->settings->bytes) + break; + if (multisend > 1 && test->settings->blocks != 0 && test->blocks_sent >= test->settings->blocks) + break; if ((r = sp->snd(sp)) < 0) { if (r == NET_SOFTERROR) break; @@ -1957,35 +1956,24 @@ iperf_send(struct iperf_test *test, fd_set *write_setP) } if (!no_throttle_check) { /* Throttle check if was not checked for each send */ iperf_time_now(&now); - SLIST_FOREACH(sp, &test->streams, streams) - if (sp->sender) - iperf_check_throttle(sp, &now); + if (sp->sender) + iperf_check_throttle(sp, &now); } - if (write_setP != NULL) - SLIST_FOREACH(sp, &test->streams, streams) - if (FD_ISSET(sp->socket, write_setP)) - FD_CLR(sp->socket, write_setP); - return 0; } int -iperf_recv(struct iperf_test *test, fd_set *read_setP) +iperf_recv_mt(struct iperf_stream *sp) { int r; - struct iperf_stream *sp; + struct iperf_test *test = sp->test; - SLIST_FOREACH(sp, &test->streams, streams) { - if (FD_ISSET(sp->socket, read_setP) && !sp->sender) { if ((r = sp->rcv(sp)) < 0) { i_errno = IESTREAMREAD; return r; } test->bytes_received += r; ++test->blocks_received; - FD_CLR(sp->socket, read_setP); - } - } return 0; } diff --git a/src/iperf_api.h b/src/iperf_api.h index a6756e8de..ed991e12b 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -310,8 +310,8 @@ void build_tcpinfo_message(struct iperf_interval_results *r, char *message); int iperf_set_send_state(struct iperf_test *test, signed char state); void iperf_check_throttle(struct iperf_stream *sp, struct iperf_time *nowP); -int iperf_send(struct iperf_test *, fd_set *) /* __attribute__((hot)) */; -int iperf_recv(struct iperf_test *, fd_set *); +int iperf_send_mt(struct iperf_stream *) /* __attribute__((hot)) */; +int iperf_recv_mt(struct iperf_stream *); void iperf_catch_sigend(void (*handler)(int)); void iperf_got_sigend(struct iperf_test *test) __attribute__ ((noreturn)); void usage(void); diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 6e6afb698..b10e7e4e7 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -52,17 +52,28 @@ #endif /* HAVE_TCP_CONGESTION */ void * -iperf_client_worker_start(void *s) { +iperf_client_worker_run(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; while (! (test->done)) { - if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d\n", sp->socket); + if (sp->sender) { + if (iperf_send_mt(sp) < 0) { + goto cleanup_and_fail; + } + } + else { + if (iperf_recv_mt(sp) < 0) { + goto cleanup_and_fail; + } } - sleep(1); } return NULL; + + cleanup_and_fail: + /* XXX */ + test->done = 0; + return NULL; } int @@ -129,12 +140,6 @@ iperf_create_streams(struct iperf_test *test, int sender) } #endif /* HAVE_TCP_CONGESTION */ - if (sender) - FD_SET(s, &test->write_set); - else - FD_SET(s, &test->read_set); - if (s > test->max_fd) test->max_fd = s; - sp = iperf_new_stream(test, s, sender); if (!sp) return -1; @@ -643,7 +648,7 @@ iperf_run_client(struct iperf_test * test) } SLIST_FOREACH(sp, &test->streams, streams) { - if (pthread_create(&(sp->thr), &attr, &iperf_client_worker_start, sp) != 0) { + if (pthread_create(&(sp->thr), &attr, &iperf_client_worker_run, sp) != 0) { i_errno = IEPTHREADCREATE; goto cleanup_and_fail; } @@ -667,24 +672,6 @@ iperf_run_client(struct iperf_test * test) } } - - if (test->mode == BIDIRECTIONAL) - { - if (iperf_send(test, &write_set) < 0) - goto cleanup_and_fail; - if (iperf_recv(test, &read_set) < 0) - goto cleanup_and_fail; - } else if (test->mode == SENDER) { - // Regular mode. Client sends. - if (iperf_send(test, &write_set) < 0) - goto cleanup_and_fail; - } else { - // Reverse mode. Client receives. - if (iperf_recv(test, &read_set) < 0) - goto cleanup_and_fail; - } - - /* Run the timers. */ iperf_time_now(&now); tmr_run(&now); @@ -736,15 +723,6 @@ iperf_run_client(struct iperf_test * test) goto cleanup_and_fail; } } - // If we're in reverse mode, continue draining the data - // connection(s) even if test is over. This prevents a - // deadlock where the server side fills up its pipe(s) - // and gets blocked, so it can't receive state changes - // from the client side. - else if (test->mode == RECEIVER && test->state == TEST_END) { - if (iperf_recv(test, &read_set) < 0) - goto cleanup_and_fail; - } } /* Cancel receiver threads */ diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 33f4c0237..2be72cae7 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -67,17 +67,28 @@ #endif /* HAVE_TCP_CONGESTION */ void * -iperf_server_worker_start(void *s) { +iperf_server_worker_run(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; while (! (test->done)) { - if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d\n", sp->socket); + if (sp->sender) { + if (iperf_send_mt(sp) < 0) { + goto cleanup_and_fail; + } + } + else { + if (iperf_recv_mt(sp) < 0) { + goto cleanup_and_fail; + } } - sleep(1); } return NULL; + + cleanup_and_fail: + /* XXX */ + test->done = 0; + return NULL; } int @@ -746,11 +757,6 @@ iperf_run_server(struct iperf_test *test) return -1; } - if (sp->sender) - FD_SET(s, &test->write_set); - else - FD_SET(s, &test->read_set); - if (s > test->max_fd) test->max_fd = s; /* @@ -844,7 +850,7 @@ iperf_run_server(struct iperf_test *test) }; SLIST_FOREACH(sp, &test->streams, streams) { - if (pthread_create(&(sp->thr), &attr, &iperf_server_worker_start, sp) != 0) { + if (pthread_create(&(sp->thr), &attr, &iperf_server_worker_run, sp) != 0) { i_errno = IEPTHREADCREATE; cleanup_server(test); return -1; @@ -862,31 +868,6 @@ iperf_run_server(struct iperf_test *test) }; } } - - if (test->state == TEST_RUNNING) { - if (test->mode == BIDIRECTIONAL) { - if (iperf_recv(test, &read_set) < 0) { - cleanup_server(test); - return -1; - } - if (iperf_send(test, &write_set) < 0) { - cleanup_server(test); - return -1; - } - } else if (test->mode == SENDER) { - // Reverse mode. Server sends. - if (iperf_send(test, &write_set) < 0) { - cleanup_server(test); - return -1; - } - } else { - // Regular mode. Server receives. - if (iperf_recv(test, &read_set) < 0) { - cleanup_server(test); - return -1; - } - } - } } if (result == 0 || From 30ce2d5984c5ef90681e0faed6d1a747b6d95999 Mon Sep 17 00:00:00 2001 From: Sarah Larsen Date: Tue, 17 Jan 2023 17:44:27 -0800 Subject: [PATCH 038/286] Add atomic_iperf_size_t for atomic (thread-safe) operations --- src/iperf.h | 25 ++++++++++++++----------- src/iperf_api.c | 2 +- src/iperf_api.h | 4 +++- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index afdf1b6c4..87b7b0ed2 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -74,14 +74,17 @@ #endif // HAVE_SSL #include +#include #if !defined(__IPERF_API_H) -typedef uint64_t iperf_size_t; +//typedef uint64_t iperf_size_t; +typedef uint_fast64_t iperf_size_t; +typedef atomic_uint_fast64_t atomic_iperf_size_t; #endif // __IPERF_API_H struct iperf_interval_results { - iperf_size_t bytes_transferred; /* bytes transferred in this interval */ + atomic_iperf_size_t bytes_transferred; /* bytes transferred in this interval */ struct iperf_time interval_start_time; struct iperf_time interval_end_time; float interval_duration; @@ -115,11 +118,11 @@ struct iperf_interval_results struct iperf_stream_result { - iperf_size_t bytes_received; - iperf_size_t bytes_sent; - iperf_size_t bytes_received_this_interval; - iperf_size_t bytes_sent_this_interval; - iperf_size_t bytes_sent_omit; + atomic_iperf_size_t bytes_received; + atomic_iperf_size_t bytes_sent; + atomic_iperf_size_t bytes_received_this_interval; + atomic_iperf_size_t bytes_sent_this_interval; + atomic_iperf_size_t bytes_sent_omit; long stream_prev_total_retrans; long stream_retrans; long stream_max_rtt; @@ -359,11 +362,11 @@ struct iperf_test int num_streams; /* total streams in the test (-P) */ - iperf_size_t bytes_sent; - iperf_size_t blocks_sent; + atomic_iperf_size_t bytes_sent; + atomic_iperf_size_t blocks_sent; - iperf_size_t bytes_received; - iperf_size_t blocks_received; + atomic_iperf_size_t bytes_received; + atomic_iperf_size_t blocks_received; iperf_size_t bitrate_limit_stats_count; /* Number of stats periods accumulated for server's total bitrate average */ iperf_size_t *bitrate_limit_intervals_traffic_bytes; /* Pointer to a cyclic array that includes the last interval's bytes transferred */ diff --git a/src/iperf_api.c b/src/iperf_api.c index 561a2cab6..eb234030c 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1889,7 +1889,7 @@ iperf_check_total_rate(struct iperf_test *test, iperf_size_t last_interval_bytes return; /* Calculating total bytes traffic to be averaged */ - for (total_bytes = 0, i = 0; i < test->settings->bitrate_limit_stats_per_interval; i++) { + for (i = 0, total_bytes = 0; i < test->settings->bitrate_limit_stats_per_interval; i++) { total_bytes += test->bitrate_limit_intervals_traffic_bytes[i]; } diff --git a/src/iperf_api.h b/src/iperf_api.h index ed991e12b..1c2cb7ec3 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -38,6 +38,7 @@ extern "C" { /* open extern "C" */ #endif +#include struct iperf_test; struct iperf_stream_result; @@ -46,7 +47,8 @@ struct iperf_stream; struct iperf_time; #if !defined(__IPERF_H) -typedef uint64_t iperf_size_t; +typedef uint_fast64_t iperf_size_t; +typedef atomic_uint_fast64_t atomic_iperf_size_t; #endif // __IPERF_H /* default settings */ From b14c3b938461d6e663f1109948bbe4e77a772ea0 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 29 Mar 2023 18:52:33 -0700 Subject: [PATCH 039/286] Make -n / -k options work correctly. We need to get the threads to exit when the ending conditions for -n / -k are reached, but we weren't doing that. While here, clean up some not-very-often-used error case code and pet copyright dates. Fixes IPERF-151. --- src/iperf_client_api.c | 6 ++---- src/iperf_server_api.c | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index b10e7e4e7..f0c4a5894 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -1,5 +1,5 @@ /* - * iperf, Copyright (c) 2014-2022, The Regents of the University of + * iperf, Copyright (c) 2014-2023, The Regents of the University of * California, through Lawrence Berkeley National Laboratory (subject * to receipt of any required approvals from the U.S. Dept. of * Energy). All rights reserved. @@ -56,7 +56,7 @@ iperf_client_worker_run(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; - while (! (test->done)) { + while (! (test->done) && ! (sp->done)) { if (sp->sender) { if (iperf_send_mt(sp) < 0) { goto cleanup_and_fail; @@ -71,8 +71,6 @@ iperf_client_worker_run(void *s) { return NULL; cleanup_and_fail: - /* XXX */ - test->done = 0; return NULL; } diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 2be72cae7..f36eaa367 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -1,5 +1,5 @@ /* - * iperf, Copyright (c) 2014-2022 The Regents of the University of + * iperf, Copyright (c) 2014-2023 The Regents of the University of * California, through Lawrence Berkeley National Laboratory (subject * to receipt of any required approvals from the U.S. Dept. of * Energy). All rights reserved. @@ -71,7 +71,7 @@ iperf_server_worker_run(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; - while (! (test->done)) { + while (! (test->done) && ! (sp->done)) { if (sp->sender) { if (iperf_send_mt(sp) < 0) { goto cleanup_and_fail; @@ -86,8 +86,6 @@ iperf_server_worker_run(void *s) { return NULL; cleanup_and_fail: - /* XXX */ - test->done = 0; return NULL; } From a326ec839ae2123d9464d4f96d732e610f144d23 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 13 Apr 2023 14:43:39 -0700 Subject: [PATCH 040/286] Add autoconf test for stdatomic Also do conditional compilation for stdatomic and pthread. --- configure.ac | 3 +++ src/iperf.h | 7 ++++++- src/iperf_api.h | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 7521f0d1c..92b9ced52 100644 --- a/configure.ac +++ b/configure.ac @@ -91,6 +91,9 @@ CC="$PTHREAD_CC" CXX="$PTHREAD_CXX" ]) +# Atomics +AC_CHECK_HEADERS([stdatomic.h]) + # Check for poll.h (it's in POSIX so everyone should have it?) AC_CHECK_HEADERS([poll.h]) diff --git a/src/iperf.h b/src/iperf.h index 87b7b0ed2..87f787fd5 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -1,5 +1,5 @@ /* - * iperf, Copyright (c) 2014-2020, The Regents of the University of + * iperf, Copyright (c) 2014-2020, 2023, The Regents of the University of * California, through Lawrence Berkeley National Laboratory (subject * to receipt of any required approvals from the U.S. Dept. of * Energy). All rights reserved. @@ -73,8 +73,13 @@ #include #endif // HAVE_SSL +#ifdef HAVE_PTHREAD #include +#endif // HAVE_PTHREAD + +#ifdef HAVE_STDATOMIC_H #include +#endif // HAVE_STDATOMIC_H #if !defined(__IPERF_API_H) //typedef uint64_t iperf_size_t; diff --git a/src/iperf_api.h b/src/iperf_api.h index 1c2cb7ec3..fd2ab6bc6 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -1,5 +1,5 @@ /* - * iperf, Copyright (c) 2014-2022, The Regents of the University of + * iperf, Copyright (c) 2014-2023, The Regents of the University of * California, through Lawrence Berkeley National Laboratory (subject * to receipt of any required approvals from the U.S. Dept. of * Energy). All rights reserved. @@ -38,7 +38,9 @@ extern "C" { /* open extern "C" */ #endif +#ifdef HAVE_STDATOMIC_H #include +#endif // HAVE_STDATOMIC_H struct iperf_test; struct iperf_stream_result; From 20a02b4d460099d6d1a584c77bda81418bf44bd8 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 13 Apr 2023 16:04:18 -0700 Subject: [PATCH 041/286] Fix build on CentOS 7 / x86_64. The issue is that the default compiler on CentOS 7 (and presumably RHEL 7) is an old GCC that's too old to support atomic types. In this case we attempt to approximate an atomic 64-bit type with a normal 64-bit integer, and warn at runtime if the system doesn't support lock-free operations with this data type. This has been compile-tested and lightly run-tested on CentOS 7 x86_64. It might not work well with ancient non-GCC compilers or 32-bit hosts. --- src/iperf.h | 8 +++++++- src/iperf_api.h | 7 +++++++ src/main.c | 20 +++++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index 87f787fd5..7b270bd0f 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -77,12 +77,18 @@ #include #endif // HAVE_PTHREAD +/* + * Atomic types highly desired, but if not, we approximate what we need + * with normal integers and warn. + */ #ifdef HAVE_STDATOMIC_H #include +#else +#warning "No available." +typedef uint64_t atomic_uint_fast64_t; #endif // HAVE_STDATOMIC_H #if !defined(__IPERF_API_H) -//typedef uint64_t iperf_size_t; typedef uint_fast64_t iperf_size_t; typedef atomic_uint_fast64_t atomic_iperf_size_t; #endif // __IPERF_API_H diff --git a/src/iperf_api.h b/src/iperf_api.h index fd2ab6bc6..9e70d44f3 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -38,8 +38,15 @@ extern "C" { /* open extern "C" */ #endif +/* + * Atomic types highly desired, but if not, we approximate what we need + * with normal integers and warn. + */ #ifdef HAVE_STDATOMIC_H #include +#else +#warning "No available" +typedef u_int64_t atomic_uint_fast64_t; #endif // HAVE_STDATOMIC_H struct iperf_test; diff --git a/src/main.c b/src/main.c index 3b397c00a..b179f5bde 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ /* - * iperf, Copyright (c) 2014-2022, The Regents of the University of + * iperf, Copyright (c) 2014-2023, The Regents of the University of * California, through Lawrence Berkeley National Laboratory (subject * to receipt of any required approvals from the U.S. Dept. of * Energy). All rights reserved. @@ -59,6 +59,24 @@ main(int argc, char **argv) { struct iperf_test *test; + /* + * Atomics check. We prefer to have atomic types (which is + * basically on any compiler supporting C11 or better). If we + * don't have them, we try to approximate the type we need with a + * regular integer, but complain if they're not lock-free. We only + * know how to check this on GCC. GCC on CentOS 7 / RHEL 7 is the + * targeted use case for these check. + */ +#ifndef HAVE_STDATOMIC_H +#ifdef __GNUC__ + if (! __atomic_always_lock_free (sizeof (u_int64_t), 0)) { +#endif // __GNUC__ + fprintf(stderr, "Warning: Cannot guarantee lock-free operation with 64-bit data types\n"); +#ifdef __GNUC__ + } +#endif // __GNUC__ +#endif // HAVE_STDATOMIC_H + // XXX: Setting the process affinity requires root on most systems. // Is this a feature we really need? #ifdef TEST_PROC_AFFINITY From 6e75b072613d7b95fee090c4632e98cb1462643e Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 19 Apr 2023 16:21:35 -0700 Subject: [PATCH 042/286] Don't set O_NONBLOCK on sockets used for tests. This fixes a problem where every thread would essentially burn a CPU core busy-waiting, when it didn't need to. It's believed that this excess CPU usage might contribute to packet loss and poor performance. Non-blocking sockets were a necessity with the original single- thread process model of iperf3, in order to allow for concurrency between different test streams. With multiple threads, this is no longer necesary (it's perfectly fine for a thread to block on I/O, as it only services a single test stream and won't affect any others). Problem pointed out by @bltierney. Code review by @swlars. Fixes IPERF-177. --- src/iperf_client_api.c | 13 ------------- src/iperf_server_api.c | 11 ----------- src/net.c | 5 ++++- 3 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index f0c4a5894..f609cc40c 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -662,12 +662,6 @@ iperf_run_client(struct iperf_test * test) goto cleanup_and_fail; } - // Set non-blocking for non-UDP tests - if (test->protocol->id != Pudp) { - SLIST_FOREACH(sp, &test->streams, streams) { - setnonblocking(sp->socket, 1); - } - } } /* Run the timers. */ @@ -706,13 +700,6 @@ iperf_run_client(struct iperf_test * test) iperf_printf(test, "Sender threads stopped\n"); } - // Unset non-blocking for non-UDP tests - if (test->protocol->id != Pudp) { - SLIST_FOREACH(sp, &test->streams, streams) { - setnonblocking(sp->socket, 0); - } - } - /* Yes, done! Send TEST_END. */ test->done = 1; cpu_util(test->cpu_util); diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index f36eaa367..21fcc2d7a 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -757,17 +757,6 @@ iperf_run_server(struct iperf_test *test) if (s > test->max_fd) test->max_fd = s; - /* - * If the protocol isn't UDP, or even if it is but - * we're the receiver, set nonblocking sockets. - * We need this to allow a server receiver to - * maintain interactivity with the control channel. - */ - if (test->protocol->id != Pudp || - !sp->sender) { - setnonblocking(s, 1); - } - if (test->on_new_stream) test->on_new_stream(sp); diff --git a/src/net.c b/src/net.c index b80fb64aa..c82caff1b 100644 --- a/src/net.c +++ b/src/net.c @@ -1,5 +1,5 @@ /* - * iperf, Copyright (c) 2014-2019, The Regents of the University of + * iperf, Copyright (c) 2014-2023, The Regents of the University of * California, through Lawrence Berkeley National Laboratory (subject * to receipt of any required approvals from the U.S. Dept. of * Energy). All rights reserved. @@ -405,6 +405,7 @@ Nread(int fd, char *buf, size_t count, int prot) while (nleft > 0) { r = read(fd, buf, nleft); if (r < 0) { + /* XXX EWOULDBLOCK can't happen without non-blocking sockets */ if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) break; else @@ -469,6 +470,7 @@ Nwrite(int fd, const char *buf, size_t count, int prot) case EINTR: case EAGAIN: #if (EAGAIN != EWOULDBLOCK) + /* XXX EWOULDBLOCK can't happen without non-blocking sockets */ case EWOULDBLOCK: #endif return count - nleft; @@ -539,6 +541,7 @@ Nsendfile(int fromfd, int tofd, const char *buf, size_t count) case EINTR: case EAGAIN: #if (EAGAIN != EWOULDBLOCK) + /* XXX EWOULDBLOCK can't happen without non-blocking sockets */ case EWOULDBLOCK: #endif if (count == nleft) From 77685c14524f513bc51c1d97abffc1ae4a18963b Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 21 Apr 2023 14:56:34 -0700 Subject: [PATCH 043/286] Update description of -P option for multithreading. --- src/iperf3.1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/iperf3.1 b/src/iperf3.1 index 18ccfefc5..df6540270 100644 --- a/src/iperf3.1 +++ b/src/iperf3.1 @@ -1,4 +1,4 @@ -.TH IPERF3 1 "September 2022" ESnet "User Manuals" +.TH IPERF3 1 "April 2023" ESnet "User Manuals" .SH NAME iperf3 \- perform network throughput tests .SH SYNOPSIS @@ -326,7 +326,9 @@ bind data streams to a specific client port (for TCP and UDP only, default is to use an ephemeral port) .TP .BR -P ", " --parallel " \fIn\fR" -number of parallel client streams to run. Note that iperf3 is single threaded, so if you are CPU bound, this will not yield higher throughput. +number of parallel client streams to run. iperf3 will spawn off a +separate thread for each test stream. Using multiple streams may +result in higher throughput than a single stream. .TP .BR -R ", " --reverse reverse the direction of a test, so that the server sends data to the From 2e80758ad49dfaeae3970d09227e3b28e412f06c Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 27 Apr 2023 18:28:06 -0700 Subject: [PATCH 044/286] Fix a bug related to idle timeouts on the test receiver. iperf3 implements a limit intended to allow the receiving side of a test to abort a test in progress if no data has been received for a certain length of time. This time limit is configured with the --rcv-timeout command-line option. The original implementation didn't work correctly with multi-threading because the code that implemented the limit had no visibility into the network I/O activity handled by other threads. The code has been restructured to make this work correctly, by watching the total number of blocks transferred in the test and using that to determine progress (or lack thereof). A minor change was also made to allow worker threads to be cancelled, even if they were blocked waiting for network I/O. While necessary for the testing protocol for this bug, this change might also improve the correctness of thread handling around the end of tests. Fixes IPERF-178. --- src/iperf_client_api.c | 51 ++++++++++++++++++++++++++++++------- src/iperf_server_api.c | 57 ++++++++++++++++++++++++++++++++---------- 2 files changed, 86 insertions(+), 22 deletions(-) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index f609cc40c..bb103dffb 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -56,6 +56,10 @@ iperf_client_worker_run(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; + /* Allow this thread to be cancelled even if it's in a syscall */ + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + while (! (test->done) && ! (sp->done)) { if (sp->sender) { if (iperf_send_mt(sp) < 0) { @@ -536,6 +540,7 @@ iperf_run_client(struct iperf_test * test) struct iperf_time last_receive_time; struct iperf_time diff_time; struct timeval used_timeout; + iperf_size_t last_receive_blocks; int64_t t_usecs; int64_t timeout_us; int64_t rcv_timeout_us; @@ -580,6 +585,9 @@ iperf_run_client(struct iperf_test * test) else rcv_timeout_us = 0; + iperf_time_now(&last_receive_time); // Initialize last time something was received + last_receive_blocks = 0; + startup = 1; while (test->state != IPERF_DONE) { memcpy(&read_set, &test->read_set, sizeof(fd_set)); @@ -595,6 +603,10 @@ iperf_run_client(struct iperf_test * test) used_timeout.tv_usec = timeout->tv_usec; timeout_us = (timeout->tv_sec * SEC_TO_US) + timeout->tv_usec; } + /* Cap the maximum select timeout at 1 second */ + if (timeout_us > SEC_TO_US) { + timeout_us = SEC_TO_US; + } if (timeout_us < 0 || timeout_us > rcv_timeout_us) { used_timeout.tv_sec = test->settings->rcv_timeout.secs; used_timeout.tv_usec = test->settings->rcv_timeout.usecs; @@ -607,23 +619,32 @@ iperf_run_client(struct iperf_test * test) i_errno = IESELECT; goto cleanup_and_fail; } else if (result == 0 && test->state == TEST_RUNNING && rcv_timeout_us > 0) { - // If nothing was received in non-reverse running state then probably something got stack - - // either client, server or network, and test should be terminated. + /* + * If nothing was received in non-reverse running state + * then probably something got stuck - either client, + * server or network, and test should be terminated./ + */ iperf_time_now(&now); if (iperf_time_diff(&now, &last_receive_time, &diff_time) == 0) { t_usecs = iperf_time_in_usecs(&diff_time); if (t_usecs > rcv_timeout_us) { - i_errno = IENOMSG; - goto cleanup_and_fail; + /* Idle timeout if no new blocks received */ + if (test->blocks_received == last_receive_blocks) { + i_errno = IENOMSG; + goto cleanup_and_fail; + } } } } + /* See if the test is making progress */ + if (test->blocks_received > last_receive_blocks) { + last_receive_blocks = test->blocks_received; + last_receive_time = now; + } + if (result > 0) { - if (rcv_timeout_us > 0) { - iperf_time_now(&last_receive_time); - } if (FD_ISSET(test->ctrl_sck, &read_set)) { if (iperf_handle_message_client(test) < 0) { goto cleanup_and_fail; @@ -687,6 +708,10 @@ iperf_run_client(struct iperf_test * test) SLIST_FOREACH(sp, &test->streams, streams) { if (sp->sender) { sp->done = 1; + if (pthread_cancel(sp->thr) != 0) { + i_errno = IEPTHREADCANCEL; + goto cleanup_and_fail; + } if (pthread_join(sp->thr, NULL) != 0) { i_errno = IEPTHREADJOIN; goto cleanup_and_fail; @@ -714,6 +739,10 @@ iperf_run_client(struct iperf_test * test) SLIST_FOREACH(sp, &test->streams, streams) { if (!sp->sender) { sp->done = 1; + if (pthread_cancel(sp->thr) != 0) { + i_errno = IEPTHREADCANCEL; + goto cleanup_and_fail; + } if (pthread_join(sp->thr, NULL) != 0) { i_errno = IEPTHREADJOIN; goto cleanup_and_fail; @@ -744,9 +773,13 @@ iperf_run_client(struct iperf_test * test) i_errno_save = i_errno; SLIST_FOREACH(sp, &test->streams, streams) { sp->done = 1; - if (pthread_join(sp->thr, NULL) != 0) { + if (pthread_cancel(sp->thr) != 0) { i_errno = IEPTHREADCANCEL; - iperf_err(test, "cleanup_and_fail - %s", iperf_strerror(i_errno)); + iperf_err(test, "cleanup_and_fail in cancel - %s", iperf_strerror(i_errno)); + } + if (pthread_join(sp->thr, NULL) != 0) { + i_errno = IEPTHREADJOIN; + iperf_err(test, "cleanup_and_fail in join - %s", iperf_strerror(i_errno)); } if (test->debug >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d stopped\n", sp->socket); diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 21fcc2d7a..ea9864f4a 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -71,6 +71,10 @@ iperf_server_worker_run(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; + /* Allow this thread to be cancelled even if it's in a syscall */ + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + while (! (test->done) && ! (sp->done)) { if (sp->sender) { if (iperf_send_mt(sp) < 0) { @@ -415,9 +419,13 @@ cleanup_server(struct iperf_test *test) int i_errno_save = i_errno; SLIST_FOREACH(sp, &test->streams, streams) { sp->done = 1; + if (pthread_cancel(sp->thr) != 0) { + i_errno = IEPTHREADCANCEL; + iperf_err(test, "cleanup_server in cancel - %s", iperf_strerror(i_errno)); + } if (pthread_join(sp->thr, NULL) != 0) { i_errno = IEPTHREADJOIN; - iperf_err(test, "cleanup_server - %s", iperf_strerror(i_errno)); + iperf_err(test, "cleanup_server in join - %s", iperf_strerror(i_errno)); } if (test->debug >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d stopped\n", sp->socket); @@ -493,6 +501,7 @@ iperf_run_server(struct iperf_test *test) struct iperf_time diff_time; struct timeval* timeout; struct timeval used_timeout; + iperf_size_t last_receive_blocks; int flag; int64_t t_usecs; int64_t timeout_us; @@ -531,6 +540,7 @@ iperf_run_server(struct iperf_test *test) } iperf_time_now(&last_receive_time); // Initialize last time something was received + last_receive_blocks = 0; test->state = IPERF_START; send_streams_accepted = 0; @@ -566,6 +576,10 @@ iperf_run_server(struct iperf_test *test) used_timeout.tv_usec = timeout->tv_usec; timeout_us = (timeout->tv_sec * SEC_TO_US) + timeout->tv_usec; } + /* Cap the maximum select timeout at 1 second */ + if (timeout_us > SEC_TO_US) { + timeout_us = SEC_TO_US; + } if (timeout_us < 0 || timeout_us > rcv_timeout_us) { used_timeout.tv_sec = test->settings->rcv_timeout.secs; used_timeout.tv_usec = test->settings->rcv_timeout.usecs; @@ -579,13 +593,18 @@ iperf_run_server(struct iperf_test *test) i_errno = IESELECT; return -1; } else if (result == 0) { - // If nothing was received during the specified time (per state) - // then probably something got stack either at the client, server or network, - // and Test should be forced to end. + /* + * If nothing was received during the specified time (per + * state) then probably something got stuck either at the + * client, server or network, and test should be forced to + * end. + */ iperf_time_now(&now); t_usecs = 0; if (iperf_time_diff(&now, &last_receive_time, &diff_time) == 0) { t_usecs = iperf_time_in_usecs(&diff_time); + + /* We're in the state where we're still accepting connections */ if (test->state == IPERF_START) { if (test->settings->idle_timeout > 0 && t_usecs >= test->settings->idle_timeout * SEC_TO_US) { test->server_forced_idle_restarts_count += 1; @@ -603,21 +622,33 @@ iperf_run_server(struct iperf_test *test) return 2; } } + + /* + * Running a test. If we're receiving, be sure we're making + * progress (sender hasn't died/crashed). + */ else if (test->mode != SENDER && t_usecs > rcv_timeout_us) { - test->server_forced_no_msg_restarts_count += 1; - i_errno = IENOMSG; - if (iperf_get_verbose(test)) - iperf_err(test, "Server restart (#%d) during active test due to idle timeout for receiving data", - test->server_forced_no_msg_restarts_count); - cleanup_server(test); - return -1; + /* Idle timeout if no new blocks received */ + if (test->blocks_received == last_receive_blocks) { + test->server_forced_no_msg_restarts_count += 1; + i_errno = IENOMSG; + if (iperf_get_verbose(test)) + iperf_err(test, "Server restart (#%d) during active test due to idle timeout for receiving data", + test->server_forced_no_msg_restarts_count); + cleanup_server(test); + return -1; + } } - } } + /* See if the test is making progress */ + if (test->blocks_received > last_receive_blocks) { + last_receive_blocks = test->blocks_received; + last_receive_time = now; + } + if (result > 0) { - iperf_time_now(&last_receive_time); if (FD_ISSET(test->listener, &read_set)) { if (test->state != CREATE_STREAMS) { if (iperf_accept(test) < 0) { From a40c9b3ec53a3e2c69849db276503d8735defb5d Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 28 Apr 2023 10:23:12 -0700 Subject: [PATCH 045/286] Make thread shutdown more tolerant. We now handle the case where the worker threads exited on their own accord before the main thread had a chance to cancel them. While here, tweaked some of the error messages. Fixes IPERF-179. --- src/iperf_client_api.c | 41 ++++++++++++++++++++++++++++++----------- src/iperf_server_api.c | 15 ++++++++++----- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index bb103dffb..dd824a721 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -704,16 +704,23 @@ iperf_run_client(struct iperf_test * test) (test->settings->blocks != 0 && (test->blocks_sent >= test->settings->blocks || test->blocks_received >= test->settings->blocks)))) { - /* Cancel sender threads */ + /* Cancel outstanding sender threads */ SLIST_FOREACH(sp, &test->streams, streams) { if (sp->sender) { + int rc; sp->done = 1; - if (pthread_cancel(sp->thr) != 0) { + rc = pthread_cancel(sp->thr); + if (rc != 0 && rc != ESRCH) { i_errno = IEPTHREADCANCEL; + errno = rc; + iperf_err(test, "sender cancel in pthread_cancel - %s", iperf_strerror(i_errno)); goto cleanup_and_fail; } - if (pthread_join(sp->thr, NULL) != 0) { + rc = pthread_join(sp->thr, NULL); + if (rc != 0 && rc != ESRCH) { i_errno = IEPTHREADJOIN; + errno = rc; + iperf_err(test, "sender cancel in pthread_join - %s", iperf_strerror(i_errno)); goto cleanup_and_fail; } if (test->debug_level >= DEBUG_LEVEL_INFO) { @@ -735,16 +742,23 @@ iperf_run_client(struct iperf_test * test) } } - /* Cancel receiver threads */ + /* Cancel outstanding receiver threads */ SLIST_FOREACH(sp, &test->streams, streams) { if (!sp->sender) { + int rc; sp->done = 1; - if (pthread_cancel(sp->thr) != 0) { + rc = pthread_cancel(sp->thr); + if (rc != 0 && rc != ESRCH) { i_errno = IEPTHREADCANCEL; + errno = rc; + iperf_err(test, "receiver cancel in pthread_cancel - %s", iperf_strerror(i_errno)); goto cleanup_and_fail; } - if (pthread_join(sp->thr, NULL) != 0) { + rc = pthread_join(sp->thr, NULL); + if (rc != 0 && rc != ESRCH) { i_errno = IEPTHREADJOIN; + errno = rc; + iperf_err(test, "receiver cancel in pthread_join - %s", iperf_strerror(i_errno)); goto cleanup_and_fail; } if (test->debug_level >= DEBUG_LEVEL_INFO) { @@ -769,17 +783,22 @@ iperf_run_client(struct iperf_test * test) return 0; cleanup_and_fail: - /* Cancel all threads */ + /* Cancel all outstanding threads */ i_errno_save = i_errno; SLIST_FOREACH(sp, &test->streams, streams) { sp->done = 1; - if (pthread_cancel(sp->thr) != 0) { + int rc; + rc = pthread_cancel(sp->thr); + if (rc != 0 && rc != ESRCH) { i_errno = IEPTHREADCANCEL; - iperf_err(test, "cleanup_and_fail in cancel - %s", iperf_strerror(i_errno)); + errno = rc; + iperf_err(test, "cleanup_and_fail in pthread_cancel - %s", iperf_strerror(i_errno)); } - if (pthread_join(sp->thr, NULL) != 0) { + rc = pthread_join(sp->thr, NULL); + if (rc != 0 && rc != ESRCH) { i_errno = IEPTHREADJOIN; - iperf_err(test, "cleanup_and_fail in join - %s", iperf_strerror(i_errno)); + errno = rc; + iperf_err(test, "cleanup_and_fail in pthread_join - %s", iperf_strerror(i_errno)); } if (test->debug >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d stopped\n", sp->socket); diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index ea9864f4a..5f1d94756 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -415,17 +415,22 @@ cleanup_server(struct iperf_test *test) { struct iperf_stream *sp; - /* Cancel threads */ + /* Cancel outstanding threads */ int i_errno_save = i_errno; SLIST_FOREACH(sp, &test->streams, streams) { + int rc; sp->done = 1; - if (pthread_cancel(sp->thr) != 0) { + rc = pthread_cancel(sp->thr); + if (rc != 0 && rc != ESRCH) { i_errno = IEPTHREADCANCEL; - iperf_err(test, "cleanup_server in cancel - %s", iperf_strerror(i_errno)); + errno = rc; + iperf_err(test, "cleanup_server in pthread_cancel - %s", iperf_strerror(i_errno)); } - if (pthread_join(sp->thr, NULL) != 0) { + rc = pthread_join(sp->thr, NULL); + if (rc != 0 && rc != ESRCH) { i_errno = IEPTHREADJOIN; - iperf_err(test, "cleanup_server in join - %s", iperf_strerror(i_errno)); + errno = rc; + iperf_err(test, "cleanup_server in pthread_join - %s", iperf_strerror(i_errno)); } if (test->debug >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d stopped\n", sp->socket); From 83693ee974473628c355be41021af71fa968273c Mon Sep 17 00:00:00 2001 From: Sarah Larsen Date: Mon, 8 May 2023 14:37:06 -0700 Subject: [PATCH 046/286] Fix debug level --- src/iperf_client_api.c | 2 +- src/iperf_server_api.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index dd824a721..5b333694b 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -800,7 +800,7 @@ iperf_run_client(struct iperf_test * test) errno = rc; iperf_err(test, "cleanup_and_fail in pthread_join - %s", iperf_strerror(i_errno)); } - if (test->debug >= DEBUG_LEVEL_INFO) { + if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d stopped\n", sp->socket); } } diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 5f1d94756..77e9c355c 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -432,7 +432,7 @@ cleanup_server(struct iperf_test *test) errno = rc; iperf_err(test, "cleanup_server in pthread_join - %s", iperf_strerror(i_errno)); } - if (test->debug >= DEBUG_LEVEL_INFO) { + if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d stopped\n", sp->socket); } } From 83a92d682afb867423eb67ca4f66cb57572d9713 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 15 Sep 2023 16:08:33 -0700 Subject: [PATCH 047/286] Add accumulated release notes from prior iperf-mt public beta releases. --- RELNOTES.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/RELNOTES.md b/RELNOTES.md index 48130e984..94ede52df 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,6 +1,38 @@ iperf3 Release Notes ==================== +iperf-3.15-mt-beta1 +------------------- +Accumulated release notes from iperf-3.14 and earlier multithreaded +beta releases: + +* Notable user-visible changes + + * Multiple test streams started with -P/--parallel will now be + serviced by different threads. This allows iperf3 to take + advantage of multiple CPU cores on modern processors. + + * Remove some busy-waiting left over from the original + single-threaded implementation, which caused the multi-threaded + iperf3 to consume CPU resources for no particular reason, and + possible subsequent packet loss. + + * CentOS 7's default compiler is a version of GCC that is too old to + compile code using C11 atomic variables. A workaround has been + devised for 64-bit CentOS 7 systems, it is not clear whether this + approach will work on 32-bit CentOS 7 hosts, or other + similarly-vintage build environment. + + * Fix a bug related to idle timeouts, so that the --rcv-timeout + option works correctly. + + * Make shutdown of threads more tolerant in the face of various + orders of operations at the end of tests. + +* Developer-visible changes + + * iperf3 requires pthreads and C atomic variables to compile and run. + iperf-3.15 2023-09-14 --------------------- From 6cfec70000444c4819d3bf674217108429034e21 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 15 Sep 2023 16:09:40 -0700 Subject: [PATCH 048/286] Version update for mt branch. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 92b9ced52..b2c19ca1e 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.15],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.15-mt],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) From 418eef5518d3e6b2db92fd68799f386f1217c521 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 15 Sep 2023 16:10:56 -0700 Subject: [PATCH 049/286] Regen. --- configure | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 727ab3456..a539d16bc 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for iperf 3.15. +# Generated by GNU Autoconf 2.71 for iperf 3.15-mt. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.15' -PACKAGE_STRING='iperf 3.15' +PACKAGE_VERSION='3.15-mt' +PACKAGE_STRING='iperf 3.15-mt' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -1366,7 +1366,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures iperf 3.15 to adapt to many kinds of systems. +\`configure' configures iperf 3.15-mt to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1437,7 +1437,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.15:";; + short | recursive ) echo "Configuration of iperf 3.15-mt:";; esac cat <<\_ACEOF @@ -1555,7 +1555,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.15 +iperf configure 3.15-mt generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -1833,7 +1833,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.15, which was +It was created by iperf $as_me 3.15-mt, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3200,7 +3200,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.15' + VERSION='3.15-mt' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -15579,7 +15579,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.15, which was +This file was extended by iperf $as_me 3.15-mt, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -15648,7 +15648,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.15 +iperf config.status 3.15-mt configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" @@ -17350,3 +17350,4 @@ printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 fi + From 6497aad2d4600575ac168dde0cf7aa60b641a3a0 Mon Sep 17 00:00:00 2001 From: Sarah Larsen Date: Fri, 29 Sep 2023 19:04:00 +0000 Subject: [PATCH 050/286] Add dates to RELNOTES.md for iperf-3.15-mt-beta1. --- RELNOTES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RELNOTES.md b/RELNOTES.md index 94ede52df..0a26d5bb0 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,8 +1,8 @@ iperf3 Release Notes ==================== -iperf-3.15-mt-beta1 -------------------- +iperf-3.15-mt-beta1 2023-09-29 +------------------------------ Accumulated release notes from iperf-3.14 and earlier multithreaded beta releases: From 291c48e0e03d0065138a862677a1f16203b15fe4 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 8 Nov 2023 11:20:21 -0800 Subject: [PATCH 051/286] Regen. --- Makefile.in | 7 + configure | 1253 ++++++++++++++++++++++++++++++++++++----- examples/Makefile.in | 7 + src/Makefile.in | 7 + src/iperf_config.h.in | 13 + 5 files changed, 1144 insertions(+), 143 deletions(-) diff --git a/Makefile.in b/Makefile.in index 522ca305c..e38f265e8 100644 --- a/Makefile.in +++ b/Makefile.in @@ -90,6 +90,7 @@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_check_openssl.m4 \ + $(top_srcdir)/config/ax_pthread.m4 \ $(top_srcdir)/config/iperf_config_static_bin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ @@ -219,6 +220,7 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ @@ -273,6 +275,10 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -291,6 +297,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ diff --git a/configure b/configure index a539d16bc..76ab0cc69 100755 --- a/configure +++ b/configure @@ -666,6 +666,12 @@ OPENSSL_LDFLAGS OPENSSL_LIBS OPENSSL_INCLUDES PKG_CONFIG +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CXX +PTHREAD_CC +ax_pthread_config +CPP ENABLE_PROFILING_FALSE ENABLE_PROFILING_TRUE MAINT @@ -817,7 +823,8 @@ CFLAGS LDFLAGS LIBS CPPFLAGS -LT_SYS_LIBRARY_PATH' +LT_SYS_LIBRARY_PATH +CPP' # Initialize some variables set by options. @@ -1486,6 +1493,7 @@ Some influential environment variables: you have headers in a nonstandard directory LT_SYS_LIBRARY_PATH User-defined run-time library search path. + CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1750,6 +1758,44 @@ printf "%s\n" "$ac_res" >&6; } } # ac_fn_c_check_func +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including @@ -2647,6 +2693,119 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is +# needed for multi-threaded programs (defaults to the value of CC +# respectively CXX otherwise). (This is necessary on e.g. AIX to use the +# special cc_r/CC_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also to link with them as well. For example, you might link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threaded programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# CXX="$PTHREAD_CXX" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# Updated for Autoconf 2.68 by Daniel Richard G. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# Copyright (c) 2019 Marc Stevens +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 31 + +# This is what autoupdate's m4 run will expand. It fires the warning +# (with _au_warn_XXX), outputs it into the updated configure.ac (with +# m4_warn), and then outputs the replacement expansion. We need extra +# quotation around the m4_warn and dnl so they will be written +# unexpanded into the updated configure.ac. + + +# This is an auxiliary macro that is also run when +# autoupdate runs m4. It simply calls m4_warning, but +# we need a wrapper so that each warning is emitted only +# once. We break the quoting in m4_warning's argument in +# order to expand this macro's arguments, not AU_DEFUN's. + + +# Finally, this is the expansion that is picked up by +# autoconf, causing NAME to expand to NEW-CODE, plus +# (if SILENT is not "silent") a m4_warning telling the +# maintainer to run autoupdate. We don't issue MESSAGE +# from autoconf, because that's instructions for what +# to do *after* running autoupdate. + + # Also link binaries as static # Check whether --enable-static-bin was given. if test ${enable_static_bin+y} @@ -13707,108 +13866,6 @@ else fi -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_RANLIB+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -printf "%s\n" "$RANLIB" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_RANLIB+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -printf "%s\n" "$ac_ct_RANLIB" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s @@ -13821,7 +13878,6 @@ printf "%s\n" "no, using $LN_S" >&6; } fi - # Add -Wall if we are using GCC. if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -Wall" @@ -14126,60 +14182,972 @@ printf "%s\n" "#define const /**/" >>confdefs.h fi -# Check for poll.h (it's in POSIX so everyone should have it?) -ac_fn_c_check_header_compile "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" -if test "x$ac_cv_header_poll_h" = xyes +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" then : - printf "%s\n" "#define HAVE_POLL_H 1" >>confdefs.h +else $as_nop + # Broken: fails on valid input. +continue fi +rm -f conftest.err conftest.i conftest.$ac_ext - -# SCTP. Allow user to disable SCTP support with --without-sctp. -# Otherwise we try to find whatever support is required. -try_sctp=true - -# Check whether --with-sctp was given. -if test ${with_sctp+y} + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" then : - withval=$with_sctp; - case "$withval" in - y | ye | yes) - ;; - n | no) - try_sctp=false - ;; - *) - as_fn_error $? "Invalid --with-sctp value" "$LINENO" 5 - ;; - esac - + # Broken: success on invalid input. +continue else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext - try_sctp=true - - +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break fi + done + ac_cv_prog_CPP=$CPP -ac_fn_c_check_header_compile "$LINENO" "linux/tcp.h" "ac_cv_header_linux_tcp_h" "$ac_includes_default" -if test "x$ac_cv_header_linux_tcp_h" = xyes +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" then : - printf "%s\n" "#define HAVE_LINUX_TCP_H 1" >>confdefs.h +else $as_nop + # Broken: fails on valid input. +continue fi +rm -f conftest.err conftest.i conftest.$ac_ext - -# Check for SCTP support -if $try_sctp; then -ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_socket_h" = xyes + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" then : - printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h - + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break fi +rm -f conftest.err conftest.i conftest.$ac_ext - for ac_header in netinet/sctp.h +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + if test "x$PTHREAD_CC" != "x" +then : + CC="$PTHREAD_CC" +fi + if test "x$PTHREAD_CXX" != "x" +then : + CXX="$PTHREAD_CXX" +fi + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char pthread_join (); +int +main (void) +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} +fi +rm -rf conftest* + + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +printf %s "checking whether $CC is Clang... " >&6; } +if test ${ax_cv_PTHREAD_CLANG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 +then : + ax_cv_PTHREAD_CLANG=yes +fi +rm -rf conftest* + + fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +if test "x$GCC" = "xyes" +then : + ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" +fi + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +if test "x$ax_pthread_clang" = "xyes" +then : + ax_pthread_flags="-pthread,-lpthread -pthread" +fi + + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +if test "x$ax_pthread_check_macro" = "x--" +then : + ax_pthread_check_cond=0 +else $as_nop + ax_pthread_check_cond="!defined($ax_pthread_check_macro)" +fi + + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +printf %s "checking whether pthreads work without any flags... " >&6; } + ;; + + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } + ;; + + -*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ax_pthread_config+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" +fi +fi +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +printf "%s\n" "$ax_pthread_config" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + if test "x$ax_pthread_config" = "xno" +then : + continue +fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; } +int +main (void) +{ +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes" +then : + break +fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`printf "%s\n" "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + if test "x$ax_pthread_try" = "xunknown" +then : + break +fi + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_link="$ax_pthread_2step_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + if test "x$ax_pthread_try" = "x" +then : + ax_pthread_try=no +fi + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +printf %s "checking for joinable pthread attribute... " >&6; } +if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int attr = $ax_pthread_attr; return attr /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } + if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes" +then : + +printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h + + ax_pthread_joinable_attr_defined=yes + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +printf %s "checking whether more special flags are required for pthreads... " >&6; } +if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } + if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes" +then : + PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int i = PTHREAD_PRIO_INHERIT; + return i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_cv_PTHREAD_PRIO_INHERIT=yes +else $as_nop + ax_cv_PTHREAD_PRIO_INHERIT=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes" +then : + +printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + + ax_pthread_prio_inherit_defined=yes + +fi + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + case "x/$CC" in #( + x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : + #handle absolute path differently from PATH based program lookup + case "x$CC" in #( + x/*) : + + if as_fn_executable_p ${CC}_r +then : + PTHREAD_CC="${CC}_r" +fi + if test "x${CXX}" != "x" +then : + if as_fn_executable_p ${CXX}_r +then : + PTHREAD_CXX="${CXX}_r" +fi +fi + ;; #( + *) : + + for ac_prog in ${CC}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +printf "%s\n" "$PTHREAD_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + + if test "x${CXX}" != "x" +then : + for ac_prog in ${CXX}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PTHREAD_CXX"; then + ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX +if test -n "$PTHREAD_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 +printf "%s\n" "$PTHREAD_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PTHREAD_CXX" && break +done +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + +fi + + ;; +esac + ;; #( + *) : + ;; +esac + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + +printf "%s\n" "#define HAVE_PTHREAD 1" >>confdefs.h + +LIBS="$PTHREAD_LIBS $LIBS" +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" +CC="$PTHREAD_CC" +CXX="$PTHREAD_CXX" + + : +else + ax_pthread_ok=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Atomics +ac_fn_c_check_header_compile "$LINENO" "stdatomic.h" "ac_cv_header_stdatomic_h" "$ac_includes_default" +if test "x$ac_cv_header_stdatomic_h" = xyes +then : + printf "%s\n" "#define HAVE_STDATOMIC_H 1" >>confdefs.h + +fi + + +# Check for poll.h (it's in POSIX so everyone should have it?) +ac_fn_c_check_header_compile "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" +if test "x$ac_cv_header_poll_h" = xyes +then : + printf "%s\n" "#define HAVE_POLL_H 1" >>confdefs.h + +fi + + +# SCTP. Allow user to disable SCTP support with --without-sctp. +# Otherwise we try to find whatever support is required. +try_sctp=true + +# Check whether --with-sctp was given. +if test ${with_sctp+y} +then : + withval=$with_sctp; + case "$withval" in + y | ye | yes) + ;; + n | no) + try_sctp=false + ;; + *) + as_fn_error $? "Invalid --with-sctp value" "$LINENO" 5 + ;; + esac + +else $as_nop + + try_sctp=true + + +fi + + +ac_fn_c_check_header_compile "$LINENO" "linux/tcp.h" "ac_cv_header_linux_tcp_h" "$ac_includes_default" +if test "x$ac_cv_header_linux_tcp_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_TCP_H 1" >>confdefs.h + +fi + + +# Check for SCTP support +if $try_sctp; then +ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_socket_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h + +fi + + for ac_header in netinet/sctp.h do : ac_fn_c_check_header_compile "$LINENO" "netinet/sctp.h" "ac_cv_header_netinet_sctp_h" "#ifdef HAVE_SYS_SOCKET_H #include @@ -14351,7 +15319,7 @@ if test "x$with_openssl" = "xno"; then printf "%s\n" "$as_me: WARNING: Building without OpenSSL; disabling iperf_auth functionality. " >&2;} else # Check for OPENSSL support - havs_ssl=false + have_ssl=false found=false @@ -17350,4 +18318,3 @@ printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 fi - diff --git a/examples/Makefile.in b/examples/Makefile.in index 93898c070..6e1365b57 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -92,6 +92,7 @@ noinst_PROGRAMS = mic$(EXEEXT) mis$(EXEEXT) subdir = examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_check_openssl.m4 \ + $(top_srcdir)/config/ax_pthread.m4 \ $(top_srcdir)/config/iperf_config_static_bin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ @@ -191,6 +192,7 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ @@ -245,6 +247,10 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -263,6 +269,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ diff --git a/src/Makefile.in b/src/Makefile.in index 91c9b156e..e13e4edc5 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -103,6 +103,7 @@ TESTS = t_timer$(EXEEXT) t_units$(EXEEXT) t_uuid$(EXEEXT) \ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/ax_check_openssl.m4 \ + $(top_srcdir)/config/ax_pthread.m4 \ $(top_srcdir)/config/iperf_config_static_bin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ @@ -517,6 +518,7 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ @@ -571,6 +573,10 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -589,6 +595,7 @@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ diff --git a/src/iperf_config.h.in b/src/iperf_config.h.in index 883107901..bb8853ff4 100644 --- a/src/iperf_config.h.in +++ b/src/iperf_config.h.in @@ -48,6 +48,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + /* Define to 1 if you have the `sched_setaffinity' function. */ #undef HAVE_SCHED_SETAFFINITY @@ -69,6 +75,9 @@ /* OpenSSL Is Available */ #undef HAVE_SSL +/* Define to 1 if you have the header file. */ +#undef HAVE_STDATOMIC_H + /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H @@ -135,6 +144,10 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ From b3686c69f671336a19cff441f2127d1e1cb85d51 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 8 Nov 2023 13:26:02 -0800 Subject: [PATCH 052/286] Documentation cleanups and updates. Update to a sane version number. --- README.md | 20 -------------------- RELNOTES.md | 37 +++++++++++++++---------------------- configure.ac | 4 ++-- src/iperf3.1 | 2 +- 4 files changed, 18 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index f569d3a38..d23f00e28 100644 --- a/README.md +++ b/README.md @@ -115,26 +115,6 @@ The projects (as of mid-2021) are in active, but separate, development. The continuing iperf2 development project can be found at https://sourceforge.net/projects/iperf2/. -iperf3 contains a number of options and functions not present in -iperf2. In addition, some flags are changed from their iperf2 -counterparts: - - -C, --linux-congestion set congestion control algorithm (Linux only) - (-Z in iperf2) - --bidir bidirectional testing mode - (-d in iperf2) - -Some iperf2 options are not available in iperf3: - - -r, --tradeoff Do a bidirectional test individually - -T, --ttl time-to-live, for multicast (default 1) - -x, --reportexclude [CDMSV] exclude C(connection) D(data) M(multicast) - S(settings) V(server) reports - -y, --reportstyle C report as a Comma-Separated Values - -Also removed is the ability to set the options via environment -variables. - Known Issues ------------ diff --git a/RELNOTES.md b/RELNOTES.md index 0a26d5bb0..c8c628f0f 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,37 +1,30 @@ iperf3 Release Notes ==================== -iperf-3.15-mt-beta1 2023-09-29 ------------------------------- -Accumulated release notes from iperf-3.14 and earlier multithreaded -beta releases: +iperf-3.16-beta1 2023-XX-XX +--------------------------- * Notable user-visible changes * Multiple test streams started with -P/--parallel will now be serviced by different threads. This allows iperf3 to take - advantage of multiple CPU cores on modern processors. + advantage of multiple CPU cores on modern processors, and will + generally result in significant throughput increases (PR #1591). - * Remove some busy-waiting left over from the original - single-threaded implementation, which caused the multi-threaded - iperf3 to consume CPU resources for no particular reason, and - possible subsequent packet loss. - - * CentOS 7's default compiler is a version of GCC that is too old to - compile code using C11 atomic variables. A workaround has been - devised for 64-bit CentOS 7 systems, it is not clear whether this - approach will work on 32-bit CentOS 7 hosts, or other - similarly-vintage build environment. - - * Fix a bug related to idle timeouts, so that the --rcv-timeout - option works correctly. - - * Make shutdown of threads more tolerant in the face of various - orders of operations at the end of tests. + * OpenSSL 3 is now detected at build time. If OpenSSL 3 is found, + various older, deprecated, APIs will not be used. iperf3 will + continue to work with OpenSSL 1.1.1. OpenSSL is used for as a part + of the iperf3 authentication functionality (Issue #1300, PR #1589). + + * The authorized users file used by the authentication functionality + is now checked for accessibility much earlier during the program + startup, as opposed to being checked near the start of a + test (Issue #1583, PR # 1585). * Developer-visible changes - * iperf3 requires pthreads and C atomic variables to compile and run. + * BREAKING CHANGE: iperf3 now requires pthreads and C atomic variables + to compile and run. iperf-3.15 2023-09-14 --------------------- diff --git a/configure.ac b/configure.ac index b2c19ca1e..39a9c8b3d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -# iperf, Copyright (c) 2014-2022, The Regents of the University of +# iperf, Copyright (c) 2014-2023, The Regents of the University of # California, through Lawrence Berkeley National Laboratory (subject # to receipt of any required approvals from the U.S. Dept. of # Energy). All rights reserved. @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.15-mt],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.16-beta],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) diff --git a/src/iperf3.1 b/src/iperf3.1 index df6540270..344a762f4 100644 --- a/src/iperf3.1 +++ b/src/iperf3.1 @@ -1,4 +1,4 @@ -.TH IPERF3 1 "April 2023" ESnet "User Manuals" +.TH IPERF3 1 "November 2023" ESnet "User Manuals" .SH NAME iperf3 \- perform network throughput tests .SH SYNOPSIS From 4bea03ef274d9e834a99edf59941785b7ff69395 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 8 Nov 2023 13:26:55 -0800 Subject: [PATCH 053/286] Regen. --- configure | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 76ab0cc69..4bcfc1d08 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for iperf 3.15-mt. +# Generated by GNU Autoconf 2.71 for iperf 3.16-beta. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.15-mt' -PACKAGE_STRING='iperf 3.15-mt' +PACKAGE_VERSION='3.16-beta' +PACKAGE_STRING='iperf 3.16-beta' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -1373,7 +1373,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures iperf 3.15-mt to adapt to many kinds of systems. +\`configure' configures iperf 3.16-beta to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1444,7 +1444,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.15-mt:";; + short | recursive ) echo "Configuration of iperf 3.16-beta:";; esac cat <<\_ACEOF @@ -1563,7 +1563,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.15-mt +iperf configure 3.16-beta generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -1879,7 +1879,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.15-mt, which was +It was created by iperf $as_me 3.16-beta, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3359,7 +3359,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.15-mt' + VERSION='3.16-beta' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -16547,7 +16547,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.15-mt, which was +This file was extended by iperf $as_me 3.16-beta, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -16616,7 +16616,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.15-mt +iperf config.status 3.16-beta configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" From 2dc942a0d6d8634696cc97f010a0f6a1d6d79434 Mon Sep 17 00:00:00 2001 From: Lei Liu Date: Wed, 15 Nov 2023 18:26:39 +0800 Subject: [PATCH 054/286] update to support VxWorks --- src/iperf.h | 11 +++++++++++ src/iperf_api.c | 8 ++++++++ src/iperf_client_api.c | 12 ++++++++++++ src/iperf_udp.c | 1 - src/portable_endian.h | 2 ++ 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/iperf.h b/src/iperf.h index 7b270bd0f..707ca2229 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -67,6 +67,7 @@ #include "queue.h" #include "cjson.h" #include "iperf_time.h" +#include "portable_endian.h" #if defined(HAVE_SSL) #include @@ -93,6 +94,10 @@ typedef uint_fast64_t iperf_size_t; typedef atomic_uint_fast64_t atomic_iperf_size_t; #endif // __IPERF_API_H +#if (defined(__vxworks)) || (defined(__VXWORKS__)) +typedef unsigned int uint +#endif // __vxworks or __VXWORKS__ + struct iperf_interval_results { atomic_iperf_size_t bytes_transferred; /* bytes transferred in this interval */ @@ -453,9 +458,15 @@ struct iperf_test extern int gerror; /* error value from getaddrinfo(3), for use in internal error handling */ /* UDP "connect" message and reply (textual value for Wireshark, etc. readability - legacy was numeric) */ +#if BYTE_ORDER == BIG_ENDIAN +#define UDP_CONNECT_MSG 0x39383736 +#define UDP_CONNECT_REPLY 0x36373839 +#define LEGACY_UDP_CONNECT_REPLY 0xb168de3a +#else #define UDP_CONNECT_MSG 0x36373839 // "6789" - legacy value was 123456789 #define UDP_CONNECT_REPLY 0x39383736 // "9876" - legacy value was 987654321 #define LEGACY_UDP_CONNECT_REPLY 987654321 // Old servers may still reply with the legacy value +#endif /* In Reverse mode, maximum number of packets to wait for "accept" response - to handle out of order packets */ #define MAX_REVERSE_OUT_OF_ORDER_PACKETS 2 diff --git a/src/iperf_api.c b/src/iperf_api.c index eb234030c..105be3564 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -4710,7 +4710,15 @@ iperf_create_pidfile(struct iperf_test *test) if (pid > 0) { /* See if the process exists. */ +#if (defined(__vxworks)) || (defined(__VXWORKS__)) +#if (defined(_WRS_KERNEL)) && (defined(_WRS_CONFIG_LP64)) + if (kill((_Vx_TASK_ID)pid, 0) == 0) { +#else + if (kill(pid, 0) == 0) { +#endif // _WRS_KERNEL and _WRS_CONFIG_LP64 +#else if (kill(pid, 0) == 0) { +#endif // __vxworks or __VXWORKS__ /* * Make sure not to try to delete existing PID file by * scribbling over the pathname we'd use to refer to it. diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 5b333694b..7ad4c939b 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -614,7 +614,19 @@ iperf_run_client(struct iperf_test * test) timeout = &used_timeout; } +#if (defined(__vxworks)) || (defined(__VXWORKS__)) + if (timeout != NULL && timeout->tv_sec == 0 && timeout->tv_usec == 0) { + taskDelay (1); + } + + result = select(test->max_fd + 1, + &read_set, + (test->state == TEST_RUNNING && !test->reverse) ? &write_set : NULL, + NULL, + timeout); +#else result = select(test->max_fd + 1, &read_set, &write_set, NULL, timeout); +#endif // __vxworks or __VXWORKS__ if (result < 0 && errno != EINTR) { i_errno = IESELECT; goto cleanup_and_fail; diff --git a/src/iperf_udp.c b/src/iperf_udp.c index b7aa1ebdf..5f69ee366 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -47,7 +47,6 @@ #include "timer.h" #include "net.h" #include "cjson.h" -#include "portable_endian.h" #if defined(HAVE_INTTYPES_H) # include diff --git a/src/portable_endian.h b/src/portable_endian.h index c3c73ffd7..dbb678992 100644 --- a/src/portable_endian.h +++ b/src/portable_endian.h @@ -131,7 +131,9 @@ // the truth because we use the homebrew htonll, et al. implementations // that were originally the sole implementation of this functionality // in iperf 3.0. +#if (!defined(__vxworks)) && (!defined(__VXWORKS__)) # warning platform not supported +#endif # include #if BYTE_ORDER == BIG_ENDIAN #define HTONLL(n) (n) From eaada2b74d986808f572d10f5894367d4c433a8e Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 15 Nov 2023 11:18:05 -0800 Subject: [PATCH 055/286] Bump version numbers for iperf-3.16-beta1. --- RELNOTES.md | 11 ++++++----- configure.ac | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/RELNOTES.md b/RELNOTES.md index c8c628f0f..8a407fe71 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,7 +1,7 @@ iperf3 Release Notes ==================== -iperf-3.16-beta1 2023-XX-XX +iperf-3.16-beta1 2023-11-15 --------------------------- * Notable user-visible changes @@ -14,17 +14,18 @@ iperf-3.16-beta1 2023-XX-XX * OpenSSL 3 is now detected at build time. If OpenSSL 3 is found, various older, deprecated, APIs will not be used. iperf3 will continue to work with OpenSSL 1.1.1. OpenSSL is used for as a part - of the iperf3 authentication functionality (Issue #1300, PR #1589). + of the iperf3 authentication functionality (Issue #1300, PR + #1589). * The authorized users file used by the authentication functionality is now checked for accessibility much earlier during the program startup, as opposed to being checked near the start of a - test (Issue #1583, PR # 1585). + test (Issue #1583, PR #1585). * Developer-visible changes - * BREAKING CHANGE: iperf3 now requires pthreads and C atomic variables - to compile and run. + * BREAKING CHANGE: iperf3 now requires pthreads and C atomic + variables to compile and run. iperf-3.15 2023-09-14 --------------------- diff --git a/configure.ac b/configure.ac index 39a9c8b3d..43eae666a 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.16-beta],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.16-beta1],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) From 97c2e40dfb575f68d0f72d80ed64e5cd7605c93b Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 15 Nov 2023 11:18:49 -0800 Subject: [PATCH 056/286] Regen. --- configure | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 4bcfc1d08..38c2a9065 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for iperf 3.16-beta. +# Generated by GNU Autoconf 2.71 for iperf 3.16-beta1. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.16-beta' -PACKAGE_STRING='iperf 3.16-beta' +PACKAGE_VERSION='3.16-beta1' +PACKAGE_STRING='iperf 3.16-beta1' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -1373,7 +1373,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures iperf 3.16-beta to adapt to many kinds of systems. +\`configure' configures iperf 3.16-beta1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1444,7 +1444,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.16-beta:";; + short | recursive ) echo "Configuration of iperf 3.16-beta1:";; esac cat <<\_ACEOF @@ -1563,7 +1563,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.16-beta +iperf configure 3.16-beta1 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -1879,7 +1879,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.16-beta, which was +It was created by iperf $as_me 3.16-beta1, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3359,7 +3359,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.16-beta' + VERSION='3.16-beta1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -16547,7 +16547,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.16-beta, which was +This file was extended by iperf $as_me 3.16-beta1, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -16616,7 +16616,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.16-beta +iperf config.status 3.16-beta1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" From 0518055f7b9e31e73cb890876c123da856b16734 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 29 Nov 2023 11:45:57 -0800 Subject: [PATCH 057/286] Version number bumps for iperf-3.16. --- RELNOTES.md | 6 +++--- configure.ac | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/RELNOTES.md b/RELNOTES.md index 8a407fe71..79743a3f3 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,8 +1,8 @@ iperf3 Release Notes ==================== -iperf-3.16-beta1 2023-11-15 ---------------------------- +iperf-3.16 2023-11-30 +--------------------- * Notable user-visible changes @@ -13,7 +13,7 @@ iperf-3.16-beta1 2023-11-15 * OpenSSL 3 is now detected at build time. If OpenSSL 3 is found, various older, deprecated, APIs will not be used. iperf3 will - continue to work with OpenSSL 1.1.1. OpenSSL is used for as a part + continue to work with OpenSSL 1.1.1. OpenSSL is used as a part of the iperf3 authentication functionality (Issue #1300, PR #1589). diff --git a/configure.ac b/configure.ac index 43eae666a..2594b395e 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.16-beta1],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.16],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) From f9481e1cd35159929458513692e4a8f9fdd1bd6f Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 29 Nov 2023 11:46:13 -0800 Subject: [PATCH 058/286] Regen. --- configure | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 38c2a9065..9649f84d7 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for iperf 3.16-beta1. +# Generated by GNU Autoconf 2.71 for iperf 3.16. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.16-beta1' -PACKAGE_STRING='iperf 3.16-beta1' +PACKAGE_VERSION='3.16' +PACKAGE_STRING='iperf 3.16' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -1373,7 +1373,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures iperf 3.16-beta1 to adapt to many kinds of systems. +\`configure' configures iperf 3.16 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1444,7 +1444,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.16-beta1:";; + short | recursive ) echo "Configuration of iperf 3.16:";; esac cat <<\_ACEOF @@ -1563,7 +1563,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.16-beta1 +iperf configure 3.16 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -1879,7 +1879,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.16-beta1, which was +It was created by iperf $as_me 3.16, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3359,7 +3359,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.16-beta1' + VERSION='3.16' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -16547,7 +16547,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.16-beta1, which was +This file was extended by iperf $as_me 3.16, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -16616,7 +16616,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.16-beta1 +iperf config.status 3.16 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" From 4264d092b62cdea836a684546167cf4cca85ae1c Mon Sep 17 00:00:00 2001 From: kjander0 Date: Thu, 30 Nov 2023 20:48:42 +1000 Subject: [PATCH 059/286] Correct format specifier for printing int64_t. --- src/iperf_locale.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 838086e18..865732615 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -84,11 +84,11 @@ #if defined(HAVE_INTTYPES_H) # include #else -# ifndef PRIu64 +# ifndef PRId64 # if sizeof(long) == 8 -# define PRIu64 "lu" +# define PRId64 "ld" # else -# define PRIu64 "llu" +# define PRId64 "lld" # endif # endif #endif @@ -394,13 +394,13 @@ const char report_bw_retrans_cwnd_format[] = "[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %3u %ss %s\n"; const char report_bw_udp_format[] = -"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %" PRIu64 "/%" PRIu64 " (%.2g%%) %s\n"; +"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %" PRId64 "/%" PRId64 " (%.2g%%) %s\n"; const char report_bw_udp_format_no_omitted_error[] = -"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms Unknown/%" PRIu64 " %s\n"; +"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms Unknown/%" PRId64 " %s\n"; const char report_bw_udp_sender_format[] = -"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %s %" PRIu64 " %s\n"; +"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %s %" PRId64 " %s\n"; const char report_summary[] = "Test Complete. Summary Results:\n"; @@ -412,10 +412,10 @@ const char report_sum_bw_retrans_format[] = "[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %3d %s\n"; const char report_sum_bw_udp_format[] = -"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %" PRIu64 "/%" PRIu64 " (%.2g%%) %s\n"; +"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %" PRId64 "/%" PRId64 " (%.2g%%) %s\n"; const char report_sum_bw_udp_sender_format[] = -"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %s %" PRIu64 " %s\n"; +"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %s %" PRId64 " %s\n"; const char report_omitted[] = "(omitted)"; From a67fd6747c5ceb4e5b2e2ebecaa642541eb01027 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 1 Dec 2023 13:37:07 -0800 Subject: [PATCH 060/286] Update for iperf-3.16. --- docs/news.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/news.rst b/docs/news.rst index b0bcfacfe..167fe8cd5 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -1,6 +1,16 @@ iperf3 Project News =================== +2023-12-01: iperf-3.16 released +-------------------------------- +| URL: https://downloads.es.net/pub/iperf/iperf-3.16.tar.gz +| SHA256: +``cc740c6bbea104398cc3e466befc515a25896ec85e44a662d5f4a767b9cf713e`` + +iperf 3.16 uses multiple threads to serve parallel tests for improved +throughput on high-speed links. It also includes support for +OpenSSL 3. More details are provided in the release notes. + 2023-09-14: iperf-3.15 released -------------------------------- | URL: https://downloads.es.net/pub/iperf/iperf-3.15.tar.gz From 1511e9f85b548891ea53d4e378903344df1fd31e Mon Sep 17 00:00:00 2001 From: Jan Palus Date: Sun, 3 Dec 2023 12:14:05 +0100 Subject: [PATCH 061/286] Check and link libatomic if needed Some architectures without native support for 64-bit atomics need linking with libatomic. --- configure.ac | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 2594b395e..ad7eaf120 100644 --- a/configure.ac +++ b/configure.ac @@ -92,7 +92,19 @@ CXX="$PTHREAD_CXX" ]) # Atomics -AC_CHECK_HEADERS([stdatomic.h]) +AC_CHECK_HEADERS([stdatomic.h], + [AC_MSG_CHECKING([whether libatomic is required]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[atomic_uint_fast64_t i; i++;]])], + [AC_MSG_RESULT([no])], + [save_LIBS="$LIBS" + LIBS="$LIBS -latomic" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[atomic_uint_fast64_t i; i++;]])], + [AC_MSG_RESULT([yes])], + [AC_MSG_ERROR([failed to find working configuration with atomics])] + )] + )], + [] +) # Check for poll.h (it's in POSIX so everyone should have it?) AC_CHECK_HEADERS([poll.h]) From fd2b6d9771deebd1cf42623cfe3a33913b5f8011 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Tue, 5 Dec 2023 09:58:57 +0200 Subject: [PATCH 062/286] Fix --affinity help text --- src/iperf_locale.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 838086e18..642c65c9a 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -115,7 +115,8 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" " -I, --pidfile file write PID file\n" " -F, --file name xmit/recv the specified file\n" #if defined(HAVE_CPU_AFFINITY) - " -A, --affinity n/n,m set CPU affinity\n" + " -A, --affinity n[,m] set CPU affinity core number to n (the core the process will use)\n" + " (optional Client only m - the Server's core number for this test)\n" #endif /* HAVE_CPU_AFFINITY */ #if defined(HAVE_SO_BINDTODEVICE) " -B, --bind [%%] bind to the interface associated with the address \n" From 8224827cc258e4267fd84bea040f21e69889fe9f Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 6 Dec 2023 16:49:33 -0800 Subject: [PATCH 063/286] Version number bump post 3.16. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 2594b395e..097ab72a0 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.16],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.16+],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) From 9970208cef7d7bdf474bc04802fa8d8e10991b22 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 6 Dec 2023 16:50:03 -0800 Subject: [PATCH 064/286] Regen. --- configure | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 9649f84d7..6fb6db3cc 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for iperf 3.16. +# Generated by GNU Autoconf 2.71 for iperf 3.16+. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.16' -PACKAGE_STRING='iperf 3.16' +PACKAGE_VERSION='3.16+' +PACKAGE_STRING='iperf 3.16+' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -1373,7 +1373,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures iperf 3.16 to adapt to many kinds of systems. +\`configure' configures iperf 3.16+ to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1444,7 +1444,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.16:";; + short | recursive ) echo "Configuration of iperf 3.16+:";; esac cat <<\_ACEOF @@ -1563,7 +1563,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.16 +iperf configure 3.16+ generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -1879,7 +1879,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.16, which was +It was created by iperf $as_me 3.16+, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3359,7 +3359,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.16' + VERSION='3.16+' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -16547,7 +16547,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.16, which was +This file was extended by iperf $as_me 3.16+, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -16616,7 +16616,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.16 +iperf config.status 3.16+ configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" From f5c253e43c6b950de6f140c124b6d23e9a57e178 Mon Sep 17 00:00:00 2001 From: Maks Mishin Date: Thu, 14 Dec 2023 00:10:19 +0300 Subject: [PATCH 065/286] Add error handling for descriptor leak(CWE-403) --- src/iperf_server_api.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 77e9c355c..1781e5af8 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -137,6 +137,7 @@ int iperf_accept(struct iperf_test *test) { int s; + int ret = -1; signed char rbuf = ACCESS_DENIED; socklen_t len; struct sockaddr_storage addr; @@ -144,7 +145,7 @@ iperf_accept(struct iperf_test *test) len = sizeof(addr); if ((s = accept(test->listener, (struct sockaddr *) &addr, &len)) < 0) { i_errno = IEACCEPT; - return -1; + return ret; } if (test->ctrl_sck == -1) { @@ -154,7 +155,7 @@ iperf_accept(struct iperf_test *test) int flag = 1; if (setsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int))) { i_errno = IESETNODELAY; - return -1; + goto error_handling; } #if defined(HAVE_TCP_USER_TIMEOUT) @@ -162,7 +163,7 @@ iperf_accept(struct iperf_test *test) if ((opt = test->settings->snd_timeout)) { if (setsockopt(s, IPPROTO_TCP, TCP_USER_TIMEOUT, &opt, sizeof(opt)) < 0) { i_errno = IESETUSERTIMEOUT; - return -1; + goto error_handling; } } #endif /* HAVE_TCP_USER_TIMEOUT */ @@ -174,18 +175,18 @@ iperf_accept(struct iperf_test *test) * (i.e. timed out). */ i_errno = IERECVCOOKIE; - return -1; + goto error_handling; } - FD_SET(test->ctrl_sck, &test->read_set); - if (test->ctrl_sck > test->max_fd) test->max_fd = test->ctrl_sck; + FD_SET(test->ctrl_sck, &test->read_set); + if (test->ctrl_sck > test->max_fd) test->max_fd = test->ctrl_sck; - if (iperf_set_send_state(test, PARAM_EXCHANGE) != 0) - return -1; - if (iperf_exchange_parameters(test) < 0) - return -1; - if (test->server_affinity != -1) - if (iperf_setaffinity(test, test->server_affinity) != 0) - return -1; + if (iperf_set_send_state(test, PARAM_EXCHANGE) != 0) + goto error_handling; + if (iperf_exchange_parameters(test) < 0) + goto error_handling; + if (test->server_affinity != -1) + if (iperf_setaffinity(test, test->server_affinity) != 0) + goto error_handling; if (test->on_connect) test->on_connect(test); } else { @@ -204,8 +205,10 @@ iperf_accept(struct iperf_test *test) } close(s); } - return 0; + error_handling: + close(s); + return ret; } From b33373ee9c7ef340a4b514dd1b7bc1d0300973ab Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 14 Dec 2023 09:22:19 -0800 Subject: [PATCH 066/286] Remove Travis CI support as we won't be using it going forward. --- .travis.yml | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 67ba0829d..000000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: c -compiler: - - gcc - - clang -os: - - linux - - osx - - freebsd - -notifications: - slack: - secure: ImUmX7hcYotHWCDBfOcIvF6H7kkeGqiaUCy7SVPFtgPbz33ttpbRd94E7oxWVmZMLKb+i6+JCujTEWGwGBimzH+DjL0LLWs0ShzXZIUa1UzEPTc4hgV6VAxucYKFg2WrbXgOPWbulkMG1VZ6pX7GlAEGf0qyNqn44F7S2ay9m18= - -script: ./configure && make && make check From e07eb70dabff4f906ed44222d471a13a4cd25a77 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 14 Dec 2023 10:15:34 -0800 Subject: [PATCH 067/286] Regen. --- configure | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 6fb6db3cc..4c8a07a4f 100755 --- a/configure +++ b/configure @@ -15086,13 +15086,60 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Atomics -ac_fn_c_check_header_compile "$LINENO" "stdatomic.h" "ac_cv_header_stdatomic_h" "$ac_includes_default" + for ac_header in stdatomic.h +do : + ac_fn_c_check_header_compile "$LINENO" "stdatomic.h" "ac_cv_header_stdatomic_h" "$ac_includes_default" if test "x$ac_cv_header_stdatomic_h" = xyes then : printf "%s\n" "#define HAVE_STDATOMIC_H 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libatomic is required" >&5 +printf %s "checking whether libatomic is required... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +atomic_uint_fast64_t i; i++; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else $as_nop + save_LIBS="$LIBS" + LIBS="$LIBS -latomic" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +atomic_uint_fast64_t i; i++; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + as_fn_error $? "failed to find working configuration with atomics" "$LINENO" 5 fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi + +done # Check for poll.h (it's in POSIX so everyone should have it?) ac_fn_c_check_header_compile "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" From e4c4cc047ecbda3d05e8ef23525aaadc304211ba Mon Sep 17 00:00:00 2001 From: Christian Speich Date: Thu, 14 Dec 2023 19:29:48 +0100 Subject: [PATCH 068/286] Implement streaming json output (#1098) Currently when enabling json output, the results are only written once the test concludes. This is done to output one full json document containing all relevant informations. To allow status output during the run while using json as output, this patch adds a newline-delimited JSON output. In order to achive this multiple event objects are emitted. These are serialized as json and printed with a newline seperating them. Each event contains a event name and its data. The following events have been introduced: start, interval, end, error, server_output_text and server_output_json. The data contains the relevant portion of the normal JSON output. Co-authored-by: swlars <89053414+swlars@users.noreply.github.com> --- src/iperf.h | 1 + src/iperf3.1 | 7 +++- src/iperf_api.c | 92 +++++++++++++++++++++++++++++++++++++++++++++- src/iperf_api.h | 5 ++- src/iperf_locale.c | 1 + src/libiperf.3 | 1 + 6 files changed, 103 insertions(+), 4 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index 5bbd1dc2f..a5eea4237 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -344,6 +344,7 @@ struct iperf_test int bidirectional; /* --bidirectional */ int verbose; /* -V option - verbose mode */ int json_output; /* -J option - JSON output */ + int json_stream; /* --json-stream */ int zerocopy; /* -Z option - use sendfile */ int debug; /* -d option - enable debug */ enum debug_level debug_level; /* -d option option - level of debug messages to show */ diff --git a/src/iperf3.1 b/src/iperf3.1 index 344a762f4..a9ae6f66a 100644 --- a/src/iperf3.1 +++ b/src/iperf3.1 @@ -96,9 +96,11 @@ test by specifying the --get-server-output flag. Either the client or the server can produce its output in a JSON structure, useful for integration with other programs, by passing it the -J flag. -Because the contents of the JSON structure are only completely known +Normally the contents of the JSON structure are only competely known after the test has finished, no JSON output will be emitted until the end of the test. +By enabling line-delimited JSON multiple objects will be emitted to +provide a real-time parsable JSON output. .PP iperf3 has a (overly) large set of command-line options that can be used to set the parameters of a test. @@ -157,6 +159,9 @@ give more detailed output .BR -J ", " --json " " output in JSON format .TP +.BR --json-stream " " +output in line-delimited JSON format +.TP .BR --logfile " \fIfile\fR" send output to a log file. .TP diff --git a/src/iperf_api.c b/src/iperf_api.c index 105be3564..dd0abe814 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -102,6 +102,7 @@ static int diskfile_recv(struct iperf_stream *sp); static int JSON_write(int fd, cJSON *json); static void print_interval_results(struct iperf_test *test, struct iperf_stream *sp, cJSON *json_interval_streams); static cJSON *JSON_read(int fd); +static int JSONStream_Output(struct iperf_test *test, const char* event_name, cJSON* obj); /*************************** Print usage functions ****************************/ @@ -326,6 +327,12 @@ iperf_get_test_json_output_string(struct iperf_test *ipt) return ipt->json_output_string; } +int +iperf_get_test_json_stream(struct iperf_test *ipt) +{ + return ipt->json_stream; +} + int iperf_get_test_zerocopy(struct iperf_test *ipt) { @@ -682,6 +689,12 @@ iperf_set_test_json_output(struct iperf_test *ipt, int json_output) ipt->json_output = json_output; } +void +iperf_set_test_json_stream(struct iperf_test *ipt, int json_stream) +{ + ipt->json_stream = json_stream; +} + int iperf_has_zerocopy( void ) { @@ -892,8 +905,12 @@ iperf_on_test_start(struct iperf_test *test) iperf_printf(test, test_start_time, test->protocol->name, test->num_streams, test->settings->blksize, test->omit, test->duration, test->settings->tos); } } + if (test->json_stream) { + JSONStream_Output(test, "start", test->json_start); + } } + /* This converts an IPv6 string address from IPv4-mapped format into regular ** old IPv4 format, which is easier on the eyes of network veterans. ** @@ -1058,6 +1075,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) {"one-off", no_argument, NULL, '1'}, {"verbose", no_argument, NULL, 'V'}, {"json", no_argument, NULL, 'J'}, + {"json-stream", no_argument, NULL, OPT_JSON_STREAM}, {"version", no_argument, NULL, 'v'}, {"server", no_argument, NULL, 's'}, {"client", required_argument, NULL, 'c'}, @@ -1207,6 +1225,10 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) case 'J': test->json_output = 1; break; + case OPT_JSON_STREAM: + test->json_output = 1; + test->json_stream = 1; + break; case 'v': printf("%s (cJSON %s)\n%s\n%s\n", version, cJSON_Version(), get_system_info(), get_optional_features()); @@ -2736,6 +2758,29 @@ JSON_read(int fd) return json; } +/*************************************************************/ +/** + * JSONStream_Output - outputs an obj as event without distrubing it + */ + +static int +JSONStream_Output(struct iperf_test * test, const char * event_name, cJSON * obj) +{ + cJSON *event = cJSON_CreateObject(); + if (!event) + return -1; + cJSON_AddStringToObject(event, "event", event_name); + cJSON_AddItemReferenceToObject(event, "data", obj); + char *str = cJSON_PrintUnformatted(event); + if (str == NULL) + return -1; + fprintf(test->outfile, "%s\n", str); + iflush(test); + cJSON_free(str); + cJSON_Delete(event); + return 0; +} + /*************************************************************/ /** * add_to_interval_list -- adds new interval to the interval_list @@ -3400,6 +3445,7 @@ iperf_print_intermediate(struct iperf_test *test) int lower_mode, upper_mode; int current_mode; + int discard_json; /* * Due to timing oddities, there can be cases, especially on the @@ -3445,11 +3491,20 @@ iperf_print_intermediate(struct iperf_test *test) return; } + /* + * When we use streamed json, we don't actually need to keep the interval + * results around unless we're the server and the client requested the server output. + * + * This avoids unneeded memory build up for long sessions. + */ + discard_json = test->json_stream == 1 && !(test->role == 's' && test->get_server_output); + if (test->json_output) { json_interval = cJSON_CreateObject(); if (json_interval == NULL) return; - cJSON_AddItemToArray(test->json_intervals, json_interval); + if (!discard_json) + cJSON_AddItemToArray(test->json_intervals, json_interval); json_interval_streams = cJSON_CreateArray(); if (json_interval_streams == NULL) return; @@ -3600,6 +3655,11 @@ iperf_print_intermediate(struct iperf_test *test) } } } + + if (test->json_stream) + JSONStream_Output(test, "interval", json_interval); + if (discard_json) + cJSON_Delete(json_interval); } /** @@ -4830,7 +4890,35 @@ iperf_json_finish(struct iperf_test *test) cJSON_Delete(test->json_top); test->json_top = NULL; } - test->json_start = test->json_connected = test->json_intervals = test->json_server_output = test->json_end = NULL; + // Get ASCII rendering of JSON structure. Then make our + // own copy of it and return the storage that cJSON allocated + // on our behalf. We keep our own copy around. + char *str = cJSON_Print(test->json_top); + if (str == NULL) + return -1; + test->json_output_string = strdup(str); + cJSON_free(str); + if (test->json_output_string == NULL) + return -1; + if (test->json_stream) { + cJSON *error = cJSON_GetObjectItem(test->json_top, "error"); + if (error) { + JSONStream_Output(test, "error", error); + } + if (test->json_server_output) { + JSONStream_Output(test, "server_output_json", test->json_server_output); + } + if (test->server_output_text) { + JSONStream_Output(test, "server_output_text", cJSON_CreateString(test->server_output_text)); + } + JSONStream_Output(test, "end", test->json_end); + } + else { + fprintf(test->outfile, "%s\n", test->json_output_string); + iflush(test); + } + cJSON_Delete(test->json_top); + test->json_top = test->json_start = test->json_connected = test->json_intervals = test->json_server_output = test->json_end = NULL; return 0; } diff --git a/src/iperf_api.h b/src/iperf_api.h index 9e70d44f3..20f7cc55a 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -100,7 +100,8 @@ typedef atomic_uint_fast64_t atomic_iperf_size_t; #define OPT_IDLE_TIMEOUT 25 #define OPT_DONT_FRAGMENT 26 #define OPT_RCV_TIMEOUT 27 -#define OPT_SND_TIMEOUT 28 +#define OPT_JSON_STREAM 28 +#define OPT_SND_TIMEOUT 29 /* states */ #define TEST_START 1 @@ -151,6 +152,7 @@ char* iperf_get_test_template( struct iperf_test* ipt ); int iperf_get_test_protocol_id( struct iperf_test* ipt ); int iperf_get_test_json_output( struct iperf_test* ipt ); char* iperf_get_test_json_output_string ( struct iperf_test* ipt ); +int iperf_get_test_json_stream( struct iperf_test* ipt ); int iperf_get_test_zerocopy( struct iperf_test* ipt ); int iperf_get_test_get_server_output( struct iperf_test* ipt ); char iperf_get_test_unit_format(struct iperf_test *ipt); @@ -195,6 +197,7 @@ void iperf_set_test_server_hostname( struct iperf_test* ipt, const char* server_ void iperf_set_test_template( struct iperf_test *ipt, const char *tmp_template ); void iperf_set_test_reverse( struct iperf_test* ipt, int reverse ); void iperf_set_test_json_output( struct iperf_test* ipt, int json_output ); +void iperf_set_test_json_stream( struct iperf_test* ipt, int json_stream ); int iperf_has_zerocopy( void ); void iperf_set_test_zerocopy( struct iperf_test* ipt, int zerocopy ); void iperf_set_test_get_server_output( struct iperf_test* ipt, int get_server_output ); diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 838086e18..f8183e85f 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -126,6 +126,7 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" #endif /* HAVE_SO_BINDTODEVICE */ " -V, --verbose more detailed output\n" " -J, --json output in JSON format\n" + " --json-stream output in line-delimited JSON format\n" " --logfile f send output to a log file\n" " --forceflush force flushing output at every interval\n" " --timestamps<=format> emit a timestamp at the start of each output line\n" diff --git a/src/libiperf.3 b/src/libiperf.3 index 4b278e394..2edc95494 100644 --- a/src/libiperf.3 +++ b/src/libiperf.3 @@ -32,6 +32,7 @@ Setting test parameters: void iperf_set_test_blksize( struct iperf_test *t, int blksize ); void iperf_set_test_num_streams( struct iperf_test *t, int num_streams ); void iperf_set_test_json_output( struct iperf_test *t, int json_output ); + void iperf_set_test_json_stream( struct iperf_test *t, int json_stream ); int iperf_has_zerocopy( void ); void iperf_set_test_zerocopy( struct iperf_test* t, int zerocopy ); void iperf_set_test_tos( struct iperf_test* t, int tos ); From d4b2b318918259eadbf5aa09c86f1a1e3f54a724 Mon Sep 17 00:00:00 2001 From: dopheide-esnet Date: Thu, 8 Feb 2024 12:43:29 -0600 Subject: [PATCH 069/286] minor error message correction for openssl includes (#1649) * minor error message correction for openssl includes * update fix for config/ax_check_openssl.m4 --- config/ax_check_openssl.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ax_check_openssl.m4 b/config/ax_check_openssl.m4 index 28e48cbef..9e0e920c9 100644 --- a/config/ax_check_openssl.m4 +++ b/config/ax_check_openssl.m4 @@ -75,7 +75,7 @@ AC_DEFUN([AX_CHECK_OPENSSL], [ if ! $found; then OPENSSL_INCLUDES= for ssldir in $ssldirs; do - AC_MSG_CHECKING([for openssl/ssl.h in $ssldir]) + AC_MSG_CHECKING([for include/openssl/ssl.h in $ssldir]) if test -f "$ssldir/include/openssl/ssl.h"; then OPENSSL_INCLUDES="-I$ssldir/include" OPENSSL_LDFLAGS="-L$ssldir/lib" From 0e90ae51d44ed719712809d9e1454e0c6d7e6012 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 8 Feb 2024 10:45:34 -0800 Subject: [PATCH 070/286] Regen. --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 4c8a07a4f..f25986417 100755 --- a/configure +++ b/configure @@ -15513,8 +15513,8 @@ fi if ! $found; then OPENSSL_INCLUDES= for ssldir in $ssldirs; do - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openssl/ssl.h in $ssldir" >&5 -printf %s "checking for openssl/ssl.h in $ssldir... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for include/openssl/ssl.h in $ssldir" >&5 +printf %s "checking for include/openssl/ssl.h in $ssldir... " >&6; } if test -f "$ssldir/include/openssl/ssl.h"; then OPENSSL_INCLUDES="-I$ssldir/include" OPENSSL_LDFLAGS="-L$ssldir/lib" From d3e676cec1380cd41303651d886c89eb73c6db92 Mon Sep 17 00:00:00 2001 From: Sarah Larsen Date: Thu, 11 Jan 2024 18:24:47 +0000 Subject: [PATCH 071/286] Fix Issue #1632 fq-rate works in reverse --- src/iperf_tcp.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index ce6a5221b..184a1955e 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -126,6 +126,22 @@ iperf_tcp_accept(struct iperf_test * test) i_errno = IESTREAMCONNECT; return -1; } +#if defined(HAVE_SO_MAX_PACING_RATE) + /* If fq socket pacing is specified, enable it. */ + + if (test->settings->fqrate) { + /* Convert bits per second to bytes per second */ + unsigned int fqrate = test->settings->fqrate / 8; + if (fqrate > 0) { + if (test->debug) { + printf("Setting fair-queue socket pacing to %u\n", fqrate); + } + if (setsockopt(s, SOL_SOCKET, SO_MAX_PACING_RATE, &fqrate, sizeof(fqrate)) < 0) { + warning("Unable to set socket pacing"); + } + } + } +#endif /* HAVE_SO_MAX_PACING_RATE */ if (Nread(s, cookie, COOKIE_SIZE, Ptcp) < 0) { i_errno = IERECVCOOKIE; @@ -240,21 +256,6 @@ iperf_tcp_listen(struct iperf_test *test) return -1; } } -#if defined(HAVE_SO_MAX_PACING_RATE) - /* If fq socket pacing is specified, enable it. */ - if (test->settings->fqrate) { - /* Convert bits per second to bytes per second */ - unsigned int fqrate = test->settings->fqrate / 8; - if (fqrate > 0) { - if (test->debug) { - printf("Setting fair-queue socket pacing to %u\n", fqrate); - } - if (setsockopt(s, SOL_SOCKET, SO_MAX_PACING_RATE, &fqrate, sizeof(fqrate)) < 0) { - warning("Unable to set socket pacing"); - } - } - } -#endif /* HAVE_SO_MAX_PACING_RATE */ { unsigned int rate = test->settings->rate / 8; if (rate > 0) { From 2c3d6318ceb2eec92c22bf63e4014382e5cf31dc Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Tue, 6 Feb 2024 10:47:05 -0800 Subject: [PATCH 072/286] docs: Update docs to account for multi-threaded iperf3. --- docs/faq.rst | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/docs/faq.rst b/docs/faq.rst index 7b700269b..b203e2a8f 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -22,7 +22,14 @@ What is the history of iperf3, and what is the difference between iperf2 and ipe current development is focused is on using UDP for latency testing, as well as broad platform support. - As of this writing (2017), both iperf2 and iperf3 are being actively + In 2023, iperf3 was modified and restructured to support + multi-threading, so that it uses one thread per test stream. This + allows it to use multiple CPU cores during tests, which in turn + permit it to keep up with continually increasing network link and + path bandwidths across the backbones of ESnet and other network + providers. + + As of this writing (2024), both iperf2 and iperf3 are being actively (although independently) developed. We recommend being familiar with both tools, and use whichever tool’s features best match your needs. @@ -30,9 +37,22 @@ What is the history of iperf3, and what is the difference between iperf2 and ipe https://fasterdata.es.net/performance-testing/network-troubleshooting-tools/throughput-tool-comparision/ iperf3 parallel stream performance is much less than iperf2. Why? - iperf3 is single threaded, and iperf2 is multi-threaded. We - recommend using iperf2 for parallel streams. - If you want to use multiple iperf3 streams use the method described `here `_. + Versions of iperf3 before version 3.16 were all single threaded, and + iperf2 is multi-threaded. This could result in a performance gap + because iperf3 was only able to use one CPU core on a host, which + turned into a bottleneck when trying to do high bitrate tests + (faster than about 25 Gbps). + + Beginning with version 3.16, iperf3 is multi-threaded, which allows + it to take advantage of multiple CPU cores during a test (one thread + per stream). iperf3 has been observed to send and receive + approximately 160Gbps on a 200Gbps path in a test involving multiple + TCP flows, with little or no tuning. + + Prior to multi-threading support in iperf3, one might need to use + the method described `here + `_ + to achieve faster speeds. I’m trying to use iperf3 on Windows, but having trouble. What should I do? iperf3 is not officially supported on Windows, but iperf2 is. We From e004dc34efcbe6092750434f747e3d19a3b943dd Mon Sep 17 00:00:00 2001 From: GBA Date: Sat, 10 Feb 2024 03:12:04 +0800 Subject: [PATCH 073/286] Fix --rcv-timeout manual text (#1642) * Fix --rcv-timeout manual text Correct the default value in ms from `12000` to `120000`. Source of truth: https://github.com/esnet/iperf/blob/master/src/iperf_api.h#L71 * Fix --rcv-timeout manual text --- docs/invoking.rst | 2 +- src/iperf3.1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/invoking.rst b/docs/invoking.rst index 5b09463fa..7c91dea14 100644 --- a/docs/invoking.rst +++ b/docs/invoking.rst @@ -194,7 +194,7 @@ the executable. --rcv-timeout # set idle timeout for receiving data during active tests. The receiver will halt a test if no data is received from the sender - for this number of ms (default to 12000 ms, or 2 minutes). + for this number of ms (default to 120000 ms, or 2 minutes). --snd-timeout # set timeout for unacknowledged TCP data (on both test and con- diff --git a/src/iperf3.1 b/src/iperf3.1 index a9ae6f66a..2efd53dea 100644 --- a/src/iperf3.1 +++ b/src/iperf3.1 @@ -183,7 +183,7 @@ follow the \fB--timestamps\fR option with no whitespace intervening. .BR --rcv-timeout " \fI#\fR" set idle timeout for receiving data during active tests. The receiver will halt a test if no data is received from the sender for this -number of ms (default to 12000 ms, or 2 minutes). +number of ms (default to 120000 ms, or 2 minutes). .TP .BR --snd-timeout " \fI#\fR" set timeout for unacknowledged TCP data (on both test and control From c362e1a83996736d36cc46d0e97f8d58d5f9b891 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 23 Feb 2024 11:30:22 -0800 Subject: [PATCH 074/286] Assume we always have inttypes.h and stdint.h (both from C99). This eliminates some compile-time tests that didn't really work as desired and aren't easy to fix. Inspired by comments on PR #1636. --- examples/mic.c | 2 -- examples/mis.c | 2 -- src/cjson.c | 22 +--------------------- src/cjson.h | 2 -- src/iperf.h | 15 +-------------- src/iperf_api.c | 2 -- src/iperf_api.h | 2 -- src/iperf_locale.c | 12 +----------- src/iperf_server_api.c | 2 -- src/iperf_udp.c | 15 +-------------- src/main.c | 2 -- src/t_api.c | 2 -- src/t_auth.c | 2 -- src/t_timer.c | 2 -- src/t_units.c | 2 -- src/units.c | 2 -- 16 files changed, 4 insertions(+), 84 deletions(-) diff --git a/examples/mic.c b/examples/mic.c index 17fd7b2f9..6e2403f60 100644 --- a/examples/mic.c +++ b/examples/mic.c @@ -4,9 +4,7 @@ #include #include #include -#ifdef HAVE_STDINT_H #include -#endif #include diff --git a/examples/mis.c b/examples/mis.c index 8090c13d9..315b9e8ed 100644 --- a/examples/mis.c +++ b/examples/mis.c @@ -4,9 +4,7 @@ #include #include #include -#ifdef HAVE_STDINT_H #include -#endif #include diff --git a/src/cjson.c b/src/cjson.c index 02d8d6001..46495f4a6 100644 --- a/src/cjson.c +++ b/src/cjson.c @@ -45,9 +45,8 @@ #include #include #include -#ifdef HAVE_STDINT_H #include -#endif +#include #include #ifdef ENABLE_LOCALES @@ -90,25 +89,6 @@ #endif #endif -#if defined(HAVE_INTTYPES_H) -# include -#else -# ifndef PRIu64 -# if sizeof(long) == 8 -# define PRIu64 "lu" -# else -# define PRIu64 "llu" -# endif -# ifndef PRId64 -# if sizeof(long) == 8 -# define PRId64 "ld" -# else -# define PRId64 "lld" -# endif -# endif -# endif -#endif - typedef struct { const unsigned char *json; size_t position; diff --git a/src/cjson.h b/src/cjson.h index 52da40dc3..3aa83cba8 100644 --- a/src/cjson.h +++ b/src/cjson.h @@ -23,9 +23,7 @@ #ifndef cJSON__h #define cJSON__h -#ifdef HAVE_STDINT_H #include -#endif #ifdef __cplusplus extern "C" diff --git a/src/iperf.h b/src/iperf.h index a5eea4237..dc3c0d1df 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -31,9 +31,8 @@ #include #include -#ifdef HAVE_STDINT_H #include -#endif +#include #include #include #ifndef _GNU_SOURCE @@ -51,18 +50,6 @@ #include #endif /* HAVE_CPUSET_SETAFFINITY */ -#if defined(HAVE_INTTYPES_H) -# include -#else -# ifndef PRIu64 -# if sizeof(long) == 8 -# define PRIu64 "lu" -# else -# define PRIu64 "llu" -# endif -# endif -#endif - #include "timer.h" #include "queue.h" #include "cjson.h" diff --git a/src/iperf_api.c b/src/iperf_api.c index dd0abe814..1dcfaabf5 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -46,9 +46,7 @@ #include #include #include -#ifdef HAVE_STDINT_H #include -#endif #include #include #include diff --git a/src/iperf_api.h b/src/iperf_api.h index 20f7cc55a..d2bbdfe96 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -31,9 +31,7 @@ #include #include #include -#ifdef HAVE_STDINT_H #include -#endif #ifdef __cplusplus extern "C" { /* open extern "C" */ #endif diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 41d78cb5c..ae0f63a41 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -81,17 +81,7 @@ #include "version.h" -#if defined(HAVE_INTTYPES_H) -# include -#else -# ifndef PRId64 -# if sizeof(long) == 8 -# define PRId64 "ld" -# else -# define PRId64 "lld" -# endif -# endif -#endif +#include #ifdef __cplusplus extern "C" diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 77e9c355c..3bd20c62d 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -40,9 +40,7 @@ #include #include #include -#ifdef HAVE_STDINT_H #include -#endif #include #include #include diff --git a/src/iperf_udp.c b/src/iperf_udp.c index 5f69ee366..a603236df 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -34,9 +34,8 @@ #include #include #include -#ifdef HAVE_STDINT_H #include -#endif +#include #include #include @@ -48,18 +47,6 @@ #include "net.h" #include "cjson.h" -#if defined(HAVE_INTTYPES_H) -# include -#else -# ifndef PRIu64 -# if sizeof(long) == 8 -# define PRIu64 "lu" -# else -# define PRIu64 "llu" -# endif -# endif -#endif - /* iperf_udp_recv * * receives the data for UDP diff --git a/src/main.c b/src/main.c index b179f5bde..57d5f40e0 100644 --- a/src/main.c +++ b/src/main.c @@ -33,9 +33,7 @@ #include #include #include -#ifdef HAVE_STDINT_H #include -#endif #include #include #include diff --git a/src/t_api.c b/src/t_api.c index d822f559e..d3bfb7e20 100644 --- a/src/t_api.c +++ b/src/t_api.c @@ -27,9 +27,7 @@ #include -#ifdef HAVE_STDINT_H #include -#endif #include #include diff --git a/src/t_auth.c b/src/t_auth.c index 22c78ae1f..77c225531 100644 --- a/src/t_auth.c +++ b/src/t_auth.c @@ -27,9 +27,7 @@ #include "iperf_config.h" #include -#ifdef HAVE_STDINT_H #include -#endif #include #include diff --git a/src/t_timer.c b/src/t_timer.c index 8eec7d8f3..fb6eb19b7 100644 --- a/src/t_timer.c +++ b/src/t_timer.c @@ -26,9 +26,7 @@ */ #include "iperf_config.h" -#ifdef HAVE_STDINT_H #include -#endif #include #include #include diff --git a/src/t_units.c b/src/t_units.c index 73f21a9d8..13883aa54 100644 --- a/src/t_units.c +++ b/src/t_units.c @@ -25,9 +25,7 @@ * file for complete information. */ #include -#ifdef HAVE_STDINT_H #include -#endif #include #include diff --git a/src/units.c b/src/units.c index 7376a0b7f..f6b14bc5d 100644 --- a/src/units.c +++ b/src/units.c @@ -54,9 +54,7 @@ #include #include #include -#ifdef HAVE_STDINT_H #include -#endif #include #include #include From d7c021b62bbe9d615bcd4aa394290d4adbe2e8bb Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 14 Mar 2024 11:53:58 -0700 Subject: [PATCH 075/286] Properly reset the --fq-rate parameter on the server between tests. Without this change, an --fq-rate setting would persist on the server, which could adversely slow down future --reverse tests. This bug was exposed by PR #1643, which allows --fq-rate to work on the server. One annoying side-effect of this bug was that GitHub Actions scripts were timing out and throwing errors. Pet file copyright date while here. --- src/iperf_api.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 1dcfaabf5..4765d4e97 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1,5 +1,5 @@ /* - * iperf, Copyright (c) 2014-2022, The Regents of the University of + * iperf, Copyright (c) 2014-2024, The Regents of the University of * California, through Lawrence Berkeley National Laboratory (subject * to receipt of any required approvals from the U.S. Dept. of * Energy). All rights reserved. @@ -3252,6 +3252,7 @@ iperf_reset_test(struct iperf_test *test) test->settings->socket_bufsize = 0; test->settings->blksize = DEFAULT_TCP_BLKSIZE; test->settings->rate = 0; + test->settings->fqrate = 0; test->settings->burst = 0; test->settings->mss = 0; test->settings->tos = 0; From 60b0c18db0a84c331444ddc70619f9c4c3f66cc1 Mon Sep 17 00:00:00 2001 From: rabijl Date: Tue, 19 Mar 2024 19:39:28 +0200 Subject: [PATCH 076/286] iperf_api: memset entire malloc in the function iperf_new_test the bitrate_limit_intervals_traffic_bytes array was only memset for the size of the sizeof return type, instead of the entire array. --- src/iperf_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 4765d4e97..7887235ca 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2878,7 +2878,7 @@ iperf_new_test() i_errno = IENEWTEST; return NULL; } - memset(test->bitrate_limit_intervals_traffic_bytes, 0, sizeof(sizeof(iperf_size_t) * MAX_INTERVAL)); + memset(test->bitrate_limit_intervals_traffic_bytes, 0, sizeof(iperf_size_t) * MAX_INTERVAL); /* By default all output goes to stdout */ test->outfile = stdout; From 7b947051d5192388dfa8a18989692e7af4226c62 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 14 Mar 2024 14:06:40 -0700 Subject: [PATCH 077/286] Update copyright dates in selected places. --- LICENSE | 2 +- README.md | 2 +- configure.ac | 2 +- docs/conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 1adda218b..c7d76aeb6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -"iperf, Copyright (c) 2014-2023, The Regents of the University of California, +"iperf, Copyright (c) 2014-2024, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Dept. of Energy). All rights reserved." diff --git a/README.md b/README.md index d23f00e28..05a5708c3 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ responsibility for the content of these pages. Copyright --------- -iperf, Copyright (c) 2014-2023, The Regents of the University of +iperf, Copyright (c) 2014-2024, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Dept. of Energy). All rights reserved. diff --git a/configure.ac b/configure.ac index 192ab16cf..ae97228dd 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -# iperf, Copyright (c) 2014-2023, The Regents of the University of +# iperf, Copyright (c) 2014-2024, The Regents of the University of # California, through Lawrence Berkeley National Laboratory (subject # to receipt of any required approvals from the U.S. Dept. of # Energy). All rights reserved. diff --git a/docs/conf.py b/docs/conf.py index b03fcbda6..f2cf9dd7c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -45,7 +45,7 @@ # General information about the project. project = u'iperf3' -copyright = u'2014-2023, ESnet' +copyright = u'2014-2024, ESnet' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the From e06177ca0da3d2b90dee742e560fa95f1bee8cb2 Mon Sep 17 00:00:00 2001 From: Maks Mishin Date: Thu, 14 Dec 2023 22:40:55 +0300 Subject: [PATCH 078/286] Close the descriptor when forces exit --- src/iperf_tcp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index 184a1955e..9217e7fe6 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -145,6 +145,7 @@ iperf_tcp_accept(struct iperf_test * test) if (Nread(s, cookie, COOKIE_SIZE, Ptcp) < 0) { i_errno = IERECVCOOKIE; + close(s); return -1; } From 111212bca2eaab948cff11fafddcb097e7615f52 Mon Sep 17 00:00:00 2001 From: Maks Mishin Date: Thu, 14 Dec 2023 23:46:46 +0300 Subject: [PATCH 079/286] Fix memory leak with addrinfo --- src/net.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/net.c b/src/net.c index c82caff1b..632ae0319 100644 --- a/src/net.c +++ b/src/net.c @@ -145,6 +145,7 @@ create_socket(int domain, int proto, const char *local, const char *bind_dev, in if ((gerror = getaddrinfo(server, portstr, &hints, &server_res)) != 0) { if (local) freeaddrinfo(local_res); + freeaddrinfo(server_res); return -1; } From ed7d16c33edaaabca0fc1746dfc448a3a147174e Mon Sep 17 00:00:00 2001 From: Maks Mishin Date: Fri, 15 Dec 2023 00:13:48 +0300 Subject: [PATCH 080/286] Fix descriptor leak in some return paths --- src/iperf_tcp.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index 9217e7fe6..71c40a6ea 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -311,6 +311,7 @@ iperf_tcp_listen(struct iperf_test *test) if (listen(s, INT_MAX) < 0) { i_errno = IESTREAMLISTEN; + close(s); return -1; } @@ -331,6 +332,7 @@ iperf_tcp_listen(struct iperf_test *test) } if (test->settings->socket_bufsize && test->settings->socket_bufsize > sndbuf_actual) { i_errno = IESETBUF2; + close(s); return -1; } @@ -348,6 +350,7 @@ iperf_tcp_listen(struct iperf_test *test) } if (test->settings->socket_bufsize && test->settings->socket_bufsize > rcvbuf_actual) { i_errno = IESETBUF2; + close(s); return -1; } From cd183446f345978d7aff774d5c4822b7465ef2e1 Mon Sep 17 00:00:00 2001 From: TheRealDJ Date: Tue, 12 Mar 2024 16:16:49 -0400 Subject: [PATCH 081/286] Add stat reporting interval to JSON .start.test_start --- src/iperf_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 4765d4e97..a296780a1 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -892,7 +892,7 @@ void iperf_on_test_start(struct iperf_test *test) { if (test->json_output) { - cJSON_AddItemToObject(test->json_start, "test_start", iperf_json_printf("protocol: %s num_streams: %d blksize: %d omit: %d duration: %d bytes: %d blocks: %d reverse: %d tos: %d target_bitrate: %d bidir: %d fqrate: %d", test->protocol->name, (int64_t) test->num_streams, (int64_t) test->settings->blksize, (int64_t) test->omit, (int64_t) test->duration, (int64_t) test->settings->bytes, (int64_t) test->settings->blocks, test->reverse?(int64_t)1:(int64_t)0, (int64_t) test->settings->tos, (int64_t) test->settings->rate, (int64_t) test->bidirectional, (uint64_t) test->settings->fqrate)); + cJSON_AddItemToObject(test->json_start, "test_start", iperf_json_printf("protocol: %s num_streams: %d blksize: %d omit: %d duration: %d bytes: %d blocks: %d reverse: %d tos: %d target_bitrate: %d bidir: %d fqrate: %d interval: %f", test->protocol->name, (int64_t) test->num_streams, (int64_t) test->settings->blksize, (int64_t) test->omit, (int64_t) test->duration, (int64_t) test->settings->bytes, (int64_t) test->settings->blocks, test->reverse?(int64_t)1:(int64_t)0, (int64_t) test->settings->tos, (int64_t) test->settings->rate, (int64_t) test->bidirectional, (uint64_t) test->settings->fqrate, test->stats_interval)); } else { if (test->verbose) { if (test->settings->bytes) From 46f60509ca8eba6b0dbe50bda9cebf9d37e7acb2 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 22 Mar 2024 08:53:49 -0700 Subject: [PATCH 082/286] Don't chdir when becoming a daemon. This fixes some non-intuitive behavior when using the iperf3 authentication feature, where iperf3 was able to use a relative path to locate the credentials file when being run "normally" but not if it was being run as a --daemon (the workaround was to use only absolute pathname arguments). --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 57d5f40e0..eb29f87ac 100644 --- a/src/main.c +++ b/src/main.c @@ -154,7 +154,7 @@ run(struct iperf_test *test) case 's': if (test->daemon) { int rc; - rc = daemon(0, 0); + rc = daemon(1, 0); if (rc < 0) { i_errno = IEDAEMON; iperf_errexit(test, "error - %s", iperf_strerror(i_errno)); From b5eb3a42f4c7d62dce0652efbb9ca6f090df7498 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sat, 23 Mar 2024 09:48:03 +0200 Subject: [PATCH 083/286] Fix issue 1662 - not allow negative test duration (with rebase and changes per reviewer comments) --- src/iperf_api.c | 2 +- src/iperf_error.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index a296780a1..02b34e5f5 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1313,7 +1313,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) break; case 't': test->duration = atoi(optarg); - if (test->duration > MAX_TIME) { + if (test->duration > MAX_TIME || test->duration < 0) { i_errno = IEDURATION; return -1; } diff --git a/src/iperf_error.c b/src/iperf_error.c index 6426554cf..231f0025e 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -166,7 +166,7 @@ iperf_strerror(int int_errno) snprintf(errstr, len, "some option you are trying to set is client only"); break; case IEDURATION: - snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME); + snprintf(errstr, len, "test duration valid values are 0 to %d seconds", MAX_TIME); break; case IENUMSTREAMS: snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS); From d80b914141582dc0c0cf3f71cc5799061074be66 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sun, 18 Feb 2024 20:07:30 +0200 Subject: [PATCH 084/286] Add pthread missing functions in Android --- src/Makefile.am | 2 ++ src/iperf.h | 4 +--- src/iperf_pthread.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/iperf_pthread.h | 21 +++++++++++++++++++++ 4 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 src/iperf_pthread.c create mode 100644 src/iperf_pthread.h diff --git a/src/Makefile.am b/src/Makefile.am index 11d3e175d..bdd638f26 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -33,6 +33,8 @@ libiperf_la_SOURCES = \ iperf_util.h \ iperf_time.c \ iperf_time.h \ + iperf_pthread.c \ + iperf_pthread.h \ dscp.c \ net.c \ net.h \ diff --git a/src/iperf.h b/src/iperf.h index dc3c0d1df..c1d839be1 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -61,9 +61,7 @@ #include #endif // HAVE_SSL -#ifdef HAVE_PTHREAD -#include -#endif // HAVE_PTHREAD +#include "iperf_pthread.h" /* * Atomic types highly desired, but if not, we approximate what we need diff --git a/src/iperf_pthread.c b/src/iperf_pthread.c new file mode 100644 index 000000000..ea4918bcd --- /dev/null +++ b/src/iperf_pthread.c @@ -0,0 +1,40 @@ +#include "iperf_config.h" + +#if defined(HAVE_PTHREAD) && defined(__ANDROID__) + +/* Workaround for `pthread_cancel()` in Android, using `pthread_kill()` instead, + * as Android NDK does not support `pthread_cancel()`. + */ + +#include +#include "iperf_pthread.h" + +int pthread_setcanceltype(int type, int *oldtype) { return 0; } +int pthread_setcancelstate(int state, int *oldstate) { return 0; } +int pthread_cancel(pthread_t thread_id) { + int status; + if ((status = iperf_set_thread_exit_handler()) == 0) { + status = pthread_kill(thread_id, SIGUSR1); + } + return status; +} + +void iperf_thread_exit_handler(int sig) +{ + pthread_exit(0); +} + +int iperf_set_thread_exit_handler() { + int rc; + struct sigaction actions; + + memset(&actions, 0, sizeof(actions)); + sigemptyset(&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = iperf_thread_exit_handler; + + rc = sigaction(SIGUSR1, &actions, NULL); + return rc; +} + +#endif // defined(HAVE_PTHREAD) && defined(__ANDROID__) diff --git a/src/iperf_pthread.h b/src/iperf_pthread.h new file mode 100644 index 000000000..44828d6a9 --- /dev/null +++ b/src/iperf_pthread.h @@ -0,0 +1,21 @@ +#include "iperf_config.h" + +#if defined(HAVE_PTHREAD) + +#include + +#if defined(__ANDROID__) + +/* Adding missing `pthread` related definitions in Android. + */ + +#define PTHREAD_CANCEL_ASYNCHRONOUS 0 +#define PTHREAD_CANCEL_ENABLE NULL + +int pthread_setcanceltype(int type, int *oldtype); +int pthread_setcancelstate(int state, int *oldstate); +int pthread_cancel(pthread_t thread_id); + +#endif // defined(__ANDROID__) + +#endif // defined(HAVE_PTHREAD) \ No newline at end of file From 1843d377f225d71b2306ba329dd0e299b3e8b9d5 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Wed, 27 Mar 2024 14:52:35 -0700 Subject: [PATCH 085/286] Regen. --- aclocal.m4 | 4 +- config/config.guess | 107 +- config/config.sub | 236 +++-- config/install-sh | 8 +- configure | 2143 +++++++++++++++++++++++++---------------- src/Makefile.in | 50 +- src/iperf_config.h.in | 20 +- 7 files changed, 1588 insertions(+), 980 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index 60439e91e..bd04b2e09 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -14,8 +14,8 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, -[m4_warning([this file was generated for autoconf 2.71. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.72],, +[m4_warning([this file was generated for autoconf 2.72. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) diff --git a/config/config.guess b/config/config.guess index e81d3ae7c..cdfc43920 100755 --- a/config/config.guess +++ b/config/config.guess @@ -1,14 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2021 Free Software Foundation, Inc. +# Copyright 1992-2023 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2021-06-03' +timestamp='2023-08-22' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -47,7 +47,7 @@ me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] -Output the configuration name of the system \`$me' is run on. +Output the configuration name of the system '$me' is run on. Options: -h, --help print this help, then exit @@ -60,13 +60,13 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2021 Free Software Foundation, Inc. +Copyright 1992-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try \`$me --help' for more information." +Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -102,8 +102,8 @@ GUESS= # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. +# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still +# use 'HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. @@ -155,6 +155,9 @@ Linux|GNU|GNU/*) set_cc_for_build cat <<-EOF > "$dummy.c" + #if defined(__ANDROID__) + LIBC=android + #else #include #if defined(__UCLIBC__) LIBC=uclibc @@ -169,6 +172,7 @@ Linux|GNU|GNU/*) LIBC=musl #endif #endif + #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" @@ -437,7 +441,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 @@ -459,7 +463,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in UNAME_RELEASE=`uname -v` ;; esac - # Japanese Language versions have a version number like `4.1.3-JL'. + # Japanese Language versions have a version number like '4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; @@ -904,7 +908,7 @@ EOF fi ;; *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; @@ -929,6 +933,9 @@ EOF i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; *:Interix*:*) case $UNAME_MACHINE in x86) @@ -963,11 +970,37 @@ EOF GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; + x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-pc-managarm-mlibc" + ;; + *:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" + ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __ARM_EABI__ + #ifdef __ARM_PCS_VFP + ABI=eabihf + #else + ABI=eabi + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; + esac + fi + GUESS=$CPU-unknown-linux-$LIBCABI ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be @@ -1033,7 +1066,16 @@ EOF k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; - loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + kvx:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + kvx:cos:*:*) + GUESS=$UNAME_MACHINE-unknown-cos + ;; + kvx:mbr:*:*) + GUESS=$UNAME_MACHINE-unknown-mbr + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) @@ -1148,16 +1190,27 @@ EOF ;; x86_64:Linux:*:*) set_cc_for_build + CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then - if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_X32 >/dev/null - then - LIBCABI=${LIBC}x32 - fi + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac fi - GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI + GUESS=$CPU-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC @@ -1177,7 +1230,7 @@ EOF GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility + # If we were able to find 'uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; @@ -1318,7 +1371,7 @@ EOF GUESS=ns32k-sni-sysv fi ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; @@ -1364,8 +1417,11 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; - x86_64:Haiku:*:*) - GUESS=x86_64-unknown-haiku + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE @@ -1522,6 +1578,9 @@ EOF i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; diff --git a/config/config.sub b/config/config.sub index d74fb6dea..defe52c0c 100755 --- a/config/config.sub +++ b/config/config.sub @@ -1,14 +1,14 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2021 Free Software Foundation, Inc. +# Copyright 1992-2023 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2021-08-14' +timestamp='2023-09-19' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -76,13 +76,13 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2021 Free Software Foundation, Inc. +Copyright 1992-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try \`$me --help' for more information." +Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -130,7 +130,7 @@ IFS=$saved_IFS # Separate into logical components for further validation case $1 in *-*-*-*-*) - echo Invalid configuration \`"$1"\': more than four components >&2 + echo "Invalid configuration '$1': more than four components" >&2 exit 1 ;; *-*-*-*) @@ -145,7 +145,8 @@ case $1 in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ - | storm-chaos* | os2-emx* | rtmk-nova*) + | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ + | windows-* ) basic_machine=$field1 basic_os=$maybe_os ;; @@ -943,7 +944,7 @@ $basic_machine EOF IFS=$saved_IFS ;; - # We use `pc' rather than `unknown' + # We use 'pc' rather than 'unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) @@ -1020,6 +1021,11 @@ case $cpu-$vendor in ;; # Here we normalize CPU types with a missing or matching vendor + armh-unknown | armh-alt) + cpu=armv7l + vendor=alt + basic_os=${basic_os:-linux-gnueabihf} + ;; dpx20-unknown | dpx20-bull) cpu=rs6000 vendor=bull @@ -1070,7 +1076,7 @@ case $cpu-$vendor in pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) cpu=i586 ;; - pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) + pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*) cpu=i686 ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) @@ -1121,7 +1127,7 @@ case $cpu-$vendor in xscale-* | xscalee[bl]-*) cpu=`echo "$cpu" | sed 's/^xscale/arm/'` ;; - arm64-*) + arm64-* | aarch64le-*) cpu=aarch64 ;; @@ -1175,7 +1181,7 @@ case $cpu-$vendor in case $cpu in 1750a | 580 \ | a29k \ - | aarch64 | aarch64_be \ + | aarch64 | aarch64_be | aarch64c | arm64ec \ | abacus \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ @@ -1194,45 +1200,23 @@ case $cpu-$vendor in | d10v | d30v | dlx | dsp16xx \ | e2k | elxsi | epiphany \ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | javascript \ | h8300 | h8500 \ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i*86 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ + | kvx \ | le32 | le64 \ | lm32 \ - | loongarch32 | loongarch64 | loongarchx32 \ + | loongarch32 | loongarch64 \ | m32c | m32r | m32rle \ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ | m88110 | m88k | maxq | mb | mcore | mep | metag \ | microblaze | microblazeel \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64eb | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r3 | mipsisa32r3el \ - | mipsisa32r5 | mipsisa32r5el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r3 | mipsisa64r3el \ - | mipsisa64r5 | mipsisa64r5el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ + | mips* \ | mmix \ | mn10200 | mn10300 \ | moxie \ @@ -1280,7 +1264,7 @@ case $cpu-$vendor in ;; *) - echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2 exit 1 ;; esac @@ -1301,11 +1285,12 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if test x$basic_os != x +if test x"$basic_os" != x then -# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. +obj= case $basic_os in gnu/linux*) kernel=linux @@ -1336,6 +1321,10 @@ EOF kernel=linux os=`echo "$basic_os" | sed -e 's|linux|gnu|'` ;; + managarm*) + kernel=managarm + os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'` + ;; *) kernel= os=$basic_os @@ -1501,10 +1490,16 @@ case $os in os=eabi ;; *) - os=elf + os= + obj=elf ;; esac ;; + aout* | coff* | elf* | pe*) + # These are machine code file formats, not OSes + obj=$os + os= + ;; *) # No normalization, but not necessarily accepted, that comes below. ;; @@ -1523,12 +1518,15 @@ else # system, and we'll never get to this point. kernel= +obj= case $cpu-$vendor in score-*) - os=elf + os= + obj=elf ;; spu-*) - os=elf + os= + obj=elf ;; *-acorn) os=riscix1.2 @@ -1538,28 +1536,35 @@ case $cpu-$vendor in os=gnu ;; arm*-semi) - os=aout + os= + obj=aout ;; c4x-* | tic4x-*) - os=coff + os= + obj=coff ;; c8051-*) - os=elf + os= + obj=elf ;; clipper-intergraph) os=clix ;; hexagon-*) - os=elf + os= + obj=elf ;; tic54x-*) - os=coff + os= + obj=coff ;; tic55x-*) - os=coff + os= + obj=coff ;; tic6x-*) - os=coff + os= + obj=coff ;; # This must come before the *-dec entry. pdp10-*) @@ -1581,19 +1586,24 @@ case $cpu-$vendor in os=sunos3 ;; m68*-cisco) - os=aout + os= + obj=aout ;; mep-*) - os=elf + os= + obj=elf ;; mips*-cisco) - os=elf + os= + obj=elf ;; mips*-*) - os=elf + os= + obj=elf ;; or32-*) - os=coff + os= + obj=coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=sysv3 @@ -1602,7 +1612,8 @@ case $cpu-$vendor in os=sunos4.1.1 ;; pru-*) - os=elf + os= + obj=elf ;; *-be) os=beos @@ -1683,10 +1694,12 @@ case $cpu-$vendor in os=uxpv ;; *-rom68k) - os=coff + os= + obj=coff ;; *-*bug) - os=coff + os= + obj=coff ;; *-apple) os=macos @@ -1704,7 +1717,8 @@ esac fi -# Now, validate our (potentially fixed-up) OS. +# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ). + case $os in # Sometimes we do "kernel-libc", so those need to count as OSes. musl* | newlib* | relibc* | uclibc*) @@ -1715,6 +1729,9 @@ case $os in # VxWorks passes extra cpu info in the 4th filed. simlinux | simwindows | spe) ;; + # See `case $cpu-$os` validation below + ghcjs) + ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. @@ -1723,7 +1740,7 @@ case $os in | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ | hiux* | abug | nacl* | netware* | windows* \ - | os9* | macos* | osx* | ios* \ + | os9* | macos* | osx* | ios* | tvos* | watchos* \ | mpw* | magic* | mmixware* | mon960* | lnews* \ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ | aos* | aros* | cloudabi* | sortix* | twizzler* \ @@ -1732,11 +1749,11 @@ case $os in | mirbsd* | netbsd* | dicos* | openedition* | ose* \ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ - | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ - | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | bosx* | nextstep* | cxux* | oabi* \ + | ptx* | ecoff* | winnt* | domain* | vsta* \ | udi* | lites* | ieee* | go32* | aux* | hcos* \ | chorusrdb* | cegcc* | glidix* | serenity* \ - | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | cygwin* | msys* | moss* | proelf* | rtems* \ | midipix* | mingw32* | mingw64* | mint* \ | uxpv* | beos* | mpeix* | udk* | moxiebox* \ | interix* | uwin* | mks* | rhapsody* | darwin* \ @@ -1748,7 +1765,8 @@ case $os in | skyos* | haiku* | rdos* | toppers* | drops* | es* \ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*) + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ + | fiwix* | mlibc* | cos* | mbr* ) ;; # This one is extra strict with allowed versions sco3.2v2 | sco3.2v[4-9]* | sco5v6*) @@ -1756,41 +1774,99 @@ case $os in ;; none) ;; + kernel* | msvc* ) + # Restricted further below + ;; + '') + if test x"$obj" = x + then + echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2 + fi + ;; + *) + echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 + exit 1 + ;; +esac + +case $obj in + aout* | coff* | elf* | pe*) + ;; + '') + # empty is fine + ;; *) - echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 + exit 1 + ;; +esac + +# Here we handle the constraint that a (synthetic) cpu and os are +# valid only in combination with each other and nowhere else. +case $cpu-$os in + # The "javascript-unknown-ghcjs" triple is used by GHC; we + # accept it here in order to tolerate that, but reject any + # variations. + javascript-ghcjs) + ;; + javascript-* | *-ghcjs) + echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. -case $kernel-$os in - linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ - | linux-musl* | linux-relibc* | linux-uclibc* ) +case $kernel-$os-$obj in + linux-gnu*- | linux-dietlibc*- | linux-android*- | linux-newlib*- \ + | linux-musl*- | linux-relibc*- | linux-uclibc*- | linux-mlibc*- ) + ;; + uclinux-uclibc*- ) + ;; + managarm-mlibc*- | managarm-kernel*- ) ;; - uclinux-uclibc* ) + windows*-msvc*-) ;; - -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) + -dietlibc*- | -newlib*- | -musl*- | -relibc*- | -uclibc*- | -mlibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. - echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 exit 1 ;; - kfreebsd*-gnu* | kopensolaris*-gnu*) + -kernel*- ) + echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 + exit 1 ;; - vxworks-simlinux | vxworks-simwindows | vxworks-spe) + *-kernel*- ) + echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 + exit 1 ;; - nto-qnx*) + *-msvc*- ) + echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 + exit 1 ;; - os2-emx) + kfreebsd*-gnu*- | kopensolaris*-gnu*-) + ;; + vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) + ;; + nto-qnx*-) + ;; + os2-emx-) ;; - *-eabi* | *-gnueabi*) + *-eabi*- | *-gnueabi*-) ;; - -*) + none--*) + # None (no kernel, i.e. freestanding / bare metal), + # can be paired with an machine code file format + ;; + -*-) # Blank kernel with real OS is always fine. ;; - *-*) - echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + --*) + # Blank kernel and OS with real machine code file format is always fine. + ;; + *-*-*) + echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 exit 1 ;; esac @@ -1873,7 +1949,7 @@ case $vendor in ;; esac -echo "$cpu-$vendor-${kernel:+$kernel-}$os" +echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: diff --git a/config/install-sh b/config/install-sh index ec298b537..7c56c9c01 100755 --- a/config/install-sh +++ b/config/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2020-11-14.01; # UTC +scriptversion=2023-11-23.18; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -124,9 +124,9 @@ it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. -Email bug reports to bug-automake@gnu.org. -Automake home page: https://www.gnu.org/software/automake/ -" +Report bugs to . +GNU Automake home page: . +General help using GNU software: ." while test $# -ne 0; do case $1 in diff --git a/configure b/configure index f25986417..4546f7357 100755 --- a/configure +++ b/configure @@ -1,11 +1,11 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for iperf 3.16+. +# Generated by GNU Autoconf 2.72 for iperf 3.16+. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # @@ -17,7 +17,6 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh @@ -26,12 +25,13 @@ then : # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else $as_nop - case `(set -o) 2>/dev/null` in #( +else case e in #( + e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi @@ -103,7 +103,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as `sh COMMAND' +# We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 @@ -133,15 +133,14 @@ case $- in # (((( esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. +# out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="as_nop=: -if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 + as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: @@ -149,12 +148,13 @@ then : # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else \$as_nop - case \`(set -o) 2>/dev/null\` in #( +else case e in #( + e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi " @@ -172,8 +172,9 @@ as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : -else \$as_nop - exitcode=1; echo positional parameters were not saved. +else case e in #( + e) exitcode=1; echo positional parameters were not saved. ;; +esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) @@ -195,14 +196,15 @@ test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes -else $as_nop - as_have_required=no +else case e in #( + e) as_have_required=no ;; +esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : -else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do @@ -235,12 +237,13 @@ IFS=$as_save_IFS if $as_found then : -else $as_nop - if { test -f "$SHELL" || test -f "$SHELL.exe"; } && +else case e in #( + e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes -fi +fi ;; +esac fi @@ -262,7 +265,7 @@ case $- in # (((( esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. +# out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi @@ -282,7 +285,8 @@ $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 -fi +fi ;; +esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} @@ -321,14 +325,6 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit -# as_fn_nop -# --------- -# Do nothing but, unlike ":", preserve the value of $?. -as_fn_nop () -{ - return $? -} -as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -397,11 +393,12 @@ then : { eval $1+=\$2 }' -else $as_nop - as_fn_append () +else case e in #( + e) as_fn_append () { eval $1=\$$1\$2 - } + } ;; +esac fi # as_fn_append # as_fn_arith ARG... @@ -415,21 +412,14 @@ then : { as_val=$(( $* )) }' -else $as_nop - as_fn_arith () +else case e in #( + e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } + } ;; +esac fi # as_fn_arith -# as_fn_nop -# --------- -# Do nothing but, unlike ":", preserve the value of $?. -as_fn_nop () -{ - return $? -} -as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -503,6 +493,8 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits /[$]LINENO/= ' <$as_myself | sed ' + t clear + :clear s/[$]LINENO.*/&-/ t lineno b @@ -551,7 +543,6 @@ esac as_echo='printf %s\n' as_echo_n='printf %s' - rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -563,9 +554,9 @@ if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then @@ -590,10 +581,12 @@ as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated SHELL=${CONFIG_SHELL-/bin/sh} @@ -933,7 +926,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: \`$ac_useropt'" + as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -959,7 +952,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: \`$ac_useropt'" + as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1172,7 +1165,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: \`$ac_useropt'" + as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1188,7 +1181,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: \`$ac_useropt'" + as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1218,8 +1211,8 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" + -*) as_fn_error $? "unrecognized option: '$ac_option' +Try '$0 --help' for more information" ;; *=*) @@ -1227,7 +1220,7 @@ Try \`$0 --help' for more information" # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1277,7 +1270,7 @@ do as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done -# There might be people who depend on the old broken behavior: `$host' +# There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias @@ -1345,7 +1338,7 @@ if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` @@ -1373,7 +1366,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures iperf 3.16+ to adapt to many kinds of systems. +'configure' configures iperf 3.16+ to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1387,11 +1380,11 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages + -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' + -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] + --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @@ -1399,10 +1392,10 @@ Installation directories: --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. +By default, 'make install' will install all the files in +'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify +an installation prefix other than '$ac_default_prefix' using '--prefix', +for instance '--prefix=\$HOME'. For better control, use the options below. @@ -1495,7 +1488,7 @@ Some influential environment variables: User-defined run-time library search path. CPP C preprocessor -Use these variables to override the choices made by `configure' or to help +Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . @@ -1564,9 +1557,9 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF iperf configure 3.16+ -generated by GNU Autoconf 2.71 +generated by GNU Autoconf 2.72 -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1605,11 +1598,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } && test -s conftest.$ac_objext then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval @@ -1647,11 +1641,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would @@ -1675,8 +1670,8 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> @@ -1684,10 +1679,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1707,15 +1704,15 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. */ + which can conflict with char $2 (void); below. */ #include #undef $2 @@ -1726,7 +1723,7 @@ else $as_nop #ifdef __cplusplus extern "C" #endif -char $2 (); +char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ @@ -1745,11 +1742,13 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1785,11 +1784,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval @@ -1808,8 +1808,8 @@ printf %s "checking for $2.$3... " >&6; } if eval test \${$4+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -1825,8 +1825,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -1842,12 +1842,15 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else $as_nop - eval "$4=no" +else case e in #( + e) eval "$4=no" ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$4 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1880,7 +1883,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by iperf $as_me 3.16+, which was -generated by GNU Autoconf 2.71. Invocation command line was +generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -2126,10 +2129,10 @@ esac printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } fi done @@ -2165,9 +2168,7 @@ struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; +static char *e (char **p, int i) { return p[i]; } @@ -2181,6 +2182,21 @@ static char *f (char * (*g) (char **, int), char **p, ...) return s; } +/* C89 style stringification. */ +#define noexpand_stringify(a) #a +const char *stringified = noexpand_stringify(arbitrary+token=sequence); + +/* C89 style token pasting. Exercises some of the corner cases that + e.g. old MSVC gets wrong, but not very hard. */ +#define noexpand_concat(a,b) a##b +#define expand_concat(a,b) noexpand_concat(a,b) +extern int vA; +extern int vbee; +#define aye A +#define bee B +int *pvA = &expand_concat(v,aye); +int *pvbee = &noexpand_concat(v,bee); + /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated @@ -2208,16 +2224,19 @@ ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' -// Does the compiler advertise C99 conformance? +/* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif +// See if C++-style comments work. + #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); +extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare @@ -2267,7 +2286,6 @@ typedef const char *ccp; static inline int test_restrict (ccp restrict text) { - // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) @@ -2333,6 +2351,8 @@ ac_c_conftest_c99_main=' ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; + // Work around memory leak warnings. + free (ia); // Check named initializers. struct named_init ni = { @@ -2354,7 +2374,7 @@ ac_c_conftest_c99_main=' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' -// Does the compiler advertise C11 conformance? +/* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif @@ -2546,8 +2566,9 @@ IFS=$as_save_IFS if $as_found then : -else $as_nop - as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +else case e in #( + e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; +esac fi @@ -2575,12 +2596,12 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) @@ -2589,18 +2610,18 @@ printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. @@ -2616,11 +2637,11 @@ printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi done if $ac_cache_corrupted; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## @@ -2813,8 +2834,9 @@ then : enableval=$enable_static_bin; enable_static=yes enable_shared=no enable_static_bin=yes -else $as_nop - : +else case e in #( + e) : ;; +esac fi if test x$enable_static_bin = xno; then @@ -2869,8 +2891,8 @@ if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 -else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS @@ -2924,7 +2946,8 @@ esac IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir - + ;; +esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install @@ -3020,7 +3043,7 @@ test "$program_prefix" != NONE && test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. -# By default was `s,x,x', remove it if useless. +# By default was 's,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` @@ -3063,8 +3086,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$STRIP"; then +else case e in #( + e) if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3086,7 +3109,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then @@ -3108,8 +3132,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_STRIP"; then +else case e in #( + e) if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3131,7 +3155,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then @@ -3167,8 +3192,8 @@ if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 -else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS @@ -3182,7 +3207,7 @@ do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ - 'BusyBox '* | \ + *'BusyBox '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; @@ -3191,18 +3216,17 @@ do done done IFS=$as_save_IFS - + ;; +esac fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" + # As a last resort, use plain mkdir -p, + # in the hope it doesn't have the bugs of ancient mkdir. + MKDIR_P='mkdir -p' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 @@ -3217,8 +3241,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$AWK"; then +else case e in #( + e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3240,7 +3264,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then @@ -3262,8 +3287,8 @@ ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 -else $as_nop - cat >conftest.make <<\_ACEOF +else case e in #( + e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' @@ -3275,7 +3300,8 @@ case `${MAKE-make} -f conftest.make 2>/dev/null` in *) eval ac_cv_prog_make_${ac_make}_set=no;; esac -rm -f conftest.make +rm -f conftest.make ;; +esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 @@ -3313,8 +3339,8 @@ printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 -else $as_nop - if printf "%s\n" 'TRUE=$(BAR$(V)) +else case e in #( + e) if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3324,7 +3350,8 @@ am__doit: am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no -fi +fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } @@ -3479,8 +3506,8 @@ printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 -else $as_nop - if printf "%s\n" 'TRUE=$(BAR$(V)) +else case e in #( + e) if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3490,7 +3517,8 @@ am__doit: am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no -fi +fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } @@ -3540,15 +3568,16 @@ printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_build_alias=$build_alias +else case e in #( + e) ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } @@ -3575,14 +3604,15 @@ printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 -else $as_nop - if test "x$host_alias" = x; then +else case e in #( + e) if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } @@ -3759,8 +3789,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3782,7 +3812,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3804,8 +3835,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3827,7 +3858,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -3862,8 +3894,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3885,7 +3917,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3907,8 +3940,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no @@ -3947,7 +3980,8 @@ if test $ac_prog_rejected = yes; then ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3971,8 +4005,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3994,7 +4028,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4020,8 +4055,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4043,7 +4078,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -4081,8 +4117,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4104,7 +4140,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4126,8 +4163,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4149,7 +4186,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -4178,10 +4216,10 @@ fi fi -test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -4253,8 +4291,8 @@ printf "%s\n" "$ac_try_echo"; } >&5 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' + # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. +# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. @@ -4274,7 +4312,7 @@ do ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' + # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. @@ -4285,8 +4323,9 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else $as_nop - ac_file='' +else case e in #( + e) ac_file='' ;; +esac fi if test -z "$ac_file" then : @@ -4295,13 +4334,14 @@ printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } +See 'config.log' for more details" "$LINENO" 5; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } @@ -4325,10 +4365,10 @@ printf "%s\n" "$ac_try_echo"; } >&5 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. + # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) +# catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will +# work properly (i.e., refer to 'conftest.exe'), while it won't with +# 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in @@ -4338,11 +4378,12 @@ for ac_file in conftest.exe conftest conftest.*; do * ) break;; esac done -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -4358,6 +4399,8 @@ int main (void) { FILE *f = fopen ("conftest.out", "w"); + if (!f) + return 1; return ferror (f) || fclose (f) != 0; ; @@ -4397,26 +4440,27 @@ printf "%s\n" "$ac_try_echo"; } >&5 if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } +If you meant to cross compile, use '--host'. +See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +rm -f conftest.$ac_ext conftest$ac_cv_exeext \ + conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4448,16 +4492,18 @@ then : break;; esac done -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext +rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } @@ -4468,8 +4514,8 @@ printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4486,12 +4532,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes -else $as_nop - ac_compiler_gnu=no +else case e in #( + e) ac_compiler_gnu=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } @@ -4509,8 +4557,8 @@ printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_save_c_werror_flag=$ac_c_werror_flag +else case e in #( + e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" @@ -4528,8 +4576,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes -else $as_nop - CFLAGS="" +else case e in #( + e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4544,8 +4592,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - ac_c_werror_flag=$ac_save_c_werror_flag +else case e in #( + e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4562,12 +4610,15 @@ if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag + ac_c_werror_flag=$ac_save_c_werror_flag ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } @@ -4594,8 +4645,8 @@ printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c11=no +else case e in #( + e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4612,25 +4663,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c11" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } - CC="$CC $ac_cv_prog_cc_c11" + CC="$CC $ac_cv_prog_cc_c11" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 + ac_prog_cc_stdc=c11 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -4640,8 +4694,8 @@ printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c99=no +else case e in #( + e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4658,25 +4712,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c99" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } - CC="$CC $ac_cv_prog_cc_c99" + CC="$CC $ac_cv_prog_cc_c99" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 + ac_prog_cc_stdc=c99 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -4686,8 +4743,8 @@ printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c89=no +else case e in #( + e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4704,25 +4761,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c89" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } - CC="$CC $ac_cv_prog_cc_c89" + CC="$CC $ac_cv_prog_cc_c89" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 + ac_prog_cc_stdc=c89 ;; +esac fi fi @@ -4743,8 +4803,8 @@ printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4774,7 +4834,8 @@ _ACEOF fi done rm -f core conftest* - unset am_i + unset am_i ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } @@ -4800,8 +4861,8 @@ printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then +else case e in #( + e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up @@ -4905,7 +4966,8 @@ else $as_nop else am_cv_CC_dependencies_compiler_type=none fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } @@ -4927,8 +4989,8 @@ printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ +else case e in #( + e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done @@ -4953,9 +5015,10 @@ do as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in +case `"$ac_path_SED" --version 2>&1` in #( *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -4990,7 +5053,8 @@ IFS=$as_save_IFS else ac_cv_path_SED=$SED fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } @@ -5015,8 +5079,8 @@ printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$GREP"; then +else case e in #( + e) if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5035,9 +5099,10 @@ do as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in +case `"$ac_path_GREP" --version 2>&1` in #( *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5072,7 +5137,8 @@ IFS=$as_save_IFS else ac_cv_path_GREP=$GREP fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } @@ -5084,8 +5150,8 @@ printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 -else $as_nop - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +else case e in #( + e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then @@ -5107,9 +5173,10 @@ do as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in +case `"$ac_path_EGREP" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5145,20 +5212,23 @@ else ac_cv_path_EGREP=$EGREP fi - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" + EGREP_TRADITIONAL=$EGREP + ac_cv_path_EGREP_TRADITIONAL=$EGREP { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 -else $as_nop - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 +else case e in #( + e) if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then @@ -5180,9 +5250,10 @@ do as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in +case `"$ac_path_FGREP" --version 2>&1` in #( *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5218,7 +5289,8 @@ else ac_cv_path_FGREP=$FGREP fi - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$ac_cv_path_FGREP" >&6; } @@ -5249,8 +5321,9 @@ test -z "$GREP" && GREP=grep if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else $as_nop - with_gnu_ld=no +else case e in #( + e) with_gnu_ld=no ;; +esac fi ac_prog=ld @@ -5295,8 +5368,8 @@ fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$LD"; then +else case e in #( + e) if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs @@ -5319,7 +5392,8 @@ else $as_nop IFS=$lt_save_ifs else lt_cv_path_LD=$LD # Let the user override the test with a path. -fi +fi ;; +esac fi LD=$lt_cv_path_LD @@ -5336,8 +5410,8 @@ printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 -else $as_nop - # I'd rather use --version here, but apparently some GNU lds only accept -v. +else case e in #( + e) # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 @@ -5364,8 +5439,8 @@ printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$NM"; then +else case e in #( + e) if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else @@ -5412,7 +5487,8 @@ else IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} -fi +fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } @@ -5433,8 +5509,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DUMPBIN"; then +else case e in #( + e) if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5456,7 +5532,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then @@ -5482,8 +5559,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DUMPBIN"; then +else case e in #( + e) if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5505,7 +5582,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then @@ -5559,8 +5637,8 @@ printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_nm_interface="BSD nm" +else case e in #( + e) lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) @@ -5573,7 +5651,8 @@ else $as_nop if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi - rm -f conftest* + rm -f conftest* ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } @@ -5595,8 +5674,8 @@ printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 -else $as_nop - i=0 +else case e in #( + e) i=0 teststring=ABCD case $build_os in @@ -5718,7 +5797,8 @@ else $as_nop fi ;; esac - + ;; +esac fi if test -n "$lt_cv_sys_max_cmd_len"; then @@ -5775,8 +5855,8 @@ printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 -else $as_nop - case $host in +else case e in #( + e) case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys @@ -5807,7 +5887,8 @@ else $as_nop lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac - + ;; +esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd @@ -5823,8 +5904,8 @@ printf %s "checking how to convert $build file names to toolchain format... " >& if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 -else $as_nop - #assume ordinary cross tools, or native build. +else case e in #( + e) #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) @@ -5835,7 +5916,8 @@ case $host in esac ;; esac - + ;; +esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd @@ -5851,8 +5933,9 @@ printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_reload_flag='-r' +else case e in #( + e) lt_cv_ld_reload_flag='-r' ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } @@ -5893,8 +5976,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FILECMD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$FILECMD"; then +else case e in #( + e) if test -n "$FILECMD"; then ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5916,7 +5999,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi FILECMD=$ac_cv_prog_FILECMD if test -n "$FILECMD"; then @@ -5938,8 +6022,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_FILECMD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_FILECMD"; then +else case e in #( + e) if test -n "$ac_ct_FILECMD"; then ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5961,7 +6045,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD if test -n "$ac_ct_FILECMD"; then @@ -6001,8 +6086,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$OBJDUMP"; then +else case e in #( + e) if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6024,7 +6109,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then @@ -6046,8 +6132,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OBJDUMP"; then +else case e in #( + e) if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6069,7 +6155,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then @@ -6110,8 +6197,8 @@ printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_file_magic_cmd='$MAGIC_CMD' +else case e in #( + e) lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support @@ -6304,7 +6391,8 @@ os2*) lt_cv_deplibs_check_method=pass_all ;; esac - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } @@ -6356,8 +6444,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DLLTOOL"; then +else case e in #( + e) if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6379,7 +6467,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then @@ -6401,8 +6490,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DLLTOOL"; then +else case e in #( + e) if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6424,7 +6513,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then @@ -6466,8 +6556,8 @@ printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_sharedlib_from_linklib_cmd='unknown' +else case e in #( + e) lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) @@ -6487,7 +6577,8 @@ cygwin* | mingw* | pw32* | cegcc*) lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } @@ -6511,8 +6602,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$AR"; then +else case e in #( + e) if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6534,7 +6625,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi AR=$ac_cv_prog_AR if test -n "$AR"; then @@ -6560,8 +6652,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_AR"; then +else case e in #( + e) if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6583,7 +6675,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then @@ -6645,8 +6738,8 @@ printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ar_at_file=no +else case e in #( + e) lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -6683,7 +6776,8 @@ then : fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } @@ -6708,8 +6802,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$STRIP"; then +else case e in #( + e) if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6731,7 +6825,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then @@ -6753,8 +6848,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_STRIP"; then +else case e in #( + e) if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6776,7 +6871,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then @@ -6817,8 +6913,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$RANLIB"; then +else case e in #( + e) if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6840,7 +6936,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then @@ -6862,8 +6959,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_RANLIB"; then +else case e in #( + e) if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6885,7 +6982,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then @@ -6996,8 +7094,8 @@ printf %s "checking command to parse $NM output from $compiler object... " >&6; if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 -else $as_nop - +else case e in #( + e) # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -7252,7 +7350,8 @@ _LT_EOF lt_cv_sys_global_symbol_pipe= fi done - + ;; +esac fi if test -z "$lt_cv_sys_global_symbol_pipe"; then @@ -7316,8 +7415,9 @@ printf %s "checking for sysroot... " >&6; } if test ${with_sysroot+y} then : withval=$with_sysroot; -else $as_nop - with_sysroot=no +else case e in #( + e) with_sysroot=no ;; +esac fi @@ -7352,8 +7452,8 @@ printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 -else $as_nop - printf 0123456789abcdef0123456789abcdef >conftest.i +else case e in #( + e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then @@ -7389,7 +7489,8 @@ else ac_cv_path_lt_DD=$lt_DD fi -rm -f conftest.i conftest2.i conftest.out +rm -f conftest.i conftest2.i conftest.out ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } @@ -7400,8 +7501,8 @@ printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 -else $as_nop - printf 0123456789abcdef0123456789abcdef >conftest.i +else case e in #( + e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then @@ -7409,7 +7510,8 @@ if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; the && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out -test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } @@ -7619,8 +7721,8 @@ printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_ext=c +else case e in #( + e) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -7640,8 +7742,9 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes -else $as_nop - lt_cv_cc_needs_belf=no +else case e in #( + e) lt_cv_cc_needs_belf=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -7650,7 +7753,8 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } @@ -7708,8 +7812,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$MANIFEST_TOOL"; then +else case e in #( + e) if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7731,7 +7835,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then @@ -7753,8 +7858,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_MANIFEST_TOOL"; then +else case e in #( + e) if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7776,7 +7881,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then @@ -7808,15 +7914,16 @@ printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_mainfest_tool+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_path_mainfest_tool=no +else case e in #( + e) lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi - rm -f conftest* + rm -f conftest* ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } @@ -7839,8 +7946,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DSYMUTIL"; then +else case e in #( + e) if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7862,7 +7969,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then @@ -7884,8 +7992,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DSYMUTIL"; then +else case e in #( + e) if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7907,7 +8015,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then @@ -7941,8 +8050,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_NMEDIT+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$NMEDIT"; then +else case e in #( + e) if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7964,7 +8073,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then @@ -7986,8 +8096,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_NMEDIT+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_NMEDIT"; then +else case e in #( + e) if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8009,7 +8119,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then @@ -8043,8 +8154,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$LIPO"; then +else case e in #( + e) if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8066,7 +8177,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then @@ -8088,8 +8200,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_LIPO"; then +else case e in #( + e) if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8111,7 +8223,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then @@ -8145,8 +8258,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$OTOOL"; then +else case e in #( + e) if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8168,7 +8281,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then @@ -8190,8 +8304,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OTOOL"; then +else case e in #( + e) if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8213,7 +8327,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then @@ -8247,8 +8362,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL64+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$OTOOL64"; then +else case e in #( + e) if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8270,7 +8385,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then @@ -8292,8 +8408,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL64+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OTOOL64"; then +else case e in #( + e) if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8315,7 +8431,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then @@ -8372,8 +8489,8 @@ printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_apple_cc_single_mod=no +else case e in #( + e) lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE @@ -8399,7 +8516,8 @@ else $as_nop fi rm -rf libconftest.dylib* rm -f conftest.* - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } @@ -8409,8 +8527,8 @@ printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_exported_symbols_list=no +else case e in #( + e) lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" @@ -8428,13 +8546,15 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes -else $as_nop - lt_cv_ld_exported_symbols_list=no +else case e in #( + e) lt_cv_ld_exported_symbols_list=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } @@ -8444,8 +8564,8 @@ printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_force_load=no +else case e in #( + e) lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF @@ -8470,7 +8590,8 @@ _LT_EOF fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$lt_cv_ld_force_load" >&6; } @@ -8610,8 +8731,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - enable_shared=yes +else case e in #( + e) enable_shared=yes ;; +esac fi @@ -8642,8 +8764,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - enable_static=yes +else case e in #( + e) enable_static=yes ;; +esac fi @@ -8674,8 +8797,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - pic_mode=default +else case e in #( + e) pic_mode=default ;; +esac fi @@ -8705,8 +8829,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - enable_fast_install=yes +else case e in #( + e) enable_fast_install=yes ;; +esac fi @@ -8733,15 +8858,17 @@ then : ;; esac lt_cv_with_aix_soname=$with_aix_soname -else $as_nop - if test ${lt_cv_with_aix_soname+y} +else case e in #( + e) if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_with_aix_soname=aix +else case e in #( + e) lt_cv_with_aix_soname=aix ;; +esac fi - with_aix_soname=$lt_cv_with_aix_soname + with_aix_soname=$lt_cv_with_aix_soname ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 @@ -8832,8 +8959,8 @@ printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 -else $as_nop - rm -f .libs 2>/dev/null +else case e in #( + e) rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs @@ -8841,7 +8968,8 @@ else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi -rmdir .libs 2>/dev/null +rmdir .libs 2>/dev/null ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } @@ -8902,8 +9030,8 @@ printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 -else $as_nop - case $MAGIC_CMD in +else case e in #( + e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; @@ -8946,6 +9074,7 @@ _LT_EOF IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; +esac ;; esac fi @@ -8969,8 +9098,8 @@ printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 -else $as_nop - case $MAGIC_CMD in +else case e in #( + e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; @@ -9013,6 +9142,7 @@ _LT_EOF IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; +esac ;; esac fi @@ -9108,8 +9238,8 @@ printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_rtti_exceptions=no +else case e in #( + e) lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment @@ -9137,7 +9267,8 @@ else $as_nop fi fi $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } @@ -9502,8 +9633,9 @@ printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +else case e in #( + e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } @@ -9518,8 +9650,8 @@ printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_pic_works=no +else case e in #( + e) lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment @@ -9547,7 +9679,8 @@ else $as_nop fi fi $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } @@ -9583,8 +9716,8 @@ printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_static_works=no +else case e in #( + e) lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext @@ -9605,7 +9738,8 @@ else $as_nop fi $RM -r conftest* LDFLAGS=$save_LDFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } @@ -9627,8 +9761,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o=no +else case e in #( + e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest @@ -9668,7 +9802,8 @@ else $as_nop cd .. $RM -r conftest $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -9683,8 +9818,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o=no +else case e in #( + e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest @@ -9724,7 +9859,8 @@ else $as_nop cd .. $RM -r conftest $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -10319,8 +10455,8 @@ else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10352,7 +10488,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi - + ;; +esac fi aix_libpath=$lt_cv_aix_libpath_ @@ -10374,8 +10511,8 @@ else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10407,7 +10544,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi - + ;; +esac fi aix_libpath=$lt_cv_aix_libpath_ @@ -10658,8 +10796,8 @@ printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler__b=no +else case e in #( + e) lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext @@ -10680,7 +10818,8 @@ else $as_nop fi $RM -r conftest* LDFLAGS=$save_LDFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } @@ -10728,8 +10867,8 @@ printf %s "checking whether the $host_os linker accepts -exported_symbol... " >& if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 -else $as_nop - save_LDFLAGS=$LDFLAGS +else case e in #( + e) save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -10738,12 +10877,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes -else $as_nop - lt_cv_irix_exported_symbol=no +else case e in #( + e) lt_cv_irix_exported_symbol=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS + LDFLAGS=$save_LDFLAGS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } @@ -11069,8 +11210,8 @@ printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 -else $as_nop - $RM conftest* +else case e in #( + e) $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 @@ -11106,7 +11247,8 @@ else $as_nop cat conftest.err 1>&5 fi $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } @@ -11833,8 +11975,8 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_shlibpath_overrides_runpath=no +else case e in #( + e) lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ @@ -11861,7 +12003,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir - + ;; +esac fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath @@ -12286,16 +12429,22 @@ printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -12307,24 +12456,27 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes -else $as_nop - ac_cv_lib_dl_dlopen=no +else case e in #( + e) ac_cv_lib_dl_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop - +else case e in #( + e) lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes - + ;; +esac fi ;; @@ -12342,22 +12494,28 @@ fi if test "x$ac_cv_func_shl_load" = xyes then : lt_cv_dlopen=shl_load -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char shl_load (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (void); int main (void) { @@ -12369,39 +12527,47 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes -else $as_nop - ac_cv_lib_dld_shl_load=no +else case e in #( + e) ac_cv_lib_dld_shl_load=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else $as_nop - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +else case e in #( + e) ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes then : lt_cv_dlopen=dlopen -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -12413,34 +12579,42 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes -else $as_nop - ac_cv_lib_dl_dlopen=no +else case e in #( + e) ac_cv_lib_dl_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -12452,34 +12626,42 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes -else $as_nop - ac_cv_lib_svld_dlopen=no +else case e in #( + e) ac_cv_lib_svld_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dld_link (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (void); int main (void) { @@ -12491,12 +12673,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes -else $as_nop - ac_cv_lib_dld_dld_link=no +else case e in #( + e) ac_cv_lib_dld_dld_link=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } @@ -12505,19 +12689,24 @@ then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi ;; @@ -12545,8 +12734,8 @@ printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 -else $as_nop - if test yes = "$cross_compiling"; then : +else case e in #( + e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -12640,7 +12829,8 @@ _LT_EOF fi rm -fr conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } @@ -12652,8 +12842,8 @@ printf %s "checking whether a statically linked program can dlopen itself... " > if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 -else $as_nop - if test yes = "$cross_compiling"; then : +else case e in #( + e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -12747,7 +12937,8 @@ _LT_EOF fi rm -fr conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } @@ -12921,8 +13112,9 @@ printf %s "checking whether to enable maintainer-specific portions of Makefiles. if test ${enable_maintainer_mode+y} then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else $as_nop - USE_MAINTAINER_MODE=no +else case e in #( + e) USE_MAINTAINER_MODE=no ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 @@ -12958,8 +13150,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -12981,7 +13173,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13003,8 +13196,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13026,7 +13219,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -13061,8 +13255,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13084,7 +13278,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13106,8 +13301,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no @@ -13146,7 +13341,8 @@ if test $ac_prog_rejected = yes; then ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13170,8 +13366,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13193,7 +13389,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13219,8 +13416,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13242,7 +13439,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -13280,8 +13478,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13303,7 +13501,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13325,8 +13524,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13348,7 +13547,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -13377,10 +13577,10 @@ fi fi -test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -13412,8 +13612,8 @@ printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -13430,12 +13630,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes -else $as_nop - ac_compiler_gnu=no +else case e in #( + e) ac_compiler_gnu=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } @@ -13453,8 +13655,8 @@ printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_save_c_werror_flag=$ac_c_werror_flag +else case e in #( + e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" @@ -13472,8 +13674,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes -else $as_nop - CFLAGS="" +else case e in #( + e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13488,8 +13690,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - ac_c_werror_flag=$ac_save_c_werror_flag +else case e in #( + e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13506,12 +13708,15 @@ if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag + ac_c_werror_flag=$ac_save_c_werror_flag ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } @@ -13538,8 +13743,8 @@ printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c11=no +else case e in #( + e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13556,25 +13761,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c11" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } - CC="$CC $ac_cv_prog_cc_c11" + CC="$CC $ac_cv_prog_cc_c11" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 + ac_prog_cc_stdc=c11 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -13584,8 +13792,8 @@ printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c99=no +else case e in #( + e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13602,25 +13810,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c99" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } - CC="$CC $ac_cv_prog_cc_c99" + CC="$CC $ac_cv_prog_cc_c99" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 + ac_prog_cc_stdc=c99 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -13630,8 +13841,8 @@ printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c89=no +else case e in #( + e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13648,25 +13859,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c89" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } - CC="$CC $ac_cv_prog_cc_c89" + CC="$CC $ac_cv_prog_cc_c89" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 + ac_prog_cc_stdc=c89 ;; +esac fi fi @@ -13687,8 +13901,8 @@ printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -13718,7 +13932,8 @@ _ACEOF fi done rm -f core conftest* - unset am_i + unset am_i ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } @@ -13744,8 +13959,8 @@ printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then +else case e in #( + e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up @@ -13849,7 +14064,8 @@ else $as_nop else am_cv_CC_dependencies_compiler_type=none fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } @@ -13905,15 +14121,21 @@ printf %s "checking for library containing floor... " >&6; } if test ${ac_cv_search_floor+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char floor (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char floor (void); int main (void) { @@ -13944,11 +14166,13 @@ done if test ${ac_cv_search_floor+y} then : -else $as_nop - ac_cv_search_floor=no +else case e in #( + e) ac_cv_search_floor=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_floor" >&5 printf "%s\n" "$ac_cv_search_floor" >&6; } @@ -13957,11 +14181,12 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -else $as_nop - +else case e in #( + e) echo "floor()" exit 1 - + ;; +esac fi @@ -13971,15 +14196,21 @@ printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char socket (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char socket (void); int main (void) { @@ -14010,11 +14241,13 @@ done if test ${ac_cv_search_socket+y} then : -else $as_nop - ac_cv_search_socket=no +else case e in #( + e) ac_cv_search_socket=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } @@ -14023,11 +14256,12 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -else $as_nop - +else case e in #( + e) echo "socket()" exit 1 - + ;; +esac fi @@ -14037,15 +14271,21 @@ printf %s "checking for library containing inet_ntop... " >&6; } if test ${ac_cv_search_inet_ntop+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char inet_ntop (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char inet_ntop (void); int main (void) { @@ -14076,11 +14316,13 @@ done if test ${ac_cv_search_inet_ntop+y} then : -else $as_nop - ac_cv_search_inet_ntop=no +else case e in #( + e) ac_cv_search_inet_ntop=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 printf "%s\n" "$ac_cv_search_inet_ntop" >&6; } @@ -14089,11 +14331,12 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -else $as_nop - +else case e in #( + e) echo "inet_ntop()" exit 1 - + ;; +esac fi @@ -14103,8 +14346,8 @@ printf %s "checking for an ANSI C-conforming const... " >&6; } if test ${ac_cv_c_const+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -14168,10 +14411,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_const=yes -else $as_nop - ac_cv_c_const=no +else case e in #( + e) ac_cv_c_const=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 printf "%s\n" "$ac_cv_c_const" >&6; } @@ -14197,8 +14442,8 @@ if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 -else $as_nop - # Double quotes because $CC needs to be expanded +else case e in #( + e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false @@ -14216,9 +14461,10 @@ _ACEOF if ac_fn_c_try_cpp "$LINENO" then : -else $as_nop - # Broken: fails on valid input. -continue +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext @@ -14232,15 +14478,16 @@ if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue -else $as_nop - # Passes both tests. +else case e in #( + e) # Passes both tests. ac_preproc_ok=: -break +break ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : @@ -14249,7 +14496,8 @@ fi done ac_cv_prog_CPP=$CPP - + ;; +esac fi CPP=$ac_cv_prog_CPP else @@ -14272,9 +14520,10 @@ _ACEOF if ac_fn_c_try_cpp "$LINENO" then : -else $as_nop - # Broken: fails on valid input. -continue +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext @@ -14288,24 +14537,26 @@ if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue -else $as_nop - # Passes both tests. +else case e in #( + e) # Passes both tests. ac_preproc_ok=: -break +break ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi ac_ext=c @@ -14315,6 +14566,140 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 +printf %s "checking for egrep -e... " >&6; } +if test ${ac_cv_path_EGREP_TRADITIONAL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + : + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + + if test "$ac_cv_path_EGREP_TRADITIONAL" +then : + ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + ;; +esac +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 +printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } + EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL + @@ -14355,8 +14740,14 @@ printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char pthread_join (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (void); int main (void) { @@ -14450,7 +14841,7 @@ case $host_os in _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 + $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} @@ -14480,8 +14871,8 @@ printf %s "checking whether $CC is Clang... " >&6; } if test ${ax_cv_PTHREAD_CLANG+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_CLANG=no +else case e in #( + e) ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14493,14 +14884,15 @@ else $as_nop _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 + $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 then : ax_cv_PTHREAD_CLANG=yes fi rm -rf conftest* fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } @@ -14550,8 +14942,9 @@ esac if test "x$ax_pthread_check_macro" = "x--" then : ax_pthread_check_cond=0 -else $as_nop - ax_pthread_check_cond="!defined($ax_pthread_check_macro)" +else case e in #( + e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;; +esac fi @@ -14585,8 +14978,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ax_pthread_config+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ax_pthread_config"; then +else case e in #( + e) if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -14609,7 +15002,8 @@ done IFS=$as_save_IFS test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" -fi +fi ;; +esac fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then @@ -14742,8 +15136,8 @@ printf %s "checking whether Clang needs flag to prevent \"argument unused\" warn if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown +else case e in #( + e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second @@ -14789,7 +15183,8 @@ then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } @@ -14816,8 +15211,8 @@ printf %s "checking for joinable pthread attribute... " >&6; } if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_JOINABLE_ATTR=unknown +else case e in #( + e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14837,7 +15232,8 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } @@ -14857,14 +15253,15 @@ printf %s "checking whether more special flags are required for pthreads... " >& if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_SPECIAL_FLAGS=no +else case e in #( + e) ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } @@ -14880,8 +15277,8 @@ printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -14896,12 +15293,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_PRIO_INHERIT=yes -else $as_nop - ax_cv_PTHREAD_PRIO_INHERIT=no +else case e in #( + e) ax_cv_PTHREAD_PRIO_INHERIT=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } @@ -14951,8 +15350,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$PTHREAD_CC"; then +else case e in #( + e) if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -14974,7 +15373,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then @@ -15001,8 +15401,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CXX+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$PTHREAD_CXX"; then +else case e in #( + e) if test -n "$PTHREAD_CXX"; then ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15024,7 +15424,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX if test -n "$PTHREAD_CXX"; then @@ -15109,8 +15510,8 @@ if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } -else $as_nop - save_LIBS="$LIBS" +else case e in #( + e) save_LIBS="$LIBS" LIBS="$LIBS -latomic" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15127,13 +15528,15 @@ if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - as_fn_error $? "failed to find working configuration with atomics" "$LINENO" 5 - +else case e in #( + e) as_fn_error $? "failed to find working configuration with atomics" "$LINENO" 5 + ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - + ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -15169,11 +15572,12 @@ then : ;; esac -else $as_nop - +else case e in #( + e) try_sctp=true - + ;; +esac fi @@ -15212,15 +15616,21 @@ printf %s "checking for library containing sctp_bindx... " >&6; } if test ${ac_cv_search_sctp_bindx+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char sctp_bindx (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char sctp_bindx (void); int main (void) { @@ -15251,11 +15661,13 @@ done if test ${ac_cv_search_sctp_bindx+y} then : -else $as_nop - ac_cv_search_sctp_bindx=no +else case e in #( + e) ac_cv_search_sctp_bindx=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sctp_bindx" >&5 printf "%s\n" "$ac_cv_search_sctp_bindx" >&6; } @@ -15279,8 +15691,8 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @@ -15310,12 +15722,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - eval "$3=yes" +else case e in #( + e) eval "$3=yes" ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -15344,20 +15758,22 @@ then : printf "%s\n" "#define HAVE_ENDIAN_H 1" >>confdefs.h -else $as_nop - ac_fn_c_check_header_compile "$LINENO" "sys/endian.h" "ac_cv_header_sys_endian_h" "$ac_includes_default" +else case e in #( + e) ac_fn_c_check_header_compile "$LINENO" "sys/endian.h" "ac_cv_header_sys_endian_h" "$ac_includes_default" if test "x$ac_cv_header_sys_endian_h" = xyes then : printf "%s\n" "#define HAVE_SYS_ENDIAN_H 1" >>confdefs.h -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Couldn't find endian.h or sys/endian.h files: doing compile-time tests." >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Couldn't find endian.h or sys/endian.h files: doing compile-time tests." >&5 printf "%s\n" "$as_me: WARNING: Couldn't find endian.h or sys/endian.h files: doing compile-time tests." >&2;} - + ;; +esac fi - + ;; +esac fi @@ -15382,8 +15798,8 @@ then : ;; esac -else $as_nop - +else case e in #( + e) # if pkg-config is installed and openssl has installed a .pc file, # then use that information and don't search ssldirs if test -n "$ac_tool_prefix"; then @@ -15394,8 +15810,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PKG_CONFIG+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$PKG_CONFIG"; then +else case e in #( + e) if test -n "$PKG_CONFIG"; then ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15417,7 +15833,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi PKG_CONFIG=$ac_cv_prog_PKG_CONFIG if test -n "$PKG_CONFIG"; then @@ -15439,8 +15856,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_PKG_CONFIG+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_PKG_CONFIG"; then +else case e in #( + e) if test -n "$ac_ct_PKG_CONFIG"; then ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15462,7 +15879,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG if test -n "$ac_ct_PKG_CONFIG"; then @@ -15502,7 +15920,8 @@ fi ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr" fi - + ;; +esac fi @@ -15568,18 +15987,19 @@ printf "%s\n" "#define HAVE_SSL 1" >>confdefs.h have_ssl=true -else $as_nop - +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if test "x$with_openssl" != "x"; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "--with-openssl was given, but test for OpenSSL failed -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } fi - + ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -15609,8 +16029,8 @@ printf %s "checking TCP_CONGESTION socket option... " >&6; } if test ${iperf3_cv_header_tcp_congestion+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -15624,10 +16044,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_tcp_congestion=yes -else $as_nop - iperf3_cv_header_tcp_congestion=no +else case e in #( + e) iperf3_cv_header_tcp_congestion=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_tcp_congestion" >&5 printf "%s\n" "$iperf3_cv_header_tcp_congestion" >&6; } @@ -15643,8 +16065,8 @@ printf %s "checking TCP_USER_TIMEOUT socket option... " >&6; } if test ${iperf3_cv_header_tcp_user_timeout+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -15658,10 +16080,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_tcp_user_timeout=yes -else $as_nop - iperf3_cv_header_tcp_user_timeout=no +else case e in #( + e) iperf3_cv_header_tcp_user_timeout=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_tcp_user_timeout" >&5 printf "%s\n" "$iperf3_cv_header_tcp_user_timeout" >&6; } @@ -15680,8 +16104,8 @@ printf %s "checking IPv6 flowlabel support... " >&6; } if test ${iperf3_cv_header_flowlabel+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -15696,10 +16120,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_flowlabel=yes -else $as_nop - iperf3_cv_header_flowlabel=no +else case e in #( + e) iperf3_cv_header_flowlabel=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_flowlabel" >&5 printf "%s\n" "$iperf3_cv_header_flowlabel" >&6; } @@ -15717,12 +16143,12 @@ fi for ac_func in cpuset_setaffinity sched_setaffinity SetProcessAffinityMask do : - as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes" then : cat >>confdefs.h <<_ACEOF -#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1 _ACEOF printf "%s\n" "#define HAVE_CPU_AFFINITY 1" >>confdefs.h @@ -15767,8 +16193,8 @@ printf %s "checking SO_MAX_PACING_RATE socket option... " >&6; } if test ${iperf3_cv_header_so_max_pacing_rate+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -15782,10 +16208,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_so_max_pacing_rate=yes -else $as_nop - iperf3_cv_header_so_max_pacing_rate=no +else case e in #( + e) iperf3_cv_header_so_max_pacing_rate=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_so_max_pacing_rate" >&5 printf "%s\n" "$iperf3_cv_header_so_max_pacing_rate" >&6; } @@ -15801,8 +16229,8 @@ printf %s "checking SO_BINDTODEVICE socket option... " >&6; } if test ${iperf3_cv_header_so_bindtodevice+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -15816,10 +16244,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_so_bindtodevice=yes -else $as_nop - iperf3_cv_header_so_bindtodevice=no +else case e in #( + e) iperf3_cv_header_so_bindtodevice=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_so_bindtodevice" >&5 printf "%s\n" "$iperf3_cv_header_so_bindtodevice" >&6; } @@ -15835,8 +16265,8 @@ printf %s "checking IP_MTU_DISCOVER socket option... " >&6; } if test ${iperf3_cv_header_ip_mtu_discover+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -15852,10 +16282,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_ip_mtu_discover=yes -else $as_nop - iperf3_cv_header_ip_mtu_discover=no +else case e in #( + e) iperf3_cv_header_ip_mtu_discover=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_ip_mtu_discover" >&5 printf "%s\n" "$iperf3_cv_header_ip_mtu_discover" >&6; } @@ -15871,8 +16303,8 @@ printf %s "checking IP_DONTFRAG socket option... " >&6; } if test ${iperf3_cv_header_ip_dontfrag+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -15888,10 +16320,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_ip_dontfrag=yes -else $as_nop - iperf3_cv_header_ip_dontfrag=no +else case e in #( + e) iperf3_cv_header_ip_dontfrag=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_ip_dontfrag" >&5 printf "%s\n" "$iperf3_cv_header_ip_dontfrag" >&6; } @@ -15907,8 +16341,8 @@ printf %s "checking IP_DONTFRAGMENT socket option... " >&6; } if test ${iperf3_cv_header_ip_dontfragment+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -15924,10 +16358,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_ip_dontfragment=yes -else $as_nop - iperf3_cv_header_ip_dontfragment=no +else case e in #( + e) iperf3_cv_header_ip_dontfragment=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_ip_dontfragment" >&5 printf "%s\n" "$iperf3_cv_header_ip_dontfragment" >&6; } @@ -15943,12 +16379,13 @@ printf %s "checking any kind of DF socket option... " >&6; } if test ${iperf3_cv_header_dontfragment+y} then : printf %s "(cached) " >&6 -else $as_nop - if test "x$iperf3_cv_header_ip_mtu_discover" = "xyes" -o "x$iperf3_cv_header_ip_dontfrag" = "xyes" -o "x$iperf3_cv_header_ip_dontfragment" = "xyes"; then +else case e in #( + e) if test "x$iperf3_cv_header_ip_mtu_discover" = "xyes" -o "x$iperf3_cv_header_ip_dontfrag" = "xyes" -o "x$iperf3_cv_header_ip_dontfragment" = "xyes"; then iperf3_cv_header_dontfragment=yes else iperf3_cv_header_dontfragment=no -fi +fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_dontfragment" >&5 printf "%s\n" "$iperf3_cv_header_dontfragment" >&6; } @@ -15973,8 +16410,9 @@ ac_fn_c_check_member "$LINENO" "struct tcp_info" "tcpi_snd_wnd" "ac_cv_member_st if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_wnd" = xyes then : iperf3_cv_header_tcp_info_snd_wnd=yes -else $as_nop - iperf3_cv_header_tcp_info_snd_wnd=no +else case e in #( + e) iperf3_cv_header_tcp_info_snd_wnd=no ;; +esac fi @@ -15990,15 +16428,21 @@ printf %s "checking for library containing clock_gettime... " >&6; } if test ${ac_cv_search_clock_gettime+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char clock_gettime (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (void); int main (void) { @@ -16029,11 +16473,13 @@ done if test ${ac_cv_search_clock_gettime+y} then : -else $as_nop - ac_cv_search_clock_gettime=no +else case e in #( + e) ac_cv_search_clock_gettime=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 printf "%s\n" "$ac_cv_search_clock_gettime" >&6; } @@ -16065,8 +16511,8 @@ cat >confcache <<\_ACEOF # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the +# 'ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF @@ -16096,14 +16542,14 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote + # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) - # `set' quotes correctly as required by POSIX, so do not add quotes. + # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | @@ -16233,7 +16679,6 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh @@ -16242,12 +16687,13 @@ then : # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else $as_nop - case `(set -o) 2>/dev/null` in #( +else case e in #( + e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi @@ -16319,7 +16765,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as `sh COMMAND' +# We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 @@ -16348,7 +16794,6 @@ as_fn_error () } # as_fn_error - # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -16388,11 +16833,12 @@ then : { eval $1+=\$2 }' -else $as_nop - as_fn_append () +else case e in #( + e) as_fn_append () { eval $1=\$$1\$2 - } + } ;; +esac fi # as_fn_append # as_fn_arith ARG... @@ -16406,11 +16852,12 @@ then : { as_val=$(( $* )) }' -else $as_nop - as_fn_arith () +else case e in #( + e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } + } ;; +esac fi # as_fn_arith @@ -16493,9 +16940,9 @@ if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then @@ -16576,10 +17023,12 @@ as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 @@ -16595,7 +17044,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # values after options handling. ac_log=" This file was extended by iperf $as_me 3.16+, which was -generated by GNU Autoconf 2.71. Invocation command line was +generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -16627,7 +17076,7 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions +'$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. @@ -16664,10 +17113,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ iperf config.status 3.16+ -configured by $0, generated by GNU Autoconf 2.71, +configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -16729,8 +17178,8 @@ do ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; + as_fn_error $? "ambiguous option: '$1' +Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -16738,8 +17187,8 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; + -*) as_fn_error $? "unrecognized option: '$1' +Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; @@ -17086,7 +17535,7 @@ do "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "iperf3.spec") CONFIG_FILES="$CONFIG_FILES iperf3.spec" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done @@ -17106,7 +17555,7 @@ fi # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. +# after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= @@ -17130,7 +17579,7 @@ ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. +# This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then @@ -17288,13 +17737,13 @@ fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. +# This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF -# Transform confdefs.h into an awk script `defines.awk', embedded as +# Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. @@ -17404,7 +17853,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -17426,19 +17875,19 @@ do -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. + # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done - # Let's still pretend it is `configure' which instantiates (i.e., don't + # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` @@ -17571,7 +18020,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 esac _ACEOF -# Neutralize VPATH when `$srcdir' = `.'. +# Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -17602,9 +18051,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -17759,15 +18208,15 @@ printf "%s\n" X/"$am_mf" | (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} diff --git a/src/Makefile.in b/src/Makefile.in index e13e4edc5..981650263 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -150,8 +150,8 @@ libiperf_la_LIBADD = am_libiperf_la_OBJECTS = cjson.lo iperf_api.lo iperf_error.lo \ iperf_auth.lo iperf_client_api.lo iperf_locale.lo \ iperf_server_api.lo iperf_tcp.lo iperf_udp.lo iperf_sctp.lo \ - iperf_util.lo iperf_time.lo dscp.lo net.lo tcp_info.lo \ - timer.lo units.lo + iperf_util.lo iperf_time.lo iperf_pthread.lo dscp.lo net.lo \ + tcp_info.lo timer.lo units.lo libiperf_la_OBJECTS = $(am_libiperf_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -168,9 +168,9 @@ am__iperf3_profile_SOURCES_DIST = main.c cjson.c cjson.h flowlabel.h \ iperf_auth.c iperf_client_api.c iperf_locale.c iperf_locale.h \ iperf_server_api.c iperf_tcp.c iperf_tcp.h iperf_udp.c \ iperf_udp.h iperf_sctp.c iperf_sctp.h iperf_util.c \ - iperf_util.h iperf_time.c iperf_time.h dscp.c net.c net.h \ - portable_endian.h queue.h tcp_info.c timer.c timer.h units.c \ - units.h version.h + iperf_util.h iperf_time.c iperf_time.h iperf_pthread.c \ + iperf_pthread.h dscp.c net.c net.h portable_endian.h queue.h \ + tcp_info.c timer.c timer.h units.c units.h version.h am__objects_1 = iperf3_profile-cjson.$(OBJEXT) \ iperf3_profile-iperf_api.$(OBJEXT) \ iperf3_profile-iperf_error.$(OBJEXT) \ @@ -183,6 +183,7 @@ am__objects_1 = iperf3_profile-cjson.$(OBJEXT) \ iperf3_profile-iperf_sctp.$(OBJEXT) \ iperf3_profile-iperf_util.$(OBJEXT) \ iperf3_profile-iperf_time.$(OBJEXT) \ + iperf3_profile-iperf_pthread.$(OBJEXT) \ iperf3_profile-dscp.$(OBJEXT) iperf3_profile-net.$(OBJEXT) \ iperf3_profile-tcp_info.$(OBJEXT) \ iperf3_profile-timer.$(OBJEXT) iperf3_profile-units.$(OBJEXT) @@ -248,6 +249,7 @@ am__depfiles_remade = ./$(DEPDIR)/cjson.Plo ./$(DEPDIR)/dscp.Plo \ ./$(DEPDIR)/iperf3_profile-iperf_client_api.Po \ ./$(DEPDIR)/iperf3_profile-iperf_error.Po \ ./$(DEPDIR)/iperf3_profile-iperf_locale.Po \ + ./$(DEPDIR)/iperf3_profile-iperf_pthread.Po \ ./$(DEPDIR)/iperf3_profile-iperf_sctp.Po \ ./$(DEPDIR)/iperf3_profile-iperf_server_api.Po \ ./$(DEPDIR)/iperf3_profile-iperf_tcp.Po \ @@ -261,14 +263,14 @@ am__depfiles_remade = ./$(DEPDIR)/cjson.Plo ./$(DEPDIR)/dscp.Plo \ ./$(DEPDIR)/iperf3_profile-units.Po ./$(DEPDIR)/iperf_api.Plo \ ./$(DEPDIR)/iperf_auth.Plo ./$(DEPDIR)/iperf_client_api.Plo \ ./$(DEPDIR)/iperf_error.Plo ./$(DEPDIR)/iperf_locale.Plo \ - ./$(DEPDIR)/iperf_sctp.Plo ./$(DEPDIR)/iperf_server_api.Plo \ - ./$(DEPDIR)/iperf_tcp.Plo ./$(DEPDIR)/iperf_time.Plo \ - ./$(DEPDIR)/iperf_udp.Plo ./$(DEPDIR)/iperf_util.Plo \ - ./$(DEPDIR)/net.Plo ./$(DEPDIR)/t_api-t_api.Po \ - ./$(DEPDIR)/t_auth-t_auth.Po ./$(DEPDIR)/t_timer-t_timer.Po \ - ./$(DEPDIR)/t_units-t_units.Po ./$(DEPDIR)/t_uuid-t_uuid.Po \ - ./$(DEPDIR)/tcp_info.Plo ./$(DEPDIR)/timer.Plo \ - ./$(DEPDIR)/units.Plo + ./$(DEPDIR)/iperf_pthread.Plo ./$(DEPDIR)/iperf_sctp.Plo \ + ./$(DEPDIR)/iperf_server_api.Plo ./$(DEPDIR)/iperf_tcp.Plo \ + ./$(DEPDIR)/iperf_time.Plo ./$(DEPDIR)/iperf_udp.Plo \ + ./$(DEPDIR)/iperf_util.Plo ./$(DEPDIR)/net.Plo \ + ./$(DEPDIR)/t_api-t_api.Po ./$(DEPDIR)/t_auth-t_auth.Po \ + ./$(DEPDIR)/t_timer-t_timer.Po ./$(DEPDIR)/t_units-t_units.Po \ + ./$(DEPDIR)/t_uuid-t_uuid.Po ./$(DEPDIR)/tcp_info.Plo \ + ./$(DEPDIR)/timer.Plo ./$(DEPDIR)/units.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -665,6 +667,8 @@ libiperf_la_SOURCES = \ iperf_util.h \ iperf_time.c \ iperf_time.h \ + iperf_pthread.c \ + iperf_pthread.h \ dscp.c \ net.c \ net.h \ @@ -908,6 +912,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_client_api.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_error.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_locale.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_pthread.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_sctp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_server_api.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_tcp.Po@am__quote@ # am--include-marker @@ -924,6 +929,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_client_api.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_error.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_locale.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_pthread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_sctp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_server_api.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_tcp.Plo@am__quote@ # am--include-marker @@ -1163,6 +1169,20 @@ iperf3_profile-iperf_time.obj: iperf_time.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -c -o iperf3_profile-iperf_time.obj `if test -f 'iperf_time.c'; then $(CYGPATH_W) 'iperf_time.c'; else $(CYGPATH_W) '$(srcdir)/iperf_time.c'; fi` +iperf3_profile-iperf_pthread.o: iperf_pthread.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -MT iperf3_profile-iperf_pthread.o -MD -MP -MF $(DEPDIR)/iperf3_profile-iperf_pthread.Tpo -c -o iperf3_profile-iperf_pthread.o `test -f 'iperf_pthread.c' || echo '$(srcdir)/'`iperf_pthread.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iperf3_profile-iperf_pthread.Tpo $(DEPDIR)/iperf3_profile-iperf_pthread.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iperf_pthread.c' object='iperf3_profile-iperf_pthread.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -c -o iperf3_profile-iperf_pthread.o `test -f 'iperf_pthread.c' || echo '$(srcdir)/'`iperf_pthread.c + +iperf3_profile-iperf_pthread.obj: iperf_pthread.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -MT iperf3_profile-iperf_pthread.obj -MD -MP -MF $(DEPDIR)/iperf3_profile-iperf_pthread.Tpo -c -o iperf3_profile-iperf_pthread.obj `if test -f 'iperf_pthread.c'; then $(CYGPATH_W) 'iperf_pthread.c'; else $(CYGPATH_W) '$(srcdir)/iperf_pthread.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iperf3_profile-iperf_pthread.Tpo $(DEPDIR)/iperf3_profile-iperf_pthread.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iperf_pthread.c' object='iperf3_profile-iperf_pthread.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -c -o iperf3_profile-iperf_pthread.obj `if test -f 'iperf_pthread.c'; then $(CYGPATH_W) 'iperf_pthread.c'; else $(CYGPATH_W) '$(srcdir)/iperf_pthread.c'; fi` + iperf3_profile-dscp.o: dscp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -MT iperf3_profile-dscp.o -MD -MP -MF $(DEPDIR)/iperf3_profile-dscp.Tpo -c -o iperf3_profile-dscp.o `test -f 'dscp.c' || echo '$(srcdir)/'`dscp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iperf3_profile-dscp.Tpo $(DEPDIR)/iperf3_profile-dscp.Po @@ -1751,6 +1771,7 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/iperf3_profile-iperf_client_api.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_error.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_locale.Po + -rm -f ./$(DEPDIR)/iperf3_profile-iperf_pthread.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_sctp.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_server_api.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_tcp.Po @@ -1767,6 +1788,7 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/iperf_client_api.Plo -rm -f ./$(DEPDIR)/iperf_error.Plo -rm -f ./$(DEPDIR)/iperf_locale.Plo + -rm -f ./$(DEPDIR)/iperf_pthread.Plo -rm -f ./$(DEPDIR)/iperf_sctp.Plo -rm -f ./$(DEPDIR)/iperf_server_api.Plo -rm -f ./$(DEPDIR)/iperf_tcp.Plo @@ -1837,6 +1859,7 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/iperf3_profile-iperf_client_api.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_error.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_locale.Po + -rm -f ./$(DEPDIR)/iperf3_profile-iperf_pthread.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_sctp.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_server_api.Po -rm -f ./$(DEPDIR)/iperf3_profile-iperf_tcp.Po @@ -1853,6 +1876,7 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/iperf_client_api.Plo -rm -f ./$(DEPDIR)/iperf_error.Plo -rm -f ./$(DEPDIR)/iperf_locale.Plo + -rm -f ./$(DEPDIR)/iperf_pthread.Plo -rm -f ./$(DEPDIR)/iperf_sctp.Plo -rm -f ./$(DEPDIR)/iperf_server_api.Plo -rm -f ./$(DEPDIR)/iperf_tcp.Plo diff --git a/src/iperf_config.h.in b/src/iperf_config.h.in index bb8853ff4..c85b19521 100644 --- a/src/iperf_config.h.in +++ b/src/iperf_config.h.in @@ -1,15 +1,15 @@ /* src/iperf_config.h.in. Generated from configure.ac by autoheader. */ -/* Define to 1 if you have the `clock_gettime' function. */ +/* Define to 1 if you have the 'clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME -/* Define to 1 if you have the `cpuset_setaffinity' function. */ +/* Define to 1 if you have the 'cpuset_setaffinity' function. */ #undef HAVE_CPUSET_SETAFFINITY /* Have CPU affinity support. */ #undef HAVE_CPU_AFFINITY -/* Define to 1 if you have the `daemon' function. */ +/* Define to 1 if you have the 'daemon' function. */ #undef HAVE_DAEMON /* Define to 1 if you have the header file. */ @@ -24,7 +24,7 @@ /* Have IPv6 flowlabel support. */ #undef HAVE_FLOWLABEL -/* Define to 1 if you have the `getline' function. */ +/* Define to 1 if you have the 'getline' function. */ #undef HAVE_GETLINE /* Define to 1 if you have the header file. */ @@ -54,16 +54,16 @@ /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT -/* Define to 1 if you have the `sched_setaffinity' function. */ +/* Define to 1 if you have the 'sched_setaffinity' function. */ #undef HAVE_SCHED_SETAFFINITY /* Have SCTP support. */ #undef HAVE_SCTP_H -/* Define to 1 if you have the `sendfile' function. */ +/* Define to 1 if you have the 'sendfile' function. */ #undef HAVE_SENDFILE -/* Define to 1 if you have the `SetProcessAffinityMask' function. */ +/* Define to 1 if you have the 'SetProcessAffinityMask' function. */ #undef HAVE_SETPROCESSAFFINITYMASK /* Have SO_BINDTODEVICE sockopt. */ @@ -93,7 +93,7 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H -/* Define to 1 if the system has the type `struct sctp_assoc_value'. */ +/* Define to 1 if the system has the type 'struct sctp_assoc_value'. */ #undef HAVE_STRUCT_SCTP_ASSOC_VALUE /* Define to 1 if you have the header file. */ @@ -148,7 +148,7 @@ your system. */ #undef PTHREAD_CREATE_JOINABLE -/* Define to 1 if all of the C90 standard headers exist (not just the ones +/* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS @@ -156,5 +156,5 @@ /* Version number of package */ #undef VERSION -/* Define to empty if `const' does not conform to ANSI C. */ +/* Define to empty if 'const' does not conform to ANSI C. */ #undef const From 9632f93394f96b041303343a55119e6c3fbe20f5 Mon Sep 17 00:00:00 2001 From: David Bar-On <61089727+davidBar-On@users.noreply.github.com> Date: Fri, 26 Apr 2024 01:10:04 +0300 Subject: [PATCH 086/286] Prevent server termination with JSON and remove redundant code with error (#1677) * Fix #1631 - prevent server termination with JSON and remove redundant code with error * Per reviewer comments: switched lock and unlock --- src/iperf_api.c | 11 +---------- src/iperf_error.c | 15 ++++++++------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 02b34e5f5..139ab87fb 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -4889,16 +4889,7 @@ iperf_json_finish(struct iperf_test *test) cJSON_Delete(test->json_top); test->json_top = NULL; } - // Get ASCII rendering of JSON structure. Then make our - // own copy of it and return the storage that cJSON allocated - // on our behalf. We keep our own copy around. - char *str = cJSON_Print(test->json_top); - if (str == NULL) - return -1; - test->json_output_string = strdup(str); - cJSON_free(str); - if (test->json_output_string == NULL) - return -1; + if (test->json_stream) { cJSON *error = cJSON_GetObjectItem(test->json_top, "error"); if (error) { diff --git a/src/iperf_error.c b/src/iperf_error.c index 231f0025e..12ab3eb7d 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -94,10 +94,6 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) struct tm *ltm = NULL; char *ct = NULL; - if (pthread_mutex_lock(&(test->print_mutex)) != 0) { - perror("iperf_errexit: pthread_mutex_lock"); - } - /* Timestamp if requested */ if (test != NULL && test->timestamps) { time(&now); @@ -113,7 +109,11 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) cJSON_AddStringToObject(test->json_top, "error", str); } iperf_json_finish(test); - } else + } else { + if (pthread_mutex_lock(&(test->print_mutex)) != 0) { + perror("iperf_errexit: pthread_mutex_lock"); + } + if (test && test->outfile && test->outfile != stdout) { if (ct) { fprintf(test->outfile, "%s", ct); @@ -127,8 +127,9 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) fprintf(stderr, "iperf3: %s\n", str); } - if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { - perror("iperf_errexit: pthread_mutex_unlock"); + if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { + perror("iperf_errexit: pthread_mutex_unlock"); + } } va_end(argp); From 4058461d14d359831913f1cd147579244b750f3e Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 25 Apr 2024 23:10:03 -0700 Subject: [PATCH 087/286] Shrink critical section in iperf_err(). This is similar to what was done for iperf_errexit() in a previous commit. --- src/iperf_error.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/iperf_error.c b/src/iperf_error.c index 12ab3eb7d..0fedf3110 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -47,10 +47,6 @@ iperf_err(struct iperf_test *test, const char *format, ...) struct tm *ltm = NULL; char *ct = NULL; - if (pthread_mutex_lock(&(test->print_mutex)) != 0) { - perror("iperf_err: pthread_mutex_lock"); - } - /* Timestamp if requested */ if (test != NULL && test->timestamps) { time(&now); @@ -64,6 +60,10 @@ iperf_err(struct iperf_test *test, const char *format, ...) if (test != NULL && test->json_output && test->json_top != NULL) cJSON_AddStringToObject(test->json_top, "error", str); else { + if (pthread_mutex_lock(&(test->print_mutex)) != 0) { + perror("iperf_err: pthread_mutex_lock"); + } + if (test && test->outfile && test->outfile != stdout) { if (ct) { fprintf(test->outfile, "%s", ct); @@ -76,12 +76,13 @@ iperf_err(struct iperf_test *test, const char *format, ...) } fprintf(stderr, "iperf3: %s\n", str); } - } - va_end(argp); - if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { - perror("iperf_err: pthread_mutex_unlock"); + if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { + perror("iperf_err: pthread_mutex_unlock"); + } + } + va_end(argp); } /* Do a printf to stderr or log file as appropriate, then exit. */ From fd96963e1e58d9933fe4666bd7071429458aac6c Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 25 Apr 2024 23:12:01 -0700 Subject: [PATCH 088/286] Restructure iperf_json_finish() to eliminate duplicate --json output. (#1688) Add locking around fprintf() calls in JSONStream_Output(). Probably not needed at the moment given that this function can only be called from the main thread, but added for consistency and possible future usage. --- src/iperf_api.c | 85 ++++++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 139ab87fb..d40561c10 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2766,13 +2766,19 @@ JSONStream_Output(struct iperf_test * test, const char * event_name, cJSON * obj { cJSON *event = cJSON_CreateObject(); if (!event) - return -1; + return -1; cJSON_AddStringToObject(event, "event", event_name); cJSON_AddItemReferenceToObject(event, "data", obj); char *str = cJSON_PrintUnformatted(event); if (str == NULL) - return -1; + return -1; + if (pthread_mutex_lock(&(test->print_mutex)) != 0) { + perror("iperf_json_finish: pthread_mutex_lock"); + } fprintf(test->outfile, "%s\n", str); + if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { + perror("iperf_json_finish: pthread_mutex_unlock"); + } iflush(test); cJSON_free(str); cJSON_Delete(event); @@ -4865,49 +4871,50 @@ iperf_json_finish(struct iperf_test *test) if (test->server_output_text) { cJSON_AddStringToObject(test->json_top, "server_output_text", test->server_output_text); } - // Get ASCII rendering of JSON structure. Then make our - // own copy of it and return the storage that cJSON allocated - // on our behalf. We keep our own copy around. - char *str = cJSON_Print(test->json_top); - if (str == NULL) { - return -1; - } - test->json_output_string = strdup(str); - cJSON_free(str); - if (test->json_output_string == NULL) { - return -1; - } - if (pthread_mutex_lock(&(test->print_mutex)) != 0) { - perror("iperf_json_finish: pthread_mutex_lock"); + /* --json-stream, so we print various individual objects */ + if (test->json_stream) { + cJSON *error = cJSON_GetObjectItem(test->json_top, "error"); + if (error) { + JSONStream_Output(test, "error", error); + } + if (test->json_server_output) { + JSONStream_Output(test, "server_output_json", test->json_server_output); + } + if (test->server_output_text) { + JSONStream_Output(test, "server_output_text", cJSON_CreateString(test->server_output_text)); + } + JSONStream_Output(test, "end", test->json_end); } - fprintf(test->outfile, "%s\n", test->json_output_string); - if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { - perror("iperf_json_finish: pthread_mutex_unlock"); + /* Original --json output, single monolithic object */ + else { + /* + * Get ASCII rendering of JSON structure. Then make our + * own copy of it and return the storage that cJSON + * allocated on our behalf. We keep our own copy + * around. + */ + char *str = cJSON_Print(test->json_top); + if (str == NULL) { + return -1; + } + test->json_output_string = strdup(str); + cJSON_free(str); + if (test->json_output_string == NULL) { + return -1; + } + if (pthread_mutex_lock(&(test->print_mutex)) != 0) { + perror("iperf_json_finish: pthread_mutex_lock"); + } + fprintf(test->outfile, "%s\n", test->json_output_string); + if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { + perror("iperf_json_finish: pthread_mutex_unlock"); + } + iflush(test); } - iflush(test); cJSON_Delete(test->json_top); - test->json_top = NULL; } - if (test->json_stream) { - cJSON *error = cJSON_GetObjectItem(test->json_top, "error"); - if (error) { - JSONStream_Output(test, "error", error); - } - if (test->json_server_output) { - JSONStream_Output(test, "server_output_json", test->json_server_output); - } - if (test->server_output_text) { - JSONStream_Output(test, "server_output_text", cJSON_CreateString(test->server_output_text)); - } - JSONStream_Output(test, "end", test->json_end); - } - else { - fprintf(test->outfile, "%s\n", test->json_output_string); - iflush(test); - } - cJSON_Delete(test->json_top); test->json_top = test->json_start = test->json_connected = test->json_intervals = test->json_server_output = test->json_end = NULL; return 0; } From 299b356df6939f71619bf45bf7a7d2222e17d840 Mon Sep 17 00:00:00 2001 From: Sarah Larsen Date: Wed, 20 Mar 2024 17:02:31 -0700 Subject: [PATCH 089/286] Using OAEP padding instead of PKCS1 padding for OpenSSL. Fix for CVE-2024-26306. Special thanks to Hubert Kario at Red Hat for finding the vulnerability. --- src/iperf.h | 1 + src/iperf_api.c | 8 ++++++-- src/iperf_api.h | 1 + src/iperf_auth.c | 32 ++++++++++++++++++++++++-------- src/iperf_auth.h | 4 ++-- src/iperf_locale.c | 1 + src/t_auth.c | 5 +++-- 7 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index c1d839be1..527e549ed 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -319,6 +319,7 @@ struct iperf_test char *server_authorized_users; EVP_PKEY *server_rsa_private_key; int server_skew_threshold; + int use_pkcs1_padding; #endif // HAVE_SSL /* boolean variables for Options */ diff --git a/src/iperf_api.c b/src/iperf_api.c index d40561c10..7fb741e77 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1137,6 +1137,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) {"rsa-private-key-path", required_argument, NULL, OPT_SERVER_RSA_PRIVATE_KEY}, {"authorized-users-path", required_argument, NULL, OPT_SERVER_AUTHORIZED_USERS}, {"time-skew-threshold", required_argument, NULL, OPT_SERVER_SKEW_THRESHOLD}, + {"use-pkcs1-padding", no_argument, NULL, OPT_USE_PKCS1_PADDING}, #endif /* HAVE_SSL */ {"fq-rate", required_argument, NULL, OPT_FQ_RATE}, {"pacing-timer", required_argument, NULL, OPT_PACING_TIMER}, @@ -1630,6 +1631,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) return -1; } break; + case OPT_USE_PKCS1_PADDING: + test->use_pkcs1_padding = 1; + break; #endif /* HAVE_SSL */ case OPT_PACING_TIMER: test->settings->pacing_timer = unit_atoi(optarg); @@ -2070,7 +2074,7 @@ int test_is_authorized(struct iperf_test *test){ if (test->settings->authtoken){ char *username = NULL, *password = NULL; time_t ts; - int rc = decode_auth_setting(test->debug, test->settings->authtoken, test->server_rsa_private_key, &username, &password, &ts); + int rc = decode_auth_setting(test->debug, test->settings->authtoken, test->server_rsa_private_key, &username, &password, &ts, test->use_pkcs1_padding); if (rc) { return -1; } @@ -2255,7 +2259,7 @@ send_parameters(struct iperf_test *test) #if defined(HAVE_SSL) /* Send authentication parameters */ if (test->settings->client_username && test->settings->client_password && test->settings->client_rsa_pubkey){ - int rc = encode_auth_setting(test->settings->client_username, test->settings->client_password, test->settings->client_rsa_pubkey, &test->settings->authtoken); + int rc = encode_auth_setting(test->settings->client_username, test->settings->client_password, test->settings->client_rsa_pubkey, &test->settings->authtoken, test->use_pkcs1_padding); if (rc) { cJSON_Delete(j); diff --git a/src/iperf_api.h b/src/iperf_api.h index d2bbdfe96..131314243 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -100,6 +100,7 @@ typedef atomic_uint_fast64_t atomic_iperf_size_t; #define OPT_RCV_TIMEOUT 27 #define OPT_JSON_STREAM 28 #define OPT_SND_TIMEOUT 29 +#define OPT_USE_PKCS1_PADDING 30 /* states */ #define TEST_START 1 diff --git a/src/iperf_auth.c b/src/iperf_auth.c index c89bde7c3..398e7d76b 100644 --- a/src/iperf_auth.c +++ b/src/iperf_auth.c @@ -230,7 +230,7 @@ int test_load_private_key_from_file(const char *file){ return 0; } -int encrypt_rsa_message(const char *plaintext, EVP_PKEY *public_key, unsigned char **encryptedtext) { +int encrypt_rsa_message(const char *plaintext, EVP_PKEY *public_key, unsigned char **encryptedtext, int use_pkcs1_padding) { #if OPENSSL_VERSION_MAJOR >= 3 EVP_PKEY_CTX *ctx; #else @@ -257,12 +257,19 @@ int encrypt_rsa_message(const char *plaintext, EVP_PKEY *public_key, unsigned ch BIO *bioBuff = BIO_new_mem_buf((void*)plaintext, (int)strlen(plaintext)); rsa_buffer_len = BIO_read(bioBuff, rsa_buffer, keysize * 2); + + int padding = RSA_PKCS1_OAEP_PADDING; + if (use_pkcs1_padding){ + padding = RSA_PKCS1_PADDING; + } #if OPENSSL_VERSION_MAJOR >= 3 EVP_PKEY_encrypt_init(ctx); + EVP_PKEY_CTX_set_rsa_padding(ctx, padding); + EVP_PKEY_encrypt(ctx, *encryptedtext, &encryptedtext_len, rsa_buffer, rsa_buffer_len); EVP_PKEY_CTX_free(ctx); #else - encryptedtext_len = RSA_public_encrypt(rsa_buffer_len, rsa_buffer, *encryptedtext, rsa, RSA_PKCS1_PADDING); + encryptedtext_len = RSA_public_encrypt(rsa_buffer_len, rsa_buffer, *encryptedtext, rsa, padding); RSA_free(rsa); #endif @@ -280,7 +287,7 @@ int encrypt_rsa_message(const char *plaintext, EVP_PKEY *public_key, unsigned ch return 0; } -int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedtext_len, EVP_PKEY *private_key, unsigned char **plaintext) { +int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedtext_len, EVP_PKEY *private_key, unsigned char **plaintext, int use_pkcs1_padding) { #if OPENSSL_VERSION_MAJOR >= 3 EVP_PKEY_CTX *ctx; #else @@ -307,13 +314,22 @@ int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedt BIO *bioBuff = BIO_new_mem_buf((void*)encryptedtext, encryptedtext_len); rsa_buffer_len = BIO_read(bioBuff, rsa_buffer, keysize * 2); + + int padding = RSA_PKCS1_OAEP_PADDING; + if (use_pkcs1_padding){ + padding = RSA_PKCS1_PADDING; + } #if OPENSSL_VERSION_MAJOR >= 3 plaintext_len = keysize; EVP_PKEY_decrypt_init(ctx); + int ret = EVP_PKEY_CTX_set_rsa_padding(ctx, padding); + if (ret < 0){ + goto errreturn; + } EVP_PKEY_decrypt(ctx, *plaintext, &plaintext_len, rsa_buffer, rsa_buffer_len); EVP_PKEY_CTX_free(ctx); #else - plaintext_len = RSA_private_decrypt(rsa_buffer_len, rsa_buffer, *plaintext, rsa, RSA_PKCS1_PADDING); + plaintext_len = RSA_private_decrypt(rsa_buffer_len, rsa_buffer, *plaintext, rsa, padding); RSA_free(rsa); #endif @@ -331,7 +347,7 @@ int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedt return 0; } -int encode_auth_setting(const char *username, const char *password, EVP_PKEY *public_key, char **authtoken){ +int encode_auth_setting(const char *username, const char *password, EVP_PKEY *public_key, char **authtoken, int use_pkcs1_padding){ time_t t = time(NULL); time_t utc_seconds = mktime(localtime(&t)); @@ -348,7 +364,7 @@ int encode_auth_setting(const char *username, const char *password, EVP_PKEY *pu unsigned char *encrypted = NULL; int encrypted_len; - encrypted_len = encrypt_rsa_message(text, public_key, &encrypted); + encrypted_len = encrypt_rsa_message(text, public_key, &encrypted, use_pkcs1_padding); free(text); if (encrypted_len < 0) { return -1; @@ -359,7 +375,7 @@ int encode_auth_setting(const char *username, const char *password, EVP_PKEY *pu return (0); //success } -int decode_auth_setting(int enable_debug, const char *authtoken, EVP_PKEY *private_key, char **username, char **password, time_t *ts){ +int decode_auth_setting(int enable_debug, const char *authtoken, EVP_PKEY *private_key, char **username, char **password, time_t *ts, int use_pkcs1_padding){ unsigned char *encrypted_b64 = NULL; size_t encrypted_len_b64; int64_t utc_seconds; @@ -367,7 +383,7 @@ int decode_auth_setting(int enable_debug, const char *authtoken, EVP_PKEY *priva unsigned char *plaintext = NULL; int plaintext_len; - plaintext_len = decrypt_rsa_message(encrypted_b64, encrypted_len_b64, private_key, &plaintext); + plaintext_len = decrypt_rsa_message(encrypted_b64, encrypted_len_b64, private_key, &plaintext, use_pkcs1_padding); free(encrypted_b64); if (plaintext_len < 0) { return -1; diff --git a/src/iperf_auth.h b/src/iperf_auth.h index ffadbf3e5..eedd45abd 100644 --- a/src/iperf_auth.h +++ b/src/iperf_auth.h @@ -35,7 +35,7 @@ EVP_PKEY *load_pubkey_from_file(const char *file); EVP_PKEY *load_pubkey_from_base64(const char *buffer); EVP_PKEY *load_privkey_from_file(const char *file); EVP_PKEY *load_privkey_from_base64(const char *buffer); -int encode_auth_setting(const char *username, const char *password, EVP_PKEY *public_key, char **authtoken); -int decode_auth_setting(int enable_debug, const char *authtoken, EVP_PKEY *private_key, char **username, char **password, time_t *ts); +int encode_auth_setting(const char *username, const char *password, EVP_PKEY *public_key, char **authtoken, int use_pkcs1_padding); +int decode_auth_setting(int enable_debug, const char *authtoken, EVP_PKEY *private_key, char **username, char **password, time_t *ts, int use_pkcs1_padding); int check_authentication(const char *username, const char *password, const time_t ts, const char *filename, int skew_threshold); ssize_t iperf_getpass (char **lineptr, size_t *n, FILE *stream); diff --git a/src/iperf_locale.c b/src/iperf_locale.c index ae0f63a41..9d94e0234 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -148,6 +148,7 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" " credentials\n" " --time-skew-threshold time skew threshold (in seconds) between the server\n" " and client during the authentication process\n" + " --use-pkcs1-padding use pkcs1 padding at your own risk\n" #endif //HAVE_SSL "Client specific:\n" " -c, --client [%%] run in client mode, connecting to \n" diff --git a/src/t_auth.c b/src/t_auth.c index 77c225531..3b0fd2f32 100644 --- a/src/t_auth.c +++ b/src/t_auth.c @@ -101,8 +101,9 @@ test_authtoken(const char *authUser, const char *authPassword, EVP_PKEY *pubkey, char *decodePassword; time_t decodeTime; - assert(encode_auth_setting(authUser, authPassword, pubkey, &authToken) == 0); - assert(decode_auth_setting(0, authToken, privkey, &decodeUser, &decodePassword, &decodeTime) == 0); + int use_pkcs1_padding = 1; + assert(encode_auth_setting(authUser, authPassword, pubkey, &authToken, use_pkcs1_padding) == 0); + assert(decode_auth_setting(0, authToken, privkey, &decodeUser, &decodePassword, &decodeTime, use_pkcs1_padding) == 0); assert(strcmp(decodeUser, authUser) == 0); assert(strcmp(decodePassword, authPassword) == 0); From 3006413849c0aa9a70503b736497130c781b4675 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 22 Apr 2024 15:19:51 -0700 Subject: [PATCH 090/286] Manual page update for --use-pkcs1-padding. --- src/iperf3.1 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/iperf3.1 b/src/iperf3.1 index 2efd53dea..2561414f5 100644 --- a/src/iperf3.1 +++ b/src/iperf3.1 @@ -193,6 +193,15 @@ parameter is specified in ms, and defaults to the system settings. This functionality depends on the TCP_USER_TIMEOUT socket option, and will not work on systems that do not support it. .TP +.BR --use-pkcs1-padding +This option is only meaningful when using iperf3's authentication +features. Versions of iperf3 prior to 3.17 used PCKS1 padding in the +RSA-encrypted credentials, which was vulnerable to a side-channel +attack that could reveal a server's private key. Beginning with +iperf-3.17, OAEP padding is used, however this is a breaking change +that is not compatible with older iperf3 versions. Use this option to +preserve the less secure, but more compatible, behavior. +.TP .BR -d ", " --debug " " emit debugging output. Primarily (perhaps exclusively) of use to developers. From fbd99b145c3e1b3890ff1dbdb20b91f631b3e85b Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 22 Apr 2024 16:13:19 -0700 Subject: [PATCH 091/286] Treat a decryption error as an empty string. --- src/iperf_auth.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/iperf_auth.c b/src/iperf_auth.c index 398e7d76b..72e85fc9a 100644 --- a/src/iperf_auth.c +++ b/src/iperf_auth.c @@ -336,8 +336,9 @@ int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedt OPENSSL_free(rsa_buffer); BIO_free(bioBuff); - if (plaintext_len <= 0) { - goto errreturn; + /* Treat a decryption error as an empty string. */ + if (plaintext_len < 0) { + plaintext_len = 0; } return plaintext_len; From 2c63a3fd404954c090969d9b4f3be70cafa2f567 Mon Sep 17 00:00:00 2001 From: Sarah Larsen Date: Fri, 10 May 2024 10:10:33 -0700 Subject: [PATCH 092/286] iperf-3.17 2024-05-10 --------------------- * Notable user-visible changes * BREAKING CHANGE: iperf3's authentication features, when used with OpenSSL prior to 3.2.0, contain a vulnerability to a side-channel timing attack. To address this flaw, a change has been made to the padding applied to encrypted strings. This change is not backwards compatible with older versions of iperf3 (before 3.17). To restore the older (vulnerable) behavior, and hence backwards-compatibility, use the --use-pkcs1-padding flag. The iperf3 team thanks Hubert Kario from RedHat for reporting this issue and providing feedback on the fix. (CVE-2024-26306)(PR#1695) * iperf3 no longer changes its current working directory in --daemon mode. This results in more predictable behavior with relative paths, in particular finding key and credential files for authentication. (PR#1672) * A new --json-stream option has been added to enable a streaming output format, consisting of a series of JSON objects (for the start of the test, each measurement interval, and the end of the test) separated by newlines (#444, #923, #1098). * UDP tests now work correctly between different endian hosts (#1415). * The --fq-rate parameter now works for --reverse tests (#1632, PR#1667). * The statistics reporting interval is now available in the --json start test object (#1663). * A negative time test duration is now properly flagged as an error (IS#1662 / PR#1666). * Notable developer-visible changes * Fixes have been made to better (unofficially) support builds on Android (#1641 / #1651) and VxWorks (#1595). * iperf3 now builds correctly on architectures without native support for 64-bit atomic types, by linking with the libatomic library (#1611). --- RELNOTES.md | 45 + aclocal.m4 | 4 +- config/config.guess | 107 +- config/config.sub | 236 ++--- config/install-sh | 8 +- configure | 2159 ++++++++++++++++------------------------- configure.ac | 2 +- src/iperf3.1 | 2 +- src/iperf_config.h.in | 20 +- 9 files changed, 1022 insertions(+), 1561 deletions(-) diff --git a/RELNOTES.md b/RELNOTES.md index 79743a3f3..fb973ce17 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,6 +1,51 @@ iperf3 Release Notes ==================== +iperf-3.17 2024-05-10 +--------------------- + +* Notable user-visible changes + + * BREAKING CHANGE: iperf3's authentication features, when used with + OpenSSL prior to 3.2.0, contain a vulnerability to a side-channel + timing attack. To address this flaw, a change has been made to the + padding applied to encrypted strings. This change is not backwards + compatible with older versions of iperf3 (before 3.17). To restore + the older (vulnerable) behavior, and hence + backwards-compatibility, use the --use-pkcs1-padding flag. The + iperf3 team thanks Hubert Kario from RedHat for reporting this + issue and providing feedback on the fix. (CVE-2024-26306)(PR#1695) + + * iperf3 no longer changes its current working directory in --daemon + mode. This results in more predictable behavior with relative + paths, in particular finding key and credential files for + authentication. (PR#1672) + + * A new --json-stream option has been added to enable a streaming + output format, consisting of a series of JSON objects (for the + start of the test, each measurement interval, and the end of the + test) separated by newlines (#444, #923, #1098). + + * UDP tests now work correctly between different endian hosts + (#1415). + + * The --fq-rate parameter now works for --reverse tests (#1632, PR#1667). + + * The statistics reporting interval is now available in the --json + start test object (#1663). + + * A negative time test duration is now properly flagged as an error + (IS#1662 / PR#1666). + +* Notable developer-visible changes + + * Fixes have been made to better (unofficially) support builds on + Android (#1641 / #1651) and VxWorks (#1595). + + * iperf3 now builds correctly on architectures without native + support for 64-bit atomic types, by linking with the libatomic + library (#1611). + iperf-3.16 2023-11-30 --------------------- diff --git a/aclocal.m4 b/aclocal.m4 index bd04b2e09..60439e91e 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -14,8 +14,8 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.72],, -[m4_warning([this file was generated for autoconf 2.72. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) diff --git a/config/config.guess b/config/config.guess index cdfc43920..e81d3ae7c 100755 --- a/config/config.guess +++ b/config/config.guess @@ -1,14 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2023 Free Software Foundation, Inc. +# Copyright 1992-2021 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2023-08-22' +timestamp='2021-06-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -47,7 +47,7 @@ me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] -Output the configuration name of the system '$me' is run on. +Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit @@ -60,13 +60,13 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2023 Free Software Foundation, Inc. +Copyright 1992-2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try '$me --help' for more information." +Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -102,8 +102,8 @@ GUESS= # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. -# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still -# use 'HOST_CC' if defined, but it is deprecated. +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. @@ -155,9 +155,6 @@ Linux|GNU|GNU/*) set_cc_for_build cat <<-EOF > "$dummy.c" - #if defined(__ANDROID__) - LIBC=android - #else #include #if defined(__UCLIBC__) LIBC=uclibc @@ -172,7 +169,6 @@ Linux|GNU|GNU/*) LIBC=musl #endif #endif - #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" @@ -441,7 +437,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 @@ -463,7 +459,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in UNAME_RELEASE=`uname -v` ;; esac - # Japanese Language versions have a version number like '4.1.3-JL'. + # Japanese Language versions have a version number like `4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; @@ -908,7 +904,7 @@ EOF fi ;; *:FreeBSD:*:*) - UNAME_PROCESSOR=`uname -p` + UNAME_PROCESSOR=`/usr/bin/uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; @@ -933,9 +929,6 @@ EOF i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; - *:SerenityOS:*:*) - GUESS=$UNAME_MACHINE-pc-serenity - ;; *:Interix*:*) case $UNAME_MACHINE in x86) @@ -970,37 +963,11 @@ EOF GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; - x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) - GUESS="$UNAME_MACHINE-pc-managarm-mlibc" - ;; - *:[Mm]anagarm:*:*) - GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" - ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) - set_cc_for_build - CPU=$UNAME_MACHINE - LIBCABI=$LIBC - if test "$CC_FOR_BUILD" != no_compiler_found; then - ABI=64 - sed 's/^ //' << EOF > "$dummy.c" - #ifdef __ARM_EABI__ - #ifdef __ARM_PCS_VFP - ABI=eabihf - #else - ABI=eabi - #endif - #endif -EOF - cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` - eval "$cc_set_abi" - case $ABI in - eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; - esac - fi - GUESS=$CPU-unknown-linux-$LIBCABI + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be @@ -1066,16 +1033,7 @@ EOF k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; - kvx:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - kvx:cos:*:*) - GUESS=$UNAME_MACHINE-unknown-cos - ;; - kvx:mbr:*:*) - GUESS=$UNAME_MACHINE-unknown-mbr - ;; - loongarch32:Linux:*:* | loongarch64:Linux:*:*) + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) @@ -1190,27 +1148,16 @@ EOF ;; x86_64:Linux:*:*) set_cc_for_build - CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then - ABI=64 - sed 's/^ //' << EOF > "$dummy.c" - #ifdef __i386__ - ABI=x86 - #else - #ifdef __ILP32__ - ABI=x32 - #endif - #endif -EOF - cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` - eval "$cc_set_abi" - case $ABI in - x86) CPU=i686 ;; - x32) LIBCABI=${LIBC}x32 ;; - esac + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI=${LIBC}x32 + fi fi - GUESS=$CPU-pc-linux-$LIBCABI + GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC @@ -1230,7 +1177,7 @@ EOF GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) - # If we were able to find 'uname', then EMX Unix compatibility + # If we were able to find `uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; @@ -1371,7 +1318,7 @@ EOF GUESS=ns32k-sni-sysv fi ;; - PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; @@ -1417,11 +1364,8 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; - ppc:Haiku:*:*) # Haiku running on Apple PowerPC - GUESS=powerpc-apple-haiku - ;; - *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) - GUESS=$UNAME_MACHINE-unknown-haiku + x86_64:Haiku:*:*) + GUESS=x86_64-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE @@ -1578,9 +1522,6 @@ EOF i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; - i*86:Fiwix:*:*) - GUESS=$UNAME_MACHINE-pc-fiwix - ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; diff --git a/config/config.sub b/config/config.sub index defe52c0c..d74fb6dea 100755 --- a/config/config.sub +++ b/config/config.sub @@ -1,14 +1,14 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2023 Free Software Foundation, Inc. +# Copyright 1992-2021 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2023-09-19' +timestamp='2021-08-14' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -76,13 +76,13 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2023 Free Software Foundation, Inc. +Copyright 1992-2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try '$me --help' for more information." +Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -130,7 +130,7 @@ IFS=$saved_IFS # Separate into logical components for further validation case $1 in *-*-*-*-*) - echo "Invalid configuration '$1': more than four components" >&2 + echo Invalid configuration \`"$1"\': more than four components >&2 exit 1 ;; *-*-*-*) @@ -145,8 +145,7 @@ case $1 in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ - | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ - | windows-* ) + | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 basic_os=$maybe_os ;; @@ -944,7 +943,7 @@ $basic_machine EOF IFS=$saved_IFS ;; - # We use 'pc' rather than 'unknown' + # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) @@ -1021,11 +1020,6 @@ case $cpu-$vendor in ;; # Here we normalize CPU types with a missing or matching vendor - armh-unknown | armh-alt) - cpu=armv7l - vendor=alt - basic_os=${basic_os:-linux-gnueabihf} - ;; dpx20-unknown | dpx20-bull) cpu=rs6000 vendor=bull @@ -1076,7 +1070,7 @@ case $cpu-$vendor in pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) cpu=i586 ;; - pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*) + pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) cpu=i686 ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) @@ -1127,7 +1121,7 @@ case $cpu-$vendor in xscale-* | xscalee[bl]-*) cpu=`echo "$cpu" | sed 's/^xscale/arm/'` ;; - arm64-* | aarch64le-*) + arm64-*) cpu=aarch64 ;; @@ -1181,7 +1175,7 @@ case $cpu-$vendor in case $cpu in 1750a | 580 \ | a29k \ - | aarch64 | aarch64_be | aarch64c | arm64ec \ + | aarch64 | aarch64_be \ | abacus \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ @@ -1200,23 +1194,45 @@ case $cpu-$vendor in | d10v | d30v | dlx | dsp16xx \ | e2k | elxsi | epiphany \ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ - | javascript \ | h8300 | h8500 \ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i*86 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ - | kvx \ | le32 | le64 \ | lm32 \ - | loongarch32 | loongarch64 \ + | loongarch32 | loongarch64 | loongarchx32 \ | m32c | m32r | m32rle \ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ | m88110 | m88k | maxq | mb | mcore | mep | metag \ | microblaze | microblazeel \ - | mips* \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64eb | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r3 | mipsisa32r3el \ + | mipsisa32r5 | mipsisa32r5el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r3 | mipsisa64r3el \ + | mipsisa64r5 | mipsisa64r5el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ | mmix \ | mn10200 | mn10300 \ | moxie \ @@ -1264,7 +1280,7 @@ case $cpu-$vendor in ;; *) - echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2 + echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 exit 1 ;; esac @@ -1285,12 +1301,11 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if test x"$basic_os" != x +if test x$basic_os != x then -# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just # set os. -obj= case $basic_os in gnu/linux*) kernel=linux @@ -1321,10 +1336,6 @@ EOF kernel=linux os=`echo "$basic_os" | sed -e 's|linux|gnu|'` ;; - managarm*) - kernel=managarm - os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'` - ;; *) kernel= os=$basic_os @@ -1490,16 +1501,10 @@ case $os in os=eabi ;; *) - os= - obj=elf + os=elf ;; esac ;; - aout* | coff* | elf* | pe*) - # These are machine code file formats, not OSes - obj=$os - os= - ;; *) # No normalization, but not necessarily accepted, that comes below. ;; @@ -1518,15 +1523,12 @@ else # system, and we'll never get to this point. kernel= -obj= case $cpu-$vendor in score-*) - os= - obj=elf + os=elf ;; spu-*) - os= - obj=elf + os=elf ;; *-acorn) os=riscix1.2 @@ -1536,35 +1538,28 @@ case $cpu-$vendor in os=gnu ;; arm*-semi) - os= - obj=aout + os=aout ;; c4x-* | tic4x-*) - os= - obj=coff + os=coff ;; c8051-*) - os= - obj=elf + os=elf ;; clipper-intergraph) os=clix ;; hexagon-*) - os= - obj=elf + os=elf ;; tic54x-*) - os= - obj=coff + os=coff ;; tic55x-*) - os= - obj=coff + os=coff ;; tic6x-*) - os= - obj=coff + os=coff ;; # This must come before the *-dec entry. pdp10-*) @@ -1586,24 +1581,19 @@ case $cpu-$vendor in os=sunos3 ;; m68*-cisco) - os= - obj=aout + os=aout ;; mep-*) - os= - obj=elf + os=elf ;; mips*-cisco) - os= - obj=elf + os=elf ;; mips*-*) - os= - obj=elf + os=elf ;; or32-*) - os= - obj=coff + os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=sysv3 @@ -1612,8 +1602,7 @@ case $cpu-$vendor in os=sunos4.1.1 ;; pru-*) - os= - obj=elf + os=elf ;; *-be) os=beos @@ -1694,12 +1683,10 @@ case $cpu-$vendor in os=uxpv ;; *-rom68k) - os= - obj=coff + os=coff ;; *-*bug) - os= - obj=coff + os=coff ;; *-apple) os=macos @@ -1717,8 +1704,7 @@ esac fi -# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ). - +# Now, validate our (potentially fixed-up) OS. case $os in # Sometimes we do "kernel-libc", so those need to count as OSes. musl* | newlib* | relibc* | uclibc*) @@ -1729,9 +1715,6 @@ case $os in # VxWorks passes extra cpu info in the 4th filed. simlinux | simwindows | spe) ;; - # See `case $cpu-$os` validation below - ghcjs) - ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. @@ -1740,7 +1723,7 @@ case $os in | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ | hiux* | abug | nacl* | netware* | windows* \ - | os9* | macos* | osx* | ios* | tvos* | watchos* \ + | os9* | macos* | osx* | ios* \ | mpw* | magic* | mmixware* | mon960* | lnews* \ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ | aos* | aros* | cloudabi* | sortix* | twizzler* \ @@ -1749,11 +1732,11 @@ case $os in | mirbsd* | netbsd* | dicos* | openedition* | ose* \ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ - | bosx* | nextstep* | cxux* | oabi* \ - | ptx* | ecoff* | winnt* | domain* | vsta* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ | udi* | lites* | ieee* | go32* | aux* | hcos* \ | chorusrdb* | cegcc* | glidix* | serenity* \ - | cygwin* | msys* | moss* | proelf* | rtems* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ | midipix* | mingw32* | mingw64* | mint* \ | uxpv* | beos* | mpeix* | udk* | moxiebox* \ | interix* | uwin* | mks* | rhapsody* | darwin* \ @@ -1765,8 +1748,7 @@ case $os in | skyos* | haiku* | rdos* | toppers* | drops* | es* \ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ - | fiwix* | mlibc* | cos* | mbr* ) + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*) ;; # This one is extra strict with allowed versions sco3.2v2 | sco3.2v[4-9]* | sco5v6*) @@ -1774,99 +1756,41 @@ case $os in ;; none) ;; - kernel* | msvc* ) - # Restricted further below - ;; - '') - if test x"$obj" = x - then - echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2 - fi - ;; - *) - echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 - exit 1 - ;; -esac - -case $obj in - aout* | coff* | elf* | pe*) - ;; - '') - # empty is fine - ;; *) - echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 - exit 1 - ;; -esac - -# Here we handle the constraint that a (synthetic) cpu and os are -# valid only in combination with each other and nowhere else. -case $cpu-$os in - # The "javascript-unknown-ghcjs" triple is used by GHC; we - # accept it here in order to tolerate that, but reject any - # variations. - javascript-ghcjs) - ;; - javascript-* | *-ghcjs) - echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 + echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. -case $kernel-$os-$obj in - linux-gnu*- | linux-dietlibc*- | linux-android*- | linux-newlib*- \ - | linux-musl*- | linux-relibc*- | linux-uclibc*- | linux-mlibc*- ) - ;; - uclinux-uclibc*- ) - ;; - managarm-mlibc*- | managarm-kernel*- ) +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* ) ;; - windows*-msvc*-) + uclinux-uclibc* ) ;; - -dietlibc*- | -newlib*- | -musl*- | -relibc*- | -uclibc*- | -mlibc*- ) + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) # These are just libc implementations, not actual OSes, and thus # require a kernel. - echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 - exit 1 - ;; - -kernel*- ) - echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 - exit 1 - ;; - *-kernel*- ) - echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 exit 1 ;; - *-msvc*- ) - echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 - exit 1 - ;; - kfreebsd*-gnu*- | kopensolaris*-gnu*-) + kfreebsd*-gnu* | kopensolaris*-gnu*) ;; - vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) + vxworks-simlinux | vxworks-simwindows | vxworks-spe) ;; - nto-qnx*-) - ;; - os2-emx-) + nto-qnx*) ;; - *-eabi*- | *-gnueabi*-) + os2-emx) ;; - none--*) - # None (no kernel, i.e. freestanding / bare metal), - # can be paired with an machine code file format + *-eabi* | *-gnueabi*) ;; - -*-) + -*) # Blank kernel with real OS is always fine. ;; - --*) - # Blank kernel and OS with real machine code file format is always fine. - ;; - *-*-*) - echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 exit 1 ;; esac @@ -1949,7 +1873,7 @@ case $vendor in ;; esac -echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" +echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: diff --git a/config/install-sh b/config/install-sh index 7c56c9c01..ec298b537 100755 --- a/config/install-sh +++ b/config/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2023-11-23.18; # UTC +scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -124,9 +124,9 @@ it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. -Report bugs to . -GNU Automake home page: . -General help using GNU software: ." +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ +" while test $# -ne 0; do case $1 in diff --git a/configure b/configure index 4546f7357..47ccb6bc4 100755 --- a/configure +++ b/configure @@ -1,11 +1,11 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for iperf 3.16+. +# Generated by GNU Autoconf 2.71 for iperf 3.17+. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Inc. # # @@ -17,6 +17,7 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh @@ -25,13 +26,12 @@ then : # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else case e in #( - e) case `(set -o) 2>/dev/null` in #( +else $as_nop + case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; -esac ;; esac fi @@ -103,7 +103,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as 'sh COMMAND' +# We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 @@ -133,14 +133,15 @@ case $- in # (((( esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed 'exec'. +# out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: @@ -148,13 +149,12 @@ then : # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else case e in #( - e) case \`(set -o) 2>/dev/null\` in #( +else \$as_nop + case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; -esac ;; esac fi " @@ -172,9 +172,8 @@ as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : -else case e in #( - e) exitcode=1; echo positional parameters were not saved. ;; -esac +else \$as_nop + exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) @@ -196,15 +195,14 @@ test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes -else case e in #( - e) as_have_required=no ;; -esac +else $as_nop + as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : -else case e in #( - e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do @@ -237,13 +235,12 @@ IFS=$as_save_IFS if $as_found then : -else case e in #( - e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes -fi ;; -esac +fi fi @@ -265,7 +262,7 @@ case $- in # (((( esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed 'exec'. +# out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi @@ -285,8 +282,7 @@ $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 -fi ;; -esac +fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} @@ -325,6 +321,14 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -393,12 +397,11 @@ then : { eval $1+=\$2 }' -else case e in #( - e) as_fn_append () +else $as_nop + as_fn_append () { eval $1=\$$1\$2 - } ;; -esac + } fi # as_fn_append # as_fn_arith ARG... @@ -412,14 +415,21 @@ then : { as_val=$(( $* )) }' -else case e in #( - e) as_fn_arith () +else $as_nop + as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } ;; -esac + } fi # as_fn_arith +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -493,8 +503,6 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits /[$]LINENO/= ' <$as_myself | sed ' - t clear - :clear s/[$]LINENO.*/&-/ t lineno b @@ -543,6 +551,7 @@ esac as_echo='printf %s\n' as_echo_n='printf %s' + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -554,9 +563,9 @@ if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: - # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. - # In both cases, we have to default to 'cp -pR'. + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then @@ -581,12 +590,10 @@ as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. -as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" -as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" -as_tr_sh="eval sed '$as_sed_sh'" # deprecated +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} @@ -614,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.16+' -PACKAGE_STRING='iperf 3.16+' +PACKAGE_VERSION='3.17+' +PACKAGE_STRING='iperf 3.17+' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -926,7 +933,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: '$ac_useropt'" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -952,7 +959,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: '$ac_useropt'" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1165,7 +1172,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: '$ac_useropt'" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1181,7 +1188,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: '$ac_useropt'" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1211,8 +1218,8 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error $? "unrecognized option: '$ac_option' -Try '$0 --help' for more information" + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) @@ -1220,7 +1227,7 @@ Try '$0 --help' for more information" # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: '$ac_envvar'" ;; + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1270,7 +1277,7 @@ do as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done -# There might be people who depend on the old broken behavior: '$host' +# There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias @@ -1338,7 +1345,7 @@ if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi -ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` @@ -1366,7 +1373,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures iperf 3.16+ to adapt to many kinds of systems. +\`configure' configures iperf 3.17+ to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1380,11 +1387,11 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print 'checking ...' messages + -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for '--cache-file=config.cache' + -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or '..'] + --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @@ -1392,10 +1399,10 @@ Installation directories: --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] -By default, 'make install' will install all the files in -'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify -an installation prefix other than '$ac_default_prefix' using '--prefix', -for instance '--prefix=\$HOME'. +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. For better control, use the options below. @@ -1437,7 +1444,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.16+:";; + short | recursive ) echo "Configuration of iperf 3.17+:";; esac cat <<\_ACEOF @@ -1488,7 +1495,7 @@ Some influential environment variables: User-defined run-time library search path. CPP C preprocessor -Use these variables to override the choices made by 'configure' or to help +Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . @@ -1556,10 +1563,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.16+ -generated by GNU Autoconf 2.72 +iperf configure 3.17+ +generated by GNU Autoconf 2.71 -Copyright (C) 2023 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1598,12 +1605,11 @@ printf "%s\n" "$ac_try_echo"; } >&5 } && test -s conftest.$ac_objext then : ac_retval=0 -else case e in #( - e) printf "%s\n" "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 ;; -esac + ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval @@ -1641,12 +1647,11 @@ printf "%s\n" "$ac_try_echo"; } >&5 } then : ac_retval=0 -else case e in #( - e) printf "%s\n" "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 ;; -esac + ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would @@ -1670,8 +1675,8 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> @@ -1679,12 +1684,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" -else case e in #( - e) eval "$3=no" ;; -esac +else $as_nop + eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1704,15 +1707,15 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (void); below. */ + which can conflict with char $2 (); below. */ #include #undef $2 @@ -1723,7 +1726,7 @@ else case e in #( #ifdef __cplusplus extern "C" #endif -char $2 (void); +char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ @@ -1742,13 +1745,11 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" -else case e in #( - e) eval "$3=no" ;; -esac +else $as_nop + eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext ;; -esac + conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1784,12 +1785,11 @@ printf "%s\n" "$ac_try_echo"; } >&5 } then : ac_retval=0 -else case e in #( - e) printf "%s\n" "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 ;; -esac + ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval @@ -1808,8 +1808,8 @@ printf %s "checking for $2.$3... " >&6; } if eval test \${$4+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -1825,8 +1825,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -1842,15 +1842,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else case e in #( - e) eval "$4=no" ;; -esac +else $as_nop + eval "$4=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$4 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1882,8 +1879,8 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.16+, which was -generated by GNU Autoconf 2.72. Invocation command line was +It was created by iperf $as_me 3.17+, which was +generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -2129,10 +2126,10 @@ esac printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file -See 'config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5; } fi done @@ -2168,7 +2165,9 @@ struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (char **p, int i) +static char *e (p, i) + char **p; + int i; { return p[i]; } @@ -2182,21 +2181,6 @@ static char *f (char * (*g) (char **, int), char **p, ...) return s; } -/* C89 style stringification. */ -#define noexpand_stringify(a) #a -const char *stringified = noexpand_stringify(arbitrary+token=sequence); - -/* C89 style token pasting. Exercises some of the corner cases that - e.g. old MSVC gets wrong, but not very hard. */ -#define noexpand_concat(a,b) a##b -#define expand_concat(a,b) noexpand_concat(a,b) -extern int vA; -extern int vbee; -#define aye A -#define bee B -int *pvA = &expand_concat(v,aye); -int *pvbee = &noexpand_concat(v,bee); - /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated @@ -2224,19 +2208,16 @@ ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' -/* Does the compiler advertise C99 conformance? */ +// Does the compiler advertise C99 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif -// See if C++-style comments work. - #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); -extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare @@ -2286,6 +2267,7 @@ typedef const char *ccp; static inline int test_restrict (ccp restrict text) { + // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) @@ -2351,8 +2333,6 @@ ac_c_conftest_c99_main=' ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; - // Work around memory leak warnings. - free (ia); // Check named initializers. struct named_init ni = { @@ -2374,7 +2354,7 @@ ac_c_conftest_c99_main=' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' -/* Does the compiler advertise C11 conformance? */ +// Does the compiler advertise C11 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif @@ -2566,9 +2546,8 @@ IFS=$as_save_IFS if $as_found then : -else case e in #( - e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; -esac +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi @@ -2596,12 +2575,12 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 -printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 -printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) @@ -2610,18 +2589,18 @@ printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 -printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 -printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 -printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 -printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. @@ -2637,11 +2616,11 @@ printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi done if $ac_cache_corrupted; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## @@ -2834,9 +2813,8 @@ then : enableval=$enable_static_bin; enable_static=yes enable_shared=no enable_static_bin=yes -else case e in #( - e) : ;; -esac +else $as_nop + : fi if test x$enable_static_bin = xno; then @@ -2891,8 +2869,8 @@ if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 -else case e in #( - e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS @@ -2946,8 +2924,7 @@ esac IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir - ;; -esac + fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install @@ -3043,7 +3020,7 @@ test "$program_prefix" != NONE && test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. -# By default was 's,x,x', remove it if useless. +# By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` @@ -3086,8 +3063,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$STRIP"; then +else $as_nop + if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3109,8 +3086,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then @@ -3132,8 +3108,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_STRIP"; then +else $as_nop + if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3155,8 +3131,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then @@ -3192,8 +3167,8 @@ if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 -else case e in #( - e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS @@ -3207,7 +3182,7 @@ do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ - *'BusyBox '* | \ + 'BusyBox '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; @@ -3216,17 +3191,18 @@ do done done IFS=$as_save_IFS - ;; -esac + fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else - # As a last resort, use plain mkdir -p, - # in the hope it doesn't have the bugs of ancient mkdir. - MKDIR_P='mkdir -p' + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 @@ -3241,8 +3217,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$AWK"; then +else $as_nop + if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3264,8 +3240,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then @@ -3287,8 +3262,8 @@ ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat >conftest.make <<\_ACEOF +else $as_nop + cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' @@ -3300,8 +3275,7 @@ case `${MAKE-make} -f conftest.make 2>/dev/null` in *) eval ac_cv_prog_make_${ac_make}_set=no;; esac -rm -f conftest.make ;; -esac +rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 @@ -3339,8 +3313,8 @@ printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if printf "%s\n" 'TRUE=$(BAR$(V)) +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3350,8 +3324,7 @@ am__doit: am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no -fi ;; -esac +fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } @@ -3386,7 +3359,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.16+' + VERSION='3.17+' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -3506,8 +3479,8 @@ printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if printf "%s\n" 'TRUE=$(BAR$(V)) +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3517,8 +3490,7 @@ am__doit: am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no -fi ;; -esac +fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } @@ -3568,16 +3540,15 @@ printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_build_alias=$build_alias +else $as_nop + ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } @@ -3604,15 +3575,14 @@ printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test "x$host_alias" = x; then +else $as_nop + if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } @@ -3789,8 +3759,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3812,8 +3782,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3835,8 +3804,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_CC"; then +else $as_nop + if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3858,8 +3827,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -3894,8 +3862,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3917,8 +3885,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3940,8 +3907,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no @@ -3980,8 +3947,7 @@ if test $ac_prog_rejected = yes; then ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4005,8 +3971,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4028,8 +3994,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4055,8 +4020,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_CC"; then +else $as_nop + if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4078,8 +4043,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -4117,8 +4081,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4140,8 +4104,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4163,8 +4126,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_CC"; then +else $as_nop + if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4186,8 +4149,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -4216,10 +4178,10 @@ fi fi -test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See 'config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -4291,8 +4253,8 @@ printf "%s\n" "$ac_try_echo"; } >&5 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : - # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. -# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. @@ -4312,7 +4274,7 @@ do ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an '-o' + # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. @@ -4323,9 +4285,8 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else case e in #( - e) ac_file='' ;; -esac +else $as_nop + ac_file='' fi if test -z "$ac_file" then : @@ -4334,14 +4295,13 @@ printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables -See 'config.log' for more details" "$LINENO" 5; } -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } ;; -esac +See \`config.log' for more details" "$LINENO" 5; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } @@ -4365,10 +4325,10 @@ printf "%s\n" "$ac_try_echo"; } >&5 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : - # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) -# catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will -# work properly (i.e., refer to 'conftest.exe'), while it won't with -# 'rm'. + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in @@ -4378,12 +4338,11 @@ for ac_file in conftest.exe conftest conftest.*; do * ) break;; esac done -else case e in #( - e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See 'config.log' for more details" "$LINENO" 5; } ;; -esac +See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -4399,8 +4358,6 @@ int main (void) { FILE *f = fopen ("conftest.out", "w"); - if (!f) - return 1; return ferror (f) || fclose (f) != 0; ; @@ -4440,27 +4397,26 @@ printf "%s\n" "$ac_try_echo"; } >&5 if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. -If you meant to cross compile, use '--host'. -See 'config.log' for more details" "$LINENO" 5; } +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } -rm -f conftest.$ac_ext conftest$ac_cv_exeext \ - conftest.o conftest.obj conftest.out +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4492,18 +4448,16 @@ then : break;; esac done -else case e in #( - e) printf "%s\n" "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile -See 'config.log' for more details" "$LINENO" 5; } ;; -esac +See \`config.log' for more details" "$LINENO" 5; } fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; -esac +rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } @@ -4514,8 +4468,8 @@ printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4532,14 +4486,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes -else case e in #( - e) ac_compiler_gnu=no ;; -esac +else $as_nop + ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } @@ -4557,8 +4509,8 @@ printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_save_c_werror_flag=$ac_c_werror_flag +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" @@ -4576,8 +4528,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes -else case e in #( - e) CFLAGS="" +else $as_nop + CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4592,8 +4544,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else case e in #( - e) ac_c_werror_flag=$ac_save_c_werror_flag +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4610,15 +4562,12 @@ if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag ;; -esac + ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } @@ -4645,8 +4594,8 @@ printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_cv_prog_cc_c11=no +else $as_nop + ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4663,28 +4612,25 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC ;; -esac +CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else case e in #( - e) if test "x$ac_cv_prog_cc_c11" = x +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } - CC="$CC $ac_cv_prog_cc_c11" ;; -esac + CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 ;; -esac + ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno @@ -4694,8 +4640,8 @@ printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_cv_prog_cc_c99=no +else $as_nop + ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4712,28 +4658,25 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC ;; -esac +CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else case e in #( - e) if test "x$ac_cv_prog_cc_c99" = x +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } - CC="$CC $ac_cv_prog_cc_c99" ;; -esac + CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 ;; -esac + ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno @@ -4743,8 +4686,8 @@ printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_cv_prog_cc_c89=no +else $as_nop + ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4761,28 +4704,25 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC ;; -esac +CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else case e in #( - e) if test "x$ac_cv_prog_cc_c89" = x +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } - CC="$CC $ac_cv_prog_cc_c89" ;; -esac + CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 ;; -esac + ac_prog_cc_stdc=c89 fi fi @@ -4803,8 +4743,8 @@ printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4834,8 +4774,7 @@ _ACEOF fi done rm -f core conftest* - unset am_i ;; -esac + unset am_i fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } @@ -4861,8 +4800,8 @@ printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up @@ -4966,8 +4905,7 @@ else case e in #( else am_cv_CC_dependencies_compiler_type=none fi - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } @@ -4989,8 +4927,8 @@ printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ +else $as_nop + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done @@ -5015,10 +4953,9 @@ do as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in #( +case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5053,8 +4990,7 @@ IFS=$as_save_IFS else ac_cv_path_SED=$SED fi - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } @@ -5079,8 +5015,8 @@ printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -z "$GREP"; then +else $as_nop + if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5099,10 +5035,9 @@ do as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in #( +case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5137,8 +5072,7 @@ IFS=$as_save_IFS else ac_cv_path_GREP=$GREP fi - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } @@ -5150,8 +5084,8 @@ printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then @@ -5173,10 +5107,9 @@ do as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in #( +case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5212,23 +5145,20 @@ else ac_cv_path_EGREP=$EGREP fi - fi ;; -esac + fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" - EGREP_TRADITIONAL=$EGREP - ac_cv_path_EGREP_TRADITIONAL=$EGREP { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 +else $as_nop + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then @@ -5250,10 +5180,9 @@ do as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in #( +case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5289,8 +5218,7 @@ else ac_cv_path_FGREP=$FGREP fi - fi ;; -esac + fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$ac_cv_path_FGREP" >&6; } @@ -5321,9 +5249,8 @@ test -z "$GREP" && GREP=grep if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else case e in #( - e) with_gnu_ld=no ;; -esac +else $as_nop + with_gnu_ld=no fi ac_prog=ld @@ -5368,8 +5295,8 @@ fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -z "$LD"; then +else $as_nop + if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs @@ -5392,8 +5319,7 @@ else case e in #( IFS=$lt_save_ifs else lt_cv_path_LD=$LD # Let the user override the test with a path. -fi ;; -esac +fi fi LD=$lt_cv_path_LD @@ -5410,8 +5336,8 @@ printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 -else case e in #( - e) # I'd rather use --version here, but apparently some GNU lds only accept -v. +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 @@ -5439,8 +5364,8 @@ printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$NM"; then +else $as_nop + if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else @@ -5487,8 +5412,7 @@ else IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} -fi ;; -esac +fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } @@ -5509,8 +5433,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$DUMPBIN"; then +else $as_nop + if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5532,8 +5456,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then @@ -5559,8 +5482,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_DUMPBIN"; then +else $as_nop + if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5582,8 +5505,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then @@ -5637,8 +5559,8 @@ printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_nm_interface="BSD nm" +else $as_nop + lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) @@ -5651,8 +5573,7 @@ else case e in #( if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi - rm -f conftest* ;; -esac + rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } @@ -5674,8 +5595,8 @@ printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 -else case e in #( - e) i=0 +else $as_nop + i=0 teststring=ABCD case $build_os in @@ -5797,8 +5718,7 @@ else case e in #( fi ;; esac - ;; -esac + fi if test -n "$lt_cv_sys_max_cmd_len"; then @@ -5855,8 +5775,8 @@ printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 -else case e in #( - e) case $host in +else $as_nop + case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys @@ -5887,8 +5807,7 @@ else case e in #( lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac - ;; -esac + fi to_host_file_cmd=$lt_cv_to_host_file_cmd @@ -5904,8 +5823,8 @@ printf %s "checking how to convert $build file names to toolchain format... " >& if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 -else case e in #( - e) #assume ordinary cross tools, or native build. +else $as_nop + #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) @@ -5916,8 +5835,7 @@ case $host in esac ;; esac - ;; -esac + fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd @@ -5933,9 +5851,8 @@ printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_ld_reload_flag='-r' ;; -esac +else $as_nop + lt_cv_ld_reload_flag='-r' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } @@ -5976,8 +5893,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FILECMD+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$FILECMD"; then +else $as_nop + if test -n "$FILECMD"; then ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5999,8 +5916,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi FILECMD=$ac_cv_prog_FILECMD if test -n "$FILECMD"; then @@ -6022,8 +5938,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_FILECMD+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_FILECMD"; then +else $as_nop + if test -n "$ac_ct_FILECMD"; then ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6045,8 +5961,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD if test -n "$ac_ct_FILECMD"; then @@ -6086,8 +6001,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$OBJDUMP"; then +else $as_nop + if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6109,8 +6024,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then @@ -6132,8 +6046,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_OBJDUMP"; then +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6155,8 +6069,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then @@ -6197,8 +6110,8 @@ printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_file_magic_cmd='$MAGIC_CMD' +else $as_nop + lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support @@ -6391,8 +6304,7 @@ os2*) lt_cv_deplibs_check_method=pass_all ;; esac - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } @@ -6444,8 +6356,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$DLLTOOL"; then +else $as_nop + if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6467,8 +6379,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then @@ -6490,8 +6401,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_DLLTOOL"; then +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6513,8 +6424,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then @@ -6556,8 +6466,8 @@ printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_sharedlib_from_linklib_cmd='unknown' +else $as_nop + lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) @@ -6577,8 +6487,7 @@ cygwin* | mingw* | pw32* | cegcc*) lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } @@ -6602,8 +6511,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$AR"; then +else $as_nop + if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6625,8 +6534,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then @@ -6652,8 +6560,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_AR"; then +else $as_nop + if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6675,8 +6583,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then @@ -6738,8 +6645,8 @@ printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_ar_at_file=no +else $as_nop + lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -6776,8 +6683,7 @@ then : fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } @@ -6802,8 +6708,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$STRIP"; then +else $as_nop + if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6825,8 +6731,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then @@ -6848,8 +6753,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_STRIP"; then +else $as_nop + if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6871,8 +6776,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then @@ -6913,8 +6817,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$RANLIB"; then +else $as_nop + if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6936,8 +6840,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then @@ -6959,8 +6862,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_RANLIB"; then +else $as_nop + if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6982,8 +6885,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then @@ -7094,8 +6996,8 @@ printf %s "checking command to parse $NM output from $compiler object... " >&6; if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 -else case e in #( - e) +else $as_nop + # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -7350,8 +7252,7 @@ _LT_EOF lt_cv_sys_global_symbol_pipe= fi done - ;; -esac + fi if test -z "$lt_cv_sys_global_symbol_pipe"; then @@ -7415,9 +7316,8 @@ printf %s "checking for sysroot... " >&6; } if test ${with_sysroot+y} then : withval=$with_sysroot; -else case e in #( - e) with_sysroot=no ;; -esac +else $as_nop + with_sysroot=no fi @@ -7452,8 +7352,8 @@ printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 -else case e in #( - e) printf 0123456789abcdef0123456789abcdef >conftest.i +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then @@ -7489,8 +7389,7 @@ else ac_cv_path_lt_DD=$lt_DD fi -rm -f conftest.i conftest2.i conftest.out ;; -esac +rm -f conftest.i conftest2.i conftest.out fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } @@ -7501,8 +7400,8 @@ printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 -else case e in #( - e) printf 0123456789abcdef0123456789abcdef >conftest.i +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then @@ -7510,8 +7409,7 @@ if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; the && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out -test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" ;; -esac +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } @@ -7721,8 +7619,8 @@ printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_ext=c +else $as_nop + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -7742,9 +7640,8 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes -else case e in #( - e) lt_cv_cc_needs_belf=no ;; -esac +else $as_nop + lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -7753,8 +7650,7 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } @@ -7812,8 +7708,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$MANIFEST_TOOL"; then +else $as_nop + if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7835,8 +7731,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then @@ -7858,8 +7753,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_MANIFEST_TOOL"; then +else $as_nop + if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7881,8 +7776,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then @@ -7914,16 +7808,15 @@ printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_mainfest_tool+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_path_mainfest_tool=no +else $as_nop + lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi - rm -f conftest* ;; -esac + rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } @@ -7946,8 +7839,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$DSYMUTIL"; then +else $as_nop + if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7969,8 +7862,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then @@ -7992,8 +7884,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_DSYMUTIL"; then +else $as_nop + if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8015,8 +7907,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then @@ -8050,8 +7941,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_NMEDIT+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$NMEDIT"; then +else $as_nop + if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8073,8 +7964,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then @@ -8096,8 +7986,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_NMEDIT+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_NMEDIT"; then +else $as_nop + if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8119,8 +8009,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then @@ -8154,8 +8043,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$LIPO"; then +else $as_nop + if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8177,8 +8066,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then @@ -8200,8 +8088,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_LIPO"; then +else $as_nop + if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8223,8 +8111,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then @@ -8258,8 +8145,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$OTOOL"; then +else $as_nop + if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8281,8 +8168,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then @@ -8304,8 +8190,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_OTOOL"; then +else $as_nop + if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8327,8 +8213,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then @@ -8362,8 +8247,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL64+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$OTOOL64"; then +else $as_nop + if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8385,8 +8270,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then @@ -8408,8 +8292,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL64+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_OTOOL64"; then +else $as_nop + if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8431,8 +8315,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then @@ -8489,8 +8372,8 @@ printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_apple_cc_single_mod=no +else $as_nop + lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE @@ -8516,8 +8399,7 @@ else case e in #( fi rm -rf libconftest.dylib* rm -f conftest.* - fi ;; -esac + fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } @@ -8527,8 +8409,8 @@ printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_ld_exported_symbols_list=no +else $as_nop + lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" @@ -8546,15 +8428,13 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes -else case e in #( - e) lt_cv_ld_exported_symbols_list=no ;; -esac +else $as_nop + lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } @@ -8564,8 +8444,8 @@ printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_ld_force_load=no +else $as_nop + lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF @@ -8590,8 +8470,7 @@ _LT_EOF fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$lt_cv_ld_force_load" >&6; } @@ -8731,9 +8610,8 @@ then : IFS=$lt_save_ifs ;; esac -else case e in #( - e) enable_shared=yes ;; -esac +else $as_nop + enable_shared=yes fi @@ -8764,9 +8642,8 @@ then : IFS=$lt_save_ifs ;; esac -else case e in #( - e) enable_static=yes ;; -esac +else $as_nop + enable_static=yes fi @@ -8797,9 +8674,8 @@ then : IFS=$lt_save_ifs ;; esac -else case e in #( - e) pic_mode=default ;; -esac +else $as_nop + pic_mode=default fi @@ -8829,9 +8705,8 @@ then : IFS=$lt_save_ifs ;; esac -else case e in #( - e) enable_fast_install=yes ;; -esac +else $as_nop + enable_fast_install=yes fi @@ -8858,17 +8733,15 @@ then : ;; esac lt_cv_with_aix_soname=$with_aix_soname -else case e in #( - e) if test ${lt_cv_with_aix_soname+y} +else $as_nop + if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_with_aix_soname=aix ;; -esac +else $as_nop + lt_cv_with_aix_soname=aix fi - with_aix_soname=$lt_cv_with_aix_soname ;; -esac + with_aix_soname=$lt_cv_with_aix_soname fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 @@ -8959,8 +8832,8 @@ printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 -else case e in #( - e) rm -f .libs 2>/dev/null +else $as_nop + rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs @@ -8968,8 +8841,7 @@ else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi -rmdir .libs 2>/dev/null ;; -esac +rmdir .libs 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } @@ -9030,8 +8902,8 @@ printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 -else case e in #( - e) case $MAGIC_CMD in +else $as_nop + case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; @@ -9074,7 +8946,6 @@ _LT_EOF IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; -esac ;; esac fi @@ -9098,8 +8969,8 @@ printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 -else case e in #( - e) case $MAGIC_CMD in +else $as_nop + case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; @@ -9142,7 +9013,6 @@ _LT_EOF IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; -esac ;; esac fi @@ -9238,8 +9108,8 @@ printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_prog_compiler_rtti_exceptions=no +else $as_nop + lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment @@ -9267,8 +9137,7 @@ else case e in #( fi fi $RM conftest* - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } @@ -9633,9 +9502,8 @@ printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;; -esac +else $as_nop + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } @@ -9650,8 +9518,8 @@ printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_prog_compiler_pic_works=no +else $as_nop + lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment @@ -9679,8 +9547,7 @@ else case e in #( fi fi $RM conftest* - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } @@ -9716,8 +9583,8 @@ printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_prog_compiler_static_works=no +else $as_nop + lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext @@ -9738,8 +9605,7 @@ else case e in #( fi $RM -r conftest* LDFLAGS=$save_LDFLAGS - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } @@ -9761,8 +9627,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_prog_compiler_c_o=no +else $as_nop + lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest @@ -9802,8 +9668,7 @@ else case e in #( cd .. $RM -r conftest $RM conftest* - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -9818,8 +9683,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_prog_compiler_c_o=no +else $as_nop + lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest @@ -9859,8 +9724,7 @@ else case e in #( cd .. $RM -r conftest $RM conftest* - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -10455,8 +10319,8 @@ else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10488,8 +10352,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi - ;; -esac + fi aix_libpath=$lt_cv_aix_libpath_ @@ -10511,8 +10374,8 @@ else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10544,8 +10407,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi - ;; -esac + fi aix_libpath=$lt_cv_aix_libpath_ @@ -10796,8 +10658,8 @@ printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_prog_compiler__b=no +else $as_nop + lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext @@ -10818,8 +10680,7 @@ else case e in #( fi $RM -r conftest* LDFLAGS=$save_LDFLAGS - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } @@ -10867,8 +10728,8 @@ printf %s "checking whether the $host_os linker accepts -exported_symbol... " >& if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 -else case e in #( - e) save_LDFLAGS=$LDFLAGS +else $as_nop + save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -10877,14 +10738,12 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes -else case e in #( - e) lt_cv_irix_exported_symbol=no ;; -esac +else $as_nop + lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS ;; -esac + LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } @@ -11210,8 +11069,8 @@ printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 -else case e in #( - e) $RM conftest* +else $as_nop + $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 @@ -11247,8 +11106,7 @@ else case e in #( cat conftest.err 1>&5 fi $RM conftest* - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } @@ -11975,8 +11833,8 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 -else case e in #( - e) lt_cv_shlibpath_overrides_runpath=no +else $as_nop + lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ @@ -12003,8 +11861,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir - ;; -esac + fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath @@ -12429,22 +12286,16 @@ printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_check_lib_save_LIBS=$LIBS +else $as_nop + ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (void); + builtin and then its argument prototype would still apply. */ +char dlopen (); int main (void) { @@ -12456,27 +12307,24 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes -else case e in #( - e) ac_cv_lib_dl_dlopen=no ;; -esac +else $as_nop + ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS ;; -esac +LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else case e in #( - e) +else $as_nop + lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes - ;; -esac + fi ;; @@ -12494,28 +12342,22 @@ fi if test "x$ac_cv_func_shl_load" = xyes then : lt_cv_dlopen=shl_load -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_check_lib_save_LIBS=$LIBS +else $as_nop + ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (void); + builtin and then its argument prototype would still apply. */ +char shl_load (); int main (void) { @@ -12527,47 +12369,39 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes -else case e in #( - e) ac_cv_lib_dld_shl_load=no ;; -esac +else $as_nop + ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS ;; -esac +LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else case e in #( - e) ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +else $as_nop + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes then : lt_cv_dlopen=dlopen -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_check_lib_save_LIBS=$LIBS +else $as_nop + ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (void); + builtin and then its argument prototype would still apply. */ +char dlopen (); int main (void) { @@ -12579,42 +12413,34 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes -else case e in #( - e) ac_cv_lib_dl_dlopen=no ;; -esac +else $as_nop + ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS ;; -esac +LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_check_lib_save_LIBS=$LIBS +else $as_nop + ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (void); + builtin and then its argument prototype would still apply. */ +char dlopen (); int main (void) { @@ -12626,42 +12452,34 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes -else case e in #( - e) ac_cv_lib_svld_dlopen=no ;; -esac +else $as_nop + ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS ;; -esac +LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_check_lib_save_LIBS=$LIBS +else $as_nop + ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (void); + builtin and then its argument prototype would still apply. */ +char dld_link (); int main (void) { @@ -12673,14 +12491,12 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes -else case e in #( - e) ac_cv_lib_dld_dld_link=no ;; -esac +else $as_nop + ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS ;; -esac +LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } @@ -12689,24 +12505,19 @@ then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi - ;; -esac + fi - ;; -esac + fi - ;; -esac + fi - ;; -esac + fi - ;; -esac + fi ;; @@ -12734,8 +12545,8 @@ printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test yes = "$cross_compiling"; then : +else $as_nop + if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -12829,8 +12640,7 @@ _LT_EOF fi rm -fr conftest* - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } @@ -12842,8 +12652,8 @@ printf %s "checking whether a statically linked program can dlopen itself... " > if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test yes = "$cross_compiling"; then : +else $as_nop + if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -12937,8 +12747,7 @@ _LT_EOF fi rm -fr conftest* - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } @@ -13112,9 +12921,8 @@ printf %s "checking whether to enable maintainer-specific portions of Makefiles. if test ${enable_maintainer_mode+y} then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else case e in #( - e) USE_MAINTAINER_MODE=no ;; -esac +else $as_nop + USE_MAINTAINER_MODE=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 @@ -13150,8 +12958,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13173,8 +12981,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13196,8 +13003,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_CC"; then +else $as_nop + if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13219,8 +13026,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -13255,8 +13061,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13278,8 +13084,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13301,8 +13106,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no @@ -13341,8 +13146,7 @@ if test $ac_prog_rejected = yes; then ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13366,8 +13170,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13389,8 +13193,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13416,8 +13219,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_CC"; then +else $as_nop + if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13439,8 +13242,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -13478,8 +13280,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$CC"; then +else $as_nop + if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13501,8 +13303,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13524,8 +13325,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_CC"; then +else $as_nop + if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13547,8 +13348,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -13577,10 +13377,10 @@ fi fi -test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See 'config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -13612,8 +13412,8 @@ printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -13630,14 +13430,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes -else case e in #( - e) ac_compiler_gnu=no ;; -esac +else $as_nop + ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } @@ -13655,8 +13453,8 @@ printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_save_c_werror_flag=$ac_c_werror_flag +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" @@ -13674,8 +13472,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes -else case e in #( - e) CFLAGS="" +else $as_nop + CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13690,8 +13488,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else case e in #( - e) ac_c_werror_flag=$ac_save_c_werror_flag +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13708,15 +13506,12 @@ if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag ;; -esac + ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } @@ -13743,8 +13538,8 @@ printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_cv_prog_cc_c11=no +else $as_nop + ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13761,28 +13556,25 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC ;; -esac +CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else case e in #( - e) if test "x$ac_cv_prog_cc_c11" = x +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } - CC="$CC $ac_cv_prog_cc_c11" ;; -esac + CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 ;; -esac + ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno @@ -13792,8 +13584,8 @@ printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_cv_prog_cc_c99=no +else $as_nop + ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13810,28 +13602,25 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC ;; -esac +CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else case e in #( - e) if test "x$ac_cv_prog_cc_c99" = x +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } - CC="$CC $ac_cv_prog_cc_c99" ;; -esac + CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 ;; -esac + ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno @@ -13841,8 +13630,8 @@ printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_cv_prog_cc_c89=no +else $as_nop + ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13859,28 +13648,25 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC ;; -esac +CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else case e in #( - e) if test "x$ac_cv_prog_cc_c89" = x +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } - CC="$CC $ac_cv_prog_cc_c89" ;; -esac + CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 ;; -esac + ac_prog_cc_stdc=c89 fi fi @@ -13901,8 +13687,8 @@ printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -13932,8 +13718,7 @@ _ACEOF fi done rm -f core conftest* - unset am_i ;; -esac + unset am_i fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } @@ -13959,8 +13744,8 @@ printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up @@ -14064,8 +13849,7 @@ else case e in #( else am_cv_CC_dependencies_compiler_type=none fi - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } @@ -14121,21 +13905,15 @@ printf %s "checking for library containing floor... " >&6; } if test ${ac_cv_search_floor+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_func_search_save_LIBS=$LIBS +else $as_nop + ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char floor (void); + builtin and then its argument prototype would still apply. */ +char floor (); int main (void) { @@ -14166,13 +13944,11 @@ done if test ${ac_cv_search_floor+y} then : -else case e in #( - e) ac_cv_search_floor=no ;; -esac +else $as_nop + ac_cv_search_floor=no fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS ;; -esac +LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_floor" >&5 printf "%s\n" "$ac_cv_search_floor" >&6; } @@ -14181,12 +13957,11 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -else case e in #( - e) +else $as_nop + echo "floor()" exit 1 - ;; -esac + fi @@ -14196,21 +13971,15 @@ printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_func_search_save_LIBS=$LIBS +else $as_nop + ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char socket (void); + builtin and then its argument prototype would still apply. */ +char socket (); int main (void) { @@ -14241,13 +14010,11 @@ done if test ${ac_cv_search_socket+y} then : -else case e in #( - e) ac_cv_search_socket=no ;; -esac +else $as_nop + ac_cv_search_socket=no fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS ;; -esac +LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } @@ -14256,12 +14023,11 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -else case e in #( - e) +else $as_nop + echo "socket()" exit 1 - ;; -esac + fi @@ -14271,21 +14037,15 @@ printf %s "checking for library containing inet_ntop... " >&6; } if test ${ac_cv_search_inet_ntop+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_func_search_save_LIBS=$LIBS +else $as_nop + ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char inet_ntop (void); + builtin and then its argument prototype would still apply. */ +char inet_ntop (); int main (void) { @@ -14316,13 +14076,11 @@ done if test ${ac_cv_search_inet_ntop+y} then : -else case e in #( - e) ac_cv_search_inet_ntop=no ;; -esac +else $as_nop + ac_cv_search_inet_ntop=no fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS ;; -esac +LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 printf "%s\n" "$ac_cv_search_inet_ntop" >&6; } @@ -14331,12 +14089,11 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -else case e in #( - e) +else $as_nop + echo "inet_ntop()" exit 1 - ;; -esac + fi @@ -14346,8 +14103,8 @@ printf %s "checking for an ANSI C-conforming const... " >&6; } if test ${ac_cv_c_const+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -14411,12 +14168,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_const=yes -else case e in #( - e) ac_cv_c_const=no ;; -esac +else $as_nop + ac_cv_c_const=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 printf "%s\n" "$ac_cv_c_const" >&6; } @@ -14442,8 +14197,8 @@ if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 -else case e in #( - e) # Double quotes because $CC needs to be expanded +else $as_nop + # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false @@ -14461,10 +14216,9 @@ _ACEOF if ac_fn_c_try_cpp "$LINENO" then : -else case e in #( - e) # Broken: fails on valid input. -continue ;; -esac +else $as_nop + # Broken: fails on valid input. +continue fi rm -f conftest.err conftest.i conftest.$ac_ext @@ -14478,16 +14232,15 @@ if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue -else case e in #( - e) # Passes both tests. +else $as_nop + # Passes both tests. ac_preproc_ok=: -break ;; -esac +break fi rm -f conftest.err conftest.i conftest.$ac_ext done -# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : @@ -14496,8 +14249,7 @@ fi done ac_cv_prog_CPP=$CPP - ;; -esac + fi CPP=$ac_cv_prog_CPP else @@ -14520,10 +14272,9 @@ _ACEOF if ac_fn_c_try_cpp "$LINENO" then : -else case e in #( - e) # Broken: fails on valid input. -continue ;; -esac +else $as_nop + # Broken: fails on valid input. +continue fi rm -f conftest.err conftest.i conftest.$ac_ext @@ -14537,26 +14288,24 @@ if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue -else case e in #( - e) # Passes both tests. +else $as_nop + # Passes both tests. ac_preproc_ok=: -break ;; -esac +break fi rm -f conftest.err conftest.i conftest.$ac_ext done -# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : -else case e in #( - e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See 'config.log' for more details" "$LINENO" 5; } ;; -esac +See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c @@ -14566,140 +14315,6 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 -printf %s "checking for egrep -e... " >&6; } -if test ${ac_cv_path_EGREP_TRADITIONAL+y} -then : - printf %s "(cached) " >&6 -else case e in #( - e) if test -z "$EGREP_TRADITIONAL"; then - ac_path_EGREP_TRADITIONAL_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in grep ggrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue -# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. - # Check for GNU $ac_path_EGREP_TRADITIONAL -case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( -*GNU*) - ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; -#( -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" - "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" - ac_path_EGREP_TRADITIONAL_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_TRADITIONAL_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then - : - fi -else - ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL -fi - - if test "$ac_cv_path_EGREP_TRADITIONAL" -then : - ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" -else case e in #( - e) if test -z "$EGREP_TRADITIONAL"; then - ac_path_EGREP_TRADITIONAL_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in egrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue -# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. - # Check for GNU $ac_path_EGREP_TRADITIONAL -case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( -*GNU*) - ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; -#( -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" - "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" - ac_path_EGREP_TRADITIONAL_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_TRADITIONAL_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL -fi - ;; -esac -fi ;; -esac -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 -printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } - EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL - @@ -14740,14 +14355,8 @@ printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_join (void); + builtin and then its argument prototype would still apply. */ +char pthread_join (); int main (void) { @@ -14841,7 +14450,7 @@ case $host_os in _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} @@ -14871,8 +14480,8 @@ printf %s "checking whether $CC is Clang... " >&6; } if test ${ax_cv_PTHREAD_CLANG+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ax_cv_PTHREAD_CLANG=no +else $as_nop + ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14884,15 +14493,14 @@ else case e in #( _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 then : ax_cv_PTHREAD_CLANG=yes fi rm -rf conftest* fi - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } @@ -14942,9 +14550,8 @@ esac if test "x$ax_pthread_check_macro" = "x--" then : ax_pthread_check_cond=0 -else case e in #( - e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;; -esac +else $as_nop + ax_pthread_check_cond="!defined($ax_pthread_check_macro)" fi @@ -14978,8 +14585,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ax_pthread_config+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ax_pthread_config"; then +else $as_nop + if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15002,8 +14609,7 @@ done IFS=$as_save_IFS test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" -fi ;; -esac +fi fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then @@ -15136,8 +14742,8 @@ printf %s "checking whether Clang needs flag to prevent \"argument unused\" warn if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown +else $as_nop + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second @@ -15183,8 +14789,7 @@ then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } @@ -15211,8 +14816,8 @@ printf %s "checking for joinable pthread attribute... " >&6; } if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown +else $as_nop + ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15232,8 +14837,7 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } @@ -15253,15 +14857,14 @@ printf %s "checking whether more special flags are required for pthreads... " >& if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ax_cv_PTHREAD_SPECIAL_FLAGS=no +else $as_nop + ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } @@ -15277,8 +14880,8 @@ printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -15293,14 +14896,12 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_PRIO_INHERIT=yes -else case e in #( - e) ax_cv_PTHREAD_PRIO_INHERIT=no ;; -esac +else $as_nop + ax_cv_PTHREAD_PRIO_INHERIT=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - ;; -esac + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } @@ -15350,8 +14951,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CC+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$PTHREAD_CC"; then +else $as_nop + if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15373,8 +14974,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then @@ -15401,8 +15001,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CXX+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$PTHREAD_CXX"; then +else $as_nop + if test -n "$PTHREAD_CXX"; then ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15424,8 +15024,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX if test -n "$PTHREAD_CXX"; then @@ -15510,8 +15109,8 @@ if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } -else case e in #( - e) save_LIBS="$LIBS" +else $as_nop + save_LIBS="$LIBS" LIBS="$LIBS -latomic" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15528,15 +15127,13 @@ if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else case e in #( - e) as_fn_error $? "failed to find working configuration with atomics" "$LINENO" 5 - ;; -esac +else $as_nop + as_fn_error $? "failed to find working configuration with atomics" "$LINENO" 5 + fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - ;; -esac + fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -15572,12 +15169,11 @@ then : ;; esac -else case e in #( - e) +else $as_nop + try_sctp=true - ;; -esac + fi @@ -15616,21 +15212,15 @@ printf %s "checking for library containing sctp_bindx... " >&6; } if test ${ac_cv_search_sctp_bindx+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_func_search_save_LIBS=$LIBS +else $as_nop + ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char sctp_bindx (void); + builtin and then its argument prototype would still apply. */ +char sctp_bindx (); int main (void) { @@ -15661,13 +15251,11 @@ done if test ${ac_cv_search_sctp_bindx+y} then : -else case e in #( - e) ac_cv_search_sctp_bindx=no ;; -esac +else $as_nop + ac_cv_search_sctp_bindx=no fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS ;; -esac +LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sctp_bindx" >&5 printf "%s\n" "$ac_cv_search_sctp_bindx" >&6; } @@ -15691,8 +15279,8 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else case e in #( - e) eval "$3=no" +else $as_nop + eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @@ -15722,14 +15310,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else case e in #( - e) eval "$3=yes" ;; -esac +else $as_nop + eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -15758,22 +15344,20 @@ then : printf "%s\n" "#define HAVE_ENDIAN_H 1" >>confdefs.h -else case e in #( - e) ac_fn_c_check_header_compile "$LINENO" "sys/endian.h" "ac_cv_header_sys_endian_h" "$ac_includes_default" +else $as_nop + ac_fn_c_check_header_compile "$LINENO" "sys/endian.h" "ac_cv_header_sys_endian_h" "$ac_includes_default" if test "x$ac_cv_header_sys_endian_h" = xyes then : printf "%s\n" "#define HAVE_SYS_ENDIAN_H 1" >>confdefs.h -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Couldn't find endian.h or sys/endian.h files: doing compile-time tests." >&5 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Couldn't find endian.h or sys/endian.h files: doing compile-time tests." >&5 printf "%s\n" "$as_me: WARNING: Couldn't find endian.h or sys/endian.h files: doing compile-time tests." >&2;} - ;; -esac + fi - ;; -esac + fi @@ -15798,8 +15382,8 @@ then : ;; esac -else case e in #( - e) +else $as_nop + # if pkg-config is installed and openssl has installed a .pc file, # then use that information and don't search ssldirs if test -n "$ac_tool_prefix"; then @@ -15810,8 +15394,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PKG_CONFIG+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$PKG_CONFIG"; then +else $as_nop + if test -n "$PKG_CONFIG"; then ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15833,8 +15417,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi PKG_CONFIG=$ac_cv_prog_PKG_CONFIG if test -n "$PKG_CONFIG"; then @@ -15856,8 +15439,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_PKG_CONFIG+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test -n "$ac_ct_PKG_CONFIG"; then +else $as_nop + if test -n "$ac_ct_PKG_CONFIG"; then ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15879,8 +15462,7 @@ done done IFS=$as_save_IFS -fi ;; -esac +fi fi ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG if test -n "$ac_ct_PKG_CONFIG"; then @@ -15920,8 +15502,7 @@ fi ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr" fi - ;; -esac + fi @@ -15987,19 +15568,18 @@ printf "%s\n" "#define HAVE_SSL 1" >>confdefs.h have_ssl=true -else case e in #( - e) +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if test "x$with_openssl" != "x"; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-openssl was given, but test for OpenSSL failed -See 'config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5; } fi - ;; -esac + fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -16029,8 +15609,8 @@ printf %s "checking TCP_CONGESTION socket option... " >&6; } if test ${iperf3_cv_header_tcp_congestion+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -16044,12 +15624,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_tcp_congestion=yes -else case e in #( - e) iperf3_cv_header_tcp_congestion=no ;; -esac +else $as_nop + iperf3_cv_header_tcp_congestion=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_tcp_congestion" >&5 printf "%s\n" "$iperf3_cv_header_tcp_congestion" >&6; } @@ -16065,8 +15643,8 @@ printf %s "checking TCP_USER_TIMEOUT socket option... " >&6; } if test ${iperf3_cv_header_tcp_user_timeout+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -16080,12 +15658,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_tcp_user_timeout=yes -else case e in #( - e) iperf3_cv_header_tcp_user_timeout=no ;; -esac +else $as_nop + iperf3_cv_header_tcp_user_timeout=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_tcp_user_timeout" >&5 printf "%s\n" "$iperf3_cv_header_tcp_user_timeout" >&6; } @@ -16104,8 +15680,8 @@ printf %s "checking IPv6 flowlabel support... " >&6; } if test ${iperf3_cv_header_flowlabel+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -16120,12 +15696,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_flowlabel=yes -else case e in #( - e) iperf3_cv_header_flowlabel=no ;; -esac +else $as_nop + iperf3_cv_header_flowlabel=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_flowlabel" >&5 printf "%s\n" "$iperf3_cv_header_flowlabel" >&6; } @@ -16143,12 +15717,12 @@ fi for ac_func in cpuset_setaffinity sched_setaffinity SetProcessAffinityMask do : - as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes" then : cat >>confdefs.h <<_ACEOF -#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF printf "%s\n" "#define HAVE_CPU_AFFINITY 1" >>confdefs.h @@ -16193,8 +15767,8 @@ printf %s "checking SO_MAX_PACING_RATE socket option... " >&6; } if test ${iperf3_cv_header_so_max_pacing_rate+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -16208,12 +15782,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_so_max_pacing_rate=yes -else case e in #( - e) iperf3_cv_header_so_max_pacing_rate=no ;; -esac +else $as_nop + iperf3_cv_header_so_max_pacing_rate=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_so_max_pacing_rate" >&5 printf "%s\n" "$iperf3_cv_header_so_max_pacing_rate" >&6; } @@ -16229,8 +15801,8 @@ printf %s "checking SO_BINDTODEVICE socket option... " >&6; } if test ${iperf3_cv_header_so_bindtodevice+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -16244,12 +15816,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_so_bindtodevice=yes -else case e in #( - e) iperf3_cv_header_so_bindtodevice=no ;; -esac +else $as_nop + iperf3_cv_header_so_bindtodevice=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_so_bindtodevice" >&5 printf "%s\n" "$iperf3_cv_header_so_bindtodevice" >&6; } @@ -16265,8 +15835,8 @@ printf %s "checking IP_MTU_DISCOVER socket option... " >&6; } if test ${iperf3_cv_header_ip_mtu_discover+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -16282,12 +15852,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_ip_mtu_discover=yes -else case e in #( - e) iperf3_cv_header_ip_mtu_discover=no ;; -esac +else $as_nop + iperf3_cv_header_ip_mtu_discover=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_ip_mtu_discover" >&5 printf "%s\n" "$iperf3_cv_header_ip_mtu_discover" >&6; } @@ -16303,8 +15871,8 @@ printf %s "checking IP_DONTFRAG socket option... " >&6; } if test ${iperf3_cv_header_ip_dontfrag+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -16320,12 +15888,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_ip_dontfrag=yes -else case e in #( - e) iperf3_cv_header_ip_dontfrag=no ;; -esac +else $as_nop + iperf3_cv_header_ip_dontfrag=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_ip_dontfrag" >&5 printf "%s\n" "$iperf3_cv_header_ip_dontfrag" >&6; } @@ -16341,8 +15907,8 @@ printf %s "checking IP_DONTFRAGMENT socket option... " >&6; } if test ${iperf3_cv_header_ip_dontfragment+y} then : printf %s "(cached) " >&6 -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -16358,12 +15924,10 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_ip_dontfragment=yes -else case e in #( - e) iperf3_cv_header_ip_dontfragment=no ;; -esac +else $as_nop + iperf3_cv_header_ip_dontfragment=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_ip_dontfragment" >&5 printf "%s\n" "$iperf3_cv_header_ip_dontfragment" >&6; } @@ -16379,13 +15943,12 @@ printf %s "checking any kind of DF socket option... " >&6; } if test ${iperf3_cv_header_dontfragment+y} then : printf %s "(cached) " >&6 -else case e in #( - e) if test "x$iperf3_cv_header_ip_mtu_discover" = "xyes" -o "x$iperf3_cv_header_ip_dontfrag" = "xyes" -o "x$iperf3_cv_header_ip_dontfragment" = "xyes"; then +else $as_nop + if test "x$iperf3_cv_header_ip_mtu_discover" = "xyes" -o "x$iperf3_cv_header_ip_dontfrag" = "xyes" -o "x$iperf3_cv_header_ip_dontfragment" = "xyes"; then iperf3_cv_header_dontfragment=yes else iperf3_cv_header_dontfragment=no -fi ;; -esac +fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_dontfragment" >&5 printf "%s\n" "$iperf3_cv_header_dontfragment" >&6; } @@ -16410,9 +15973,8 @@ ac_fn_c_check_member "$LINENO" "struct tcp_info" "tcpi_snd_wnd" "ac_cv_member_st if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_wnd" = xyes then : iperf3_cv_header_tcp_info_snd_wnd=yes -else case e in #( - e) iperf3_cv_header_tcp_info_snd_wnd=no ;; -esac +else $as_nop + iperf3_cv_header_tcp_info_snd_wnd=no fi @@ -16428,21 +15990,15 @@ printf %s "checking for library containing clock_gettime... " >&6; } if test ${ac_cv_search_clock_gettime+y} then : printf %s "(cached) " >&6 -else case e in #( - e) ac_func_search_save_LIBS=$LIBS +else $as_nop + ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char clock_gettime (void); + builtin and then its argument prototype would still apply. */ +char clock_gettime (); int main (void) { @@ -16473,13 +16029,11 @@ done if test ${ac_cv_search_clock_gettime+y} then : -else case e in #( - e) ac_cv_search_clock_gettime=no ;; -esac +else $as_nop + ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS ;; -esac +LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 printf "%s\n" "$ac_cv_search_clock_gettime" >&6; } @@ -16511,8 +16065,8 @@ cat >confcache <<\_ACEOF # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # -# 'ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* 'ac_cv_foo' will be assigned the +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF @@ -16542,14 +16096,14 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # 'set' does not quote correctly, so add quotes: double-quote + # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) - # 'set' quotes correctly as required by POSIX, so do not add quotes. + # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | @@ -16679,6 +16233,7 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh @@ -16687,13 +16242,12 @@ then : # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else case e in #( - e) case `(set -o) 2>/dev/null` in #( +else $as_nop + case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; -esac ;; esac fi @@ -16765,7 +16319,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as 'sh COMMAND' +# We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 @@ -16794,6 +16348,7 @@ as_fn_error () } # as_fn_error + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -16833,12 +16388,11 @@ then : { eval $1+=\$2 }' -else case e in #( - e) as_fn_append () +else $as_nop + as_fn_append () { eval $1=\$$1\$2 - } ;; -esac + } fi # as_fn_append # as_fn_arith ARG... @@ -16852,12 +16406,11 @@ then : { as_val=$(( $* )) }' -else case e in #( - e) as_fn_arith () +else $as_nop + as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } ;; -esac + } fi # as_fn_arith @@ -16940,9 +16493,9 @@ if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: - # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. - # In both cases, we have to default to 'cp -pR'. + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then @@ -17023,12 +16576,10 @@ as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. -as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" -as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" -as_tr_sh="eval sed '$as_sed_sh'" # deprecated +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 @@ -17043,8 +16594,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.16+, which was -generated by GNU Autoconf 2.72. Invocation command line was +This file was extended by iperf $as_me 3.17+, which was +generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -17076,7 +16627,7 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -'$as_me' instantiates files and other configuration actions +\`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. @@ -17112,11 +16663,11 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.16+ -configured by $0, generated by GNU Autoconf 2.72, +iperf config.status 3.17+ +configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" -Copyright (C) 2023 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -17178,8 +16729,8 @@ do ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error $? "ambiguous option: '$1' -Try '$0 --help' for more information.";; + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -17187,8 +16738,8 @@ Try '$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error $? "unrecognized option: '$1' -Try '$0 --help' for more information." ;; + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; @@ -17535,7 +17086,7 @@ do "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "iperf3.spec") CONFIG_FILES="$CONFIG_FILES iperf3.spec" ;; - *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -17555,7 +17106,7 @@ fi # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to '$tmp'. +# after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= @@ -17579,7 +17130,7 @@ ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. -# This happens for instance with './config.status config.h'. +# This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then @@ -17737,13 +17288,13 @@ fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with './config.status Makefile'. +# This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF -# Transform confdefs.h into an awk script 'defines.awk', embedded as +# Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. @@ -17853,7 +17404,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -17875,19 +17426,19 @@ do -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain ':'. + # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done - # Let's still pretend it is 'configure' which instantiates (i.e., don't + # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` @@ -18020,7 +17571,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 esac _ACEOF -# Neutralize VPATH when '$srcdir' = '.'. +# Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -18051,9 +17602,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -18208,15 +17759,15 @@ printf "%s\n" X/"$am_mf" | (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). -See 'config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} diff --git a/configure.ac b/configure.ac index ae97228dd..0871d3b2d 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.16+],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.17+],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) diff --git a/src/iperf3.1 b/src/iperf3.1 index 2561414f5..f8eff48d2 100644 --- a/src/iperf3.1 +++ b/src/iperf3.1 @@ -1,4 +1,4 @@ -.TH IPERF3 1 "November 2023" ESnet "User Manuals" +.TH IPERF3 1 "May 2024" ESnet "User Manuals" .SH NAME iperf3 \- perform network throughput tests .SH SYNOPSIS diff --git a/src/iperf_config.h.in b/src/iperf_config.h.in index c85b19521..bb8853ff4 100644 --- a/src/iperf_config.h.in +++ b/src/iperf_config.h.in @@ -1,15 +1,15 @@ /* src/iperf_config.h.in. Generated from configure.ac by autoheader. */ -/* Define to 1 if you have the 'clock_gettime' function. */ +/* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME -/* Define to 1 if you have the 'cpuset_setaffinity' function. */ +/* Define to 1 if you have the `cpuset_setaffinity' function. */ #undef HAVE_CPUSET_SETAFFINITY /* Have CPU affinity support. */ #undef HAVE_CPU_AFFINITY -/* Define to 1 if you have the 'daemon' function. */ +/* Define to 1 if you have the `daemon' function. */ #undef HAVE_DAEMON /* Define to 1 if you have the header file. */ @@ -24,7 +24,7 @@ /* Have IPv6 flowlabel support. */ #undef HAVE_FLOWLABEL -/* Define to 1 if you have the 'getline' function. */ +/* Define to 1 if you have the `getline' function. */ #undef HAVE_GETLINE /* Define to 1 if you have the header file. */ @@ -54,16 +54,16 @@ /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT -/* Define to 1 if you have the 'sched_setaffinity' function. */ +/* Define to 1 if you have the `sched_setaffinity' function. */ #undef HAVE_SCHED_SETAFFINITY /* Have SCTP support. */ #undef HAVE_SCTP_H -/* Define to 1 if you have the 'sendfile' function. */ +/* Define to 1 if you have the `sendfile' function. */ #undef HAVE_SENDFILE -/* Define to 1 if you have the 'SetProcessAffinityMask' function. */ +/* Define to 1 if you have the `SetProcessAffinityMask' function. */ #undef HAVE_SETPROCESSAFFINITYMASK /* Have SO_BINDTODEVICE sockopt. */ @@ -93,7 +93,7 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H -/* Define to 1 if the system has the type 'struct sctp_assoc_value'. */ +/* Define to 1 if the system has the type `struct sctp_assoc_value'. */ #undef HAVE_STRUCT_SCTP_ASSOC_VALUE /* Define to 1 if you have the header file. */ @@ -148,7 +148,7 @@ your system. */ #undef PTHREAD_CREATE_JOINABLE -/* Define to 1 if all of the C89 standard headers exist (not just the ones +/* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS @@ -156,5 +156,5 @@ /* Version number of package */ #undef VERSION -/* Define to empty if 'const' does not conform to ANSI C. */ +/* Define to empty if `const' does not conform to ANSI C. */ #undef const From 356f01f91485937173e5557c61d5a41b845a1943 Mon Sep 17 00:00:00 2001 From: Matthew Cather <14895427+MattCatz@users.noreply.github.com> Date: Fri, 10 May 2024 16:27:29 -0500 Subject: [PATCH 093/286] Initialize cookie buffer `Nread` reads up *to* N bytes from the socket. Since we only check that we read more than 0 bytes, it's possible for the cookie buffer only be partially initialized (and may not contain a valid null terminated string). Initializing the buffer to 0 fixes this. Also swap `strcmp` with `strncmp` since we know know exactly how long a cookie should be. This will help prevent any buffer overflows if the length of the cookie ever changes for some reason. --- src/iperf_tcp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index 71c40a6ea..e025515ab 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -117,7 +117,7 @@ iperf_tcp_accept(struct iperf_test * test) { int s; signed char rbuf = ACCESS_DENIED; - char cookie[COOKIE_SIZE]; + char cookie[COOKIE_SIZE] = {0}; socklen_t len; struct sockaddr_storage addr; @@ -149,7 +149,7 @@ iperf_tcp_accept(struct iperf_test * test) return -1; } - if (strcmp(test->cookie, cookie) != 0) { + if (strncmp(test->cookie, cookie, COOKIE_SIZE) != 0) { if (Nwrite(s, (char*) &rbuf, sizeof(rbuf), Ptcp) < 0) { iperf_err(test, "failed to send access denied from busy server to new connecting client, errno = %d\n", errno); } From 2a23508f66c75775fb96be22571b482e41d370d6 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 10 May 2024 17:10:44 -0700 Subject: [PATCH 094/286] Update for iperf-3.17. Various markup and other fixes in Web site. --- docs/conf.py | 7 ++++--- docs/news.rst | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index f2cf9dd7c..96c352c8f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -52,10 +52,10 @@ # built documents. # # The short X.Y version. -version = '3.15' +version = '3.17' # The full version, including alpha/beta/rc tags. -release = '3.15' +release = '3.17' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -159,7 +159,8 @@ #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -html_sidebars = {'index': None, 'search': None, '*': ['localtoc.html']} +#html_sidebars = {'index': None, 'search': None, '*': ['localtoc.html']} +html_sidebars = {'index': [], 'search': [], '**': ['localtoc.html']} # Additional templates that should be rendered to pages, maps page names to # template names. diff --git a/docs/news.rst b/docs/news.rst index 167fe8cd5..9903ec12a 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -1,11 +1,25 @@ iperf3 Project News =================== +2024-05-10: iperf-3.17 released +-------------------------------- +| URL: https://downloads.es.net/pub/iperf/iperf-3.17.tar.gz +| SHA256: ``077ede831b11b733ecf8b273abd97f9630fd7448d3ec1eaa789f396d82c8c943`` + +iperf 3.17 contains a fix for a minor security vulnerability related +to iperf3's authentication feature and its use of RSA-encrypted +credentials. The release notes contain more +details on this breaking change, and how to revert to older, less +secure behavior if needed for backward compatibility with older +versions of iperf3. + +This version also contains a new streaming JSON output format (enabled +with the --json-stream) option, and a number of other bug fixes. + 2023-12-01: iperf-3.16 released -------------------------------- | URL: https://downloads.es.net/pub/iperf/iperf-3.16.tar.gz -| SHA256: -``cc740c6bbea104398cc3e466befc515a25896ec85e44a662d5f4a767b9cf713e`` +| SHA256: ``cc740c6bbea104398cc3e466befc515a25896ec85e44a662d5f4a767b9cf713e`` iperf 3.16 uses multiple threads to serve parallel tests for improved throughput on high-speed links. It also includes support for From 6f1e96ffe230b38efcf92856bfd9535279c93586 Mon Sep 17 00:00:00 2001 From: tqfx Date: Tue, 23 Apr 2024 12:29:16 +0800 Subject: [PATCH 095/286] Fix clang compilation failure due to patch d80b914141582dc0c0cf3f71cc5799061074be66 --- src/iperf_pthread.c | 27 ++++++++++++++------------- src/iperf_pthread.h | 4 ++-- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/iperf_pthread.c b/src/iperf_pthread.c index ea4918bcd..9798a4112 100644 --- a/src/iperf_pthread.c +++ b/src/iperf_pthread.c @@ -6,21 +6,12 @@ * as Android NDK does not support `pthread_cancel()`. */ +#include #include #include "iperf_pthread.h" -int pthread_setcanceltype(int type, int *oldtype) { return 0; } -int pthread_setcancelstate(int state, int *oldstate) { return 0; } -int pthread_cancel(pthread_t thread_id) { - int status; - if ((status = iperf_set_thread_exit_handler()) == 0) { - status = pthread_kill(thread_id, SIGUSR1); - } - return status; -} - void iperf_thread_exit_handler(int sig) -{ +{ pthread_exit(0); } @@ -28,13 +19,23 @@ int iperf_set_thread_exit_handler() { int rc; struct sigaction actions; - memset(&actions, 0, sizeof(actions)); + memset(&actions, 0, sizeof(actions)); sigemptyset(&actions.sa_mask); - actions.sa_flags = 0; + actions.sa_flags = 0; actions.sa_handler = iperf_thread_exit_handler; rc = sigaction(SIGUSR1, &actions, NULL); return rc; } +int pthread_setcanceltype(int type, int *oldtype) { return 0; } +int pthread_setcancelstate(int state, int *oldstate) { return 0; } +int pthread_cancel(pthread_t thread_id) { + int status; + if ((status = iperf_set_thread_exit_handler()) == 0) { + status = pthread_kill(thread_id, SIGUSR1); + } + return status; +} + #endif // defined(HAVE_PTHREAD) && defined(__ANDROID__) diff --git a/src/iperf_pthread.h b/src/iperf_pthread.h index 44828d6a9..9fe3db8a2 100644 --- a/src/iperf_pthread.h +++ b/src/iperf_pthread.h @@ -10,7 +10,7 @@ */ #define PTHREAD_CANCEL_ASYNCHRONOUS 0 -#define PTHREAD_CANCEL_ENABLE NULL +#define PTHREAD_CANCEL_ENABLE 0 int pthread_setcanceltype(int type, int *oldtype); int pthread_setcancelstate(int state, int *oldstate); @@ -18,4 +18,4 @@ int pthread_cancel(pthread_t thread_id); #endif // defined(__ANDROID__) -#endif // defined(HAVE_PTHREAD) \ No newline at end of file +#endif // defined(HAVE_PTHREAD) From fbeb99128283d93b3a92df7c4112169cacf26444 Mon Sep 17 00:00:00 2001 From: swlars Date: Mon, 13 May 2024 11:37:01 -0700 Subject: [PATCH 096/286] iperf-3.17.1 --- RELNOTES.md | 11 +++++++++++ configure.ac | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/RELNOTES.md b/RELNOTES.md index fb973ce17..e5b1275c5 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,6 +1,17 @@ iperf3 Release Notes ==================== +iperf-3.17.1 2024-05-13 +----------------------- + +* Notable user-visible changes + + * Version number has been corrected. (#1699) + +* Notable developer-visible changes + + * No longer signing tags + iperf-3.17 2024-05-10 --------------------- diff --git a/configure.ac b/configure.ac index 0871d3b2d..7caf2abbd 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.17+],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.17.1],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) From a00eef62bf6eecb6c43d15f6b348fbf3c3cd6bb5 Mon Sep 17 00:00:00 2001 From: swlars Date: Mon, 13 May 2024 11:38:25 -0700 Subject: [PATCH 097/286] Regen. --- aclocal.m4 | 4 +- config/config.guess | 107 +- config/config.sub | 236 +++-- config/install-sh | 8 +- configure | 2159 +++++++++++++++++++++++++---------------- src/iperf_config.h.in | 20 +- 6 files changed, 1559 insertions(+), 975 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index 60439e91e..bd04b2e09 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -14,8 +14,8 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, -[m4_warning([this file was generated for autoconf 2.71. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.72],, +[m4_warning([this file was generated for autoconf 2.72. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) diff --git a/config/config.guess b/config/config.guess index e81d3ae7c..cdfc43920 100755 --- a/config/config.guess +++ b/config/config.guess @@ -1,14 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2021 Free Software Foundation, Inc. +# Copyright 1992-2023 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2021-06-03' +timestamp='2023-08-22' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -47,7 +47,7 @@ me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] -Output the configuration name of the system \`$me' is run on. +Output the configuration name of the system '$me' is run on. Options: -h, --help print this help, then exit @@ -60,13 +60,13 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2021 Free Software Foundation, Inc. +Copyright 1992-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try \`$me --help' for more information." +Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -102,8 +102,8 @@ GUESS= # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. +# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still +# use 'HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. @@ -155,6 +155,9 @@ Linux|GNU|GNU/*) set_cc_for_build cat <<-EOF > "$dummy.c" + #if defined(__ANDROID__) + LIBC=android + #else #include #if defined(__UCLIBC__) LIBC=uclibc @@ -169,6 +172,7 @@ Linux|GNU|GNU/*) LIBC=musl #endif #endif + #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" @@ -437,7 +441,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 @@ -459,7 +463,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in UNAME_RELEASE=`uname -v` ;; esac - # Japanese Language versions have a version number like `4.1.3-JL'. + # Japanese Language versions have a version number like '4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; @@ -904,7 +908,7 @@ EOF fi ;; *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; @@ -929,6 +933,9 @@ EOF i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; *:Interix*:*) case $UNAME_MACHINE in x86) @@ -963,11 +970,37 @@ EOF GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; + x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-pc-managarm-mlibc" + ;; + *:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" + ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __ARM_EABI__ + #ifdef __ARM_PCS_VFP + ABI=eabihf + #else + ABI=eabi + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; + esac + fi + GUESS=$CPU-unknown-linux-$LIBCABI ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be @@ -1033,7 +1066,16 @@ EOF k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; - loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + kvx:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + kvx:cos:*:*) + GUESS=$UNAME_MACHINE-unknown-cos + ;; + kvx:mbr:*:*) + GUESS=$UNAME_MACHINE-unknown-mbr + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) @@ -1148,16 +1190,27 @@ EOF ;; x86_64:Linux:*:*) set_cc_for_build + CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then - if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_X32 >/dev/null - then - LIBCABI=${LIBC}x32 - fi + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac fi - GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI + GUESS=$CPU-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC @@ -1177,7 +1230,7 @@ EOF GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility + # If we were able to find 'uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; @@ -1318,7 +1371,7 @@ EOF GUESS=ns32k-sni-sysv fi ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; @@ -1364,8 +1417,11 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; - x86_64:Haiku:*:*) - GUESS=x86_64-unknown-haiku + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE @@ -1522,6 +1578,9 @@ EOF i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; diff --git a/config/config.sub b/config/config.sub index d74fb6dea..defe52c0c 100755 --- a/config/config.sub +++ b/config/config.sub @@ -1,14 +1,14 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2021 Free Software Foundation, Inc. +# Copyright 1992-2023 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2021-08-14' +timestamp='2023-09-19' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -76,13 +76,13 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2021 Free Software Foundation, Inc. +Copyright 1992-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try \`$me --help' for more information." +Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -130,7 +130,7 @@ IFS=$saved_IFS # Separate into logical components for further validation case $1 in *-*-*-*-*) - echo Invalid configuration \`"$1"\': more than four components >&2 + echo "Invalid configuration '$1': more than four components" >&2 exit 1 ;; *-*-*-*) @@ -145,7 +145,8 @@ case $1 in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ - | storm-chaos* | os2-emx* | rtmk-nova*) + | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ + | windows-* ) basic_machine=$field1 basic_os=$maybe_os ;; @@ -943,7 +944,7 @@ $basic_machine EOF IFS=$saved_IFS ;; - # We use `pc' rather than `unknown' + # We use 'pc' rather than 'unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) @@ -1020,6 +1021,11 @@ case $cpu-$vendor in ;; # Here we normalize CPU types with a missing or matching vendor + armh-unknown | armh-alt) + cpu=armv7l + vendor=alt + basic_os=${basic_os:-linux-gnueabihf} + ;; dpx20-unknown | dpx20-bull) cpu=rs6000 vendor=bull @@ -1070,7 +1076,7 @@ case $cpu-$vendor in pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) cpu=i586 ;; - pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) + pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*) cpu=i686 ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) @@ -1121,7 +1127,7 @@ case $cpu-$vendor in xscale-* | xscalee[bl]-*) cpu=`echo "$cpu" | sed 's/^xscale/arm/'` ;; - arm64-*) + arm64-* | aarch64le-*) cpu=aarch64 ;; @@ -1175,7 +1181,7 @@ case $cpu-$vendor in case $cpu in 1750a | 580 \ | a29k \ - | aarch64 | aarch64_be \ + | aarch64 | aarch64_be | aarch64c | arm64ec \ | abacus \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ @@ -1194,45 +1200,23 @@ case $cpu-$vendor in | d10v | d30v | dlx | dsp16xx \ | e2k | elxsi | epiphany \ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | javascript \ | h8300 | h8500 \ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i*86 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ + | kvx \ | le32 | le64 \ | lm32 \ - | loongarch32 | loongarch64 | loongarchx32 \ + | loongarch32 | loongarch64 \ | m32c | m32r | m32rle \ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ | m88110 | m88k | maxq | mb | mcore | mep | metag \ | microblaze | microblazeel \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64eb | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r3 | mipsisa32r3el \ - | mipsisa32r5 | mipsisa32r5el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r3 | mipsisa64r3el \ - | mipsisa64r5 | mipsisa64r5el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ + | mips* \ | mmix \ | mn10200 | mn10300 \ | moxie \ @@ -1280,7 +1264,7 @@ case $cpu-$vendor in ;; *) - echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2 exit 1 ;; esac @@ -1301,11 +1285,12 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if test x$basic_os != x +if test x"$basic_os" != x then -# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. +obj= case $basic_os in gnu/linux*) kernel=linux @@ -1336,6 +1321,10 @@ EOF kernel=linux os=`echo "$basic_os" | sed -e 's|linux|gnu|'` ;; + managarm*) + kernel=managarm + os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'` + ;; *) kernel= os=$basic_os @@ -1501,10 +1490,16 @@ case $os in os=eabi ;; *) - os=elf + os= + obj=elf ;; esac ;; + aout* | coff* | elf* | pe*) + # These are machine code file formats, not OSes + obj=$os + os= + ;; *) # No normalization, but not necessarily accepted, that comes below. ;; @@ -1523,12 +1518,15 @@ else # system, and we'll never get to this point. kernel= +obj= case $cpu-$vendor in score-*) - os=elf + os= + obj=elf ;; spu-*) - os=elf + os= + obj=elf ;; *-acorn) os=riscix1.2 @@ -1538,28 +1536,35 @@ case $cpu-$vendor in os=gnu ;; arm*-semi) - os=aout + os= + obj=aout ;; c4x-* | tic4x-*) - os=coff + os= + obj=coff ;; c8051-*) - os=elf + os= + obj=elf ;; clipper-intergraph) os=clix ;; hexagon-*) - os=elf + os= + obj=elf ;; tic54x-*) - os=coff + os= + obj=coff ;; tic55x-*) - os=coff + os= + obj=coff ;; tic6x-*) - os=coff + os= + obj=coff ;; # This must come before the *-dec entry. pdp10-*) @@ -1581,19 +1586,24 @@ case $cpu-$vendor in os=sunos3 ;; m68*-cisco) - os=aout + os= + obj=aout ;; mep-*) - os=elf + os= + obj=elf ;; mips*-cisco) - os=elf + os= + obj=elf ;; mips*-*) - os=elf + os= + obj=elf ;; or32-*) - os=coff + os= + obj=coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=sysv3 @@ -1602,7 +1612,8 @@ case $cpu-$vendor in os=sunos4.1.1 ;; pru-*) - os=elf + os= + obj=elf ;; *-be) os=beos @@ -1683,10 +1694,12 @@ case $cpu-$vendor in os=uxpv ;; *-rom68k) - os=coff + os= + obj=coff ;; *-*bug) - os=coff + os= + obj=coff ;; *-apple) os=macos @@ -1704,7 +1717,8 @@ esac fi -# Now, validate our (potentially fixed-up) OS. +# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ). + case $os in # Sometimes we do "kernel-libc", so those need to count as OSes. musl* | newlib* | relibc* | uclibc*) @@ -1715,6 +1729,9 @@ case $os in # VxWorks passes extra cpu info in the 4th filed. simlinux | simwindows | spe) ;; + # See `case $cpu-$os` validation below + ghcjs) + ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. @@ -1723,7 +1740,7 @@ case $os in | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ | hiux* | abug | nacl* | netware* | windows* \ - | os9* | macos* | osx* | ios* \ + | os9* | macos* | osx* | ios* | tvos* | watchos* \ | mpw* | magic* | mmixware* | mon960* | lnews* \ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ | aos* | aros* | cloudabi* | sortix* | twizzler* \ @@ -1732,11 +1749,11 @@ case $os in | mirbsd* | netbsd* | dicos* | openedition* | ose* \ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ - | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ - | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | bosx* | nextstep* | cxux* | oabi* \ + | ptx* | ecoff* | winnt* | domain* | vsta* \ | udi* | lites* | ieee* | go32* | aux* | hcos* \ | chorusrdb* | cegcc* | glidix* | serenity* \ - | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | cygwin* | msys* | moss* | proelf* | rtems* \ | midipix* | mingw32* | mingw64* | mint* \ | uxpv* | beos* | mpeix* | udk* | moxiebox* \ | interix* | uwin* | mks* | rhapsody* | darwin* \ @@ -1748,7 +1765,8 @@ case $os in | skyos* | haiku* | rdos* | toppers* | drops* | es* \ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*) + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ + | fiwix* | mlibc* | cos* | mbr* ) ;; # This one is extra strict with allowed versions sco3.2v2 | sco3.2v[4-9]* | sco5v6*) @@ -1756,41 +1774,99 @@ case $os in ;; none) ;; + kernel* | msvc* ) + # Restricted further below + ;; + '') + if test x"$obj" = x + then + echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2 + fi + ;; + *) + echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 + exit 1 + ;; +esac + +case $obj in + aout* | coff* | elf* | pe*) + ;; + '') + # empty is fine + ;; *) - echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 + exit 1 + ;; +esac + +# Here we handle the constraint that a (synthetic) cpu and os are +# valid only in combination with each other and nowhere else. +case $cpu-$os in + # The "javascript-unknown-ghcjs" triple is used by GHC; we + # accept it here in order to tolerate that, but reject any + # variations. + javascript-ghcjs) + ;; + javascript-* | *-ghcjs) + echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. -case $kernel-$os in - linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ - | linux-musl* | linux-relibc* | linux-uclibc* ) +case $kernel-$os-$obj in + linux-gnu*- | linux-dietlibc*- | linux-android*- | linux-newlib*- \ + | linux-musl*- | linux-relibc*- | linux-uclibc*- | linux-mlibc*- ) + ;; + uclinux-uclibc*- ) + ;; + managarm-mlibc*- | managarm-kernel*- ) ;; - uclinux-uclibc* ) + windows*-msvc*-) ;; - -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) + -dietlibc*- | -newlib*- | -musl*- | -relibc*- | -uclibc*- | -mlibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. - echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 exit 1 ;; - kfreebsd*-gnu* | kopensolaris*-gnu*) + -kernel*- ) + echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 + exit 1 ;; - vxworks-simlinux | vxworks-simwindows | vxworks-spe) + *-kernel*- ) + echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 + exit 1 ;; - nto-qnx*) + *-msvc*- ) + echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 + exit 1 ;; - os2-emx) + kfreebsd*-gnu*- | kopensolaris*-gnu*-) + ;; + vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) + ;; + nto-qnx*-) + ;; + os2-emx-) ;; - *-eabi* | *-gnueabi*) + *-eabi*- | *-gnueabi*-) ;; - -*) + none--*) + # None (no kernel, i.e. freestanding / bare metal), + # can be paired with an machine code file format + ;; + -*-) # Blank kernel with real OS is always fine. ;; - *-*) - echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + --*) + # Blank kernel and OS with real machine code file format is always fine. + ;; + *-*-*) + echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 exit 1 ;; esac @@ -1873,7 +1949,7 @@ case $vendor in ;; esac -echo "$cpu-$vendor-${kernel:+$kernel-}$os" +echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: diff --git a/config/install-sh b/config/install-sh index ec298b537..7c56c9c01 100755 --- a/config/install-sh +++ b/config/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2020-11-14.01; # UTC +scriptversion=2023-11-23.18; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -124,9 +124,9 @@ it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. -Email bug reports to bug-automake@gnu.org. -Automake home page: https://www.gnu.org/software/automake/ -" +Report bugs to . +GNU Automake home page: . +General help using GNU software: ." while test $# -ne 0; do case $1 in diff --git a/configure b/configure index 47ccb6bc4..e15701969 100755 --- a/configure +++ b/configure @@ -1,11 +1,11 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for iperf 3.17+. +# Generated by GNU Autoconf 2.72 for iperf 3.17.1. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # @@ -17,7 +17,6 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh @@ -26,12 +25,13 @@ then : # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else $as_nop - case `(set -o) 2>/dev/null` in #( +else case e in #( + e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi @@ -103,7 +103,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as `sh COMMAND' +# We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 @@ -133,15 +133,14 @@ case $- in # (((( esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. +# out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="as_nop=: -if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 + as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: @@ -149,12 +148,13 @@ then : # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else \$as_nop - case \`(set -o) 2>/dev/null\` in #( +else case e in #( + e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi " @@ -172,8 +172,9 @@ as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : -else \$as_nop - exitcode=1; echo positional parameters were not saved. +else case e in #( + e) exitcode=1; echo positional parameters were not saved. ;; +esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) @@ -195,14 +196,15 @@ test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes -else $as_nop - as_have_required=no +else case e in #( + e) as_have_required=no ;; +esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : -else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do @@ -235,12 +237,13 @@ IFS=$as_save_IFS if $as_found then : -else $as_nop - if { test -f "$SHELL" || test -f "$SHELL.exe"; } && +else case e in #( + e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes -fi +fi ;; +esac fi @@ -262,7 +265,7 @@ case $- in # (((( esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. +# out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi @@ -282,7 +285,8 @@ $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 -fi +fi ;; +esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} @@ -321,14 +325,6 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit -# as_fn_nop -# --------- -# Do nothing but, unlike ":", preserve the value of $?. -as_fn_nop () -{ - return $? -} -as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -397,11 +393,12 @@ then : { eval $1+=\$2 }' -else $as_nop - as_fn_append () +else case e in #( + e) as_fn_append () { eval $1=\$$1\$2 - } + } ;; +esac fi # as_fn_append # as_fn_arith ARG... @@ -415,21 +412,14 @@ then : { as_val=$(( $* )) }' -else $as_nop - as_fn_arith () +else case e in #( + e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } + } ;; +esac fi # as_fn_arith -# as_fn_nop -# --------- -# Do nothing but, unlike ":", preserve the value of $?. -as_fn_nop () -{ - return $? -} -as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -503,6 +493,8 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits /[$]LINENO/= ' <$as_myself | sed ' + t clear + :clear s/[$]LINENO.*/&-/ t lineno b @@ -551,7 +543,6 @@ esac as_echo='printf %s\n' as_echo_n='printf %s' - rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -563,9 +554,9 @@ if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then @@ -590,10 +581,12 @@ as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated SHELL=${CONFIG_SHELL-/bin/sh} @@ -621,8 +614,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.17+' -PACKAGE_STRING='iperf 3.17+' +PACKAGE_VERSION='3.17.1' +PACKAGE_STRING='iperf 3.17.1' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -933,7 +926,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: \`$ac_useropt'" + as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -959,7 +952,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: \`$ac_useropt'" + as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1172,7 +1165,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: \`$ac_useropt'" + as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1188,7 +1181,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: \`$ac_useropt'" + as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1218,8 +1211,8 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" + -*) as_fn_error $? "unrecognized option: '$ac_option' +Try '$0 --help' for more information" ;; *=*) @@ -1227,7 +1220,7 @@ Try \`$0 --help' for more information" # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1277,7 +1270,7 @@ do as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done -# There might be people who depend on the old broken behavior: `$host' +# There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias @@ -1345,7 +1338,7 @@ if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` @@ -1373,7 +1366,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures iperf 3.17+ to adapt to many kinds of systems. +'configure' configures iperf 3.17.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1387,11 +1380,11 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages + -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' + -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] + --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @@ -1399,10 +1392,10 @@ Installation directories: --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. +By default, 'make install' will install all the files in +'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify +an installation prefix other than '$ac_default_prefix' using '--prefix', +for instance '--prefix=\$HOME'. For better control, use the options below. @@ -1444,7 +1437,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.17+:";; + short | recursive ) echo "Configuration of iperf 3.17.1:";; esac cat <<\_ACEOF @@ -1495,7 +1488,7 @@ Some influential environment variables: User-defined run-time library search path. CPP C preprocessor -Use these variables to override the choices made by `configure' or to help +Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . @@ -1563,10 +1556,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.17+ -generated by GNU Autoconf 2.71 +iperf configure 3.17.1 +generated by GNU Autoconf 2.72 -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1605,11 +1598,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } && test -s conftest.$ac_objext then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval @@ -1647,11 +1641,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would @@ -1675,8 +1670,8 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> @@ -1684,10 +1679,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1707,15 +1704,15 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. */ + which can conflict with char $2 (void); below. */ #include #undef $2 @@ -1726,7 +1723,7 @@ else $as_nop #ifdef __cplusplus extern "C" #endif -char $2 (); +char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ @@ -1745,11 +1742,13 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1785,11 +1784,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval @@ -1808,8 +1808,8 @@ printf %s "checking for $2.$3... " >&6; } if eval test \${$4+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -1825,8 +1825,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -1842,12 +1842,15 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else $as_nop - eval "$4=no" +else case e in #( + e) eval "$4=no" ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$4 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1879,8 +1882,8 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.17+, which was -generated by GNU Autoconf 2.71. Invocation command line was +It was created by iperf $as_me 3.17.1, which was +generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -2126,10 +2129,10 @@ esac printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } fi done @@ -2165,9 +2168,7 @@ struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; +static char *e (char **p, int i) { return p[i]; } @@ -2181,6 +2182,21 @@ static char *f (char * (*g) (char **, int), char **p, ...) return s; } +/* C89 style stringification. */ +#define noexpand_stringify(a) #a +const char *stringified = noexpand_stringify(arbitrary+token=sequence); + +/* C89 style token pasting. Exercises some of the corner cases that + e.g. old MSVC gets wrong, but not very hard. */ +#define noexpand_concat(a,b) a##b +#define expand_concat(a,b) noexpand_concat(a,b) +extern int vA; +extern int vbee; +#define aye A +#define bee B +int *pvA = &expand_concat(v,aye); +int *pvbee = &noexpand_concat(v,bee); + /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated @@ -2208,16 +2224,19 @@ ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' -// Does the compiler advertise C99 conformance? +/* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif +// See if C++-style comments work. + #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); +extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare @@ -2267,7 +2286,6 @@ typedef const char *ccp; static inline int test_restrict (ccp restrict text) { - // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) @@ -2333,6 +2351,8 @@ ac_c_conftest_c99_main=' ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; + // Work around memory leak warnings. + free (ia); // Check named initializers. struct named_init ni = { @@ -2354,7 +2374,7 @@ ac_c_conftest_c99_main=' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' -// Does the compiler advertise C11 conformance? +/* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif @@ -2546,8 +2566,9 @@ IFS=$as_save_IFS if $as_found then : -else $as_nop - as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +else case e in #( + e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; +esac fi @@ -2575,12 +2596,12 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) @@ -2589,18 +2610,18 @@ printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. @@ -2616,11 +2637,11 @@ printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi done if $ac_cache_corrupted; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## @@ -2813,8 +2834,9 @@ then : enableval=$enable_static_bin; enable_static=yes enable_shared=no enable_static_bin=yes -else $as_nop - : +else case e in #( + e) : ;; +esac fi if test x$enable_static_bin = xno; then @@ -2869,8 +2891,8 @@ if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 -else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS @@ -2924,7 +2946,8 @@ esac IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir - + ;; +esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install @@ -3020,7 +3043,7 @@ test "$program_prefix" != NONE && test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. -# By default was `s,x,x', remove it if useless. +# By default was 's,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` @@ -3063,8 +3086,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$STRIP"; then +else case e in #( + e) if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3086,7 +3109,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then @@ -3108,8 +3132,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_STRIP"; then +else case e in #( + e) if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3131,7 +3155,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then @@ -3167,8 +3192,8 @@ if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 -else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS @@ -3182,7 +3207,7 @@ do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ - 'BusyBox '* | \ + *'BusyBox '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; @@ -3191,18 +3216,17 @@ do done done IFS=$as_save_IFS - + ;; +esac fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" + # As a last resort, use plain mkdir -p, + # in the hope it doesn't have the bugs of ancient mkdir. + MKDIR_P='mkdir -p' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 @@ -3217,8 +3241,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$AWK"; then +else case e in #( + e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3240,7 +3264,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then @@ -3262,8 +3287,8 @@ ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 -else $as_nop - cat >conftest.make <<\_ACEOF +else case e in #( + e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' @@ -3275,7 +3300,8 @@ case `${MAKE-make} -f conftest.make 2>/dev/null` in *) eval ac_cv_prog_make_${ac_make}_set=no;; esac -rm -f conftest.make +rm -f conftest.make ;; +esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 @@ -3313,8 +3339,8 @@ printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 -else $as_nop - if printf "%s\n" 'TRUE=$(BAR$(V)) +else case e in #( + e) if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3324,7 +3350,8 @@ am__doit: am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no -fi +fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } @@ -3359,7 +3386,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.17+' + VERSION='3.17.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -3479,8 +3506,8 @@ printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 -else $as_nop - if printf "%s\n" 'TRUE=$(BAR$(V)) +else case e in #( + e) if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3490,7 +3517,8 @@ am__doit: am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no -fi +fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } @@ -3540,15 +3568,16 @@ printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_build_alias=$build_alias +else case e in #( + e) ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } @@ -3575,14 +3604,15 @@ printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 -else $as_nop - if test "x$host_alias" = x; then +else case e in #( + e) if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } @@ -3759,8 +3789,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3782,7 +3812,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3804,8 +3835,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3827,7 +3858,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -3862,8 +3894,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3885,7 +3917,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3907,8 +3940,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no @@ -3947,7 +3980,8 @@ if test $ac_prog_rejected = yes; then ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3971,8 +4005,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3994,7 +4028,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4020,8 +4055,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4043,7 +4078,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -4081,8 +4117,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4104,7 +4140,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -4126,8 +4163,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4149,7 +4186,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -4178,10 +4216,10 @@ fi fi -test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -4253,8 +4291,8 @@ printf "%s\n" "$ac_try_echo"; } >&5 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' + # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. +# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. @@ -4274,7 +4312,7 @@ do ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' + # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. @@ -4285,8 +4323,9 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else $as_nop - ac_file='' +else case e in #( + e) ac_file='' ;; +esac fi if test -z "$ac_file" then : @@ -4295,13 +4334,14 @@ printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } +See 'config.log' for more details" "$LINENO" 5; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } @@ -4325,10 +4365,10 @@ printf "%s\n" "$ac_try_echo"; } >&5 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. + # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) +# catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will +# work properly (i.e., refer to 'conftest.exe'), while it won't with +# 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in @@ -4338,11 +4378,12 @@ for ac_file in conftest.exe conftest conftest.*; do * ) break;; esac done -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -4358,6 +4399,8 @@ int main (void) { FILE *f = fopen ("conftest.out", "w"); + if (!f) + return 1; return ferror (f) || fclose (f) != 0; ; @@ -4397,26 +4440,27 @@ printf "%s\n" "$ac_try_echo"; } >&5 if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } +If you meant to cross compile, use '--host'. +See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +rm -f conftest.$ac_ext conftest$ac_cv_exeext \ + conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4448,16 +4492,18 @@ then : break;; esac done -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext +rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } @@ -4468,8 +4514,8 @@ printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4486,12 +4532,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes -else $as_nop - ac_compiler_gnu=no +else case e in #( + e) ac_compiler_gnu=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } @@ -4509,8 +4557,8 @@ printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_save_c_werror_flag=$ac_c_werror_flag +else case e in #( + e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" @@ -4528,8 +4576,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes -else $as_nop - CFLAGS="" +else case e in #( + e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4544,8 +4592,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - ac_c_werror_flag=$ac_save_c_werror_flag +else case e in #( + e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4562,12 +4610,15 @@ if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag + ac_c_werror_flag=$ac_save_c_werror_flag ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } @@ -4594,8 +4645,8 @@ printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c11=no +else case e in #( + e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4612,25 +4663,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c11" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } - CC="$CC $ac_cv_prog_cc_c11" + CC="$CC $ac_cv_prog_cc_c11" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 + ac_prog_cc_stdc=c11 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -4640,8 +4694,8 @@ printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c99=no +else case e in #( + e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4658,25 +4712,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c99" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } - CC="$CC $ac_cv_prog_cc_c99" + CC="$CC $ac_cv_prog_cc_c99" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 + ac_prog_cc_stdc=c99 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -4686,8 +4743,8 @@ printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c89=no +else case e in #( + e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4704,25 +4761,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c89" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } - CC="$CC $ac_cv_prog_cc_c89" + CC="$CC $ac_cv_prog_cc_c89" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 + ac_prog_cc_stdc=c89 ;; +esac fi fi @@ -4743,8 +4803,8 @@ printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4774,7 +4834,8 @@ _ACEOF fi done rm -f core conftest* - unset am_i + unset am_i ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } @@ -4800,8 +4861,8 @@ printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then +else case e in #( + e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up @@ -4905,7 +4966,8 @@ else $as_nop else am_cv_CC_dependencies_compiler_type=none fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } @@ -4927,8 +4989,8 @@ printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ +else case e in #( + e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done @@ -4953,9 +5015,10 @@ do as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in +case `"$ac_path_SED" --version 2>&1` in #( *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -4990,7 +5053,8 @@ IFS=$as_save_IFS else ac_cv_path_SED=$SED fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } @@ -5015,8 +5079,8 @@ printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$GREP"; then +else case e in #( + e) if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5035,9 +5099,10 @@ do as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in +case `"$ac_path_GREP" --version 2>&1` in #( *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5072,7 +5137,8 @@ IFS=$as_save_IFS else ac_cv_path_GREP=$GREP fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } @@ -5084,8 +5150,8 @@ printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 -else $as_nop - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +else case e in #( + e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then @@ -5107,9 +5173,10 @@ do as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in +case `"$ac_path_EGREP" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5145,20 +5212,23 @@ else ac_cv_path_EGREP=$EGREP fi - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" + EGREP_TRADITIONAL=$EGREP + ac_cv_path_EGREP_TRADITIONAL=$EGREP { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 -else $as_nop - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 +else case e in #( + e) if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then @@ -5180,9 +5250,10 @@ do as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in +case `"$ac_path_FGREP" --version 2>&1` in #( *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +#( *) ac_count=0 printf %s 0123456789 >"conftest.in" @@ -5218,7 +5289,8 @@ else ac_cv_path_FGREP=$FGREP fi - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$ac_cv_path_FGREP" >&6; } @@ -5249,8 +5321,9 @@ test -z "$GREP" && GREP=grep if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else $as_nop - with_gnu_ld=no +else case e in #( + e) with_gnu_ld=no ;; +esac fi ac_prog=ld @@ -5295,8 +5368,8 @@ fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$LD"; then +else case e in #( + e) if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs @@ -5319,7 +5392,8 @@ else $as_nop IFS=$lt_save_ifs else lt_cv_path_LD=$LD # Let the user override the test with a path. -fi +fi ;; +esac fi LD=$lt_cv_path_LD @@ -5336,8 +5410,8 @@ printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 -else $as_nop - # I'd rather use --version here, but apparently some GNU lds only accept -v. +else case e in #( + e) # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 @@ -5364,8 +5439,8 @@ printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$NM"; then +else case e in #( + e) if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else @@ -5412,7 +5487,8 @@ else IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} -fi +fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } @@ -5433,8 +5509,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DUMPBIN"; then +else case e in #( + e) if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5456,7 +5532,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then @@ -5482,8 +5559,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DUMPBIN"; then +else case e in #( + e) if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5505,7 +5582,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then @@ -5559,8 +5637,8 @@ printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_nm_interface="BSD nm" +else case e in #( + e) lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) @@ -5573,7 +5651,8 @@ else $as_nop if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi - rm -f conftest* + rm -f conftest* ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } @@ -5595,8 +5674,8 @@ printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 -else $as_nop - i=0 +else case e in #( + e) i=0 teststring=ABCD case $build_os in @@ -5718,7 +5797,8 @@ else $as_nop fi ;; esac - + ;; +esac fi if test -n "$lt_cv_sys_max_cmd_len"; then @@ -5775,8 +5855,8 @@ printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 -else $as_nop - case $host in +else case e in #( + e) case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys @@ -5807,7 +5887,8 @@ else $as_nop lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac - + ;; +esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd @@ -5823,8 +5904,8 @@ printf %s "checking how to convert $build file names to toolchain format... " >& if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 -else $as_nop - #assume ordinary cross tools, or native build. +else case e in #( + e) #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) @@ -5835,7 +5916,8 @@ case $host in esac ;; esac - + ;; +esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd @@ -5851,8 +5933,9 @@ printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_reload_flag='-r' +else case e in #( + e) lt_cv_ld_reload_flag='-r' ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } @@ -5893,8 +5976,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FILECMD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$FILECMD"; then +else case e in #( + e) if test -n "$FILECMD"; then ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5916,7 +5999,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi FILECMD=$ac_cv_prog_FILECMD if test -n "$FILECMD"; then @@ -5938,8 +6022,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_FILECMD+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_FILECMD"; then +else case e in #( + e) if test -n "$ac_ct_FILECMD"; then ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5961,7 +6045,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD if test -n "$ac_ct_FILECMD"; then @@ -6001,8 +6086,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$OBJDUMP"; then +else case e in #( + e) if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6024,7 +6109,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then @@ -6046,8 +6132,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OBJDUMP"; then +else case e in #( + e) if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6069,7 +6155,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then @@ -6110,8 +6197,8 @@ printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_file_magic_cmd='$MAGIC_CMD' +else case e in #( + e) lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support @@ -6304,7 +6391,8 @@ os2*) lt_cv_deplibs_check_method=pass_all ;; esac - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } @@ -6356,8 +6444,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DLLTOOL"; then +else case e in #( + e) if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6379,7 +6467,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then @@ -6401,8 +6490,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DLLTOOL"; then +else case e in #( + e) if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6424,7 +6513,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then @@ -6466,8 +6556,8 @@ printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_sharedlib_from_linklib_cmd='unknown' +else case e in #( + e) lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) @@ -6487,7 +6577,8 @@ cygwin* | mingw* | pw32* | cegcc*) lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } @@ -6511,8 +6602,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$AR"; then +else case e in #( + e) if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6534,7 +6625,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi AR=$ac_cv_prog_AR if test -n "$AR"; then @@ -6560,8 +6652,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_AR"; then +else case e in #( + e) if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6583,7 +6675,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then @@ -6645,8 +6738,8 @@ printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ar_at_file=no +else case e in #( + e) lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -6683,7 +6776,8 @@ then : fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } @@ -6708,8 +6802,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$STRIP"; then +else case e in #( + e) if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6731,7 +6825,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then @@ -6753,8 +6848,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_STRIP"; then +else case e in #( + e) if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6776,7 +6871,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then @@ -6817,8 +6913,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$RANLIB"; then +else case e in #( + e) if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6840,7 +6936,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then @@ -6862,8 +6959,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_RANLIB"; then +else case e in #( + e) if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -6885,7 +6982,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then @@ -6996,8 +7094,8 @@ printf %s "checking command to parse $NM output from $compiler object... " >&6; if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 -else $as_nop - +else case e in #( + e) # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -7252,7 +7350,8 @@ _LT_EOF lt_cv_sys_global_symbol_pipe= fi done - + ;; +esac fi if test -z "$lt_cv_sys_global_symbol_pipe"; then @@ -7316,8 +7415,9 @@ printf %s "checking for sysroot... " >&6; } if test ${with_sysroot+y} then : withval=$with_sysroot; -else $as_nop - with_sysroot=no +else case e in #( + e) with_sysroot=no ;; +esac fi @@ -7352,8 +7452,8 @@ printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 -else $as_nop - printf 0123456789abcdef0123456789abcdef >conftest.i +else case e in #( + e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then @@ -7389,7 +7489,8 @@ else ac_cv_path_lt_DD=$lt_DD fi -rm -f conftest.i conftest2.i conftest.out +rm -f conftest.i conftest2.i conftest.out ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } @@ -7400,8 +7501,8 @@ printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 -else $as_nop - printf 0123456789abcdef0123456789abcdef >conftest.i +else case e in #( + e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then @@ -7409,7 +7510,8 @@ if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; the && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out -test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } @@ -7619,8 +7721,8 @@ printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_ext=c +else case e in #( + e) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -7640,8 +7742,9 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes -else $as_nop - lt_cv_cc_needs_belf=no +else case e in #( + e) lt_cv_cc_needs_belf=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -7650,7 +7753,8 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } @@ -7708,8 +7812,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$MANIFEST_TOOL"; then +else case e in #( + e) if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7731,7 +7835,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then @@ -7753,8 +7858,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_MANIFEST_TOOL"; then +else case e in #( + e) if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7776,7 +7881,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then @@ -7808,15 +7914,16 @@ printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_mainfest_tool+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_path_mainfest_tool=no +else case e in #( + e) lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi - rm -f conftest* + rm -f conftest* ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } @@ -7839,8 +7946,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$DSYMUTIL"; then +else case e in #( + e) if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7862,7 +7969,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then @@ -7884,8 +7992,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DSYMUTIL"; then +else case e in #( + e) if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7907,7 +8015,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then @@ -7941,8 +8050,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_NMEDIT+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$NMEDIT"; then +else case e in #( + e) if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7964,7 +8073,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then @@ -7986,8 +8096,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_NMEDIT+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_NMEDIT"; then +else case e in #( + e) if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8009,7 +8119,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then @@ -8043,8 +8154,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$LIPO"; then +else case e in #( + e) if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8066,7 +8177,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then @@ -8088,8 +8200,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_LIPO"; then +else case e in #( + e) if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8111,7 +8223,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then @@ -8145,8 +8258,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$OTOOL"; then +else case e in #( + e) if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8168,7 +8281,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then @@ -8190,8 +8304,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OTOOL"; then +else case e in #( + e) if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8213,7 +8327,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then @@ -8247,8 +8362,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL64+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$OTOOL64"; then +else case e in #( + e) if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8270,7 +8385,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then @@ -8292,8 +8408,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL64+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OTOOL64"; then +else case e in #( + e) if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -8315,7 +8431,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then @@ -8372,8 +8489,8 @@ printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_apple_cc_single_mod=no +else case e in #( + e) lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE @@ -8399,7 +8516,8 @@ else $as_nop fi rm -rf libconftest.dylib* rm -f conftest.* - fi + fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } @@ -8409,8 +8527,8 @@ printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_exported_symbols_list=no +else case e in #( + e) lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" @@ -8428,13 +8546,15 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes -else $as_nop - lt_cv_ld_exported_symbols_list=no +else case e in #( + e) lt_cv_ld_exported_symbols_list=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } @@ -8444,8 +8564,8 @@ printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_force_load=no +else case e in #( + e) lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF @@ -8470,7 +8590,8 @@ _LT_EOF fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$lt_cv_ld_force_load" >&6; } @@ -8610,8 +8731,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - enable_shared=yes +else case e in #( + e) enable_shared=yes ;; +esac fi @@ -8642,8 +8764,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - enable_static=yes +else case e in #( + e) enable_static=yes ;; +esac fi @@ -8674,8 +8797,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - pic_mode=default +else case e in #( + e) pic_mode=default ;; +esac fi @@ -8705,8 +8829,9 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop - enable_fast_install=yes +else case e in #( + e) enable_fast_install=yes ;; +esac fi @@ -8733,15 +8858,17 @@ then : ;; esac lt_cv_with_aix_soname=$with_aix_soname -else $as_nop - if test ${lt_cv_with_aix_soname+y} +else case e in #( + e) if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_with_aix_soname=aix +else case e in #( + e) lt_cv_with_aix_soname=aix ;; +esac fi - with_aix_soname=$lt_cv_with_aix_soname + with_aix_soname=$lt_cv_with_aix_soname ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 @@ -8832,8 +8959,8 @@ printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 -else $as_nop - rm -f .libs 2>/dev/null +else case e in #( + e) rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs @@ -8841,7 +8968,8 @@ else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi -rmdir .libs 2>/dev/null +rmdir .libs 2>/dev/null ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } @@ -8902,8 +9030,8 @@ printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 -else $as_nop - case $MAGIC_CMD in +else case e in #( + e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; @@ -8946,6 +9074,7 @@ _LT_EOF IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; +esac ;; esac fi @@ -8969,8 +9098,8 @@ printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 -else $as_nop - case $MAGIC_CMD in +else case e in #( + e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; @@ -9013,6 +9142,7 @@ _LT_EOF IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; +esac ;; esac fi @@ -9108,8 +9238,8 @@ printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_rtti_exceptions=no +else case e in #( + e) lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment @@ -9137,7 +9267,8 @@ else $as_nop fi fi $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } @@ -9502,8 +9633,9 @@ printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +else case e in #( + e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } @@ -9518,8 +9650,8 @@ printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_pic_works=no +else case e in #( + e) lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment @@ -9547,7 +9679,8 @@ else $as_nop fi fi $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } @@ -9583,8 +9716,8 @@ printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_static_works=no +else case e in #( + e) lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext @@ -9605,7 +9738,8 @@ else $as_nop fi $RM -r conftest* LDFLAGS=$save_LDFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } @@ -9627,8 +9761,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o=no +else case e in #( + e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest @@ -9668,7 +9802,8 @@ else $as_nop cd .. $RM -r conftest $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -9683,8 +9818,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o=no +else case e in #( + e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest @@ -9724,7 +9859,8 @@ else $as_nop cd .. $RM -r conftest $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -10319,8 +10455,8 @@ else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10352,7 +10488,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi - + ;; +esac fi aix_libpath=$lt_cv_aix_libpath_ @@ -10374,8 +10511,8 @@ else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10407,7 +10544,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi - + ;; +esac fi aix_libpath=$lt_cv_aix_libpath_ @@ -10658,8 +10796,8 @@ printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler__b=no +else case e in #( + e) lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext @@ -10680,7 +10818,8 @@ else $as_nop fi $RM -r conftest* LDFLAGS=$save_LDFLAGS - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } @@ -10728,8 +10867,8 @@ printf %s "checking whether the $host_os linker accepts -exported_symbol... " >& if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 -else $as_nop - save_LDFLAGS=$LDFLAGS +else case e in #( + e) save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -10738,12 +10877,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes -else $as_nop - lt_cv_irix_exported_symbol=no +else case e in #( + e) lt_cv_irix_exported_symbol=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS + LDFLAGS=$save_LDFLAGS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } @@ -11069,8 +11210,8 @@ printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 -else $as_nop - $RM conftest* +else case e in #( + e) $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 @@ -11106,7 +11247,8 @@ else $as_nop cat conftest.err 1>&5 fi $RM conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } @@ -11833,8 +11975,8 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 -else $as_nop - lt_cv_shlibpath_overrides_runpath=no +else case e in #( + e) lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ @@ -11861,7 +12003,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir - + ;; +esac fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath @@ -12286,16 +12429,22 @@ printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -12307,24 +12456,27 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes -else $as_nop - ac_cv_lib_dl_dlopen=no +else case e in #( + e) ac_cv_lib_dl_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop - +else case e in #( + e) lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes - + ;; +esac fi ;; @@ -12342,22 +12494,28 @@ fi if test "x$ac_cv_func_shl_load" = xyes then : lt_cv_dlopen=shl_load -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char shl_load (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (void); int main (void) { @@ -12369,39 +12527,47 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes -else $as_nop - ac_cv_lib_dld_shl_load=no +else case e in #( + e) ac_cv_lib_dld_shl_load=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else $as_nop - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +else case e in #( + e) ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes then : lt_cv_dlopen=dlopen -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -12413,34 +12579,42 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes -else $as_nop - ac_cv_lib_dl_dlopen=no +else case e in #( + e) ac_cv_lib_dl_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); int main (void) { @@ -12452,34 +12626,42 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes -else $as_nop - ac_cv_lib_svld_dlopen=no +else case e in #( + e) ac_cv_lib_svld_dlopen=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dld_link (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (void); int main (void) { @@ -12491,12 +12673,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes -else $as_nop - ac_cv_lib_dld_dld_link=no +else case e in #( + e) ac_cv_lib_dld_dld_link=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } @@ -12505,19 +12689,24 @@ then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi ;; @@ -12545,8 +12734,8 @@ printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 -else $as_nop - if test yes = "$cross_compiling"; then : +else case e in #( + e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -12640,7 +12829,8 @@ _LT_EOF fi rm -fr conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } @@ -12652,8 +12842,8 @@ printf %s "checking whether a statically linked program can dlopen itself... " > if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 -else $as_nop - if test yes = "$cross_compiling"; then : +else case e in #( + e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -12747,7 +12937,8 @@ _LT_EOF fi rm -fr conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } @@ -12921,8 +13112,9 @@ printf %s "checking whether to enable maintainer-specific portions of Makefiles. if test ${enable_maintainer_mode+y} then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else $as_nop - USE_MAINTAINER_MODE=no +else case e in #( + e) USE_MAINTAINER_MODE=no ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 @@ -12958,8 +13150,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -12981,7 +13173,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13003,8 +13196,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13026,7 +13219,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -13061,8 +13255,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13084,7 +13278,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13106,8 +13301,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no @@ -13146,7 +13341,8 @@ if test $ac_prog_rejected = yes; then ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13170,8 +13366,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13193,7 +13389,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13219,8 +13416,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13242,7 +13439,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -13280,8 +13478,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13303,7 +13501,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -13325,8 +13524,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then +else case e in #( + e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -13348,7 +13547,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -13377,10 +13577,10 @@ fi fi -test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -13412,8 +13612,8 @@ printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -13430,12 +13630,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes -else $as_nop - ac_compiler_gnu=no +else case e in #( + e) ac_compiler_gnu=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } @@ -13453,8 +13655,8 @@ printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_save_c_werror_flag=$ac_c_werror_flag +else case e in #( + e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" @@ -13472,8 +13674,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes -else $as_nop - CFLAGS="" +else case e in #( + e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13488,8 +13690,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - ac_c_werror_flag=$ac_save_c_werror_flag +else case e in #( + e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13506,12 +13708,15 @@ if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag + ac_c_werror_flag=$ac_save_c_werror_flag ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } @@ -13538,8 +13743,8 @@ printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c11=no +else case e in #( + e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13556,25 +13761,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c11" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } - CC="$CC $ac_cv_prog_cc_c11" + CC="$CC $ac_cv_prog_cc_c11" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 + ac_prog_cc_stdc=c11 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -13584,8 +13792,8 @@ printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c99=no +else case e in #( + e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13602,25 +13810,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c99" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } - CC="$CC $ac_cv_prog_cc_c99" + CC="$CC $ac_cv_prog_cc_c99" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 + ac_prog_cc_stdc=c99 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -13630,8 +13841,8 @@ printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c89=no +else case e in #( + e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13648,25 +13859,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext -CC=$ac_save_CC +CC=$ac_save_CC ;; +esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c89" = x +else case e in #( + e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } - CC="$CC $ac_cv_prog_cc_c89" + CC="$CC $ac_cv_prog_cc_c89" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 + ac_prog_cc_stdc=c89 ;; +esac fi fi @@ -13687,8 +13901,8 @@ printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -13718,7 +13932,8 @@ _ACEOF fi done rm -f core conftest* - unset am_i + unset am_i ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } @@ -13744,8 +13959,8 @@ printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then +else case e in #( + e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up @@ -13849,7 +14064,8 @@ else $as_nop else am_cv_CC_dependencies_compiler_type=none fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } @@ -13905,15 +14121,21 @@ printf %s "checking for library containing floor... " >&6; } if test ${ac_cv_search_floor+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char floor (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char floor (void); int main (void) { @@ -13944,11 +14166,13 @@ done if test ${ac_cv_search_floor+y} then : -else $as_nop - ac_cv_search_floor=no +else case e in #( + e) ac_cv_search_floor=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_floor" >&5 printf "%s\n" "$ac_cv_search_floor" >&6; } @@ -13957,11 +14181,12 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -else $as_nop - +else case e in #( + e) echo "floor()" exit 1 - + ;; +esac fi @@ -13971,15 +14196,21 @@ printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char socket (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char socket (void); int main (void) { @@ -14010,11 +14241,13 @@ done if test ${ac_cv_search_socket+y} then : -else $as_nop - ac_cv_search_socket=no +else case e in #( + e) ac_cv_search_socket=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } @@ -14023,11 +14256,12 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -else $as_nop - +else case e in #( + e) echo "socket()" exit 1 - + ;; +esac fi @@ -14037,15 +14271,21 @@ printf %s "checking for library containing inet_ntop... " >&6; } if test ${ac_cv_search_inet_ntop+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char inet_ntop (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char inet_ntop (void); int main (void) { @@ -14076,11 +14316,13 @@ done if test ${ac_cv_search_inet_ntop+y} then : -else $as_nop - ac_cv_search_inet_ntop=no +else case e in #( + e) ac_cv_search_inet_ntop=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 printf "%s\n" "$ac_cv_search_inet_ntop" >&6; } @@ -14089,11 +14331,12 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -else $as_nop - +else case e in #( + e) echo "inet_ntop()" exit 1 - + ;; +esac fi @@ -14103,8 +14346,8 @@ printf %s "checking for an ANSI C-conforming const... " >&6; } if test ${ac_cv_c_const+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -14168,10 +14411,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_const=yes -else $as_nop - ac_cv_c_const=no +else case e in #( + e) ac_cv_c_const=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 printf "%s\n" "$ac_cv_c_const" >&6; } @@ -14197,8 +14442,8 @@ if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 -else $as_nop - # Double quotes because $CC needs to be expanded +else case e in #( + e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false @@ -14216,9 +14461,10 @@ _ACEOF if ac_fn_c_try_cpp "$LINENO" then : -else $as_nop - # Broken: fails on valid input. -continue +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext @@ -14232,15 +14478,16 @@ if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue -else $as_nop - # Passes both tests. +else case e in #( + e) # Passes both tests. ac_preproc_ok=: -break +break ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : @@ -14249,7 +14496,8 @@ fi done ac_cv_prog_CPP=$CPP - + ;; +esac fi CPP=$ac_cv_prog_CPP else @@ -14272,9 +14520,10 @@ _ACEOF if ac_fn_c_try_cpp "$LINENO" then : -else $as_nop - # Broken: fails on valid input. -continue +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext @@ -14288,24 +14537,26 @@ if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue -else $as_nop - # Passes both tests. +else case e in #( + e) # Passes both tests. ac_preproc_ok=: -break +break ;; +esac fi rm -f conftest.err conftest.i conftest.$ac_ext done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi ac_ext=c @@ -14315,6 +14566,140 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 +printf %s "checking for egrep -e... " >&6; } +if test ${ac_cv_path_EGREP_TRADITIONAL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + : + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + + if test "$ac_cv_path_EGREP_TRADITIONAL" +then : + ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + ;; +esac +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 +printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } + EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL + @@ -14355,8 +14740,14 @@ printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char pthread_join (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (void); int main (void) { @@ -14450,7 +14841,7 @@ case $host_os in _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 + $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} @@ -14480,8 +14871,8 @@ printf %s "checking whether $CC is Clang... " >&6; } if test ${ax_cv_PTHREAD_CLANG+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_CLANG=no +else case e in #( + e) ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14493,14 +14884,15 @@ else $as_nop _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 + $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 then : ax_cv_PTHREAD_CLANG=yes fi rm -rf conftest* fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } @@ -14550,8 +14942,9 @@ esac if test "x$ax_pthread_check_macro" = "x--" then : ax_pthread_check_cond=0 -else $as_nop - ax_pthread_check_cond="!defined($ax_pthread_check_macro)" +else case e in #( + e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;; +esac fi @@ -14585,8 +14978,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ax_pthread_config+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ax_pthread_config"; then +else case e in #( + e) if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -14609,7 +15002,8 @@ done IFS=$as_save_IFS test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" -fi +fi ;; +esac fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then @@ -14742,8 +15136,8 @@ printf %s "checking whether Clang needs flag to prevent \"argument unused\" warn if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown +else case e in #( + e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second @@ -14789,7 +15183,8 @@ then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } @@ -14816,8 +15211,8 @@ printf %s "checking for joinable pthread attribute... " >&6; } if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_JOINABLE_ATTR=unknown +else case e in #( + e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14837,7 +15232,8 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } @@ -14857,14 +15253,15 @@ printf %s "checking whether more special flags are required for pthreads... " >& if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} then : printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_SPECIAL_FLAGS=no +else case e in #( + e) ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } @@ -14880,8 +15277,8 @@ printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -14896,12 +15293,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_PRIO_INHERIT=yes -else $as_nop - ax_cv_PTHREAD_PRIO_INHERIT=no +else case e in #( + e) ax_cv_PTHREAD_PRIO_INHERIT=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } @@ -14951,8 +15350,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CC+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$PTHREAD_CC"; then +else case e in #( + e) if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -14974,7 +15373,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then @@ -15001,8 +15401,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CXX+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$PTHREAD_CXX"; then +else case e in #( + e) if test -n "$PTHREAD_CXX"; then ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15024,7 +15424,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX if test -n "$PTHREAD_CXX"; then @@ -15109,8 +15510,8 @@ if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } -else $as_nop - save_LIBS="$LIBS" +else case e in #( + e) save_LIBS="$LIBS" LIBS="$LIBS -latomic" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15127,13 +15528,15 @@ if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } -else $as_nop - as_fn_error $? "failed to find working configuration with atomics" "$LINENO" 5 - +else case e in #( + e) as_fn_error $? "failed to find working configuration with atomics" "$LINENO" 5 + ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - + ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -15169,11 +15572,12 @@ then : ;; esac -else $as_nop - +else case e in #( + e) try_sctp=true - + ;; +esac fi @@ -15212,15 +15616,21 @@ printf %s "checking for library containing sctp_bindx... " >&6; } if test ${ac_cv_search_sctp_bindx+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char sctp_bindx (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char sctp_bindx (void); int main (void) { @@ -15251,11 +15661,13 @@ done if test ${ac_cv_search_sctp_bindx+y} then : -else $as_nop - ac_cv_search_sctp_bindx=no +else case e in #( + e) ac_cv_search_sctp_bindx=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sctp_bindx" >&5 printf "%s\n" "$ac_cv_search_sctp_bindx" >&6; } @@ -15279,8 +15691,8 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @@ -15310,12 +15722,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - eval "$3=yes" +else case e in #( + e) eval "$3=yes" ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -15344,20 +15758,22 @@ then : printf "%s\n" "#define HAVE_ENDIAN_H 1" >>confdefs.h -else $as_nop - ac_fn_c_check_header_compile "$LINENO" "sys/endian.h" "ac_cv_header_sys_endian_h" "$ac_includes_default" +else case e in #( + e) ac_fn_c_check_header_compile "$LINENO" "sys/endian.h" "ac_cv_header_sys_endian_h" "$ac_includes_default" if test "x$ac_cv_header_sys_endian_h" = xyes then : printf "%s\n" "#define HAVE_SYS_ENDIAN_H 1" >>confdefs.h -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Couldn't find endian.h or sys/endian.h files: doing compile-time tests." >&5 +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Couldn't find endian.h or sys/endian.h files: doing compile-time tests." >&5 printf "%s\n" "$as_me: WARNING: Couldn't find endian.h or sys/endian.h files: doing compile-time tests." >&2;} - + ;; +esac fi - + ;; +esac fi @@ -15382,8 +15798,8 @@ then : ;; esac -else $as_nop - +else case e in #( + e) # if pkg-config is installed and openssl has installed a .pc file, # then use that information and don't search ssldirs if test -n "$ac_tool_prefix"; then @@ -15394,8 +15810,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PKG_CONFIG+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$PKG_CONFIG"; then +else case e in #( + e) if test -n "$PKG_CONFIG"; then ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15417,7 +15833,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi PKG_CONFIG=$ac_cv_prog_PKG_CONFIG if test -n "$PKG_CONFIG"; then @@ -15439,8 +15856,8 @@ printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_PKG_CONFIG+y} then : printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_PKG_CONFIG"; then +else case e in #( + e) if test -n "$ac_ct_PKG_CONFIG"; then ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -15462,7 +15879,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG if test -n "$ac_ct_PKG_CONFIG"; then @@ -15502,7 +15920,8 @@ fi ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr" fi - + ;; +esac fi @@ -15568,18 +15987,19 @@ printf "%s\n" "#define HAVE_SSL 1" >>confdefs.h have_ssl=true -else $as_nop - +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if test "x$with_openssl" != "x"; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "--with-openssl was given, but test for OpenSSL failed -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } fi - + ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext @@ -15609,8 +16029,8 @@ printf %s "checking TCP_CONGESTION socket option... " >&6; } if test ${iperf3_cv_header_tcp_congestion+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -15624,10 +16044,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_tcp_congestion=yes -else $as_nop - iperf3_cv_header_tcp_congestion=no +else case e in #( + e) iperf3_cv_header_tcp_congestion=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_tcp_congestion" >&5 printf "%s\n" "$iperf3_cv_header_tcp_congestion" >&6; } @@ -15643,8 +16065,8 @@ printf %s "checking TCP_USER_TIMEOUT socket option... " >&6; } if test ${iperf3_cv_header_tcp_user_timeout+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -15658,10 +16080,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_tcp_user_timeout=yes -else $as_nop - iperf3_cv_header_tcp_user_timeout=no +else case e in #( + e) iperf3_cv_header_tcp_user_timeout=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_tcp_user_timeout" >&5 printf "%s\n" "$iperf3_cv_header_tcp_user_timeout" >&6; } @@ -15680,8 +16104,8 @@ printf %s "checking IPv6 flowlabel support... " >&6; } if test ${iperf3_cv_header_flowlabel+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -15696,10 +16120,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_flowlabel=yes -else $as_nop - iperf3_cv_header_flowlabel=no +else case e in #( + e) iperf3_cv_header_flowlabel=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_flowlabel" >&5 printf "%s\n" "$iperf3_cv_header_flowlabel" >&6; } @@ -15717,12 +16143,12 @@ fi for ac_func in cpuset_setaffinity sched_setaffinity SetProcessAffinityMask do : - as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes" then : cat >>confdefs.h <<_ACEOF -#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1 _ACEOF printf "%s\n" "#define HAVE_CPU_AFFINITY 1" >>confdefs.h @@ -15767,8 +16193,8 @@ printf %s "checking SO_MAX_PACING_RATE socket option... " >&6; } if test ${iperf3_cv_header_so_max_pacing_rate+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -15782,10 +16208,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_so_max_pacing_rate=yes -else $as_nop - iperf3_cv_header_so_max_pacing_rate=no +else case e in #( + e) iperf3_cv_header_so_max_pacing_rate=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_so_max_pacing_rate" >&5 printf "%s\n" "$iperf3_cv_header_so_max_pacing_rate" >&6; } @@ -15801,8 +16229,8 @@ printf %s "checking SO_BINDTODEVICE socket option... " >&6; } if test ${iperf3_cv_header_so_bindtodevice+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -15816,10 +16244,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_so_bindtodevice=yes -else $as_nop - iperf3_cv_header_so_bindtodevice=no +else case e in #( + e) iperf3_cv_header_so_bindtodevice=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_so_bindtodevice" >&5 printf "%s\n" "$iperf3_cv_header_so_bindtodevice" >&6; } @@ -15835,8 +16265,8 @@ printf %s "checking IP_MTU_DISCOVER socket option... " >&6; } if test ${iperf3_cv_header_ip_mtu_discover+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -15852,10 +16282,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_ip_mtu_discover=yes -else $as_nop - iperf3_cv_header_ip_mtu_discover=no +else case e in #( + e) iperf3_cv_header_ip_mtu_discover=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_ip_mtu_discover" >&5 printf "%s\n" "$iperf3_cv_header_ip_mtu_discover" >&6; } @@ -15871,8 +16303,8 @@ printf %s "checking IP_DONTFRAG socket option... " >&6; } if test ${iperf3_cv_header_ip_dontfrag+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -15888,10 +16320,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_ip_dontfrag=yes -else $as_nop - iperf3_cv_header_ip_dontfrag=no +else case e in #( + e) iperf3_cv_header_ip_dontfrag=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_ip_dontfrag" >&5 printf "%s\n" "$iperf3_cv_header_ip_dontfrag" >&6; } @@ -15907,8 +16341,8 @@ printf %s "checking IP_DONTFRAGMENT socket option... " >&6; } if test ${iperf3_cv_header_ip_dontfragment+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -15924,10 +16358,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : iperf3_cv_header_ip_dontfragment=yes -else $as_nop - iperf3_cv_header_ip_dontfragment=no +else case e in #( + e) iperf3_cv_header_ip_dontfragment=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_ip_dontfragment" >&5 printf "%s\n" "$iperf3_cv_header_ip_dontfragment" >&6; } @@ -15943,12 +16379,13 @@ printf %s "checking any kind of DF socket option... " >&6; } if test ${iperf3_cv_header_dontfragment+y} then : printf %s "(cached) " >&6 -else $as_nop - if test "x$iperf3_cv_header_ip_mtu_discover" = "xyes" -o "x$iperf3_cv_header_ip_dontfrag" = "xyes" -o "x$iperf3_cv_header_ip_dontfragment" = "xyes"; then +else case e in #( + e) if test "x$iperf3_cv_header_ip_mtu_discover" = "xyes" -o "x$iperf3_cv_header_ip_dontfrag" = "xyes" -o "x$iperf3_cv_header_ip_dontfragment" = "xyes"; then iperf3_cv_header_dontfragment=yes else iperf3_cv_header_dontfragment=no -fi +fi ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iperf3_cv_header_dontfragment" >&5 printf "%s\n" "$iperf3_cv_header_dontfragment" >&6; } @@ -15973,8 +16410,9 @@ ac_fn_c_check_member "$LINENO" "struct tcp_info" "tcpi_snd_wnd" "ac_cv_member_st if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_wnd" = xyes then : iperf3_cv_header_tcp_info_snd_wnd=yes -else $as_nop - iperf3_cv_header_tcp_info_snd_wnd=no +else case e in #( + e) iperf3_cv_header_tcp_info_snd_wnd=no ;; +esac fi @@ -15990,15 +16428,21 @@ printf %s "checking for library containing clock_gettime... " >&6; } if test ${ac_cv_search_clock_gettime+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS +else case e in #( + e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char clock_gettime (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (void); int main (void) { @@ -16029,11 +16473,13 @@ done if test ${ac_cv_search_clock_gettime+y} then : -else $as_nop - ac_cv_search_clock_gettime=no +else case e in #( + e) ac_cv_search_clock_gettime=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 printf "%s\n" "$ac_cv_search_clock_gettime" >&6; } @@ -16065,8 +16511,8 @@ cat >confcache <<\_ACEOF # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the +# 'ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF @@ -16096,14 +16542,14 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote + # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) - # `set' quotes correctly as required by POSIX, so do not add quotes. + # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | @@ -16233,7 +16679,6 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh @@ -16242,12 +16687,13 @@ then : # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else $as_nop - case `(set -o) 2>/dev/null` in #( +else case e in #( + e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi @@ -16319,7 +16765,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as `sh COMMAND' +# We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 @@ -16348,7 +16794,6 @@ as_fn_error () } # as_fn_error - # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -16388,11 +16833,12 @@ then : { eval $1+=\$2 }' -else $as_nop - as_fn_append () +else case e in #( + e) as_fn_append () { eval $1=\$$1\$2 - } + } ;; +esac fi # as_fn_append # as_fn_arith ARG... @@ -16406,11 +16852,12 @@ then : { as_val=$(( $* )) }' -else $as_nop - as_fn_arith () +else case e in #( + e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } + } ;; +esac fi # as_fn_arith @@ -16493,9 +16940,9 @@ if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then @@ -16576,10 +17023,12 @@ as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 @@ -16594,8 +17043,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.17+, which was -generated by GNU Autoconf 2.71. Invocation command line was +This file was extended by iperf $as_me 3.17.1, which was +generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -16627,7 +17076,7 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions +'$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. @@ -16663,11 +17112,11 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.17+ -configured by $0, generated by GNU Autoconf 2.71, +iperf config.status 3.17.1 +configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -16729,8 +17178,8 @@ do ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; + as_fn_error $? "ambiguous option: '$1' +Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -16738,8 +17187,8 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; + -*) as_fn_error $? "unrecognized option: '$1' +Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; @@ -17086,7 +17535,7 @@ do "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "iperf3.spec") CONFIG_FILES="$CONFIG_FILES iperf3.spec" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done @@ -17106,7 +17555,7 @@ fi # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. +# after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= @@ -17130,7 +17579,7 @@ ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. +# This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then @@ -17288,13 +17737,13 @@ fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. +# This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF -# Transform confdefs.h into an awk script `defines.awk', embedded as +# Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. @@ -17404,7 +17853,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -17426,19 +17875,19 @@ do -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. + # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done - # Let's still pretend it is `configure' which instantiates (i.e., don't + # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` @@ -17571,7 +18020,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 esac _ACEOF -# Neutralize VPATH when `$srcdir' = `.'. +# Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -17602,9 +18051,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -17759,15 +18208,15 @@ printf "%s\n" X/"$am_mf" | (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). -See \`config.log' for more details" "$LINENO" 5; } +See 'config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} diff --git a/src/iperf_config.h.in b/src/iperf_config.h.in index bb8853ff4..c85b19521 100644 --- a/src/iperf_config.h.in +++ b/src/iperf_config.h.in @@ -1,15 +1,15 @@ /* src/iperf_config.h.in. Generated from configure.ac by autoheader. */ -/* Define to 1 if you have the `clock_gettime' function. */ +/* Define to 1 if you have the 'clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME -/* Define to 1 if you have the `cpuset_setaffinity' function. */ +/* Define to 1 if you have the 'cpuset_setaffinity' function. */ #undef HAVE_CPUSET_SETAFFINITY /* Have CPU affinity support. */ #undef HAVE_CPU_AFFINITY -/* Define to 1 if you have the `daemon' function. */ +/* Define to 1 if you have the 'daemon' function. */ #undef HAVE_DAEMON /* Define to 1 if you have the header file. */ @@ -24,7 +24,7 @@ /* Have IPv6 flowlabel support. */ #undef HAVE_FLOWLABEL -/* Define to 1 if you have the `getline' function. */ +/* Define to 1 if you have the 'getline' function. */ #undef HAVE_GETLINE /* Define to 1 if you have the header file. */ @@ -54,16 +54,16 @@ /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT -/* Define to 1 if you have the `sched_setaffinity' function. */ +/* Define to 1 if you have the 'sched_setaffinity' function. */ #undef HAVE_SCHED_SETAFFINITY /* Have SCTP support. */ #undef HAVE_SCTP_H -/* Define to 1 if you have the `sendfile' function. */ +/* Define to 1 if you have the 'sendfile' function. */ #undef HAVE_SENDFILE -/* Define to 1 if you have the `SetProcessAffinityMask' function. */ +/* Define to 1 if you have the 'SetProcessAffinityMask' function. */ #undef HAVE_SETPROCESSAFFINITYMASK /* Have SO_BINDTODEVICE sockopt. */ @@ -93,7 +93,7 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H -/* Define to 1 if the system has the type `struct sctp_assoc_value'. */ +/* Define to 1 if the system has the type 'struct sctp_assoc_value'. */ #undef HAVE_STRUCT_SCTP_ASSOC_VALUE /* Define to 1 if you have the header file. */ @@ -148,7 +148,7 @@ your system. */ #undef PTHREAD_CREATE_JOINABLE -/* Define to 1 if all of the C90 standard headers exist (not just the ones +/* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS @@ -156,5 +156,5 @@ /* Version number of package */ #undef VERSION -/* Define to empty if `const' does not conform to ANSI C. */ +/* Define to empty if 'const' does not conform to ANSI C. */ #undef const From 2acfcfe94e928e74542c9f107e02aa6dd4748a79 Mon Sep 17 00:00:00 2001 From: swlars Date: Mon, 13 May 2024 11:40:55 -0700 Subject: [PATCH 098/286] Remove signing requirement for git tags --- make_release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make_release b/make_release index 54c43f0b9..ef805808f 100755 --- a/make_release +++ b/make_release @@ -21,7 +21,7 @@ echo dirname $dirname do_tag () { - git tag -s -m "tagging $tag" "$tag" + git tag -m "tagging $tag" "$tag" } do_tar () From 9371f994f72bf47ecca65a25d018c789db304e86 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 13 May 2024 13:56:41 -0700 Subject: [PATCH 099/286] Update for iperf-3.17.1. --- docs/conf.py | 4 ++-- docs/news.rst | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 96c352c8f..adfa8316c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -52,10 +52,10 @@ # built documents. # # The short X.Y version. -version = '3.17' +version = '3.17.1' # The full version, including alpha/beta/rc tags. -release = '3.17' +release = '3.17.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/news.rst b/docs/news.rst index 9903ec12a..2299d10fe 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -1,6 +1,16 @@ iperf3 Project News =================== +2024-05-13: ipef-3.17.1 released +--------------------------------- + +| URL: https://downloads.es.net/pub/iperf/iperf-3.17.1.tar.gz +| SHA256: ``84404ca8431b595e86c473d8f23d8bb102810001f15feaf610effd3b318788aa`` + +iperf-3.17.1 fixes some issues with version numbers in various +places. It is otherwise identical to iperf-3.17. + + 2024-05-10: iperf-3.17 released -------------------------------- | URL: https://downloads.es.net/pub/iperf/iperf-3.17.tar.gz From 3ba2559bb8454227b2f9f438a998c681ee52a94b Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 13 May 2024 13:57:24 -0700 Subject: [PATCH 100/286] Update online manual page for iperf-3.17.1. --- docs/invoking.rst | 419 ++++++++++++++++++++++++---------------------- 1 file changed, 216 insertions(+), 203 deletions(-) diff --git a/docs/invoking.rst b/docs/invoking.rst index 7c91dea14..0d015ad5a 100644 --- a/docs/invoking.rst +++ b/docs/invoking.rst @@ -28,72 +28,72 @@ the executable. :: IPERF3(1) User Manuals IPERF3(1) - - - + + + NAME iperf3 - perform network throughput tests - + SYNOPSIS iperf3 -s [ options ] iperf3 -c server [ options ] - - + + DESCRIPTION iperf3 is a tool for performing network throughput measurements. It can test TCP, UDP, or SCTP throughput. To perform an iperf3 test the user must establish both a server and a client. - + The iperf3 executable contains both client and server functionality. An iperf3 server can be started using either of the -s or --server com- mand-line parameters, for example: - + iperf3 -s - + iperf3 --server - + Note that many iperf3 parameters have both short (-s) and long (--server) forms. In this section we will generally use the short form of command-line flags, unless only the long form of a flag is avail- able. - + By default, the iperf3 server listens on TCP port 5201 for connections from an iperf3 client. A custom port can be specified by using the -p flag, for example: - + iperf3 -s -p 5002 - + After the server is started, it will listen for connections from iperf3 clients (in other words, the iperf3 program run in client mode). The client mode can be started using the -c command-line option, which also requires a host to which iperf3 should connect. The host can by speci- fied by hostname, IPv4 literal, or IPv6 literal: - + iperf3 -c iperf3.example.com - + iperf3 -c 192.0.2.1 - + iperf3 -c 2001:db8::1 - + If the iperf3 server is running on a non-default TCP port, that port number needs to be specified on the client as well: - + iperf3 -c iperf3.example.com -p 5002 - + The initial TCP connection is used to exchange test parameters, control the start and end of the test, and to exchange test results. This is sometimes referred to as the "control connection". The actual test data is sent over a separate TCP connection, as a separate flow of UDP packets, or as an independent SCTP connection, depending on what proto- col was specified by the client. - + Normally, the test data is sent from the client to the server, and mea- sures the upload speed of the client. Measuring the download speed from the server can be done by specifying the -R flag on the client. This causes data to be sent from the server to the client. - + iperf3 -c iperf3.example.com -p 5202 -R - + Results are displayed on both the client and server. There will be at least one line of output per measurement interval (by default a mea- surement interval lasts for one second, but this can be changed by the @@ -103,206 +103,220 @@ the executable. measurement interval are taken from the point of view of the endpoint process emitting that output (in other words, the output on the client shows the measurement interval data for the client. - + At the end of the test is a set of statistics that shows (at least as much as possible) a summary of the test as seen by both the sender and the receiver, with lines tagged accordingly. Recall that by default the client is the sender and the server is the receiver, although as indicated above, use of the -R flag will reverse these roles. - + The client can be made to retrieve the server-side output for a given test by specifying the --get-server-output flag. - + Either the client or the server can produce its output in a JSON struc- ture, useful for integration with other programs, by passing it the -J - flag. Because the contents of the JSON structure are only completely + flag. Normally the contents of the JSON structure are only competely known after the test has finished, no JSON output will be emitted until - the end of the test. - - iperf3 has a (overly) large set of command-line options that can be - used to set the parameters of a test. They are given in the "GENERAL - OPTIONS" section of the manual page below, as well as summarized in + the end of the test. By enabling line-delimited JSON multiple objects + will be emitted to provide a real-time parsable JSON output. + + iperf3 has a (overly) large set of command-line options that can be + used to set the parameters of a test. They are given in the "GENERAL + OPTIONS" section of the manual page below, as well as summarized in iperf3's help output, which can be viewed by running iperf3 with the -h flag. - + GENERAL OPTIONS -p, --port n set server port to listen on/connect to to n (default 5201) - + -f, --format [kmgtKMGT] format to report: Kbits/Mbits/Gbits/Tbits - + -i, --interval n - pause n seconds between periodic throughput reports; default is + pause n seconds between periodic throughput reports; default is 1, use 0 to disable - + -I, --pidfile file - write a file with the process ID, most useful when running as a + write a file with the process ID, most useful when running as a daemon. - + -F, --file name - Use a file as the source (on the sender) or sink (on the - receiver) of data, rather than just generating random data or - throwing it away. This feature is used for finding whether or - not the storage subsystem is the bottleneck for file transfers. - It does not turn iperf3 into a file transfer tool. The length, - attributes, and in some cases contents of the received file may + Use a file as the source (on the sender) or sink (on the re- + ceiver) of data, rather than just generating random data or + throwing it away. This feature is used for finding whether or + not the storage subsystem is the bottleneck for file transfers. + It does not turn iperf3 into a file transfer tool. The length, + attributes, and in some cases contents of the received file may not match those of the original file. - + -A, --affinity n/n,m - Set the CPU affinity, if possible (Linux, FreeBSD, and Windows - only). On both the client and server you can set the local - affinity by using the n form of this argument (where n is a CPU - number). In addition, on the client side you can override the - server's affinity for just that one test, using the n,m form of - argument. Note that when using this feature, a process will - only be bound to a single CPU (as opposed to a set containing + Set the CPU affinity, if possible (Linux, FreeBSD, and Windows + only). On both the client and server you can set the local + affinity by using the n form of this argument (where n is a CPU + number). In addition, on the client side you can override the + server's affinity for just that one test, using the n,m form of + argument. Note that when using this feature, a process will + only be bound to a single CPU (as opposed to a set containing potentially multiple CPUs). - + -B, --bind host[%dev] bind to the specific interface associated with address host. If - an optional interface is specified, it is treated as a shortcut - for --bind-dev dev. Note that a percent sign and interface - device name are required for IPv6 link-local address literals. - + an optional interface is specified, it is treated as a shortcut + for --bind-dev dev. Note that a percent sign and interface de- + vice name are required for IPv6 link-local address literals. + --bind-dev dev - bind to the specified network interface. This option uses - SO_BINDTODEVICE, and may require root permissions. (Available + bind to the specified network interface. This option uses + SO_BINDTODEVICE, and may require root permissions. (Available on Linux and possibly other systems.) - + -V, --verbose give more detailed output - + -J, --json output in JSON format - + + --json-stream + output in line-delimited JSON format + --logfile file send output to a log file. - + --forceflush - force flushing output at every interval. Used to avoid buffer- + force flushing output at every interval. Used to avoid buffer- ing when sending output to pipe. - + --timestamps[=format] - prepend a timestamp at the start of each output line. By - default, timestamps have the format emitted by ctime(1). - Optionally, = followed by a format specification can be passed - to customize the timestamps, see strftime(3). If this optional - format is given, the = must immediately follow the --timestamps - option with no whitespace intervening. - + prepend a timestamp at the start of each output line. By de- + fault, timestamps have the format emitted by ctime(1). Option- + ally, = followed by a format specification can be passed to cus- + tomize the timestamps, see strftime(3). If this optional format + is given, the = must immediately follow the --timestamps option + with no whitespace intervening. + --rcv-timeout # - set idle timeout for receiving data during active tests. The - receiver will halt a test if no data is received from the sender + set idle timeout for receiving data during active tests. The re- + ceiver will halt a test if no data is received from the sender for this number of ms (default to 120000 ms, or 2 minutes). - + --snd-timeout # - set timeout for unacknowledged TCP data (on both test and con- + set timeout for unacknowledged TCP data (on both test and con- trol connections) This option can be used to force a faster test - timeout in case of a network partition during a test. The - required parameter is specified in ms, and defaults to the sys- - tem settings. This functionality depends on the TCP_USER_TIME- - OUT socket option, and will not work on systems that do not sup- - port it. - + timeout in case of a network partition during a test. The re- + quired parameter is specified in ms, and defaults to the system + settings. This functionality depends on the TCP_USER_TIMEOUT + socket option, and will not work on systems that do not support + it. + + --use-pkcs1-padding + This option is only meaningful when using iperf3's authentica- + tion features. Versions of iperf3 prior to 3.17 used PCKS1 pad- + ding in the RSA-encrypted credentials, which was vulnerable to a + side-channel attack that could reveal a server's private key. + Beginning with iperf-3.17, OAEP padding is used, however this is + a breaking change that is not compatible with older iperf3 ver- + sions. Use this option to preserve the less secure, but more + compatible, behavior. + -d, --debug emit debugging output. Primarily (perhaps exclusively) of use to developers. - + -v, --version show version information and quit - + -h, --help show a help synopsis - - + + SERVER SPECIFIC OPTIONS -s, --server run in server mode - + -D, --daemon run the server in background as a daemon - + -1, --one-off handle one client connection, then exit. If an idle time is set, the server will exit after that amount of time with no con- nection. - + --idle-timeout n restart the server after n seconds in case it gets stuck. In one-off mode, this is the number of seconds the server will wait before exiting. - + --server-bitrate-limit n[KMGT] set a limit on the server side, which will cause a test to abort if the client specifies a test of more than n bits per second, or if the average data sent or received by the client (including - all data streams) is greater than n bits per second. The - default limit is zero, which implies no limit. The interval - over which to average the data rate is 5 seconds by default, but - can be specified by adding a '/' and a number to the bitrate - specifier. - + all data streams) is greater than n bits per second. The de- + fault limit is zero, which implies no limit. The interval over + which to average the data rate is 5 seconds by default, but can + be specified by adding a '/' and a number to the bitrate speci- + fier. + --rsa-private-key-path file - path to the RSA private key (not password-protected) used to - decrypt authentication credentials from the client (if built - with OpenSSL support). - + path to the RSA private key (not password-protected) used to de- + crypt authentication credentials from the client (if built with + OpenSSL support). + --authorized-users-path file path to the configuration file containing authorized users cre- dentials to run iperf tests (if built with OpenSSL support). The file is a comma separated list of usernames and password hashes; more information on the structure of the file can be found in the EXAMPLES section. - + --time-skew-thresholdsecond seconds time skew threshold (in seconds) between the server and client during the authentication process. - + CLIENT SPECIFIC OPTIONS -c, --client host[%dev] - run in client mode, connecting to the specified server. By - default, a test consists of sending data from the client to the + run in client mode, connecting to the specified server. By de- + fault, a test consists of sending data from the client to the server, unless the -R flag is specified. If an optional inter- face is specified, it is treated as a shortcut for --bind-dev - dev. Note that a percent sign and interface device name are - required for IPv6 link-local address literals. - + dev. Note that a percent sign and interface device name are re- + quired for IPv6 link-local address literals. + --sctp use SCTP rather than TCP (FreeBSD and Linux) - + -u, --udp use UDP rather than TCP - + --connect-timeout n set timeout for establishing the initial control connection to the server, in milliseconds. The default behavior is the oper- ating system's timeout for TCP connection establishment. Pro- viding a shorter value may speed up detection of a down iperf3 server. - + -b, --bitrate n[KMGT] set target bitrate to n bits/sec (default 1 Mbit/sec for UDP, unlimited for TCP/SCTP). If there are multiple streams (-P flag), the throughput limit is applied separately to each stream. You can also add a '/' and a number to the bitrate specifier. This is called "burst mode". It will send the given - number of packets without pausing, even if that temporarily - exceeds the specified throughput limit. Setting the target - bitrate to 0 will disable bitrate limits (particularly useful - for UDP tests). This throughput limit is implemented internally - inside iperf3, and is available on all platforms. Compare with + number of packets without pausing, even if that temporarily ex- + ceeds the specified throughput limit. Setting the target bi- + trate to 0 will disable bitrate limits (particularly useful for + UDP tests). This throughput limit is implemented internally in- + side iperf3, and is available on all platforms. Compare with the --fq-rate flag. This option replaces the --bandwidth flag, which is now deprecated but (at least for now) still accepted. - + --pacing-timer n[KMGT] - set pacing timer interval in microseconds (default 1000 - microseconds, or 1 ms). This controls iperf3's internal pacing - timer for the -b/--bitrate option. The timer fires at the - interval set by this parameter. Smaller values of the pacing + set pacing timer interval in microseconds (default 1000 mi- + croseconds, or 1 ms). This controls iperf3's internal pacing + timer for the -b/--bitrate option. The timer fires at the in- + terval set by this parameter. Smaller values of the pacing timer parameter smooth out the traffic emitted by iperf3, but potentially at the cost of performance due to more frequent timer processing. - + --fq-rate n[KMGT] Set a rate to be used with fair-queueing based socket-level pac- ing, in bits per second. This pacing (if specified) will be in @@ -311,44 +325,44 @@ the executable. test. Only available on platforms supporting the SO_MAX_PAC- ING_RATE socket option (currently only Linux). The default is no fair-queueing based pacing. - + --no-fq-socket-pacing This option is deprecated and will be removed. It is equivalent to specifying --fq-rate=0. - + -t, --time n time in seconds to transmit for (default 10 secs) - + -n, --bytes n[KMGT] number of bytes to transmit (instead of -t) - + -k, --blockcount n[KMGT] number of blocks (packets) to transmit (instead of -t or -n) - + -l, --length n[KMGT] length of buffer to read or write. For TCP tests, the default value is 128KB. In the case of UDP, iperf3 tries to dynamically determine a reasonable sending size based on the path MTU; if that cannot be determined it uses 1460 bytes as a sending size. For SCTP tests, the default size is 64KB. - + --cport port bind data streams to a specific client port (for TCP and UDP only, default is to use an ephemeral port) - + -P, --parallel n - number of parallel client streams to run. Note that iperf3 is - single threaded, so if you are CPU bound, this will not yield - higher throughput. - + number of parallel client streams to run. iperf3 will spawn off + a separate thread for each test stream. Using multiple streams + may result in higher throughput than a single stream. + -R, --reverse reverse the direction of a test, so that the server sends data to the client - + --bidir test in both directions (normal and reverse), with both the client and server sending and receiving data simultaneously - + -w, --window n[KMGT] set socket buffer size / window size. This value gets sent to the server and used on that side too; on both sides this option @@ -358,96 +372,95 @@ the executable. size is approximately double what is specified by this option (this behavior is not a bug in iperf3 but a "feature" of the Linux kernel, as documented by tcp(7) and socket(7)). - + -M, --set-mss n set TCP/SCTP maximum segment size (MTU - 40 bytes) - + -N, --no-delay set TCP/SCTP no delay, disabling Nagle's Algorithm - + -4, --version4 only use IPv4 - + -6, --version6 only use IPv6 - + -S, --tos n set the IP type of service. The usual prefixes for octal and hex can be used, i.e. 52, 064 and 0x34 all specify the same value. - + --dscp dscp - set the IP DSCP bits. Both numeric and symbolic values are - accepted. Numeric values can be specified in decimal, octal and - hex (see --tos above). To set both the DSCP bits and the ECN - bits, use --tos. - + set the IP DSCP bits. Both numeric and symbolic values are ac- + cepted. Numeric values can be specified in decimal, octal and + hex (see --tos above). + -L, --flowlabel n set the IPv6 flow label (currently only supported on Linux) - + -X, --xbind name - Bind SCTP associations to a specific subset of links using - sctp_bindx(3). The --B flag will be ignored if this flag is + Bind SCTP associations to a specific subset of links using + sctp_bindx(3). The --B flag will be ignored if this flag is specified. Normally SCTP will include the protocol addresses of - all active links on the local host when setting up an associa- - tion. Specifying at least one --X name will disable this behav- - iour. This flag must be specified for each link to be included - in the association, and is supported for both iperf servers and + all active links on the local host when setting up an associa- + tion. Specifying at least one --X name will disable this behav- + iour. This flag must be specified for each link to be included + in the association, and is supported for both iperf servers and clients (the latter are supported by passing the first --X argu- - ment to bind(2)). Hostnames are accepted as arguments and are - resolved using getaddrinfo(3). If the --4 or --6 flags are - specified, names which do not resolve to addresses within the + ment to bind(2)). Hostnames are accepted as arguments and are + resolved using getaddrinfo(3). If the --4 or --6 flags are + specified, names which do not resolve to addresses within the specified protocol family will be ignored. - + --nstreams n Set number of SCTP streams. - + -Z, --zerocopy - Use a "zero copy" method of sending data, such as sendfile(2), + Use a "zero copy" method of sending data, such as sendfile(2), instead of the usual write(2). - + -O, --omit n Perform pre-test for N seconds and omit the pre-test statistics, to skip past the TCP slow-start period. - + -T, --title str Prefix every output line with this string. - + --extra-data str - Specify an extra data string field to be included in JSON out- + Specify an extra data string field to be included in JSON out- put. - + -C, --congestion algo - Set the congestion control algorithm (Linux and FreeBSD only). - An older --linux-congestion synonym for this flag is accepted + Set the congestion control algorithm (Linux and FreeBSD only). + An older --linux-congestion synonym for this flag is accepted but is deprecated. - + --get-server-output Get the output from the server. The output format is determined by the server (in particular, if the server was invoked with the - --json flag, the output will be in JSON format, otherwise it - will be in human-readable format). If the client is run with - --json, the server output is included in a JSON object; other- - wise it is appended at the bottom of the human-readable output. - + --json flag, the output will be in JSON format, otherwise it + will be in human-readable format). If the client is run with + --json, the server output is included in a JSON object; other- + wise it is appended at the bottom of the human-readable output. + --udp-counters-64bit Use 64-bit counters in UDP test packets. The use of this option can help prevent counter overflows during long or high-bitrate UDP tests. Both client and server need to be running at least version 3.1 for this option to work. It may become the default behavior at some point in the future. - + --repeating-payload Use repeating pattern in payload, instead of random bytes. The same payload is used in iperf2 (ASCII '0..9' repeating). It might help to test and reveal problems in networking gear with hardware compression (including some WiFi access points), where - iperf2 and iperf3 perform differently, just based on payload - entropy. - + iperf2 and iperf3 perform differently, just based on payload en- + tropy. + --dont-fragment Set the IPv4 Don't Fragment (DF) bit on outgoing packets. Only applicable to tests doing UDP over IPv4. - + --username username username to use for authentication to the iperf server (if built with OpenSSL support). The password will be prompted for inter- @@ -455,64 +468,64 @@ the executable. also be specified via the IPERF3_PASSWORD environment variable. If this variable is present, the password prompt will be skipped. - + --rsa-public-key-path file path to the RSA public key used to encrypt authentication cre- dentials (if built with OpenSSL support) - - + + EXAMPLES Authentication - RSA Keypair The authentication feature of iperf3 requires an RSA public keypair. The public key is used to encrypt the authentication token containing - the user credentials, while the private key is used to decrypt the - authentication token. The private key must be in PEM format and addi- + the user credentials, while the private key is used to decrypt the au- + thentication token. The private key must be in PEM format and addi- tionally must not have a password set. The public key must be in PEM format and use SubjectPrefixKeyInfo encoding. An example of a set of UNIX/Linux commands using OpenSSL to generate a correctly-formed key- pair follows: - + > openssl genrsa -des3 -out private.pem 2048 > openssl rsa -in private.pem -outform PEM -pubout -out public.pem > openssl rsa -in private.pem -out private_not_protected.pem -out- form PEM - + After these commands, the public key will be contained in the file pub- - lic.pem and the private key will be contained in the file pri- + lic.pem and the private key will be contained in the file pri- vate_not_protected.pem. - + Authentication - Authorized users configuration file - A simple plaintext file must be provided to the iperf3 server in order - to specify the authorized user credentials. The file is a simple list - of comma-separated pairs of a username and a corresponding password - hash. The password hash is a SHA256 hash of the string "{$user}$pass- - word". The file can also contain commented lines (starting with the # - character). An example of commands to generate the password hash on a + A simple plaintext file must be provided to the iperf3 server in order + to specify the authorized user credentials. The file is a simple list + of comma-separated pairs of a username and a corresponding password + hash. The password hash is a SHA256 hash of the string "{$user}$pass- + word". The file can also contain commented lines (starting with the # + character). An example of commands to generate the password hash on a UNIX/Linux system is given below: - + > S_USER=mario S_PASSWD=rossi > echo -n "{$S_USER}$S_PASSWD" | sha256sum | awk '{ print $1 }' - + An example of a password file (with an entry corresponding to the above username and password) is given below: > cat credentials.csv # file format: username,sha256 - mario,bf7a49a846d44b454a5d11e7acfaf13d138bbe0b7483aa3e050879700572709b - - - + mario,bf7a49a846d44b454a5d11e7ac- + faf13d138bbe0b7483aa3e050879700572709b + + + AUTHORS A list of the contributors to iperf3 can be found within the documenta- tion located at https://software.es.net/iperf/dev.html#authors. - - + + SEE ALSO libiperf(3), https://software.es.net/iperf - - - - ESnet September 2022 IPERF3(1) + + ESnet May 2024 IPERF3(1) + The iperf3 manual page will typically be installed in manual section 1. From 1b1fc4609bdf227eee2d34621bc21eee70ce9fa3 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 13 May 2024 14:11:01 -0700 Subject: [PATCH 101/286] General update of release engineering checklist. --- docs/dev.rst | 86 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/docs/dev.rst b/docs/dev.rst index c65524bc7..c5a495893 100644 --- a/docs/dev.rst +++ b/docs/dev.rst @@ -133,25 +133,34 @@ The developers increment the: Release Engineering Checklist ----------------------------- -1. Update the ``README.md`` and ``RELNOTES.md`` files to be accurate. Make sure +1. Start from a clean source tree (be sure that ``git status`` emits + no output). Also ensure up-to-date installs of ``autoconf`` and + ``automake``. + +2. Ensure that ``README.md`` and ``LICENSE`` have correct copyright + dates. + +3. Update the ``README.md`` and ``RELNOTES.md`` files to be accurate. Make sure that the "Known Issues" section of the ``README.md`` file and in this document are up to date. -2. Compose a release announcement. Most of the release announcement +4. Compose a release announcement. Most of the release announcement can be written before tagging. Usually the previous version's announcement can be used as a starting point. -3. Preferably starting from a clean source tree (be sure that ``git - status`` emits no output), make the changes necessary to produce +5. Make the changes necessary to produce the new version, such as bumping version numbers:: vi RELNOTES.md # update version number and release date vi configure.ac # update version parameter in AC_INIT - vi src/iperf3.1 # update manpage revision date if needed - vi src/libiperf.3 # update manpage revision date if needed + # (there should not be any "+" in artifacts) + vi src/iperf3.1 # update manpage revision date (only if needed) + vi src/libiperf.3 # update manpage revision date (only if needed) git commit -a # commit changes to the local repository only + # (commit log should mention version number) ./bootstrap.sh # regenerate configure script, etc. git commit -a # commit changes to the local repository only + # (commit can be simply "Regen.") # Assuming that $VERSION is the version number to be released... ./make_release tag $VERSION # this creates a tag in the local repo @@ -159,43 +168,60 @@ Release Engineering Checklist These steps should be done on a platform with a relatively recent version of autotools / libtools. Examples are MacOS / MacPorts or - FreeBSD. The versions of these tools in CentOS 6 are somewhat + FreeBSD. The versions of these tools in CentOS and similar + distributions are somewhat older and probably should be avoided. - The result will be a release artifact that should be used for - pre-testing. + The result will be release artifacts that should be used for + pre-testing. One will be a compressed tarball + (e.g. ``iperf-3.17.1.tar.gz``) and the other will contain SHA256 + checksum (e.g. ``iperf-3.17.1.tar.gz.sha256``) -4. Stage the tarball (and a file containing the SHA256 hash) to the - download site. Currently this is located on ``downloads.es.net``. +6. Stage the tarball (and a file containing the SHA256 hash) to the + download site. Currently this is located on ``downloads.es.net`` + in the directory ``/var/www/html/pub/iperf/``. -5. From another host, test the link in the release announcement by +7. From another host, test the link in the release announcement by downloading a fresh copy of the file and verifying the SHA256 checksum. Checking all other links in the release announcement is strongly recommended as well. -6. Also verify (with file(1)) that the tarball is actually a gzipped + The link to the tarball will be something of the form + ``https://downloads.es.net/pub/iperf/iperf-3.17.1.tar.gz``. If + composing a release announcement using a HTML-aware editor, verify + the link targets point to the correct artifacts. + +8. Also verify (with file(1)) that the tarball is actually a gzipped tarball. -7. For extra points, actually try downloading, compiling, and - smoke-testing the results of the tarball on all supported - platforms. +9. Try downloading, compiling, and smoke-testing the results of the + tarball on all supported platforms. -8. Plug the SHA256 checksum into the release announcement. +10. Verify that the version string in ``iperf3 --version`` matches the + version number of the artifacts. -9. PGP-sign the release announcement text using ``gpg --clearsign``. - The signed announcement will be sent out in a subsequent emails, - but could also be archived. Decoupling the signing from emailing - allows a signed release announcement to be resent via email or sent - by other, non-email means. +11. Plug the SHA256 checksum into the release announcement. -10. At this point, the release can and should be considered +12. (optional) PGP-sign the release announcement text using ``gpg + --clearsign``. The signed announcement will be sent out in a + subsequent emails, but could also be archived. Decoupling the + signing from emailing allows a signed release announcement to be + resent via email or sent by other, non-email means. + +13. At this point, the release can and should be considered finalized. To commit the release-engineering-related changes to GitHub and make them public, push them out thusly:: git push # Push version changes git push --tags # Push the new tag to the GitHub repo -11. Send the PGP-signed release announcement to the following +14. Update GitHub Releases with the current release notes. Start from: + ``https://github.com/esnet/iperf/releases/new``. Remember to + properly select the tag from the dropdown menu and drop + the artifacts into the GitHub Release. Check "Set as the latest + release" and (optionally) "Create a discussion for this release". + +15. Send the release announcement to the following addresses. Remember to turn off signing in the MUA, if applicable. Remember to check the source address when posting to lists, as "closed" list will reject posting from all from @@ -217,14 +243,15 @@ Release Engineering Checklist sending process by sending a copy to oneself first and attempting to verify the signature is highly encouraged. -12. Update GitHub Releases with the current release notes. +16. Announce the new release in the #iperf3 channel in ESnet Slack. -13. Update the iperf3 Project News section of the documentation site +17. Update the iperf3 Project News section of the documentation site to announce the new release (see ``docs/news.rst`` and ``docs/conf.py`` in the source tree) and deploy a new build of the - documentation to GitHub Pages. + documentation to GitHub Pages. Be sure to double-check version + numbers and copyright dates. -14. If an update to the on-line manual page is needed, it can be +18. If an update to the on-line manual page is needed, it can be generated with this sequence of commands (tested on CentOS 7) and import the result into ``invoking.rst``:: @@ -232,6 +259,9 @@ Release Engineering Checklist export TERM nroff -Tascii -c -man src/iperf3.1 | ul | sed 's/^/ /' > iperf3.txt +19. Update the version number in ``configure.ac`` to some + post-release number (with a "+") and regenerate. + Code Authors ------------ From 8119457236e6720eedb5f6adf4a7c5cadcd2a3f6 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 13 May 2024 14:28:42 -0700 Subject: [PATCH 102/286] Version bump post 3.17.1. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 7caf2abbd..a23c3bcf4 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.17.1],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.17.1+],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) From a6fdfbf01dff9e3499a1b2a868fb715764876826 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 13 May 2024 14:29:13 -0700 Subject: [PATCH 103/286] Regen. --- configure | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/configure b/configure index e15701969..0cc1574cd 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for iperf 3.17.1. +# Generated by GNU Autoconf 2.72 for iperf 3.17.1+. # # Report bugs to . # @@ -614,8 +614,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='iperf' PACKAGE_TARNAME='iperf' -PACKAGE_VERSION='3.17.1' -PACKAGE_STRING='iperf 3.17.1' +PACKAGE_VERSION='3.17.1+' +PACKAGE_STRING='iperf 3.17.1+' PACKAGE_BUGREPORT='https://github.com/esnet/iperf' PACKAGE_URL='https://software.es.net/iperf/' @@ -1366,7 +1366,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures iperf 3.17.1 to adapt to many kinds of systems. +'configure' configures iperf 3.17.1+ to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1437,7 +1437,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of iperf 3.17.1:";; + short | recursive ) echo "Configuration of iperf 3.17.1+:";; esac cat <<\_ACEOF @@ -1556,7 +1556,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -iperf configure 3.17.1 +iperf configure 3.17.1+ generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -1882,7 +1882,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by iperf $as_me 3.17.1, which was +It was created by iperf $as_me 3.17.1+, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -3386,7 +3386,7 @@ fi # Define the identity of the package. PACKAGE='iperf' - VERSION='3.17.1' + VERSION='3.17.1+' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -17043,7 +17043,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by iperf $as_me 3.17.1, which was +This file was extended by iperf $as_me 3.17.1+, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17112,7 +17112,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -iperf config.status 3.17.1 +iperf config.status 3.17.1+ configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" From 93c60bf2ea8aa52e98399223ec04a95f65f00f7b Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Mon, 13 May 2024 14:37:50 -0700 Subject: [PATCH 104/286] Document post-release version number bump in releng checklist. --- docs/dev.rst | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/dev.rst b/docs/dev.rst index c5a495893..2ae56da44 100644 --- a/docs/dev.rst +++ b/docs/dev.rst @@ -260,7 +260,17 @@ Release Engineering Checklist nroff -Tascii -c -man src/iperf3.1 | ul | sed 's/^/ /' > iperf3.txt 19. Update the version number in ``configure.ac`` to some - post-release number (with a "+") and regenerate. + post-release number (with a "+") and regenerate:: + + vi configure.ac # update version in AC_INIT, add "+" + git commit configure.ac # commit changes to local repository + # commit log should mention + # "post-release version bump" + ./bootstrap.sh # regenerate configure script, etc. + git commit -a # commit changes to local repository + # (commit can be simply "Regen.") + # test + git push Code Authors ------------ From ac6b9f7fd335ddebc5212eed40083ef4cd3cb86d Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sun, 2 Jun 2024 11:52:03 +0300 Subject: [PATCH 105/286] Do not listen to old pro_listener --- src/iperf_udp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/iperf_udp.c b/src/iperf_udp.c index a603236df..40f2b1ca7 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -446,6 +446,7 @@ iperf_udp_accept(struct iperf_test *test) /* * Create a new "listening" socket to replace the one we were using before. */ + FD_CLR(test->prot_listener, &test->read_set); // No control messages from old listener test->prot_listener = netannounce(test->settings->domain, Pudp, test->bind_address, test->bind_dev, test->server_port); if (test->prot_listener < 0) { i_errno = IESTREAMLISTEN; From 8b39c84a38f9c0c75f783408a4ed47687ccc581c Mon Sep 17 00:00:00 2001 From: Matthew Cather <14895427+MattCatz@users.noreply.github.com> Date: Fri, 7 Jun 2024 14:48:00 -0500 Subject: [PATCH 106/286] Fix memory leak for parallel tests `congestion_used` is set each iteration of the loop. For tests running parallel streams, the previous malloc-ed string (from `strdup`) is leaked. --- src/iperf_client_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 7ad4c939b..a552fd68d 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -130,6 +130,11 @@ iperf_create_streams(struct iperf_test *test, int sender) i_errno = IESETCONGESTION; return -1; } + if (test->congestion_used) { + if (test->debug) + printf("Overriding existing congestion algorithm: %s\n", test->congestion_used); + free(test->congestion_used); + } // Set actual used congestion alg, or set to unknown if could not get it if (rc < 0) test->congestion_used = strdup("unknown"); From 4c7629f590bb18855e478a826833adb05d2a128b Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 8 Jun 2024 15:35:47 -0700 Subject: [PATCH 107/286] fix -Wformat-y2k error %c potentially prints a 2 digit year. Just use a normal format. --- src/iperf_error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iperf_error.c b/src/iperf_error.c index 0fedf3110..f4172d0d1 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -99,7 +99,7 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) if (test != NULL && test->timestamps) { time(&now); ltm = localtime(&now); - strftime(iperf_timestrerr, sizeof(iperf_timestrerr), "%c ", ltm); + strftime(iperf_timestrerr, sizeof(iperf_timestrerr), "%Y-%m-%d %H:%M:%S", ltm); ct = iperf_timestrerr; } From 8a62bb75b03f0f5329b09822073f9b5f588fb524 Mon Sep 17 00:00:00 2001 From: Matthew Cather <14895427+MattCatz@users.noreply.github.com> Date: Sun, 9 Jun 2024 11:25:29 -0500 Subject: [PATCH 108/286] Fix memory leak in `iperf_print_results` --- src/iperf_api.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/iperf_api.c b/src/iperf_api.c index 4c73e8328..c96efdf0e 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -4200,6 +4200,7 @@ iperf_print_results(struct iperf_test *test) } if (test->server_output_text) { iperf_printf(test, "\nServer output:\n%s\n", test->server_output_text); + free(test->server_output_text); test->server_output_text = NULL; } } From 4fe022d22e3d04bae4aa7e35d37a7beda4241f6c Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Mon, 10 Jun 2024 18:52:00 -0700 Subject: [PATCH 109/286] fix more formats Signed-off-by: Rosen Penev --- src/iperf_api.c | 4 ++-- src/iperf_locale.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 4c73e8328..14056de36 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -3554,7 +3554,7 @@ iperf_print_intermediate(struct iperf_test *test) iperf_size_t bytes = 0; double bandwidth; - int retransmits = 0; + int64_t retransmits = 0; double start_time, end_time; int64_t total_packets = 0, lost_packets = 0; @@ -3630,7 +3630,7 @@ iperf_print_intermediate(struct iperf_test *test) if (test->sender_has_retransmits == 1 && stream_must_be_sender) { /* Interval sum, TCP with retransmits. */ if (test->json_output) - cJSON_AddItemToObject(json_interval, sum_name, iperf_json_printf("start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d omitted: %b sender: %b", (double) start_time, (double) end_time, (double) irp->interval_duration, (int64_t) bytes, bandwidth * 8, (int64_t) retransmits, irp->omitted, stream_must_be_sender)); /* XXX irp->omitted or test->omitting? */ + cJSON_AddItemToObject(json_interval, sum_name, iperf_json_printf("start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d omitted: %b sender: %b", (double) start_time, (double) end_time, (double) irp->interval_duration, (int64_t) bytes, bandwidth * 8, retransmits, irp->omitted, stream_must_be_sender)); /* XXX irp->omitted or test->omitting? */ else iperf_printf(test, report_sum_bw_retrans_format, mbuf, start_time, end_time, ubuf, nbuf, retransmits, irp->omitted?report_omitted:""); /* XXX irp->omitted or test->omitting? */ } else { diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 9d94e0234..64940108a 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -292,10 +292,10 @@ const char test_start_time[] = "Starting Test: protocol: %s, %d streams, %d byte blocks, omitting %d seconds, %d second test, tos %d\n"; const char test_start_bytes[] = -"Starting Test: protocol: %s, %d streams, %d byte blocks, omitting %d seconds, %llu bytes to send, tos %d\n"; +"Starting Test: protocol: %s, %d streams, %d byte blocks, omitting %d seconds, %"PRIuFAST64" bytes to send, tos %d\n"; const char test_start_blocks[] = -"Starting Test: protocol: %s, %d streams, %d byte blocks, omitting %d seconds, %d blocks to send, tos %d\n"; +"Starting Test: protocol: %s, %d streams, %d byte blocks, omitting %d seconds, %"PRIuFAST64" bytes to send, tos %d\n"; /* ------------------------------------------------------------------- @@ -381,10 +381,10 @@ const char report_bw_format[] = "[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %s\n"; const char report_bw_retrans_format[] = -"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %3u %s\n"; +"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %3ld %s\n"; const char report_bw_retrans_cwnd_format[] = -"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %3u %ss %s\n"; +"[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %3ld %ss %s\n"; const char report_bw_udp_format[] = "[%3d]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %" PRId64 "/%" PRId64 " (%.2g%%) %s\n"; @@ -402,7 +402,7 @@ const char report_sum_bw_format[] = "[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %s\n"; const char report_sum_bw_retrans_format[] = -"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %3d %s\n"; +"[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %3"PRId64" %s\n"; const char report_sum_bw_udp_format[] = "[SUM]%s %6.2f-%-6.2f sec %ss %ss/sec %5.3f ms %" PRId64 "/%" PRId64 " (%.2g%%) %s\n"; @@ -419,7 +419,7 @@ const char report_outoforder[] = "[%3d]%s %4.1f-%4.1f sec %d datagrams received out-of-order\n"; const char report_sum_outoforder[] = -"[SUM]%s %4.1f-%4.1f sec %d datagrams received out-of-order\n"; +"[SUM]%s %4.1f-%4.1f sec %"PRIu64" datagrams received out-of-order\n"; const char report_peer[] = "[%3d] local %s port %u connected with %s port %u\n"; From d976d43065de28d3f62403c60af11839c616f6c0 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Mon, 10 Jun 2024 20:50:47 -0700 Subject: [PATCH 110/286] cast time_t to 64-bit time_t is 64-bit, even under 32-bit musl. Cast to 64-bit to make it compatible everywhere. Signed-off-by: Rosen Penev --- src/iperf_api.c | 4 ++-- src/iperf_locale.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 14056de36..4653adbc5 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2081,14 +2081,14 @@ int test_is_authorized(struct iperf_test *test){ int ret = check_authentication(username, password, ts, test->server_authorized_users, test->server_skew_threshold); if (ret == 0){ if (test->debug) { - iperf_printf(test, report_authentication_succeeded, username, ts); + iperf_printf(test, report_authentication_succeeded, username, (uint64_t)ts); } free(username); free(password); return 0; } else { if (test->debug) { - iperf_printf(test, report_authentication_failed, ret, username, ts); + iperf_printf(test, report_authentication_failed, ret, username, (uint64_t)ts); } free(username); free(password); diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 64940108a..cfdba5826 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -309,10 +309,10 @@ const char report_connecting[] = "Connecting to host %s, port %d\n"; const char report_authentication_succeeded[] = -"Authentication succeeded for user '%s' ts %ld\n"; +"Authentication succeeded for user '%s' ts %" PRIu64 "\n"; const char report_authentication_failed[] = -"Authentication failed with return code %d for user '%s' ts %ld\n"; +"Authentication failed with return code %d for user '%s' ts %" PRIu64 "\n"; const char report_reverse[] = "Reverse mode, remote host %s is sending\n"; From daea2dc307cb2b1e2c76ebe4d00659d321e13442 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sun, 16 Jun 2024 19:47:19 +0300 Subject: [PATCH 111/286] Add SKIP-RX-COPY support - using MSG_TRUNC socket option --- configure.ac | 14 ++++++++++++++ src/iperf.h | 1 + src/iperf_api.c | 15 +++++++++++++++ src/iperf_api.h | 1 + src/iperf_locale.c | 3 +++ src/iperf_tcp.c | 9 ++++++++- src/iperf_udp.c | 12 +++++++++++- src/net.c | 28 ++++++++++++++++++++++------ src/net.h | 1 + 9 files changed, 76 insertions(+), 8 deletions(-) diff --git a/configure.ac b/configure.ac index a23c3bcf4..fac25f46d 100644 --- a/configure.ac +++ b/configure.ac @@ -337,6 +337,20 @@ if test "x$iperf3_cv_header_tcp_info_snd_wnd" = "xyes"; then AC_DEFINE([HAVE_TCP_INFO_SND_WND], [1], [Have tcpi_snd_wnd field in tcp_info.]) fi +# Check for MSG_TRUNC (mostly on Linux) +AC_CACHE_CHECK([MSG_TRUNC recv option], +[iperf3_cv_header_msg_trunc], +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include + #include + #include ]], + [[int foo = MSG_TRUNC;]])], + iperf3_cv_header_msg_trunc=yes, + iperf3_cv_header_msg_trunc=no)) +if test "x$iperf3_cv_header_msg_trunc" = "xyes"; then + AC_DEFINE([HAVE_MSG_TRUNC], [1], [Have MSG_TRUNC recv option.]) +fi + # Check if we need -lrt for clock_gettime AC_SEARCH_LIBS(clock_gettime, [rt posix4]) # Check for clock_gettime support diff --git a/src/iperf.h b/src/iperf.h index 527e549ed..c23a548a9 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -169,6 +169,7 @@ struct iperf_settings char *client_password; EVP_PKEY *client_rsa_pubkey; #endif // HAVE_SSL + int skip_rx_copy; /* Whether to ignore received messages data, using MSG_TRUNC option */ int connect_timeout; /* socket connection timeout, in ms */ int idle_timeout; /* server idle time timeout */ unsigned int snd_timeout; /* Timeout for sending tcp messages in active mode, in us */ diff --git a/src/iperf_api.c b/src/iperf_api.c index 4c73e8328..7b480b562 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1131,6 +1131,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) #if defined(HAVE_DONT_FRAGMENT) {"dont-fragment", no_argument, NULL, OPT_DONT_FRAGMENT}, #endif /* HAVE_DONT_FRAGMENT */ +#if defined(HAVE_MSG_TRUNC) + {"skip-rx-copy", no_argument, NULL, OPT_SKIP_RX_COPY}, +#endif /* HAVE_MSG_TRUNC */ #if defined(HAVE_SSL) {"username", required_argument, NULL, OPT_CLIENT_USERNAME}, {"rsa-public-key-path", required_argument, NULL, OPT_CLIENT_RSA_PUBLIC_KEY}, @@ -1635,6 +1638,12 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) test->use_pkcs1_padding = 1; break; #endif /* HAVE_SSL */ +#if defined(HAVE_MSG_TRUNC) + case OPT_SKIP_RX_COPY: + test->settings->skip_rx_copy = 1; + client_flag = 1; + break; +#endif /* HAVE_MSG_TRUNC */ case OPT_PACING_TIMER: test->settings->pacing_timer = unit_atoi(optarg); client_flag = 1; @@ -2270,6 +2279,8 @@ send_parameters(struct iperf_test *test) cJSON_AddStringToObject(j, "authtoken", test->settings->authtoken); } #endif // HAVE_SSL + if (test->settings->skip_rx_copy) + cJSON_AddNumberToObject(j, "skip_rx_copy", test->settings->skip_rx_copy); cJSON_AddStringToObject(j, "client_version", IPERF_VERSION); if (test->debug) { @@ -2376,6 +2387,8 @@ get_parameters(struct iperf_test *test) if ((j_p = cJSON_GetObjectItem(j, "authtoken")) != NULL) test->settings->authtoken = strdup(j_p->valuestring); #endif //HAVE_SSL + if ((j_p = cJSON_GetObjectItem(j, "skip_rx_copy")) != NULL) + test->settings->skip_rx_copy = j_p->valueint; if (test->mode && test->protocol->id == Ptcp && has_tcpinfo_retransmits()) test->sender_has_retransmits = 1; if (test->settings->rate) @@ -2971,6 +2984,7 @@ iperf_defaults(struct iperf_test *testp) testp->settings->rcv_timeout.secs = DEFAULT_NO_MSG_RCVD_TIMEOUT / SEC_TO_mS; testp->settings->rcv_timeout.usecs = (DEFAULT_NO_MSG_RCVD_TIMEOUT % SEC_TO_mS) * mS_TO_US; testp->zerocopy = 0; + testp->settings->skip_rx_copy = 0; memset(testp->cookie, 0, COOKIE_SIZE); @@ -3268,6 +3282,7 @@ iperf_reset_test(struct iperf_test *test) test->settings->tos = 0; test->settings->dont_fragment = 0; test->zerocopy = 0; + test->settings->skip_rx_copy = 0; #if defined(HAVE_SSL) if (test->settings->authtoken) { diff --git a/src/iperf_api.h b/src/iperf_api.h index 131314243..cb0be425f 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -101,6 +101,7 @@ typedef atomic_uint_fast64_t atomic_iperf_size_t; #define OPT_JSON_STREAM 28 #define OPT_SND_TIMEOUT 29 #define OPT_USE_PKCS1_PADDING 30 +#define OPT_SKIP_RX_COPY 31 /* states */ #define TEST_START 1 diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 9d94e0234..94d7715c2 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -199,6 +199,9 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" " -L, --flowlabel N set the IPv6 flow label (only supported on Linux)\n" #endif /* HAVE_FLOWLABEL */ " -Z, --zerocopy use a 'zero copy' method of sending data\n" +#if defined(HAVE_MSG_TRUNC) + " --skip-rx-copy ignore received messages using MSG_TRUNC option\n" +#endif /* HAVE_MSG_TRUNC */ " -O, --omit N perform pre-test for N seconds and omit the pre-test statistics\n" " -T, --title str prefix every output line with this string\n" " --extra-data str data string to include in client and server JSON\n" diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index e025515ab..694ced80d 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -56,8 +56,15 @@ int iperf_tcp_recv(struct iperf_stream *sp) { int r; + int sock_opt; - r = Nread(sp->socket, sp->buffer, sp->settings->blksize, Ptcp); +#if defined(HAVE_MSG_TRUNC) + sock_opt = sp->test->settings->skip_rx_copy ? MSG_TRUNC : 0; +#else + sock_opt = 0; +#endif /* HAVE_MSG_TRUNC */ + + r = Nrecv(sp->socket, sp->buffer, sp->settings->blksize, Ptcp, sock_opt); if (r < 0) return r; diff --git a/src/iperf_udp.c b/src/iperf_udp.c index a603236df..247302d6e 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -61,8 +61,17 @@ iperf_udp_recv(struct iperf_stream *sp) int first_packet = 0; double transit = 0, d = 0; struct iperf_time sent_time, arrival_time, temp_time; + int sock_opt = 0; - r = Nread(sp->socket, sp->buffer, size, Pudp); +#if defined(HAVE_MSG_TRUNC) + // UDP recv() with MSG_TRUNC reads only the size bytes, but return the length of the full packet + if (sp->test->settings->skip_rx_copy) { + sock_opt = MSG_TRUNC; + size = sizeof(sec) + sizeof(usec) + sizeof(pcount); + } +#endif /* HAVE_MSG_TRUNC */ + + r = Nrecv(sp->socket, sp->buffer, size, Pudp, sock_opt); /* * If we got an error in the read, or if we didn't read anything @@ -446,6 +455,7 @@ iperf_udp_accept(struct iperf_test *test) /* * Create a new "listening" socket to replace the one we were using before. */ + FD_CLR(test->prot_listener, &test->read_set); // No control messages from old listener test->prot_listener = netannounce(test->settings->domain, Pudp, test->bind_address, test->bind_dev, test->server_port); if (test->prot_listener < 0) { i_errno = IESTREAMLISTEN; diff --git a/src/net.c b/src/net.c index 632ae0319..43333dde0 100644 --- a/src/net.c +++ b/src/net.c @@ -366,16 +366,27 @@ netannounce(int domain, int proto, const char *local, const char *bind_dev, int return s; } - /*******************************************************************/ -/* reads 'count' bytes from a socket */ +/* Nread - reads 'count' bytes from a socket */ /********************************************************************/ int Nread(int fd, char *buf, size_t count, int prot) +{ + return Nrecv(fd, buf, count, prot, 0); +} + +/*******************************************************************/ +/* Nrecv - reads 'count' bytes from a socket */ +/********************************************************************/ + +int +Nrecv(int fd, char *buf, size_t count, int prot, int sock_opt) { register ssize_t r; - register size_t nleft = count; + // `nleft` must be signed as it may get negative value for SKIP-RX-COPY UDP (MSG_TRUNC in sock_opt). + register ssize_t nleft = count; + register size_t total = 0; struct iperf_time ftimeout = { 0, 0 }; fd_set rfdset; @@ -404,7 +415,11 @@ Nread(int fd, char *buf, size_t count, int prot) } while (nleft > 0) { - r = read(fd, buf, nleft); + if (sock_opt) + r = recv(fd, buf, nleft, sock_opt); + else + r = read(fd, buf, nleft); + if (r < 0) { /* XXX EWOULDBLOCK can't happen without non-blocking sockets */ if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) @@ -414,7 +429,8 @@ Nread(int fd, char *buf, size_t count, int prot) } else if (r == 0) break; - nleft -= r; + total += r; + nleft -= r; buf += r; /* @@ -450,7 +466,7 @@ Nread(int fd, char *buf, size_t count, int prot) } } } - return count - nleft; + return total; } diff --git a/src/net.h b/src/net.h index f0e1b4f98..bba87de46 100644 --- a/src/net.h +++ b/src/net.h @@ -32,6 +32,7 @@ int create_socket(int domain, int proto, const char *local, const char *bind_dev int netdial(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, int timeout); int netannounce(int domain, int proto, const char *local, const char *bind_dev, int port); int Nread(int fd, char *buf, size_t count, int prot); +int Nrecv(int fd, char *buf, size_t count, int prot, int sock_opt); int Nwrite(int fd, const char *buf, size_t count, int prot) /* __attribute__((hot)) */; int has_sendfile(void); int Nsendfile(int fromfd, int tofd, const char *buf, size_t count) /* __attribute__((hot)) */; From 33838da76c71d2b458529b532b184bb9fe50931e Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Thu, 27 Jun 2024 14:06:25 -0700 Subject: [PATCH 112/286] Use user-provided timestasmp format string specifier for errors. This change provides consistent behavior relative to more routine (non-error) timestamped output. --- src/iperf_error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iperf_error.c b/src/iperf_error.c index f4172d0d1..ce925a81f 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -99,7 +99,7 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) if (test != NULL && test->timestamps) { time(&now); ltm = localtime(&now); - strftime(iperf_timestrerr, sizeof(iperf_timestrerr), "%Y-%m-%d %H:%M:%S", ltm); + strftime(iperf_timestrerr, sizeof(iperf_timestrerr), iperf_get_test_timestamp_format(test), ltm); ct = iperf_timestrerr; } From c0983a3a423cd6e87bdbaae4a926b41a9e0e770d Mon Sep 17 00:00:00 2001 From: Marcos Schwarz Date: Wed, 10 Jul 2024 14:19:48 -0400 Subject: [PATCH 113/286] Changed fqrate from uint to uint64 to allow pacing above 30G --- src/iperf_tcp.c | 8 ++++---- src/iperf_udp.c | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index e025515ab..058914eeb 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -131,10 +131,10 @@ iperf_tcp_accept(struct iperf_test * test) if (test->settings->fqrate) { /* Convert bits per second to bytes per second */ - unsigned int fqrate = test->settings->fqrate / 8; + uint64_t fqrate = test->settings->fqrate / 8; if (fqrate > 0) { if (test->debug) { - printf("Setting fair-queue socket pacing to %u\n", fqrate); + printf("Setting fair-queue socket pacing to %"PRIu64"\n", fqrate); } if (setsockopt(s, SOL_SOCKET, SO_MAX_PACING_RATE, &fqrate, sizeof(fqrate)) < 0) { warning("Unable to set socket pacing"); @@ -541,10 +541,10 @@ iperf_tcp_connect(struct iperf_test *test) /* If socket pacing is specified try to enable it. */ if (test->settings->fqrate) { /* Convert bits per second to bytes per second */ - unsigned int fqrate = test->settings->fqrate / 8; + uint64_t fqrate = test->settings->fqrate / 8; if (fqrate > 0) { if (test->debug) { - printf("Setting fair-queue socket pacing to %u\n", fqrate); + printf("Setting fair-queue socket pacing to %"PRIu64"\n", fqrate); } if (setsockopt(s, SOL_SOCKET, SO_MAX_PACING_RATE, &fqrate, sizeof(fqrate)) < 0) { warning("Unable to set socket pacing"); diff --git a/src/iperf_udp.c b/src/iperf_udp.c index a603236df..375d38f6e 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -423,10 +423,10 @@ iperf_udp_accept(struct iperf_test *test) /* If socket pacing is specified, try it. */ if (test->settings->fqrate) { /* Convert bits per second to bytes per second */ - unsigned int fqrate = test->settings->fqrate / 8; + uint64_t fqrate = test->settings->fqrate / 8; if (fqrate > 0) { if (test->debug) { - printf("Setting fair-queue socket pacing to %u\n", fqrate); + printf("Setting fair-queue socket pacing to %"PRIu64"\n", fqrate); } if (setsockopt(s, SOL_SOCKET, SO_MAX_PACING_RATE, &fqrate, sizeof(fqrate)) < 0) { warning("Unable to set socket pacing"); @@ -539,10 +539,10 @@ iperf_udp_connect(struct iperf_test *test) /* If socket pacing is available and not disabled, try it. */ if (test->settings->fqrate) { /* Convert bits per second to bytes per second */ - unsigned int fqrate = test->settings->fqrate / 8; + uint64_t fqrate = test->settings->fqrate / 8; if (fqrate > 0) { if (test->debug) { - printf("Setting fair-queue socket pacing to %u\n", fqrate); + printf("Setting fair-queue socket pacing to %"PRIu64"\n", fqrate); } if (setsockopt(s, SOL_SOCKET, SO_MAX_PACING_RATE, &fqrate, sizeof(fqrate)) < 0) { warning("Unable to set socket pacing"); From c3b19d8a06e954f9419f459aa45201767eca2062 Mon Sep 17 00:00:00 2001 From: Sarah Larsen Date: Thu, 27 Jun 2024 21:46:37 +0000 Subject: [PATCH 114/286] Fix indentation and add braces in iperf_server_api for clarity --- src/iperf_server_api.c | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 7d512081c..42ae5abb3 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -175,25 +175,26 @@ iperf_accept(struct iperf_test *test) i_errno = IERECVCOOKIE; goto error_handling; } - FD_SET(test->ctrl_sck, &test->read_set); - if (test->ctrl_sck > test->max_fd) test->max_fd = test->ctrl_sck; + FD_SET(test->ctrl_sck, &test->read_set); + if (test->ctrl_sck > test->max_fd) test->max_fd = test->ctrl_sck; - if (iperf_set_send_state(test, PARAM_EXCHANGE) != 0) - goto error_handling; - if (iperf_exchange_parameters(test) < 0) - goto error_handling; - if (test->server_affinity != -1) - if (iperf_setaffinity(test, test->server_affinity) != 0) + if (iperf_set_send_state(test, PARAM_EXCHANGE) != 0) + goto error_handling; + if (iperf_exchange_parameters(test) < 0) goto error_handling; + if (test->server_affinity != -1) { + if (iperf_setaffinity(test, test->server_affinity) != 0) + goto error_handling; + } if (test->on_connect) test->on_connect(test); } else { - /* - * Don't try to read from the socket. It could block an ongoing test. - * Just send ACCESS_DENIED. + /* + * Don't try to read from the socket. It could block an ongoing test. + * Just send ACCESS_DENIED. * Also, if sending failed, don't return an error, as the request is not related * to the ongoing test, and returning an error will terminate the test. - */ + */ if (Nwrite(s, (char*) &rbuf, sizeof(rbuf), Ptcp) < 0) { if (test->debug) printf("failed to send ACCESS_DENIED to an unsolicited connection request during active test\n"); @@ -220,7 +221,7 @@ iperf_handle_message_server(struct iperf_test *test) // XXX: Need to rethink how this behaves to fit API if ((rval = Nread(test->ctrl_sck, (char*) &test->state, sizeof(signed char), Ptcp)) <= 0) { if (rval == 0) { - iperf_err(test, "the client has unexpectedly closed the connection"); + iperf_err(test, "the client has unexpectedly closed the connection"); i_errno = IECTRLCLOSE; test->state = IPERF_DONE; return 0; @@ -234,7 +235,7 @@ iperf_handle_message_server(struct iperf_test *test) case TEST_START: break; case TEST_END: - test->done = 1; + test->done = 1; cpu_util(test->cpu_util); test->stats_callback(test); SLIST_FOREACH(sp, &test->streams, streams) { @@ -243,11 +244,11 @@ iperf_handle_message_server(struct iperf_test *test) close(sp->socket); } test->reporter_callback(test); - if (iperf_set_send_state(test, EXCHANGE_RESULTS) != 0) + if (iperf_set_send_state(test, EXCHANGE_RESULTS) != 0) return -1; if (iperf_exchange_results(test) < 0) return -1; - if (iperf_set_send_state(test, DISPLAY_RESULTS) != 0) + if (iperf_set_send_state(test, DISPLAY_RESULTS) != 0) return -1; if (test->on_test_finish) test->on_test_finish(test); @@ -513,21 +514,24 @@ iperf_run_server(struct iperf_test *test) int64_t timeout_us; int64_t rcv_timeout_us; - if (test->logfile) + if (test->logfile) { if (iperf_open_logfile(test) < 0) return -2; + } - if (test->affinity != -1) + if (test->affinity != -1) { if (iperf_setaffinity(test, test->affinity) != 0) { cleanup_server(test); return -2; } + } - if (test->json_output) + if (test->json_output) { if (iperf_json_start(test) < 0) { cleanup_server(test); return -2; } + } if (test->json_output) { cJSON_AddItemToObject(test->json_start, "version", cJSON_CreateString(version)); From 3f7dbaeb9b4824dc15cafd5b791bfdcc7f5094df Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sat, 27 Jul 2024 12:11:10 +0300 Subject: [PATCH 115/286] Changes per review comments with some enhancements --- src/iperf_api.c | 10 +++++++--- src/iperf_client_api.c | 9 +++++++++ src/iperf_server_api.c | 14 +++++++++++--- src/iperf_tcp.c | 3 ++- src/iperf_util.c | 27 +++++++++++++++++++++++++++ src/iperf_util.h | 2 ++ 6 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 4c73e8328..0ff71675d 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -481,6 +481,10 @@ iperf_set_test_stats_interval(struct iperf_test *ipt, double stats_interval) void iperf_set_test_state(struct iperf_test *ipt, signed char state) { + if (ipt->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(ipt, "State change: State set to %d-%s (from %d-%s)\n", + state, state_to_text(state), ipt->state, state_to_text(ipt->state)); + } ipt->state = state; } @@ -1862,7 +1866,7 @@ int iperf_set_send_state(struct iperf_test *test, signed char state) { if (test->ctrl_sck >= 0) { - test->state = state; + iperf_set_test_state(test, state); if (Nwrite(test->ctrl_sck, (char*) &state, sizeof(state), Ptcp) < 0) { i_errno = IESENDMESSAGE; return -1; @@ -4746,14 +4750,14 @@ iperf_got_sigend(struct iperf_test *test) test->done = 1; cpu_util(test->cpu_util); test->stats_callback(test); - test->state = DISPLAY_RESULTS; /* change local state only */ + iperf_set_test_state(test, DISPLAY_RESULTS); /* change local state only */ if (test->on_test_finish) test->on_test_finish(test); test->reporter_callback(test); } if (test->ctrl_sck >= 0) { - test->state = (test->role == 'c') ? CLIENT_TERMINATE : SERVER_TERMINATE; + iperf_set_test_state(test, (test->role == 'c') ? CLIENT_TERMINATE : SERVER_TERMINATE); (void) Nwrite(test->ctrl_sck, (char*) &test->state, sizeof(signed char), Ptcp); } i_errno = (test->role == 'c') ? IECLIENTTERM : IESERVERTERM; diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 7ad4c939b..7c22caded 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -288,6 +288,11 @@ iperf_handle_message_client(struct iperf_test *test) i_errno = IEINITTEST; return -1; } + + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Reading new State from the Server - current state is %d-%s\n", test->state, state_to_text(test->state)); + } + /*!!! Why is this read() and not Nread()? */ if ((rval = read(test->ctrl_sck, (char*) &test->state, sizeof(signed char))) <= 0) { if (rval == 0) { @@ -299,6 +304,10 @@ iperf_handle_message_client(struct iperf_test *test) } } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "State change: client received and changed State to %d-%s\n", test->state, state_to_text(test->state)); + } + switch (test->state) { case PARAM_EXCHANGE: if (iperf_exchange_parameters(test) < 0) diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 42ae5abb3..b87734fec 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -218,12 +218,16 @@ iperf_handle_message_server(struct iperf_test *test) int rval; struct iperf_stream *sp; + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Reading new State from the Client - current state is %d-%s\n", test->state, state_to_text(test->state)); + } + // XXX: Need to rethink how this behaves to fit API if ((rval = Nread(test->ctrl_sck, (char*) &test->state, sizeof(signed char), Ptcp)) <= 0) { if (rval == 0) { iperf_err(test, "the client has unexpectedly closed the connection"); i_errno = IECTRLCLOSE; - test->state = IPERF_DONE; + iperf_set_test_state(test, IPERF_DONE); return 0; } else { i_errno = IERECVMESSAGE; @@ -231,6 +235,10 @@ iperf_handle_message_server(struct iperf_test *test) } } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "State change: server received and changed State to %d-%s\n", test->state, state_to_text(test->state)); + } + switch(test->state) { case TEST_START: break; @@ -273,7 +281,7 @@ iperf_handle_message_server(struct iperf_test *test) FD_CLR(sp->socket, &test->write_set); close(sp->socket); } - test->state = IPERF_DONE; + iperf_set_test_state(test, IPERF_DONE); break; default: i_errno = IEMESSAGE; @@ -552,7 +560,7 @@ iperf_run_server(struct iperf_test *test) iperf_time_now(&last_receive_time); // Initialize last time something was received last_receive_blocks = 0; - test->state = IPERF_START; + iperf_set_test_state(test, IPERF_START); send_streams_accepted = 0; rec_streams_accepted = 0; rcv_timeout_us = (test->settings->rcv_timeout.secs * SEC_TO_US) + test->settings->rcv_timeout.usecs; diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index e025515ab..4b0e1a043 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -41,6 +41,7 @@ #include "iperf.h" #include "iperf_api.h" #include "iperf_tcp.h" +#include "iperf_util.h" #include "net.h" #include "cjson.h" @@ -69,7 +70,7 @@ iperf_tcp_recv(struct iperf_stream *sp) } else { if (sp->test->debug) - printf("Late receive, state = %d\n", sp->test->state); + printf("Late receive, state = %d-%s\n", sp->test->state, state_to_text(sp->test->state)); } return r; diff --git a/src/iperf_util.c b/src/iperf_util.c index 81e8da108..17c246666 100644 --- a/src/iperf_util.c +++ b/src/iperf_util.c @@ -595,3 +595,30 @@ getline(char **buf, size_t *bufsiz, FILE *fp) } #endif + +/* Translate numeric State to text - for debugging pupposes */ +char * +state_to_text(signed char state) +{ + char *txt; + + switch (state) { + case 0: txt = "Test reset"; break; + case TEST_START: txt = "TEST_START - starting a new test"; break; + case TEST_RUNNING: txt = "TEST_RUNNING"; break; + case TEST_END: txt = "TEST_END"; break; + case PARAM_EXCHANGE: txt = "PARAM_EXCHANGE - Client to Server Parameters Exchange"; break; + case CREATE_STREAMS: txt = "CREATE_STREAMS"; break; + case SERVER_TERMINATE: txt = "SERVER_TERMINATE"; break; + case CLIENT_TERMINATE: txt = "CLIENT_TERMINATE"; break; + case EXCHANGE_RESULTS: txt = "EXCHANGE_RESULTS"; break; + case DISPLAY_RESULTS: txt = "DISPLAY_RESULTS"; break; + case IPERF_START: txt = "IPERF_START - waiting for a new test"; break; + case IPERF_DONE: txt = "IPERF_DONE"; break; + case ACCESS_DENIED: txt = "ACCESS_DENIED - Server is busy"; break; + case SERVER_ERROR: txt = "SERVER_ERROR"; break; + default: txt = "Unknown State"; + } + + return txt; +} \ No newline at end of file diff --git a/src/iperf_util.h b/src/iperf_util.h index b109af2c6..a371cfcaa 100644 --- a/src/iperf_util.h +++ b/src/iperf_util.h @@ -64,4 +64,6 @@ extern int daemon(int nochdir, int noclose); ssize_t getline(char **buf, size_t *bufsiz, FILE *fp); #endif /* HAVE_GETLINE */ +char * state_to_text(signed char state); + #endif From 92c91554100177d48b219f2d8f599eb94b30bdd2 Mon Sep 17 00:00:00 2001 From: David Bar-On <61089727+davidBar-On@users.noreply.github.com> Date: Fri, 2 Aug 2024 23:45:10 +0300 Subject: [PATCH 116/286] Add SCTP information to --json output (#1731) * Add SCTP information to --json output * Fix compile error when SCTP is not supported --- src/iperf.h | 11 +++++++++++ src/iperf_api.c | 40 ++++++++++++++++++++++++++++++++++++-- src/iperf_sctp.c | 50 ++++++++++++++++++++++++++++++++++++++++++++---- src/iperf_sctp.h | 6 ++++++ 4 files changed, 101 insertions(+), 6 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index 527e549ed..f297587d1 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -83,6 +83,14 @@ typedef atomic_uint_fast64_t atomic_iperf_size_t; typedef unsigned int uint #endif // __vxworks or __VXWORKS__ +struct iperf_sctp_info +{ + long rtt; + long pmtu; + uint32_t wnd; + uint32_t cwnd; +}; + struct iperf_interval_results { atomic_iperf_size_t bytes_transferred; /* bytes transferred in this interval */ @@ -107,6 +115,9 @@ struct iperf_interval_results /* Just placeholders, never accessed. */ char *tcpInfo; #endif +#if defined(HAVE_SCTP_H) + struct iperf_sctp_info sctp_info; +#endif /* HAVE_SCTP_H */ long interval_retrans; long snd_cwnd; long snd_wnd; diff --git a/src/iperf_api.c b/src/iperf_api.c index 0ff71675d..daa157cac 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -3362,8 +3362,14 @@ iperf_stats_callback(struct iperf_test *test) struct iperf_interval_results *irp, temp; struct iperf_time temp_time; iperf_size_t total_interval_bytes_transferred = 0; +#if defined(HAVE_SCTP_H) + struct iperf_sctp_info sctp_info; +#endif /* HAVE_SCTP_H */ temp.omitted = test->omitting; + temp.rtt = 0; + temp.rttvar = 0; + temp.pmtu = 0; SLIST_FOREACH(sp, &test->streams, streams) { rp = sp->result; temp.bytes_transferred = sp->sender ? rp->bytes_sent_this_interval : rp->bytes_received_this_interval; @@ -3431,6 +3437,36 @@ iperf_stats_callback(struct iperf_test *test) temp.outoforder_packets = sp->outoforder_packets; temp.cnt_error = sp->cnt_error; } + +#if defined(HAVE_SCTP_H) + if (test->protocol->id == Psctp) { + if (iperf_sctp_get_info(sp, &sctp_info) >= 0) {; + temp.pmtu = sctp_info.pmtu; + temp.rtt = sctp_info.rtt; + temp.snd_cwnd = sctp_info.cwnd; + temp.snd_wnd = sctp_info.wnd; + if (temp.snd_cwnd > rp->stream_max_snd_cwnd) { + rp->stream_max_snd_cwnd = temp.snd_cwnd; + } + if (temp.snd_wnd > rp->stream_max_snd_wnd) { + rp->stream_max_snd_wnd = temp.snd_wnd; + } + if (temp.rtt >= 0) { + temp.rtt = sctp_info.rtt; + if (temp.rtt > rp->stream_max_rtt) { + rp->stream_max_rtt = temp.rtt; + } + if (rp->stream_min_rtt == 0 || + temp.rtt < rp->stream_min_rtt) { + rp->stream_min_rtt = temp.rtt; + } + rp->stream_sum_rtt += temp.rtt; + rp->stream_count_rtt++; + } + } + } +#endif /* HAVE_SCTP_H */ + add_to_interval_list(rp, &temp); rp->bytes_sent_this_interval = rp->bytes_received_this_interval = 0; } @@ -3871,7 +3907,7 @@ iperf_print_results(struct iperf_test *test) } unit_snprintf(nbuf, UNIT_LEN, bandwidth, test->settings->unit_format); if (test->protocol->id == Ptcp || test->protocol->id == Psctp) { - if (test->sender_has_retransmits) { + if (test->sender_has_retransmits || test->protocol->id == Psctp) { /* Sender summary, TCP and SCTP with retransmits. */ if (test->json_output) cJSON_AddItemToObject(json_summary_stream, report_sender, iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d max_snd_cwnd: %d max_snd_wnd: %d max_rtt: %d min_rtt: %d mean_rtt: %d sender: %b", (int64_t) sp->socket, (double) start_time, (double) sender_time, (double) sender_time, (int64_t) bytes_sent, bandwidth * 8, (int64_t) sp->result->stream_retrans, (int64_t) sp->result->stream_max_snd_cwnd, (int64_t) sp->result->stream_max_snd_wnd, (int64_t) sp->result->stream_max_rtt, (int64_t) sp->result->stream_min_rtt, (int64_t) ((sp->result->stream_count_rtt == 0) ? 0 : sp->result->stream_sum_rtt / sp->result->stream_count_rtt), stream_must_be_sender)); @@ -4322,7 +4358,7 @@ print_interval_results(struct iperf_test *test, struct iperf_stream *sp, cJSON * et = iperf_time_in_secs(&temp_time); if (test->protocol->id == Ptcp || test->protocol->id == Psctp) { - if (test->sender_has_retransmits == 1 && sp->sender) { + if ((test->sender_has_retransmits == 1 || test->protocol->id == Psctp) && sp->sender) { /* Interval, TCP with retransmits. */ if (test->json_output) cJSON_AddItemToArray(json_interval_streams, iperf_json_printf("socket: %d start: %f end: %f seconds: %f bytes: %d bits_per_second: %f retransmits: %d snd_cwnd: %d snd_wnd: %d rtt: %d rttvar: %d pmtu: %d omitted: %b sender: %b", (int64_t) sp->socket, (double) st, (double) et, (double) irp->interval_duration, (int64_t) irp->bytes_transferred, bandwidth * 8, (int64_t) irp->interval_retrans, (int64_t) irp->snd_cwnd, (int64_t) irp->snd_wnd, (int64_t) irp->rtt, (int64_t) irp->rttvar, (int64_t) irp->pmtu, irp->omitted, sp->sender)); diff --git a/src/iperf_sctp.c b/src/iperf_sctp.c index 104083281..9a61bba44 100644 --- a/src/iperf_sctp.c +++ b/src/iperf_sctp.c @@ -39,10 +39,6 @@ #include #include -#ifdef HAVE_NETINET_SCTP_H -#include -#endif /* HAVE_NETINET_SCTP_H */ - #include "iperf.h" #include "iperf_api.h" #include "iperf_sctp.h" @@ -734,3 +730,49 @@ iperf_sctp_bindx(struct iperf_test *test, int s, int is_server) return -1; #endif /* HAVE_SCTP_H */ } + + +/* iperf_sctp_get_rtt + * + * Get SCTP stream RTT. + * Assuming that iperf3 supports only one-toone SCTP associassion, and not one-to-many associassion. + * + * Main resouses used are RFC-6458, man pages for SCTP, + * https://docs.oracle.com/cd/E19253-01/817-4415/sockets-199/index.html. + * + */ +int +iperf_sctp_get_info(struct iperf_stream *sp, struct iperf_sctp_info *sctp_info) +{ +#if defined(HAVE_SCTP_H) + struct sctp_status status; + socklen_t len; + sctp_assoc_t assoc_id; + int rc = 0; + + if (sp->test->protocol->id != Psctp) { + rc = -1; + } else { +#ifdef SCTP_FUTURE_ASSOC + assoc_id = SCTP_FUTURE_ASSOC; +#else + assoc_id = 0; +#endif + len = sizeof(status); + rc = sctp_opt_info(sp->socket, assoc_id, SCTP_STATUS, &status, &len); + if (rc < 0) { + if (sp->test->debug_level >= DEBUG_LEVEL_ERROR) + iperf_err(sp->test, "sctp_opt_info get SCTP_STATUS for socket %d failed with errno %d - %s", sp->socket, errno, strerror(errno)); + } else { + sctp_info->wnd = status.sstat_rwnd; + sctp_info->rtt = status.sstat_primary.spinfo_srtt; + sctp_info->pmtu = status.sstat_primary.spinfo_mtu; + sctp_info->cwnd = status.sstat_primary.spinfo_cwnd; + } + } + + return rc; +#else + return -1; +#endif /* HAVE_SCTP_H */ +} diff --git a/src/iperf_sctp.h b/src/iperf_sctp.h index 764c410df..cbe24c934 100644 --- a/src/iperf_sctp.h +++ b/src/iperf_sctp.h @@ -27,6 +27,10 @@ #ifndef IPERF_SCTP_H #define IPERF_SCTP_H +#ifdef HAVE_NETINET_SCTP_H +#include +#endif /* HAVE_NETINET_SCTP_H */ + /** * iperf_sctp_accept -- accepts a new SCTP connection * on sctp_listener_socket for SCTP data and param/result @@ -65,4 +69,6 @@ int iperf_sctp_init(struct iperf_test *test); int iperf_sctp_bindx(struct iperf_test *test, int s, int is_server); +int iperf_sctp_get_info(struct iperf_stream *sp, struct iperf_sctp_info *sctp_info); + #endif From e9e49c49acbd7789d2e44f82401663b58720bb66 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sat, 10 Aug 2024 09:33:50 +0300 Subject: [PATCH 117/286] Performance enhancement for iperf_time_add() --- src/iperf_time.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/iperf_time.c b/src/iperf_time.c index a435dd30d..5c9b0fb7f 100644 --- a/src/iperf_time.c +++ b/src/iperf_time.c @@ -72,12 +72,11 @@ iperf_time_now(struct iperf_time *time1) void iperf_time_add_usecs(struct iperf_time *time1, uint64_t usecs) { - time1->secs += usecs / 1000000L; - time1->usecs += usecs % 1000000L; - if ( time1->usecs >= 1000000L ) { - time1->secs += time1->usecs / 1000000L; - time1->usecs %= 1000000L; - } + uint64_t total_usecs; + + total_usecs = time1->usecs + usecs; + time1->secs += total_usecs / 1000000L; + time1->usecs = total_usecs % 1000000L; } uint64_t From 783095e138b7257dfcbf4e9aa2a48685d14c7f16 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sun, 11 Aug 2024 16:14:42 +0300 Subject: [PATCH 118/286] Fix #1741 - reduce CPU usage when test baud rate is limited --- configure.ac | 9 ++++++ src/iperf_api.c | 75 ++++++++++++++++++++++++++++++++++++++++++++-- src/iperf_locale.c | 2 ++ 3 files changed, 83 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index a23c3bcf4..073d07dcc 100644 --- a/configure.ac +++ b/configure.ac @@ -342,5 +342,14 @@ AC_SEARCH_LIBS(clock_gettime, [rt posix4]) # Check for clock_gettime support AC_CHECK_FUNCS([clock_gettime]) +# Check if we need -lrt for nanosleep +AC_SEARCH_LIBS(nanosleep, [rt posix4]) +# Check for nanosleep support +AC_CHECK_FUNCS([nanosleep]) +# Check if we need -lrt for clock_nanosleep +AC_SEARCH_LIBS(clock_nanosleep, [rt posix4]) +# Check for clock_nanosleep support +AC_CHECK_FUNCS([clock_nanosleep]) + AC_CONFIG_FILES([Makefile src/Makefile src/version.h examples/Makefile iperf3.spec]) AC_OUTPUT diff --git a/src/iperf_api.c b/src/iperf_api.c index daa157cac..c2d2b7bf6 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1639,10 +1639,12 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) test->use_pkcs1_padding = 1; break; #endif /* HAVE_SSL */ +#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) case OPT_PACING_TIMER: test->settings->pacing_timer = unit_atoi(optarg); client_flag = 1; break; +#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP */ case OPT_CONNECT_TIMEOUT: test->settings->connect_timeout = unit_atoi(optarg); client_flag = 1; @@ -1881,17 +1883,73 @@ iperf_check_throttle(struct iperf_stream *sp, struct iperf_time *nowP) struct iperf_time temp_time; double seconds; uint64_t bits_per_second; + int64_t missing_rate; + uint64_t bits_sent; + +#if defined(HAVE_CLOCK_NANOSLEEP) || defined(HAVE_NANOSLEEP) + struct timespec nanosleep_time; + int64_t time_to_green_ligh, delta_bits; + int ret; +#endif /* HAVE_CLOCK_NANOSLEEP || HAVE_NANOSLEEP) */ +#if defined(HAVE_CLOCK_NANOSLEEP) + int64_t ns; +#endif /* HAVE_CLOCK_NANOSLEEP */ if (sp->test->done || sp->test->settings->rate == 0) return; iperf_time_diff(&sp->result->start_time_fixed, nowP, &temp_time); seconds = iperf_time_in_secs(&temp_time); - bits_per_second = sp->result->bytes_sent * 8 / seconds; - if (bits_per_second < sp->test->settings->rate) { + bits_sent = sp->result->bytes_sent * 8; + bits_per_second = bits_sent / seconds; + missing_rate = sp->test->settings->rate - bits_per_second; + + if (missing_rate > 0) { sp->green_light = 1; } else { sp->green_light = 0; } + +#if defined(HAVE_CLOCK_NANOSLEEP) || defined(HAVE_NANOSLEEP) + // If estimated time to next send is large enough, sleep instead of just CPU looping until green light is set + if (missing_rate < 0) { + delta_bits = bits_sent - (seconds * sp->test->settings->rate); + // Calclate time until next data send is required + time_to_green_ligh = (SEC_TO_NS * delta_bits / sp->test->settings->rate); + // Whether shouuld wait before next send + if (time_to_green_ligh >= 0) { +#if defined(HAVE_CLOCK_NANOSLEEP) + if (clock_gettime(CLOCK_MONOTONIC, &nanosleep_time) == 0) { + // Calculate absolute end of sleep time + ns = nanosleep_time.tv_nsec + time_to_green_ligh; + if (ns < SEC_TO_NS) { + nanosleep_time.tv_nsec = ns; + } else { + nanosleep_time.tv_sec += ns / SEC_TO_NS; + nanosleep_time.tv_nsec = ns % SEC_TO_NS; + } + // Sleep until average baud rate reaches the target value + while((ret = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &nanosleep_time, NULL)) == EINTR); + if (ret == 0) { + sp->green_light = 1; + } + } + +#else /* HAVE_NANOSLEEP */ + nanosleep_time.tv_sec = 0; + // Sleep until average baud rate reaches the target value or intrupt / error + do { + // nansleep() time should be less than 1 sec + nanosleep_time.tv_nsec = (time_to_green_ligh >= SEC_TO_NS) ? SEC_TO_NS - 1 : time_to_green_ligh; + time_to_green_ligh -= nanosleep_time.tv_nsec; + ret = nanosleep(&nanosleep_time, NULL); + } while (ret == 0 && time_to_green_ligh > 0); + if (ret == 0) { + sp->green_light = 1; + } +#endif /* HAVE_CLOCK_NANOSLEEP else HAVE_NANOSLEEP */ + } + } +#endif /* HAVE_CLOCK_NANOSLEEP || HAVE_NANOSLEEP */ } /* Verify that average traffic is not greater than the specified limit */ @@ -1982,7 +2040,11 @@ iperf_send_mt(struct iperf_stream *sp) if (!streams_active) break; } +#if defined(HAVE_CLOCK_NANOSLEEP) || defined(HAVE_NANOSLEEP) + if (!sp->green_light) { /* Should check if green ligh can be set, as pacing timer is not supported in this case */ +#else /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP */ if (!no_throttle_check) { /* Throttle check if was not checked for each send */ +#endif /* HAVE_CLOCK_NANOSLEEP, HAVE_NANOSLEEP */ iperf_time_now(&now); if (sp->sender) iperf_check_throttle(sp, &now); @@ -2032,6 +2094,7 @@ iperf_init_test(struct iperf_test *test) return 0; } +#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) static void send_timer_proc(TimerClientData client_data, struct iperf_time *nowP) { @@ -2043,20 +2106,25 @@ send_timer_proc(TimerClientData client_data, struct iperf_time *nowP) */ iperf_check_throttle(sp, nowP); } +#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP) */ int iperf_create_send_timers(struct iperf_test * test) { - struct iperf_time now; struct iperf_stream *sp; +#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) TimerClientData cd; + struct iperf_time now; if (iperf_time_now(&now) < 0) { i_errno = IEINITTEST; return -1; } +#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP) */ + SLIST_FOREACH(sp, &test->streams, streams) { sp->green_light = 1; +#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) if (test->settings->rate != 0 && sp->sender) { cd.p = sp; sp->send_timer = tmr_create(NULL, send_timer_proc, cd, test->settings->pacing_timer, 1); @@ -2065,6 +2133,7 @@ iperf_create_send_timers(struct iperf_test * test) return -1; } } +#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP) */ } return 0; } diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 9d94e0234..ae4454074 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -163,7 +163,9 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" " -b, --bitrate #[KMG][/#] target bitrate in bits/sec (0 for unlimited)\n" " (default %d Mbit/sec for UDP, unlimited for TCP)\n" " (optional slash and packet count for burst mode)\n" +#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) " --pacing-timer #[KMG] set the timing for pacing, in microseconds (default %d)\n" +#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP */ #if defined(HAVE_SO_MAX_PACING_RATE) " --fq-rate #[KMG] enable fair-queuing based socket pacing in\n" " bits/sec (Linux only)\n" From 9e4ccfbe5285ad63d30aa649a8580173c3bfed29 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Tue, 13 Aug 2024 11:49:20 +0300 Subject: [PATCH 119/286] Fix rcv-timeout issue because of Nread timeout --- src/iperf_api.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index daa157cac..0d6adef13 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2000,8 +2000,14 @@ iperf_recv_mt(struct iperf_stream *sp) i_errno = IESTREAMREAD; return r; } - test->bytes_received += r; - ++test->blocks_received; + + /* Collect statistics only if receive did not timeout (e.g. `Nread()` may timeout). + * This is also important for `--rcv-timeout` to work properly. + */ + if (r > 0) { + test->bytes_received += r; + ++test->blocks_received; + } return 0; } From 3da07ae96f5b40f76b75e1ccd4b20267f6a5988e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kul=C3=ADk?= Date: Wed, 28 Aug 2024 09:43:04 +0200 Subject: [PATCH 120/286] remove incorrect freeaddrinfo call --- src/net.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/net.c b/src/net.c index 632ae0319..c82caff1b 100644 --- a/src/net.c +++ b/src/net.c @@ -145,7 +145,6 @@ create_socket(int domain, int proto, const char *local, const char *bind_dev, in if ((gerror = getaddrinfo(server, portstr, &hints, &server_res)) != 0) { if (local) freeaddrinfo(local_res); - freeaddrinfo(server_res); return -1; } From af81adc9bf27604df33e5e39e57450f7e7c6c52b Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Thu, 29 Aug 2024 10:24:20 +0300 Subject: [PATCH 121/286] Changes per reviewer comments --- src/iperf_api.c | 16 +++++++--------- src/iperf_locale.c | 3 +++ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index c2d2b7bf6..f8acd9237 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1639,12 +1639,10 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) test->use_pkcs1_padding = 1; break; #endif /* HAVE_SSL */ -#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) case OPT_PACING_TIMER: test->settings->pacing_timer = unit_atoi(optarg); client_flag = 1; break; -#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP */ case OPT_CONNECT_TIMEOUT: test->settings->connect_timeout = unit_atoi(optarg); client_flag = 1; @@ -1888,7 +1886,7 @@ iperf_check_throttle(struct iperf_stream *sp, struct iperf_time *nowP) #if defined(HAVE_CLOCK_NANOSLEEP) || defined(HAVE_NANOSLEEP) struct timespec nanosleep_time; - int64_t time_to_green_ligh, delta_bits; + int64_t time_to_green_light, delta_bits; int ret; #endif /* HAVE_CLOCK_NANOSLEEP || HAVE_NANOSLEEP) */ #if defined(HAVE_CLOCK_NANOSLEEP) @@ -1914,13 +1912,13 @@ iperf_check_throttle(struct iperf_stream *sp, struct iperf_time *nowP) if (missing_rate < 0) { delta_bits = bits_sent - (seconds * sp->test->settings->rate); // Calclate time until next data send is required - time_to_green_ligh = (SEC_TO_NS * delta_bits / sp->test->settings->rate); + time_to_green_light = (SEC_TO_NS * delta_bits / sp->test->settings->rate); // Whether shouuld wait before next send - if (time_to_green_ligh >= 0) { + if (time_to_green_light >= 0) { #if defined(HAVE_CLOCK_NANOSLEEP) if (clock_gettime(CLOCK_MONOTONIC, &nanosleep_time) == 0) { // Calculate absolute end of sleep time - ns = nanosleep_time.tv_nsec + time_to_green_ligh; + ns = nanosleep_time.tv_nsec + time_to_green_light; if (ns < SEC_TO_NS) { nanosleep_time.tv_nsec = ns; } else { @@ -1939,10 +1937,10 @@ iperf_check_throttle(struct iperf_stream *sp, struct iperf_time *nowP) // Sleep until average baud rate reaches the target value or intrupt / error do { // nansleep() time should be less than 1 sec - nanosleep_time.tv_nsec = (time_to_green_ligh >= SEC_TO_NS) ? SEC_TO_NS - 1 : time_to_green_ligh; - time_to_green_ligh -= nanosleep_time.tv_nsec; + nanosleep_time.tv_nsec = (time_to_green_light >= SEC_TO_NS) ? SEC_TO_NS - 1 : time_to_green_light; + time_to_green_light -= nanosleep_time.tv_nsec; ret = nanosleep(&nanosleep_time, NULL); - } while (ret == 0 && time_to_green_ligh > 0); + } while (ret == 0 && time_to_green_light > 0); if (ret == 0) { sp->green_light = 1; } diff --git a/src/iperf_locale.c b/src/iperf_locale.c index ae4454074..dbbb72fec 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -165,6 +165,9 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" " (optional slash and packet count for burst mode)\n" #if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) " --pacing-timer #[KMG] set the timing for pacing, in microseconds (default %d)\n" +#else + " --pacing-timer #[KMG] set the Server timing for pacing, in microseconds (default %d)\n" + " (used by the server only if this option is in its help message)\n" #endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP */ #if defined(HAVE_SO_MAX_PACING_RATE) " --fq-rate #[KMG] enable fair-queuing based socket pacing in\n" From 9d73ceef627143806688ffbb508a2b5a9a2493eb Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Thu, 29 Aug 2024 20:09:40 +0300 Subject: [PATCH 122/286] Fix #812 and #835 - add control connection keepalive (after rebase with master 3.17.1+) --- configure.ac | 12 ++++ src/iperf.h | 4 ++ src/iperf_api.c | 122 +++++++++++++++++++++++++++++++++++++++++ src/iperf_api.h | 14 +++++ src/iperf_client_api.c | 10 +++- src/iperf_error.c | 28 ++++++++-- src/iperf_locale.c | 4 ++ src/iperf_server_api.c | 6 ++ 8 files changed, 193 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index a23c3bcf4..e43ff6dec 100644 --- a/configure.ac +++ b/configure.ac @@ -204,6 +204,18 @@ if test "x$iperf3_cv_header_tcp_user_timeout" = "xyes"; then AC_DEFINE([HAVE_TCP_USER_TIMEOUT], [1], [Have TCP_USER_TIMEOUT sockopt.]) fi +# Check for TCP_KEEPIDLE sockopt (not clear where supported) +AC_CACHE_CHECK([TCP_KEEPIDLE socket option], +[iperf3_cv_header_tcp_keepalive], +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include ]], + [[int foo = TCP_KEEPIDLE;]])], + iperf3_cv_header_tcp_keepalive=yes, + iperf3_cv_header_tcp_keepalive=no)) +if test "x$iperf3_cv_header_tcp_keepalive" = "xyes"; then + AC_DEFINE([HAVE_TCP_KEEPALIVE], [1], [Have TCP_KEEPIDLE sockopt.]) +fi + # Check for IPv6 flowlabel support (believed to be Linux only) # We check for IPV6_FLOWLABEL_MGR in even though we # don't use that file directly (we have our own stripped-down diff --git a/src/iperf.h b/src/iperf.h index f297587d1..e30aa5221 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -184,6 +184,10 @@ struct iperf_settings int idle_timeout; /* server idle time timeout */ unsigned int snd_timeout; /* Timeout for sending tcp messages in active mode, in us */ struct iperf_time rcv_timeout; /* Timeout for receiving messages in active mode, in us */ + int cntl_ka; /* Use Control TCP connection Keepalive */ + int cntl_ka_keepidle; /* Control TCP connection Keepalive idle time (TCP_KEEPIDLE) */ + int cntl_ka_interval; /* Control TCP connection Keepalive interval between retries (TCP_KEEPINTV) */ + int cntl_ka_count; /* Control TCP connection Keepalive number of retries (TCP_KEEPCNT) */ }; struct iperf_test; diff --git a/src/iperf_api.c b/src/iperf_api.c index dafbadf65..5505ff227 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1149,6 +1149,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) {"idle-timeout", required_argument, NULL, OPT_IDLE_TIMEOUT}, {"rcv-timeout", required_argument, NULL, OPT_RCV_TIMEOUT}, {"snd-timeout", required_argument, NULL, OPT_SND_TIMEOUT}, +#if defined(HAVE_TCP_KEEPALIVE) + {"cntl-ka", optional_argument, NULL, OPT_CNTL_KA}, +#endif /* HAVE_TCP_KEEPALIVE */ {"debug", optional_argument, NULL, 'd'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} @@ -1162,6 +1165,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) char* comma; #endif /* HAVE_CPU_AFFINITY */ char* slash; +#if defined(HAVE_TCP_KEEPALIVE) + char* slash2; +#endif /* HAVE_TCP_KEEPALIVE */ char *p, *p1; struct xbind_entry *xbe; double farg; @@ -1530,6 +1536,39 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) snd_timeout_flag = 1; break; #endif /* HAVE_TCP_USER_TIMEOUT */ +#if defined (HAVE_TCP_KEEPALIVE) + case OPT_CNTL_KA: + test->settings->cntl_ka = 1; + if (optarg) { + slash = strchr(optarg, '/'); + if (slash) { + *slash = '\0'; + ++slash; + slash2 = strchr(slash, '/'); + if (slash2) { + *slash2 = '\0'; + ++slash2; + if (strlen(slash2) > 0) { + test->settings->cntl_ka_count = atoi(slash2); + } + } + if (strlen(slash) > 0) { + test->settings->cntl_ka_interval = atoi(slash); + } + } + if (strlen(optarg) > 0) { + test->settings->cntl_ka_keepidle = atoi(optarg); + } + } + // Seems that at least in Windows WSL2, TCP keepalive retries full inteval must be + // smaller than the idle interval. Otherwise, the keepalive message is sent only once. + if (test->settings->cntl_ka_keepidle && + test->settings->cntl_ka_keepidle <= (test->settings->cntl_ka_count * test->settings->cntl_ka_interval)) { + i_errno = IECNTLKA; + return -1; + } + break; +#endif /* HAVE_TCP_KEEPALIVE */ case 'A': #if defined(HAVE_CPU_AFFINITY) test->affinity = strtol(optarg, &endptr, 0); @@ -2975,6 +3014,10 @@ iperf_defaults(struct iperf_test *testp) testp->settings->rcv_timeout.secs = DEFAULT_NO_MSG_RCVD_TIMEOUT / SEC_TO_mS; testp->settings->rcv_timeout.usecs = (DEFAULT_NO_MSG_RCVD_TIMEOUT % SEC_TO_mS) * mS_TO_US; testp->zerocopy = 0; + testp->settings->cntl_ka = 0; + testp->settings->cntl_ka_keepidle = 0; + testp->settings->cntl_ka_interval = 0; + testp->settings->cntl_ka_count = 0; memset(testp->cookie, 0, COOKIE_SIZE); @@ -5172,3 +5215,82 @@ iflush(struct iperf_test *test) return rc2; } + +#if defined (HAVE_TCP_KEEPALIVE) +// Set Control Connection TCP Keepalive (especially useful for long UDP test sessions) +int +iperf_set_control_keepalive(struct iperf_test *test) +{ + int opt, kaidle, kainterval, kacount; + socklen_t len; + + if (test->settings->cntl_ka) { + // Set keepalive using system defaults + opt = 1; + if (setsockopt(test->ctrl_sck, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt))) { + i_errno = IESETCNTLKA; + return -1; + } + + // Get default values when not specified + if ((kaidle = test->settings->cntl_ka_keepidle) == 0) { + len = sizeof(kaidle); + if (getsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_KEEPIDLE, (char *) &kaidle, &len)) { + i_errno = IESETCNTLKAINTERVAL; + return -1; + } + } + if ((kainterval = test->settings->cntl_ka_interval) == 0) { + len = sizeof(kainterval); + if (getsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_KEEPINTVL, (char *) &kainterval, &len)) { + i_errno = IESETCNTLKAINTERVAL; + return -1; + } + } + if ((kacount = test->settings->cntl_ka_count) == 0) { + len = sizeof(kacount); + if (getsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_KEEPCNT, (char *) &kacount, &len)) { + i_errno = IESETCNTLKACOUNT; + return -1; + } + } + + // Seems that at least in Windows WSL2, TCP keepalive retries full inteval must be + // smaller than the idle interval. Otherwise, the keepalive message is sent only once. + if (test->settings->cntl_ka_keepidle) { + if (test->settings->cntl_ka_keepidle <= (kainterval * kacount)) { + iperf_err(test, "Keepalive Idle time (%d) should be greater than Retries-interval (%d) times Retries-count (%d)", kaidle, kainterval, kacount); + i_errno = IECNTLKA; + return -1; + } + } + + // Set keep alive values when specified + if ((opt = test->settings->cntl_ka_keepidle)) { + if (setsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_KEEPIDLE, (char *) &opt, sizeof(opt))) { + i_errno = IESETCNTLKAKEEPIDLE; + return -1; + } + } + if ((opt = test->settings->cntl_ka_interval)) { + if (setsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_KEEPINTVL, (char *) &opt, sizeof(opt))) { + i_errno = IESETCNTLKAINTERVAL; + return -1; + } + } + if ((opt = test->settings->cntl_ka_count)) { + if (setsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_KEEPCNT, (char *) &opt, sizeof(opt))) { + i_errno = IESETCNTLKACOUNT; + return -1; + } + } + + if (test->verbose) { + printf("Control connection TCP Keepalive TCP_KEEPIDLE/TCP_KEEPINTVL/TCP_KEEPCNT are set to %d/%d/%d\n", + kaidle, kainterval, kacount); + } + } + + return 0; +} +#endif //HAVE_TCP_KEEPALIVE diff --git a/src/iperf_api.h b/src/iperf_api.h index 131314243..9aa345449 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -101,6 +101,7 @@ typedef atomic_uint_fast64_t atomic_iperf_size_t; #define OPT_JSON_STREAM 28 #define OPT_SND_TIMEOUT 29 #define OPT_USE_PKCS1_PADDING 30 +#define OPT_CNTL_KA 31 /* states */ #define TEST_START 1 @@ -309,6 +310,14 @@ void iperf_free_stream(struct iperf_stream * sp); */ int iperf_common_sockopts(struct iperf_test *, int s); +#if defined (HAVE_TCP_KEEPALIVE) +/** + * iperf_set_control_keepalive -- set control connection TCP keepalive + * + */ +int iperf_set_control_keepalive(struct iperf_test *test); +#endif //HAVE_TCP_KEEPALIVE + int has_tcpinfo(void); int has_tcpinfo_retransmits(void); void save_tcpinfo(struct iperf_stream *sp, struct iperf_interval_results *irp); @@ -420,6 +429,7 @@ enum { IESNDTIMEOUT = 33, // Illegal message send timeout IEUDPFILETRANSFER = 34, // Cannot transfer file using UDP IESERVERAUTHUSERS = 35, // Cannot access authorized users file + IECNTLKA = 36, // Control connection Keepalive period should be larger than the full retry period (interval * count) /* Test errors */ IENEWTEST = 100, // Unable to create a new test (check perror) IEINITTEST = 101, // Test initialization failed (check perror) @@ -475,6 +485,10 @@ enum { IEPTHREADJOIN=152, // Unable to join thread (check perror) IEPTHREADATTRINIT=153, // Unable to initialize thread attribute (check perror) IEPTHREADATTRDESTROY=154, // Unable to destroy thread attribute (check perror) + IESETCNTLKA = 155, // Unable to set socket keepalive (SO_KEEPALIVE) option + IESETCNTLKAKEEPIDLE = 156, // Unable to set socket keepalive TCP period (TCP_KEEPIDLE) option + IESETCNTLKAINTERVAL = 157, // Unable to set/get socket keepalive TCP retry interval (TCP_KEEPINTVL) option + IESETCNTLKACOUNT = 158, // Unable to set/get socket keepalive TCP number of retries (TCP_KEEPCNT) option /* Stream errors */ IECREATESTREAM = 200, // Unable to create a new stream (check herror/perror) IEINITSTREAM = 201, // Unable to initialize stream (check herror/perror) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 7c22caded..b606c465b 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -421,11 +421,17 @@ iperf_connect(struct iperf_test *test) return -1; } +#if defined (HAVE_TCP_KEEPALIVE) + // Set Control Connection TCP Keepalive (especially useful for long UDP test sessions) + if (iperf_set_control_keepalive(test) < 0) + return -1; +#endif //HAVE_TCP_KEEPALIVE + #if defined(HAVE_TCP_USER_TIMEOUT) if ((opt = test->settings->snd_timeout)) { if (setsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_USER_TIMEOUT, &opt, sizeof(opt)) < 0) { - i_errno = IESETUSERTIMEOUT; - return -1; + i_errno = IESETUSERTIMEOUT; + return -1; } } #endif /* HAVE_TCP_USER_TIMEOUT */ diff --git a/src/iperf_error.c b/src/iperf_error.c index ce925a81f..c4cca621d 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -182,7 +182,7 @@ iperf_strerror(int int_errno) case IEINTERVAL: snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL); break; - case IEBIND: /* UNUSED */ + case IEBIND: /* UNUSED */ snprintf(errstr, len, "--bind must be specified to use --cport"); break; case IEUDPBLOCKSIZE: @@ -464,7 +464,7 @@ iperf_strerror(int int_errno) case IETOTALRATE: snprintf(errstr, len, "total required bandwidth is larger than server limit"); break; - case IESKEWTHRESHOLD: + case IESKEWTHRESHOLD: snprintf(errstr, len, "skew threshold must be a positive number"); break; case IEIDLETIMEOUT: @@ -473,16 +473,16 @@ iperf_strerror(int int_errno) case IEBINDDEV: snprintf(errstr, len, "Unable to bind-to-device (check perror, maybe permissions?)"); break; - case IEBINDDEVNOSUPPORT: + case IEBINDDEVNOSUPPORT: snprintf(errstr, len, "`%%` is not supported as system does not support bind to device"); break; - case IEHOSTDEV: + case IEHOSTDEV: snprintf(errstr, len, "host device name (ip%%) is supported (and required) only for IPv6 link-local address"); break; case IENOMSG: snprintf(errstr, len, "idle timeout for receiving data"); break; - case IESETDONTFRAGMENT: + case IESETDONTFRAGMENT: snprintf(errstr, len, "unable to set IP Do-Not-Fragment flag"); break; case IESETUSERTIMEOUT: @@ -507,6 +507,24 @@ iperf_strerror(int int_errno) break; case IEPTHREADATTRDESTROY: snprintf(errstr, len, "unable to destroy thread attributes"); + case IECNTLKA: + snprintf(errstr, len, "control connection Keepalive period should be larger than the full retry period (interval * count)"); + perr = 1; + break; + case IESETCNTLKA: + snprintf(errstr, len, "unable to set socket keepalive (SO_KEEPALIVE) option"); + perr = 1; + break; + case IESETCNTLKAKEEPIDLE: + snprintf(errstr, len, "unable to set socket keepalive TCP period (TCP_KEEPIDLE) option"); + perr = 1; + break; + case IESETCNTLKAINTERVAL: + snprintf(errstr, len, "unable to set/get socket keepalive TCP retry interval (TCP_KEEPINTVL) option"); + perr = 1; + break; + case IESETCNTLKACOUNT: + snprintf(errstr, len, "unable to set/get socket keepalive TCP number of retries (TCP_KEEPCNT) option"); perr = 1; break; default: diff --git a/src/iperf_locale.c b/src/iperf_locale.c index cfdba5826..98a61c283 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -128,6 +128,10 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" " --snd-timeout # timeout for unacknowledged TCP data\n" " (in ms, default is system settings)\n" #endif /* HAVE_TCP_USER_TIMEOUT */ +#if defined(HAVE_TCP_KEEPALIVE) + " --cntl-ka[=#/#/#] use control connection TCP keepalive - KEEPIDLE/KEEPINTV/KEEPCNT\n" + " each value is optional with system settings default\n" +#endif //HAVE_TCP_KEEPALIVE " -d, --debug[=#] emit debugging output\n" " (optional optional \"=\" and debug level: 1-4. Default is 4 - all messages)\n" " -v, --version show version information and quit\n" diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index b87734fec..5bf66c4c4 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -166,6 +166,12 @@ iperf_accept(struct iperf_test *test) } #endif /* HAVE_TCP_USER_TIMEOUT */ +#if defined (HAVE_TCP_KEEPALIVE) + // Set Control Connection TCP Keepalive (especially useful for long UDP test sessions) + if (iperf_set_control_keepalive(test) < 0) + return -1; +#endif //HAVE_TCP_KEEPALIVE + if (Nread(test->ctrl_sck, test->cookie, COOKIE_SIZE, Ptcp) != COOKIE_SIZE) { /* * Note this error covers both the case of a system error From 7679199ec99c5db194c554b7b11066d347891735 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 30 Aug 2024 10:39:47 -0700 Subject: [PATCH 123/286] Regen. --- Makefile.in | 35 ++- aclocal.m4 | 415 ++++++++++++++++++++++---------- config/compile | 11 +- config/config.guess | 11 +- config/config.sub | 29 ++- config/depcomp | 15 +- config/install-sh | 8 +- config/missing | 75 +++--- config/mkinstalldirs | 8 +- config/test-driver | 15 +- configure | 532 +++++++++++++++++++++++++++++++----------- examples/Makefile.in | 34 +-- src/Makefile.in | 125 ++++++---- src/iperf_config.h.in | 6 + 14 files changed, 925 insertions(+), 394 deletions(-) diff --git a/Makefile.in b/Makefile.in index e38f265e8..e8b89f73c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.5 from Makefile.am. +# Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2021 Free Software Foundation, Inc. +# Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -69,6 +69,8 @@ am__make_running_with_option = \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -170,8 +172,8 @@ distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ + find "$(distdir)" -type d ! -perm -700 -exec chmod u+rwx {} ';' \ + ; rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) @@ -201,14 +203,16 @@ am__relativize = \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best +GZIP_ENV = -9 DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' -distcleancheck_listfiles = find . -type f -print +distcleancheck_listfiles = \ + find . \( -type f -a \! \ + \( -name .nfs* -o -name .smb* -o -name .__afs* \) \) -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ @@ -295,8 +299,10 @@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ @@ -498,7 +504,7 @@ distdir: $(BUILT_SOURCES) distdir-am: $(DISTFILES) $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" + $(AM_V_at)$(MKDIR_P) "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -609,7 +615,7 @@ dist dist-all: distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ - eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + eval GZIP= gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ @@ -619,7 +625,7 @@ distcheck: dist *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ - eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + eval GZIP= gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ @@ -719,8 +725,8 @@ mostlyclean-generic: clean-generic: distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -820,3 +826,10 @@ uninstall-am: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/aclocal.m4 b/aclocal.m4 index bd04b2e09..37e331823 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.16.5 -*- Autoconf -*- +# generated automatically by aclocal 1.17 -*- Autoconf -*- -# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# Copyright (C) 1996-2024 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9081,7 +9081,7 @@ m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) -# Copyright (C) 2002-2021 Free Software Foundation, Inc. +# Copyright (C) 2002-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9093,10 +9093,10 @@ m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.16' +[am__api_version='1.17' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.16.5], [], +m4_if([$1], [1.17], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -9112,14 +9112,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.16.5])dnl +[AM_AUTOMAKE_VERSION([1.17])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9171,7 +9171,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2021 Free Software Foundation, Inc. +# Copyright (C) 1997-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9202,7 +9202,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# Copyright (C) 1999-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9334,7 +9334,7 @@ AC_CACHE_CHECK([dependency style of $depcc], # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: + # When given -MP, icc 7.0 and 7.1 complain thus: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported @@ -9393,7 +9393,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# Copyright (C) 1999-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9461,7 +9461,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# Copyright (C) 1996-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9595,7 +9595,7 @@ if test -z "$CSCOPE"; then fi AC_SUBST([CSCOPE]) -AC_REQUIRE([AM_SILENT_RULES])dnl +AC_REQUIRE([_AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. @@ -9603,47 +9603,9 @@ AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. +AC_REQUIRE([_AM_PROG_RM_F]) +AC_REQUIRE([_AM_PROG_XARGS_N]) -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) - fi -fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. @@ -9676,7 +9638,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9697,7 +9659,7 @@ if test x"${install_sh+set}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2021 Free Software Foundation, Inc. +# Copyright (C) 2003-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9719,7 +9681,7 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# Copyright (C) 1996-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9754,7 +9716,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9797,7 +9759,7 @@ AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2021 Free Software Foundation, Inc. +# Copyright (C) 1997-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9831,7 +9793,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9860,7 +9822,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# Copyright (C) 1999-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9907,7 +9869,23 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# Copyright (C) 2022-2024 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_RM_F +# --------------- +# Check whether 'rm -f' without any arguments works. +# https://bugs.gnu.org/10828 +AC_DEFUN([_AM_PROG_RM_F], +[am__rm_f_notfound= +AS_IF([(rm -f && rm -fr && rm -rf) 2>/dev/null], [], [am__rm_f_notfound='""']) +AC_SUBST(am__rm_f_notfound) +]) + +# Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9926,16 +9904,169 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# Copyright (C) 1996-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# _AM_SLEEP_FRACTIONAL_SECONDS +# ---------------------------- +AC_DEFUN([_AM_SLEEP_FRACTIONAL_SECONDS], [dnl +AC_CACHE_CHECK([whether sleep supports fractional seconds], + am_cv_sleep_fractional_seconds, [dnl +AS_IF([sleep 0.001 2>/dev/null], [am_cv_sleep_fractional_seconds=yes], + [am_cv_sleep_fractional_seconds=no]) +])]) + +# _AM_FILESYSTEM_TIMESTAMP_RESOLUTION +# ----------------------------------- +# Determine the filesystem's resolution for file modification +# timestamps. The coarsest we know of is FAT, with a resolution +# of only two seconds, even with the most recent "exFAT" extensions. +# The finest (e.g. ext4 with large inodes, XFS, ZFS) is one +# nanosecond, matching clock_gettime. However, it is probably not +# possible to delay execution of a shell script for less than one +# millisecond, due to process creation overhead and scheduling +# granularity, so we don't check for anything finer than that. (See below.) +AC_DEFUN([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION], [dnl +AC_REQUIRE([_AM_SLEEP_FRACTIONAL_SECONDS]) +AC_CACHE_CHECK([filesystem timestamp resolution], + am_cv_filesystem_timestamp_resolution, [dnl +# Default to the worst case. +am_cv_filesystem_timestamp_resolution=2 + +# Only try to go finer than 1 sec if sleep can do it. +# Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work, +# - 1 sec is not much of a win compared to 2 sec, and +# - it takes 2 seconds to perform the test whether 1 sec works. +# +# Instead, just use the default 2s on platforms that have 1s resolution, +# accept the extra 1s delay when using $sleep in the Automake tests, in +# exchange for not incurring the 2s delay for running the test for all +# packages. +# +am_try_resolutions= +if test "$am_cv_sleep_fractional_seconds" = yes; then + # Even a millisecond often causes a bunch of false positives, + # so just try a hundredth of a second. The time saved between .001 and + # .01 is not terribly consequential. + am_try_resolutions="0.01 0.1 $am_try_resolutions" +fi + +# In order to catch current-generation FAT out, we must *modify* files +# that already exist; the *creation* timestamp is finer. Use names +# that make ls -t sort them differently when they have equal +# timestamps than when they have distinct timestamps, keeping +# in mind that ls -t prints the *newest* file first. +rm -f conftest.ts? +: > conftest.ts1 +: > conftest.ts2 +: > conftest.ts3 + +# Make sure ls -t actually works. Do 'set' in a subshell so we don't +# clobber the current shell's arguments. (Outer-level square brackets +# are removed by m4; they're present so that m4 does not expand +# ; be careful, easy to get confused.) +if ( + set X `[ls -t conftest.ts[12]]` && + { + test "$[]*" != "X conftest.ts1 conftest.ts2" || + test "$[]*" != "X conftest.ts2 conftest.ts1"; + } +); then :; else + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + _AS_ECHO_UNQUOTED( + ["Bad output from ls -t: \"`[ls -t conftest.ts[12]]`\""], + [AS_MESSAGE_LOG_FD]) + AC_MSG_FAILURE([ls -t produces unexpected output. +Make sure there is not a broken ls alias in your environment.]) +fi + +for am_try_res in $am_try_resolutions; do + # Any one fine-grained sleep might happen to cross the boundary + # between two values of a coarser actual resolution, but if we do + # two fine-grained sleeps in a row, at least one of them will fall + # entirely within a coarse interval. + echo alpha > conftest.ts1 + sleep $am_try_res + echo beta > conftest.ts2 + sleep $am_try_res + echo gamma > conftest.ts3 + + # We assume that 'ls -t' will make use of high-resolution + # timestamps if the operating system supports them at all. + if (set X `ls -t conftest.ts?` && + test "$[]2" = conftest.ts3 && + test "$[]3" = conftest.ts2 && + test "$[]4" = conftest.ts1); then + # + # Ok, ls -t worked. If we're at a resolution of 1 second, we're done, + # because we don't need to test make. + make_ok=true + if test $am_try_res != 1; then + # But if we've succeeded so far with a subsecond resolution, we + # have one more thing to check: make. It can happen that + # everything else supports the subsecond mtimes, but make doesn't; + # notably on macOS, which ships make 3.81 from 2006 (the last one + # released under GPLv2). https://bugs.gnu.org/68808 + # + # We test $MAKE if it is defined in the environment, else "make". + # It might get overridden later, but our hope is that in practice + # it does not matter: it is the system "make" which is (by far) + # the most likely to be broken, whereas if the user overrides it, + # probably they did so with a better, or at least not worse, make. + # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html + # + # Create a Makefile (real tab character here): + rm -f conftest.mk + echo 'conftest.ts1: conftest.ts2' >conftest.mk + echo ' touch conftest.ts2' >>conftest.mk + # + # Now, running + # touch conftest.ts1; touch conftest.ts2; make + # should touch ts1 because ts2 is newer. This could happen by luck, + # but most often, it will fail if make's support is insufficient. So + # test for several consecutive successes. + # + # (We reuse conftest.ts[12] because we still want to modify existing + # files, not create new ones, per above.) + n=0 + make=${MAKE-make} + until test $n -eq 3; do + echo one > conftest.ts1 + sleep $am_try_res + echo two > conftest.ts2 # ts2 should now be newer than ts1 + if $make -f conftest.mk | grep 'up to date' >/dev/null; then + make_ok=false + break # out of $n loop + fi + n=`expr $n + 1` + done + fi + # + if $make_ok; then + # Everything we know to check worked out, so call this resolution good. + am_cv_filesystem_timestamp_resolution=$am_try_res + break # out of $am_try_res loop + fi + # Otherwise, we'll go on to check the next resolution. + fi +done +rm -f conftest.ts? +# (end _am_filesystem_timestamp_resolution) +])]) + # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) +[AC_REQUIRE([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION]) +# This check should not be cached, as it may vary across builds of +# different projects. +AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -9954,49 +10085,40 @@ esac # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! +am_build_env_is_sane=no +am_has_slept=no +rm -f conftest.file +for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[]*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + test "$[]2" = conftest.file + ); then + am_build_env_is_sane=yes + break + fi + # Just in case. + sleep "$am_cv_filesystem_timestamp_resolution" + am_has_slept=yes +done + +AC_MSG_RESULT([$am_build_env_is_sane]) +if test "$am_build_env_is_sane" = no; then + AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT([yes]) + # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & +AS_IF([test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1],, [dnl + ( sleep "$am_cv_filesystem_timestamp_resolution" ) & am_sleep_pid=$! -fi +]) AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then @@ -10007,18 +10129,18 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2021 Free Software Foundation, Inc. +# Copyright (C) 2009-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# AM_SILENT_RULES([DEFAULT]) -# -------------------------- -# Enable less verbose build rules; with the default set to DEFAULT -# ("yes" being less verbose, "no" or empty being verbose). -AC_DEFUN([AM_SILENT_RULES], -[AC_ARG_ENABLE([silent-rules], [dnl +# _AM_SILENT_RULES +# ---------------- +# Enable less verbose build rules support. +AC_DEFUN([_AM_SILENT_RULES], +[AM_DEFAULT_VERBOSITY=1 +AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) @@ -10026,11 +10148,6 @@ AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. @@ -10049,14 +10166,6 @@ am__doit: else am_cv_make_support_nested_variables=no fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using '$V' instead of '$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl @@ -10065,9 +10174,33 @@ AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +dnl Delay evaluation of AM_DEFAULT_VERBOSITY to the end to allow multiple calls +dnl to AM_SILENT_RULES to change the default value. +AC_CONFIG_COMMANDS_PRE([dnl +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; +esac +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +])dnl ]) -# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Set the default verbosity level to DEFAULT ("yes" being less verbose, "no" or +# empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_REQUIRE([_AM_SILENT_RULES]) +AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1])]) + +# Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10095,7 +10228,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2021 Free Software Foundation, Inc. +# Copyright (C) 2006-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10114,7 +10247,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2021 Free Software Foundation, Inc. +# Copyright (C) 2004-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -10160,15 +10293,19 @@ m4_if([$1], [v7], am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) - if test $am_uid -le $am_max_uid; then - AC_MSG_RESULT([yes]) + if test x$am_uid = xunknown; then + AC_MSG_WARN([ancient id detected; assuming current UID is ok, but dist-ustar might not work]) + elif test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) else - AC_MSG_RESULT([no]) - _am_tools=none + AC_MSG_RESULT([no]) + _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) - if test $am_gid -le $am_max_gid; then - AC_MSG_RESULT([yes]) + if test x$gm_gid = xunknown; then + AC_MSG_WARN([ancient id detected; assuming current GID is ok, but dist-ustar might not work]) + elif test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none @@ -10245,3 +10382,23 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR +# Copyright (C) 2022-2024 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_XARGS_N +# ---------------- +# Check whether 'xargs -n' works. It should work everywhere, so the fallback +# is not optimized at all as we never expect to use it. +AC_DEFUN([_AM_PROG_XARGS_N], +[AC_CACHE_CHECK([xargs -n works], am_cv_xargs_n_works, [dnl +AS_IF([test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 +3"], [am_cv_xargs_n_works=yes], [am_cv_xargs_n_works=no])]) +AS_IF([test "$am_cv_xargs_n_works" = yes], [am__xargs_n='xargs -n'], [dnl + am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "$@" "$am__xargs_n_arg"; done; }' +])dnl +AC_SUBST(am__xargs_n) +]) + diff --git a/config/compile b/config/compile index df363c8fb..49b3d05fd 100755 --- a/config/compile +++ b/config/compile @@ -1,9 +1,9 @@ #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. -scriptversion=2018-03-07.03; # UTC +scriptversion=2024-06-19.01; # UTC -# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# Copyright (C) 1999-2024 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -143,7 +143,7 @@ func_cl_wrapper () # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in - *.o | *.[oO][bB][jJ]) + *.o | *.lo | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift @@ -248,14 +248,17 @@ If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . +GNU Automake home page: . +General help using GNU software: . EOF exit $? ;; -v | --v*) - echo "compile $scriptversion" + echo "compile (GNU Automake) $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; diff --git a/config/config.guess b/config/config.guess index cdfc43920..f6d217a49 100755 --- a/config/config.guess +++ b/config/config.guess @@ -1,10 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2023 Free Software Foundation, Inc. +# Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2023-08-22' +timestamp='2024-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -60,7 +60,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2023 Free Software Foundation, Inc. +Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -165,6 +165,8 @@ Linux|GNU|GNU/*) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu + #elif defined(__LLVM_LIBC__) + LIBC=llvm #else #include /* First heuristic to detect musl libc. */ @@ -1593,6 +1595,9 @@ EOF *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; + *:Ironclad:*:*) + GUESS=$UNAME_MACHINE-unknown-ironclad + ;; esac # Do we have a guess based on uname results? diff --git a/config/config.sub b/config/config.sub index defe52c0c..2c6a07ab3 100755 --- a/config/config.sub +++ b/config/config.sub @@ -1,10 +1,10 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2023 Free Software Foundation, Inc. +# Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2023-09-19' +timestamp='2024-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -76,7 +76,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2023 Free Software Foundation, Inc. +Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -1222,6 +1222,7 @@ case $cpu-$vendor in | moxie \ | mt \ | msp430 \ + | nanomips* \ | nds32 | nds32le | nds32be \ | nfp \ | nios | nios2 | nios2eb | nios2el \ @@ -1253,6 +1254,7 @@ case $cpu-$vendor in | ubicom32 \ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ | vax \ + | vc4 \ | visium \ | w65 \ | wasm32 | wasm64 \ @@ -1597,7 +1599,7 @@ case $cpu-$vendor in os= obj=elf ;; - mips*-*) + mips*-*|nanomips*-*) os= obj=elf ;; @@ -1721,7 +1723,7 @@ fi case $os in # Sometimes we do "kernel-libc", so those need to count as OSes. - musl* | newlib* | relibc* | uclibc*) + llvm* | musl* | newlib* | relibc* | uclibc*) ;; # Likewise for "kernel-abi" eabi* | gnueabi*) @@ -1766,12 +1768,19 @@ case $os in | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ - | fiwix* | mlibc* | cos* | mbr* ) + | fiwix* | mlibc* | cos* | mbr* | ironclad* ) ;; # This one is extra strict with allowed versions sco3.2v2 | sco3.2v[4-9]* | sco5v6*) # Don't forget version if it is 3.2v4 or newer. ;; + # This refers to builds using the UEFI calling convention + # (which depends on the architecture) and PE file format. + # Note that this is both a different calling convention and + # different file format than that of GNU-EFI + # (x86_64-w64-mingw32). + uefi) + ;; none) ;; kernel* | msvc* ) @@ -1818,8 +1827,9 @@ esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os-$obj in - linux-gnu*- | linux-dietlibc*- | linux-android*- | linux-newlib*- \ - | linux-musl*- | linux-relibc*- | linux-uclibc*- | linux-mlibc*- ) + linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ + | linux-mlibc*- | linux-musl*- | linux-newlib*- \ + | linux-relibc*- | linux-uclibc*- ) ;; uclinux-uclibc*- ) ;; @@ -1827,7 +1837,8 @@ case $kernel-$os-$obj in ;; windows*-msvc*-) ;; - -dietlibc*- | -newlib*- | -musl*- | -relibc*- | -uclibc*- | -mlibc*- ) + -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ + | -uclibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 diff --git a/config/depcomp b/config/depcomp index 715e34311..1f0aa972c 100755 --- a/config/depcomp +++ b/config/depcomp @@ -1,9 +1,9 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2018-03-07.03; # UTC +scriptversion=2024-06-19.01; # UTC -# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# Copyright (C) 1999-2024 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -47,11 +47,13 @@ Environment variables: libtool Whether libtool is used (yes/no). Report bugs to . +GNU Automake home page: . +General help using GNU software: . EOF exit $? ;; -v | --v*) - echo "depcomp $scriptversion" + echo "depcomp (GNU Automake) $scriptversion" exit $? ;; esac @@ -113,7 +115,6 @@ nl=' # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz -digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then @@ -128,7 +129,7 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" -# Avoid interferences from the environment. +# Avoid interference from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We @@ -198,8 +199,8 @@ gcc3) ;; gcc) -## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. -## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. +## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: diff --git a/config/install-sh b/config/install-sh index 7c56c9c01..b1d7a6f67 100755 --- a/config/install-sh +++ b/config/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2023-11-23.18; # UTC +scriptversion=2024-06-19.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -170,7 +170,7 @@ while test $# -ne 0; do -T) is_target_a_directory=never;; - --version) echo "$0 $scriptversion"; exit $?;; + --version) echo "$0 (GNU Automake) $scriptversion"; exit $?;; --) shift break;; @@ -345,7 +345,7 @@ do ' 0 # Because "mkdir -p" follows existing symlinks and we likely work - # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directly in world-writable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && @@ -353,7 +353,7 @@ do exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. + # Check for POSIX incompatibility with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. diff --git a/config/missing b/config/missing index 1fe1611f1..7e7d78ec5 100755 --- a/config/missing +++ b/config/missing @@ -1,9 +1,11 @@ #! /bin/sh -# Common wrapper for a few potentially missing GNU programs. +# Common wrapper for a few potentially missing GNU and other programs. -scriptversion=2018-03-07.03; # UTC +scriptversion=2024-06-07.14; # UTC -# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# shellcheck disable=SC2006,SC2268 # we must support pre-POSIX shells + +# Copyright (C) 1996-2024 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify @@ -54,18 +56,20 @@ Options: -v, --version output version information and exit Supported PROGRAM values: - aclocal autoconf autoheader autom4te automake makeinfo - bison yacc flex lex help2man +aclocal autoconf autogen autoheader autom4te automake autoreconf +bison flex help2man lex makeinfo perl yacc Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. -Send bug reports to ." +Report bugs to . +GNU Automake home page: . +General help using GNU software: ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" + echo "missing (GNU Automake) $scriptversion" exit $? ;; @@ -108,7 +112,7 @@ gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in - aclocal|automake) + aclocal|automake|autoreconf) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" @@ -123,6 +127,9 @@ program_details () echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; + *) + : + ;; esac } @@ -137,48 +144,55 @@ give_advice () printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + autoheader_deps="'acconfig.h'" + automake_deps="'Makefile.am'" + aclocal_deps="'acinclude.m4'" case $normalized_program in + aclocal*) + echo "You should only need it if you modified $aclocal_deps or" + echo "$configure_deps." + ;; autoconf*) - echo "You should only need it if you modified 'configure.ac'," - echo "or m4 files included by it." - program_details 'autoconf' + echo "You should only need it if you modified $configure_deps." + ;; + autogen*) + echo "You should only need it if you modified a '.def' or '.tpl' file." + echo "You may want to install the GNU AutoGen package:" + echo "<$gnu_software_URL/autogen/>" ;; autoheader*) - echo "You should only need it if you modified 'acconfig.h' or" + echo "You should only need it if you modified $autoheader_deps or" echo "$configure_deps." - program_details 'autoheader' ;; automake*) - echo "You should only need it if you modified 'Makefile.am' or" - echo "$configure_deps." - program_details 'automake' - ;; - aclocal*) - echo "You should only need it if you modified 'acinclude.m4' or" + echo "You should only need it if you modified $automake_deps or" echo "$configure_deps." - program_details 'aclocal' ;; - autom4te*) + autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." - program_details 'autom4te' + ;; + autoreconf*) + echo "You should only need it if you modified $aclocal_deps or" + echo "$automake_deps or $autoheader_deps or $automake_deps or" + echo "$configure_deps." ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; - lex*|flex*) - echo "You should only need it if you modified a '.l' file." - echo "You may want to install the Fast Lexical Analyzer package:" - echo "<$flex_URL>" - ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." @@ -189,6 +203,12 @@ give_advice () echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; + perl*) + echo "You should only need it to run GNU Autoconf, GNU Automake, " + echo " assorted other tools, or if you modified a Perl source file." + echo "You may want to install the Perl 5 language interpreter:" + echo "<$perl_URL>" + ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" @@ -197,6 +217,7 @@ give_advice () echo "case some other package contains this missing '$1' program." ;; esac + program_details "$normalized_program" } give_advice "$1" | sed -e '1s/^/WARNING: /' \ diff --git a/config/mkinstalldirs b/config/mkinstalldirs index c364f3d5e..e536369cc 100755 --- a/config/mkinstalldirs +++ b/config/mkinstalldirs @@ -1,7 +1,7 @@ #! /bin/sh # mkinstalldirs --- make directory hierarchy -scriptversion=2020-07-26.22; # UTC +scriptversion=2024-06-19.01; # UTC # Original author: Noah Friedman # Created: 1993-05-16 @@ -23,7 +23,9 @@ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. -Report bugs to ." +Report bugs to . +GNU Automake home page: . +General help using GNU software: ." # process command line arguments while test $# -gt 0 ; do @@ -39,7 +41,7 @@ while test $# -gt 0 ; do shift ;; --version) - echo "$0 $scriptversion" + echo "$0 (GNU Automake) $scriptversion" exit $? ;; --) # stop option processing diff --git a/config/test-driver b/config/test-driver index be73b80ad..dc38f623f 100755 --- a/config/test-driver +++ b/config/test-driver @@ -1,9 +1,9 @@ #! /bin/sh # test-driver - basic testsuite driver script. -scriptversion=2018-03-07.03; # UTC +scriptversion=2024-06-19.01; # UTC -# Copyright (C) 2011-2021 Free Software Foundation, Inc. +# Copyright (C) 2011-2024 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -44,11 +44,16 @@ print_usage () Usage: test-driver --test-name NAME --log-file PATH --trs-file PATH [--expect-failure {yes|no}] [--color-tests {yes|no}] + [--collect-skipped-logs {yes|no}] [--enable-hard-errors {yes|no}] [--] TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS] The '--test-name', '--log-file' and '--trs-file' options are mandatory. See the GNU Automake documentation for information. + +Report bugs to . +GNU Automake home page: . +General help using GNU software: . END } @@ -57,15 +62,17 @@ log_file= # Where to save the output of the test script. trs_file= # Where to save the metadata of the test run. expect_failure=no color_tests=no +collect_skipped_logs=yes enable_hard_errors=yes while test $# -gt 0; do case $1 in --help) print_usage; exit $?;; - --version) echo "test-driver $scriptversion"; exit $?;; + --version) echo "test-driver (GNU Automake) $scriptversion"; exit $?;; --test-name) test_name=$2; shift;; --log-file) log_file=$2; shift;; --trs-file) trs_file=$2; shift;; --color-tests) color_tests=$2; shift;; + --collect-skipped-logs) collect_skipped_logs=$2; shift;; --expect-failure) expect_failure=$2; shift;; --enable-hard-errors) enable_hard_errors=$2; shift;; --) shift; break;; @@ -121,7 +128,7 @@ fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; - 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 77:*) col=$blu res=SKIP recheck=no gcopy=$collect_skipped_logs;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; diff --git a/configure b/configure index 0cc1574cd..ab5678566 100755 --- a/configure +++ b/configure @@ -717,6 +717,8 @@ build_vendor build_cpu build LIBTOOL +am__xargs_n +am__rm_f_notfound AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V @@ -2867,7 +2869,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Initialize the automake system -am__api_version='1.16' +am__api_version='1.17' @@ -2970,6 +2972,165 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sleep supports fractional seconds" >&5 +printf %s "checking whether sleep supports fractional seconds... " >&6; } +if test ${am_cv_sleep_fractional_seconds+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if sleep 0.001 2>/dev/null +then : + am_cv_sleep_fractional_seconds=yes +else case e in #( + e) am_cv_sleep_fractional_seconds=no ;; +esac +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_sleep_fractional_seconds" >&5 +printf "%s\n" "$am_cv_sleep_fractional_seconds" >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking filesystem timestamp resolution" >&5 +printf %s "checking filesystem timestamp resolution... " >&6; } +if test ${am_cv_filesystem_timestamp_resolution+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) # Default to the worst case. +am_cv_filesystem_timestamp_resolution=2 + +# Only try to go finer than 1 sec if sleep can do it. +# Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work, +# - 1 sec is not much of a win compared to 2 sec, and +# - it takes 2 seconds to perform the test whether 1 sec works. +# +# Instead, just use the default 2s on platforms that have 1s resolution, +# accept the extra 1s delay when using $sleep in the Automake tests, in +# exchange for not incurring the 2s delay for running the test for all +# packages. +# +am_try_resolutions= +if test "$am_cv_sleep_fractional_seconds" = yes; then + # Even a millisecond often causes a bunch of false positives, + # so just try a hundredth of a second. The time saved between .001 and + # .01 is not terribly consequential. + am_try_resolutions="0.01 0.1 $am_try_resolutions" +fi + +# In order to catch current-generation FAT out, we must *modify* files +# that already exist; the *creation* timestamp is finer. Use names +# that make ls -t sort them differently when they have equal +# timestamps than when they have distinct timestamps, keeping +# in mind that ls -t prints the *newest* file first. +rm -f conftest.ts? +: > conftest.ts1 +: > conftest.ts2 +: > conftest.ts3 + +# Make sure ls -t actually works. Do 'set' in a subshell so we don't +# clobber the current shell's arguments. (Outer-level square brackets +# are removed by m4; they're present so that m4 does not expand +# ; be careful, easy to get confused.) +if ( + set X `ls -t conftest.ts[12]` && + { + test "$*" != "X conftest.ts1 conftest.ts2" || + test "$*" != "X conftest.ts2 conftest.ts1"; + } +); then :; else + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + printf "%s\n" ""Bad output from ls -t: \"`ls -t conftest.ts[12]`\""" >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "ls -t produces unexpected output. +Make sure there is not a broken ls alias in your environment. +See 'config.log' for more details" "$LINENO" 5; } +fi + +for am_try_res in $am_try_resolutions; do + # Any one fine-grained sleep might happen to cross the boundary + # between two values of a coarser actual resolution, but if we do + # two fine-grained sleeps in a row, at least one of them will fall + # entirely within a coarse interval. + echo alpha > conftest.ts1 + sleep $am_try_res + echo beta > conftest.ts2 + sleep $am_try_res + echo gamma > conftest.ts3 + + # We assume that 'ls -t' will make use of high-resolution + # timestamps if the operating system supports them at all. + if (set X `ls -t conftest.ts?` && + test "$2" = conftest.ts3 && + test "$3" = conftest.ts2 && + test "$4" = conftest.ts1); then + # + # Ok, ls -t worked. If we're at a resolution of 1 second, we're done, + # because we don't need to test make. + make_ok=true + if test $am_try_res != 1; then + # But if we've succeeded so far with a subsecond resolution, we + # have one more thing to check: make. It can happen that + # everything else supports the subsecond mtimes, but make doesn't; + # notably on macOS, which ships make 3.81 from 2006 (the last one + # released under GPLv2). https://bugs.gnu.org/68808 + # + # We test $MAKE if it is defined in the environment, else "make". + # It might get overridden later, but our hope is that in practice + # it does not matter: it is the system "make" which is (by far) + # the most likely to be broken, whereas if the user overrides it, + # probably they did so with a better, or at least not worse, make. + # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html + # + # Create a Makefile (real tab character here): + rm -f conftest.mk + echo 'conftest.ts1: conftest.ts2' >conftest.mk + echo ' touch conftest.ts2' >>conftest.mk + # + # Now, running + # touch conftest.ts1; touch conftest.ts2; make + # should touch ts1 because ts2 is newer. This could happen by luck, + # but most often, it will fail if make's support is insufficient. So + # test for several consecutive successes. + # + # (We reuse conftest.ts[12] because we still want to modify existing + # files, not create new ones, per above.) + n=0 + make=${MAKE-make} + until test $n -eq 3; do + echo one > conftest.ts1 + sleep $am_try_res + echo two > conftest.ts2 # ts2 should now be newer than ts1 + if $make -f conftest.mk | grep 'up to date' >/dev/null; then + make_ok=false + break # out of $n loop + fi + n=`expr $n + 1` + done + fi + # + if $make_ok; then + # Everything we know to check worked out, so call this resolution good. + am_cv_filesystem_timestamp_resolution=$am_try_res + break # out of $am_try_res loop + fi + # Otherwise, we'll go on to check the next resolution. + fi +done +rm -f conftest.ts? +# (end _am_filesystem_timestamp_resolution) + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_filesystem_timestamp_resolution" >&5 +printf "%s\n" "$am_cv_filesystem_timestamp_resolution" >&6; } + +# This check should not be cached, as it may vary across builds of +# different projects. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory @@ -2990,49 +3151,45 @@ esac # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! +am_build_env_is_sane=no +am_has_slept=no +rm -f conftest.file +for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + test "$2" = conftest.file + ); then + am_build_env_is_sane=yes + break + fi + # Just in case. + sleep "$am_cv_filesystem_timestamp_resolution" + am_has_slept=yes +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_build_env_is_sane" >&5 +printf "%s\n" "$am_build_env_is_sane" >&6; } +if test "$am_build_env_is_sane" = no; then + as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } + # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & +if test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1 +then : + +else case e in #( + e) ( sleep "$am_cv_filesystem_timestamp_resolution" ) & am_sleep_pid=$! + ;; +esac fi rm -f conftest.file @@ -3322,17 +3479,13 @@ else fi rmdir .tst 2>/dev/null +AM_DEFAULT_VERBOSITY=1 # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } @@ -3355,15 +3508,45 @@ esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi AM_BACKSLASH='\' +am__rm_f_notfound= +if (rm -f && rm -fr && rm -rf) 2>/dev/null +then : + +else case e in #( + e) am__rm_f_notfound='""' ;; +esac +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking xargs -n works" >&5 +printf %s "checking xargs -n works... " >&6; } +if test ${am_cv_xargs_n_works+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 +3" +then : + am_cv_xargs_n_works=yes +else case e in #( + e) am_cv_xargs_n_works=no ;; +esac +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_xargs_n_works" >&5 +printf "%s\n" "$am_cv_xargs_n_works" >&6; } +if test "$am_cv_xargs_n_works" = yes +then : + am__xargs_n='xargs -n' +else case e in #( + e) am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "" "$am__xargs_n_arg"; done; }' + ;; +esac +fi + if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." @@ -3447,90 +3630,12 @@ fi -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 - fi -fi -# Check whether --enable-silent-rules was given. -if test ${enable_silent_rules+y} -then : - enableval=$enable_silent_rules; -fi -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=0;; -esac -am_make=${MAKE-make} -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -printf %s "checking whether $am_make supports nested variables... " >&6; } -if test ${am_cv_make_support_nested_variables+y} -then : - printf %s "(cached) " >&6 -else case e in #( - e) if printf "%s\n" 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi ;; -esac -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' +AM_DEFAULT_VERBOSITY=0 case `pwd` in *\ * | *\ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 @@ -4949,7 +5054,7 @@ else case e in #( # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: + # When given -MP, icc 7.0 and 7.1 complain thus: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported @@ -14047,7 +14152,7 @@ else case e in #( # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: + # When given -MP, icc 7.0 and 7.1 complain thus: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported @@ -16499,6 +16604,159 @@ then : fi +# Check if we need -lrt for nanosleep +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nanosleep" >&5 +printf %s "checking for library containing nanosleep... " >&6; } +if test ${ac_cv_search_nanosleep+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char nanosleep (void); +int +main (void) +{ +return nanosleep (); + ; + return 0; +} +_ACEOF +for ac_lib in '' rt posix4 +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_nanosleep=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_nanosleep+y} +then : + break +fi +done +if test ${ac_cv_search_nanosleep+y} +then : + +else case e in #( + e) ac_cv_search_nanosleep=no ;; +esac +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nanosleep" >&5 +printf "%s\n" "$ac_cv_search_nanosleep" >&6; } +ac_res=$ac_cv_search_nanosleep +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +# Check for nanosleep support +ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" +if test "x$ac_cv_func_nanosleep" = xyes +then : + printf "%s\n" "#define HAVE_NANOSLEEP 1" >>confdefs.h + +fi + +# Check if we need -lrt for clock_nanosleep +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing clock_nanosleep" >&5 +printf %s "checking for library containing clock_nanosleep... " >&6; } +if test ${ac_cv_search_clock_nanosleep+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char clock_nanosleep (void); +int +main (void) +{ +return clock_nanosleep (); + ; + return 0; +} +_ACEOF +for ac_lib in '' rt posix4 +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_clock_nanosleep=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_clock_nanosleep+y} +then : + break +fi +done +if test ${ac_cv_search_clock_nanosleep+y} +then : + +else case e in #( + e) ac_cv_search_clock_nanosleep=no ;; +esac +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_nanosleep" >&5 +printf "%s\n" "$ac_cv_search_clock_nanosleep" >&6; } +ac_res=$ac_cv_search_clock_nanosleep +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +# Check for clock_nanosleep support +ac_fn_c_check_func "$LINENO" "clock_nanosleep" "ac_cv_func_clock_nanosleep" +if test "x$ac_cv_func_clock_nanosleep" = xyes +then : + printf "%s\n" "#define HAVE_CLOCK_NANOSLEEP 1" >>confdefs.h + +fi + + ac_config_files="$ac_config_files Makefile src/Makefile src/version.h examples/Makefile iperf3.spec" cat >confcache <<\_ACEOF @@ -16622,6 +16880,18 @@ printf %s "checking that generated files are newer than configure... " >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; +esac +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi + if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' diff --git a/examples/Makefile.in b/examples/Makefile.in index 6e1365b57..bf0968bb9 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.5 from Makefile.am. +# Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2021 Free Software Foundation, Inc. +# Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -70,6 +70,8 @@ am__make_running_with_option = \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -267,8 +269,10 @@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ @@ -355,13 +359,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list + $(am__rm_f) $(noinst_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(noinst_PROGRAMS:$(EXEEXT)=) mic$(EXEEXT): $(mic_OBJECTS) $(mic_DEPENDENCIES) $(EXTRA_mic_DEPENDENCIES) @rm -f mic$(EXEEXT) @@ -382,7 +381,7 @@ distclean-compile: $(am__depfiles_remade): @$(MKDIR_P) $(@D) - @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + @: >>$@ am--depfiles: $(am__depfiles_remade) @@ -553,8 +552,8 @@ mostlyclean-generic: clean-generic: distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -565,7 +564,7 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -f ./$(DEPDIR)/mic-mic.Po + -rm -f ./$(DEPDIR)/mic-mic.Po -rm -f ./$(DEPDIR)/mis-mis.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ @@ -612,7 +611,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -f ./$(DEPDIR)/mic-mic.Po + -rm -f ./$(DEPDIR)/mic-mic.Po -rm -f ./$(DEPDIR)/mis-mis.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -654,3 +653,10 @@ uninstall-am: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/src/Makefile.in b/src/Makefile.in index 981650263..af36b68b9 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.5 from Makefile.am. +# Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2021 Free Software Foundation, Inc. +# Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -72,6 +72,8 @@ am__make_running_with_option = \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -140,10 +142,9 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } LTLIBRARIES = $(lib_LTLIBRARIES) libiperf_la_LIBADD = @@ -433,6 +434,7 @@ am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ + $$am__collect_skipped_logs \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the @@ -457,6 +459,11 @@ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ +if test -n '$(IGNORE_SKIPPED_LOGS)'; then \ + am__collect_skipped_logs='--collect-skipped-logs no'; \ +else \ + am__collect_skipped_logs=''; \ +fi; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ @@ -595,8 +602,10 @@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ @@ -760,12 +769,12 @@ iperf_config.h: stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/iperf_config.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status src/iperf_config.h + $(AM_V_at)rm -f stamp-h1 + $(AM_V_GEN)cd $(top_builddir) && $(SHELL) ./config.status src/iperf_config.h $(srcdir)/iperf_config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) - rm -f stamp-h1 - touch $@ + $(AM_V_GEN)($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + $(AM_V_at)rm -f stamp-h1 + $(AM_V_at)touch $@ distclean-hdr: -rm -f iperf_config.h stamp-h1 @@ -810,25 +819,15 @@ uninstall-binPROGRAMS: `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files + cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list + $(am__rm_f) $(bin_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list + $(am__rm_f) $(noinst_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(noinst_PROGRAMS:$(EXEEXT)=) install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @@ -855,15 +854,13 @@ uninstall-libLTLIBRARIES: done clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + -$(am__rm_f) $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } + echo rm -f $${locs}; \ + $(am__rm_f) $${locs} libiperf.la: $(libiperf_la_OBJECTS) $(libiperf_la_DEPENDENCIES) $(EXTRA_libiperf_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libiperf_la_OBJECTS) $(libiperf_la_LIBADD) $(LIBS) @@ -948,7 +945,7 @@ distclean-compile: $(am__depfiles_remade): @$(MKDIR_P) $(@D) - @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + @: >>$@ am--depfiles: $(am__depfiles_remade) @@ -1501,7 +1498,6 @@ distclean-tags: am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: - $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ @@ -1577,10 +1573,37 @@ $(TEST_SUITE_LOG): $(TEST_LOGS) result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ + output_system_information () \ + { \ + echo; \ + { uname -a | $(AWK) '{ \ + printf "System information (uname -a):"; \ + for (i = 1; i < NF; ++i) \ + { \ + if (i != 2) \ + printf " %s", $$i; \ + } \ + printf "\n"; \ +}'; } 2>&1; \ + if test -r /etc/os-release; then \ + echo "Distribution information (/etc/os-release):"; \ + sed 8q /etc/os-release; \ + elif test -r /etc/issue; then \ + echo "Distribution information (/etc/issue):"; \ + cat /etc/issue; \ + fi; \ + }; \ + please_report () \ + { \ +echo "Some test(s) failed. Please report this to $(PACKAGE_BUGREPORT),"; \ +echo "together with the test-suite.log file (gzipped) and your system"; \ +echo "information. Thanks."; \ + }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ + output_system_information; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ @@ -1600,26 +1623,25 @@ $(TEST_SUITE_LOG): $(TEST_LOGS) create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ - echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG) for debugging.$${std}";\ if test -n "$(PACKAGE_BUGREPORT)"; then \ - echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + please_report | sed -e "s/^/$${col}/" -e s/'$$'/"$${std}"/; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: - @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list - @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list - @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @$(am__rm_f) $(RECHECK_LOGS) + @$(am__rm_f) $(RECHECK_LOGS:.log=.trs) + @$(am__rm_f) $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ - trs_list=`for i in $$bases; do echo $$i.trs; done`; \ - log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all - @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @$(am__rm_f) $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ @@ -1742,15 +1764,15 @@ install-strip: "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: - -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) - -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) - -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + -$(am__rm_f) $(TEST_LOGS) + -$(am__rm_f) $(TEST_LOGS:.log=.trs) + -$(am__rm_f) $(TEST_SUITE_LOG) clean-generic: distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -1761,7 +1783,7 @@ clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -f ./$(DEPDIR)/cjson.Plo + -rm -f ./$(DEPDIR)/cjson.Plo -rm -f ./$(DEPDIR)/dscp.Plo -rm -f ./$(DEPDIR)/iperf3-main.Po -rm -f ./$(DEPDIR)/iperf3_profile-cjson.Po @@ -1849,7 +1871,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -f ./$(DEPDIR)/cjson.Plo + -rm -f ./$(DEPDIR)/cjson.Plo -rm -f ./$(DEPDIR)/dscp.Plo -rm -f ./$(DEPDIR)/iperf3-main.Po -rm -f ./$(DEPDIR)/iperf3_profile-cjson.Po @@ -1941,3 +1963,10 @@ uninstall-man: uninstall-man1 uninstall-man3 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/src/iperf_config.h.in b/src/iperf_config.h.in index c85b19521..217aee3db 100644 --- a/src/iperf_config.h.in +++ b/src/iperf_config.h.in @@ -3,6 +3,9 @@ /* Define to 1 if you have the 'clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME +/* Define to 1 if you have the 'clock_nanosleep' function. */ +#undef HAVE_CLOCK_NANOSLEEP + /* Define to 1 if you have the 'cpuset_setaffinity' function. */ #undef HAVE_CPUSET_SETAFFINITY @@ -42,6 +45,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_TCP_H +/* Define to 1 if you have the 'nanosleep' function. */ +#undef HAVE_NANOSLEEP + /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_SCTP_H From 0128d0357b7e8916fe39e980e455729bc0e5fd4e Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sun, 2 Jun 2024 12:41:10 +0300 Subject: [PATCH 124/286] Veify that Params JSON size was received and is resonable --- src/iperf.h | 2 ++ src/iperf_api.c | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index f297587d1..7d14a3453 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -436,6 +436,8 @@ struct iperf_test #define UDP_BUFFER_EXTRA 1024 +#define MAX_PARAMS_JSON_STRING 8 * 1024 + /* constants for command line arg sanity checks */ #define MB (1024 * 1024) #define MAX_TCP_BUFFER (512 * MB) diff --git a/src/iperf_api.c b/src/iperf_api.c index 565e0b0aa..8a6635222 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2799,8 +2799,9 @@ JSON_read(int fd) * Then read the JSON into a buffer and parse it. Return a parsed JSON * structure, NULL if there was an error. */ - if (Nread(fd, (char*) &nsize, sizeof(nsize), Ptcp) >= 0) { - hsize = ntohl(nsize); + rc = Nread(fd, (char*) &nsize, sizeof(nsize), Ptcp); + hsize = ntohl(nsize); + if (rc == sizeof(nsize) && hsize <= MAX_PARAMS_JSON_STRING) { /* Allocate a buffer to hold the JSON */ strsize = hsize + 1; /* +1 for trailing NULL */ if (strsize) { From 5b0ed630e191dd1ca5a13dcb1bbea1b32b7f1419 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Sun, 2 Jun 2024 12:48:08 +0300 Subject: [PATCH 125/286] Add check that size is positive --- src/iperf_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 8a6635222..2d8d4ed42 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2801,7 +2801,7 @@ JSON_read(int fd) */ rc = Nread(fd, (char*) &nsize, sizeof(nsize), Ptcp); hsize = ntohl(nsize); - if (rc == sizeof(nsize) && hsize <= MAX_PARAMS_JSON_STRING) { + if (rc == sizeof(nsize) && hsize > 0 && hsize <= MAX_PARAMS_JSON_STRING) { /* Allocate a buffer to hold the JSON */ strsize = hsize + 1; /* +1 for trailing NULL */ if (strsize) { From d2a6ba63df4c4dbe218ebb383d81e35f0b43a110 Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Thu, 12 Sep 2024 14:45:28 +0300 Subject: [PATCH 126/286] Changes per reviewer comments (with rebase) --- src/iperf_api.c | 55 +++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 2d8d4ed42..30fa13555 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2800,35 +2800,40 @@ JSON_read(int fd) * structure, NULL if there was an error. */ rc = Nread(fd, (char*) &nsize, sizeof(nsize), Ptcp); - hsize = ntohl(nsize); - if (rc == sizeof(nsize) && hsize > 0 && hsize <= MAX_PARAMS_JSON_STRING) { - /* Allocate a buffer to hold the JSON */ - strsize = hsize + 1; /* +1 for trailing NULL */ - if (strsize) { - str = (char *) calloc(sizeof(char), strsize); - if (str != NULL) { - rc = Nread(fd, str, hsize, Ptcp); - if (rc >= 0) { - /* - * We should be reading in the number of bytes corresponding to the - * length in that 4-byte integer. If we don't the socket might have - * prematurely closed. Only do the JSON parsing if we got the - * correct number of bytes. - */ - if (rc == hsize) { - json = cJSON_Parse(str); - } - else { - printf("WARNING: Size of data read does not correspond to offered length\n"); - } - } - } - free(str); + if (rc == sizeof(nsize)) { + hsize = ntohl(nsize); + if (hsize > 0 && hsize <= MAX_PARAMS_JSON_STRING) { + /* Allocate a buffer to hold the JSON */ + strsize = hsize + 1; /* +1 for trailing NULL */ + if (strsize) { + str = (char *) calloc(sizeof(char), strsize); + if (str != NULL) { + rc = Nread(fd, str, hsize, Ptcp); + if (rc >= 0) { + /* + * We should be reading in the number of bytes corresponding to the + * length in that 4-byte integer. If we don't the socket might have + * prematurely closed. Only do the JSON parsing if we got the + * correct number of bytes. + */ + if (rc == hsize) { + json = cJSON_Parse(str); + } + else { + printf("WARNING: JSON size of data read does not correspond to offered length\n"); + } + } + free(str); + } + } } else { - printf("WARNING: Data length overflow\n"); + printf("WARNING: JSON data length overflow\n"); } } + else { + printf("WARNING: Failed to read JSN data size\n"); + } return json; } From d5713db9dec9abb98b37f4b9904991ebdc5da59b Mon Sep 17 00:00:00 2001 From: Jie Sheng Date: Fri, 13 Sep 2024 11:05:12 +0800 Subject: [PATCH 127/286] Avoid subthread signal handling (#1752) * Avoid subthread signal handling * subthread signal handling Since multiple threads responding simultaneously to a signal leading to race condition, this is used to ensure that only the main thread handles the signal. * aesthetic improvements * Revert IEPTHREADATTRDESTROY to original value --- src/iperf_api.h | 1 + src/iperf_client_api.c | 18 ++++++++++++++++++ src/iperf_error.c | 3 +++ src/iperf_server_api.c | 18 ++++++++++++++++++ 4 files changed, 40 insertions(+) diff --git a/src/iperf_api.h b/src/iperf_api.h index 131314243..2b71613e9 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -475,6 +475,7 @@ enum { IEPTHREADJOIN=152, // Unable to join thread (check perror) IEPTHREADATTRINIT=153, // Unable to initialize thread attribute (check perror) IEPTHREADATTRDESTROY=154, // Unable to destroy thread attribute (check perror) + IEPTHREADSIGMASK=155, // Unable to initialize sub thread signal mask (check perror) /* Stream errors */ IECREATESTREAM = 200, // Unable to create a new stream (check herror/perror) IEINITSTREAM = 201, // Unable to initialize stream (check herror/perror) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 7c22caded..c26bcc27a 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "iperf.h" #include "iperf_api.h" @@ -56,6 +57,23 @@ iperf_client_worker_run(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; + /* Blocking signal to make sure that signal will be handled by main thread */ + sigset_t set; + sigemptyset(&set); +#ifdef SIGTERM + sigaddset(&set, SIGTERM); +#endif +#ifdef SIGHUP + sigaddset(&set, SIGHUP); +#endif +#ifdef SIGINT + sigaddset(&set, SIGINT); +#endif + if (pthread_sigmask(SIG_BLOCK, &set, NULL) != 0) { + i_errno = IEPTHREADSIGMASK; + goto cleanup_and_fail; + } + /* Allow this thread to be cancelled even if it's in a syscall */ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); diff --git a/src/iperf_error.c b/src/iperf_error.c index ce925a81f..3388d376e 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -505,6 +505,9 @@ iperf_strerror(int int_errno) snprintf(errstr, len, "unable to create thread attributes"); perr = 1; break; + case IEPTHREADSIGMASK: + snprintf(errstr, len, "unable to change mask of blocked signals"); + break; case IEPTHREADATTRDESTROY: snprintf(errstr, len, "unable to destroy thread attributes"); perr = 1; diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index b87734fec..9727cdddb 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -45,6 +45,7 @@ #include #include #include +#include #include "iperf.h" #include "iperf_api.h" @@ -69,6 +70,23 @@ iperf_server_worker_run(void *s) { struct iperf_stream *sp = (struct iperf_stream *) s; struct iperf_test *test = sp->test; + /* Blocking signal to make sure that signal will be handled by main thread */ + sigset_t set; + sigemptyset(&set); +#ifdef SIGTERM + sigaddset(&set, SIGTERM); +#endif +#ifdef SIGHUP + sigaddset(&set, SIGHUP); +#endif +#ifdef SIGINT + sigaddset(&set, SIGINT); +#endif + if (pthread_sigmask(SIG_BLOCK, &set, NULL) != 0) { + i_errno = IEPTHREADSIGMASK; + goto cleanup_and_fail; + } + /* Allow this thread to be cancelled even if it's in a syscall */ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); From dab301f163a078b5a6931d973972efdfcc857659 Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Sun, 15 Sep 2024 11:24:18 +0300 Subject: [PATCH 128/286] Call warning() instead of printf("WARINING: ....") --- src/iperf_api.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 30fa13555..096cfe27f 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2820,7 +2820,7 @@ JSON_read(int fd) json = cJSON_Parse(str); } else { - printf("WARNING: JSON size of data read does not correspond to offered length\n"); + warning("JSON size of data read does not correspond to offered length"); } } free(str); @@ -2828,11 +2828,11 @@ JSON_read(int fd) } } else { - printf("WARNING: JSON data length overflow\n"); + warning("JSON data length overflow"); } } else { - printf("WARNING: Failed to read JSN data size\n"); + warning("Failed to read JSON data size"); } return json; } From 7bd583d323950071e6ad05eb6c72a45a786fb126 Mon Sep 17 00:00:00 2001 From: jiangjixiang Date: Mon, 9 Sep 2024 17:54:25 +0800 Subject: [PATCH 129/286] Avoid duplicate thread recycling. At the end of the test, the traffic thread has been reclaimed. If there is an exception in the control connection, it will cause the thread to be reclaimed repeatedly. Use sp->done to avoid repeated thread recycling. --- src/iperf_client_api.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 7c22caded..6d8eee2dd 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -807,6 +807,9 @@ iperf_run_client(struct iperf_test * test) /* Cancel all outstanding threads */ i_errno_save = i_errno; SLIST_FOREACH(sp, &test->streams, streams) { + if (sp->done) { + continue; + } sp->done = 1; int rc; rc = pthread_cancel(sp->thr); From bf12abbeb825989b839f6b0134ca5f787996785a Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Thu, 19 Sep 2024 15:55:44 +0300 Subject: [PATCH 130/286] Remove the usage of pacing_timer and simplify iperf_mt_send --- src/iperf_api.c | 96 ++++++++++++++-------------------------------- src/iperf_locale.c | 6 +-- 2 files changed, 30 insertions(+), 72 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index dcf386c30..d0feafd0c 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1993,10 +1993,10 @@ iperf_check_total_rate(struct iperf_test *test, iperf_size_t last_interval_bytes int iperf_send_mt(struct iperf_stream *sp) { - register int multisend, r, streams_active; + register int multisend, r, message_sent; register struct iperf_test *test = sp->test; struct iperf_time now; - int no_throttle_check; + int throttle_check_per_message; /* Can we do multisend mode? */ if (test->settings->burst != 0) @@ -2007,45 +2007,38 @@ iperf_send_mt(struct iperf_stream *sp) multisend = 1; /* nope */ /* Should bitrate throttle be checked for every send */ - no_throttle_check = test->settings->rate != 0 && test->settings->burst == 0; - - for (; multisend > 0; --multisend) { - if (no_throttle_check) - iperf_time_now(&now); - streams_active = 0; - { - if (sp->green_light && sp->sender) { - // XXX If we hit one of these ending conditions maybe - // want to stop even trying to send something? - if (multisend > 1 && test->settings->bytes != 0 && test->bytes_sent >= test->settings->bytes) - break; - if (multisend > 1 && test->settings->blocks != 0 && test->blocks_sent >= test->settings->blocks) - break; - if ((r = sp->snd(sp)) < 0) { - if (r == NET_SOFTERROR) - break; - i_errno = IESTREAMWRITE; - return r; - } - streams_active = 1; - test->bytes_sent += r; - if (!sp->pending_size) - ++test->blocks_sent; - if (no_throttle_check) - iperf_check_throttle(sp, &now); - } - } - if (!streams_active) - break; + throttle_check_per_message = test->settings->rate != 0 && test->settings->burst == 0; + + for (message_sent = 0; sp->green_light && multisend > 0; --multisend) { + // XXX If we hit one of these ending conditions maybe + // want to stop even trying to send something? + if (multisend > 1 && test->settings->bytes != 0 && test->bytes_sent >= test->settings->bytes) + break; + if (multisend > 1 && test->settings->blocks != 0 && test->blocks_sent >= test->settings->blocks) + break; + if ((r = sp->snd(sp)) < 0) { + if (r == NET_SOFTERROR) + break; + i_errno = IESTREAMWRITE; + return r; + } + test->bytes_sent += r; + if (!sp->pending_size) + ++test->blocks_sent; + if (throttle_check_per_message) { + if (message_sent == 0) + iperf_time_now(&now); + iperf_check_throttle(sp, &now); + } + message_sent = 1; } #if defined(HAVE_CLOCK_NANOSLEEP) || defined(HAVE_NANOSLEEP) if (!sp->green_light) { /* Should check if green ligh can be set, as pacing timer is not supported in this case */ #else /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP */ - if (!no_throttle_check) { /* Throttle check if was not checked for each send */ + if (!throttle_check_per_message || message_sent == 0) { /* Throttle check if was not checked for each send */ #endif /* HAVE_CLOCK_NANOSLEEP, HAVE_NANOSLEEP */ iperf_time_now(&now); - if (sp->sender) - iperf_check_throttle(sp, &now); + iperf_check_throttle(sp, &now); } return 0; } @@ -2098,46 +2091,15 @@ iperf_init_test(struct iperf_test *test) return 0; } -#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) -static void -send_timer_proc(TimerClientData client_data, struct iperf_time *nowP) -{ - struct iperf_stream *sp = client_data.p; - - /* All we do here is set or clear the flag saying that this stream may - ** be sent to. The actual sending gets done in the send proc, after - ** checking the flag. - */ - iperf_check_throttle(sp, nowP); -} -#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP) */ int iperf_create_send_timers(struct iperf_test * test) { + // Note: No times for the multi-thread versions struct iperf_stream *sp; -#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) - TimerClientData cd; - struct iperf_time now; - - if (iperf_time_now(&now) < 0) { - i_errno = IEINITTEST; - return -1; - } -#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP) */ SLIST_FOREACH(sp, &test->streams, streams) { sp->green_light = 1; -#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) - if (test->settings->rate != 0 && sp->sender) { - cd.p = sp; - sp->send_timer = tmr_create(NULL, send_timer_proc, cd, test->settings->pacing_timer, 1); - if (sp->send_timer == NULL) { - i_errno = IEINITTEST; - return -1; - } - } -#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP) */ } return 0; } diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 5c6e66dfd..32883da84 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -163,12 +163,8 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" " -b, --bitrate #[KMG][/#] target bitrate in bits/sec (0 for unlimited)\n" " (default %d Mbit/sec for UDP, unlimited for TCP)\n" " (optional slash and packet count for burst mode)\n" -#if !defined(HAVE_CLOCK_NANOSLEEP) && !defined(HAVE_NANOSLEEP) - " --pacing-timer #[KMG] set the timing for pacing, in microseconds (default %d)\n" -#else " --pacing-timer #[KMG] set the Server timing for pacing, in microseconds (default %d)\n" - " (used by the server only if this option is in its help message)\n" -#endif /* !HAVE_CLOCK_NANOSLEEP && !HAVE_NANOSLEEP */ + " (deprecated - for servers using older versions ackward compatibility)\n" #if defined(HAVE_SO_MAX_PACING_RATE) " --fq-rate #[KMG] enable fair-queuing based socket pacing in\n" " bits/sec (Linux only)\n" From 31b63a0d579b8f36fda7aa4de59ae0fcad51750d Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Fri, 20 Sep 2024 10:55:27 +0300 Subject: [PATCH 131/286] Issue 1770 - not limit omit time --- src/iperf_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index dcf386c30..f5d07084e 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1493,7 +1493,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) break; case 'O': test->omit = atoi(optarg); - if (test->omit < 0 || test->omit > 60) { + if (test->omit < 0 || test->omit > MAX_TIME) { i_errno = IEOMIT; return -1; } From 54b228863fe34574fa6a35c897d651f75dacd092 Mon Sep 17 00:00:00 2001 From: iZarrios Date: Fri, 27 Sep 2024 21:03:59 +0300 Subject: [PATCH 132/286] fix typo in iperf_util.c --- src/iperf_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iperf_util.c b/src/iperf_util.c index 17c246666..3d0c7831b 100644 --- a/src/iperf_util.c +++ b/src/iperf_util.c @@ -105,7 +105,7 @@ void fill_with_repeating_pattern(void *out, size_t outsize) * Generate and return a cookie string * * Iperf uses this function to create test "cookies" which - * server as unique test identifiers. These cookies are also + * serve as unique test identifiers. These cookies are also * used for the authentication of stream connections. * Assumes cookie has size (COOKIE_SIZE + 1) char's. */ From 464ce7ca989e1274a6b1ece3d075e88b666a7a77 Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Fri, 27 Sep 2024 18:33:58 +0300 Subject: [PATCH 133/286] Fix for #1776 - do not limit JSON size for --get-server-output --- src/iperf_api.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 60efd1273..262adbc2e 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -99,7 +99,7 @@ static int diskfile_send(struct iperf_stream *sp); static int diskfile_recv(struct iperf_stream *sp); static int JSON_write(int fd, cJSON *json); static void print_interval_results(struct iperf_test *test, struct iperf_stream *sp, cJSON *json_interval_streams); -static cJSON *JSON_read(int fd); +static cJSON *JSON_read(int fd, int max_size); static int JSONStream_Output(struct iperf_test *test, const char* event_name, cJSON* obj); @@ -2373,7 +2373,7 @@ get_parameters(struct iperf_test *test) cJSON *j; cJSON *j_p; - j = JSON_read(test->ctrl_sck); + j = JSON_read(test->ctrl_sck, MAX_PARAMS_JSON_STRING); if (j == NULL) { i_errno = IERECVPARAMS; r = -1; @@ -2604,7 +2604,7 @@ get_results(struct iperf_test *test) int retransmits; struct iperf_stream *sp; - j = JSON_read(test->ctrl_sck); + j = JSON_read(test->ctrl_sck, 0); if (j == NULL) { i_errno = IERECVRESULTS; r = -1; @@ -2792,7 +2792,7 @@ JSON_write(int fd, cJSON *json) /*************************************************************/ static cJSON * -JSON_read(int fd) +JSON_read(int fd, int max_size) { uint32_t hsize, nsize; size_t strsize; @@ -2808,7 +2808,7 @@ JSON_read(int fd) rc = Nread(fd, (char*) &nsize, sizeof(nsize), Ptcp); if (rc == sizeof(nsize)) { hsize = ntohl(nsize); - if (hsize > 0 && hsize <= MAX_PARAMS_JSON_STRING) { + if (hsize > 0 && (max_size == 0 || hsize <= max_size)) { /* Allocate a buffer to hold the JSON */ strsize = hsize + 1; /* +1 for trailing NULL */ if (strsize) { From c038abe9360557bad654003108aedda256e1a997 Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Tue, 15 Oct 2024 19:02:02 +0300 Subject: [PATCH 134/286] -No select() when reading data (used only for control/json read) --- src/iperf_sctp.c | 2 +- src/iperf_tcp.c | 2 +- src/iperf_udp.c | 2 +- src/net.c | 27 +++++++++++++++++++++++++++ src/net.h | 1 + 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/iperf_sctp.c b/src/iperf_sctp.c index 9a61bba44..f2e4baef0 100644 --- a/src/iperf_sctp.c +++ b/src/iperf_sctp.c @@ -56,7 +56,7 @@ iperf_sctp_recv(struct iperf_stream *sp) #if defined(HAVE_SCTP_H) int r; - r = Nread(sp->socket, sp->buffer, sp->settings->blksize, Psctp); + r = Nread_no_select(sp->socket, sp->buffer, sp->settings->blksize, Psctp); if (r < 0) return r; diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index dc0feda6d..481c09dc8 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -58,7 +58,7 @@ iperf_tcp_recv(struct iperf_stream *sp) { int r; - r = Nread(sp->socket, sp->buffer, sp->settings->blksize, Ptcp); + r = Nread_no_select(sp->socket, sp->buffer, sp->settings->blksize, Ptcp); if (r < 0) return r; diff --git a/src/iperf_udp.c b/src/iperf_udp.c index 760116b4b..150b8c69e 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -62,7 +62,7 @@ iperf_udp_recv(struct iperf_stream *sp) double transit = 0, d = 0; struct iperf_time sent_time, arrival_time, temp_time; - r = Nread(sp->socket, sp->buffer, size, Pudp); + r = Nread_no_select(sp->socket, sp->buffer, size, Pudp); /* * If we got an error in the read, or if we didn't read anything diff --git a/src/net.c b/src/net.c index c82caff1b..003ff5757 100644 --- a/src/net.c +++ b/src/net.c @@ -452,6 +452,33 @@ Nread(int fd, char *buf, size_t count, int prot) return count - nleft; } +/********************************************************************/ +/* reads 'count' bytes from a socket - but without using select() */ +/********************************************************************/ +int +Nread_no_select(int fd, char *buf, size_t count, int prot) +{ + register ssize_t r; + register size_t nleft = count; + + while (nleft > 0) { + r = read(fd, buf, nleft); + if (r < 0) { + /* XXX EWOULDBLOCK can't happen without non-blocking sockets */ + if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) + break; + else + return NET_HARDERROR; + } else if (r == 0) + break; + + nleft -= r; + buf += r; + + } + return count - nleft; +} + /* * N W R I T E diff --git a/src/net.h b/src/net.h index f0e1b4f98..859c52cef 100644 --- a/src/net.h +++ b/src/net.h @@ -32,6 +32,7 @@ int create_socket(int domain, int proto, const char *local, const char *bind_dev int netdial(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, int timeout); int netannounce(int domain, int proto, const char *local, const char *bind_dev, int port); int Nread(int fd, char *buf, size_t count, int prot); +int Nread_no_select(int fd, char *buf, size_t count, int prot); int Nwrite(int fd, const char *buf, size_t count, int prot) /* __attribute__((hot)) */; int has_sendfile(void); int Nsendfile(int fromfd, int tofd, const char *buf, size_t count) /* __attribute__((hot)) */; From 3f10f76d792c5a69ae69002d9ef8b7238dcc2846 Mon Sep 17 00:00:00 2001 From: tinyboxvk Date: Thu, 31 Oct 2024 20:56:24 +0000 Subject: [PATCH 135/286] Bump actions/checkout to v4 --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index afc960d96..7001a9653 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,7 +4,7 @@ jobs: cppcheck-test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: | sudo apt-get -y update && sudo apt-get install -y cppcheck && \ @@ -12,7 +12,7 @@ jobs: build-test-latest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: | sudo apt-get -y update && sudo apt-get install -y build-essential @@ -24,7 +24,7 @@ jobs: build-test-ubuntu-20_04: runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: | sudo apt-get -y update && sudo apt-get install -y build-essential From da42ebafa9302a8b249e6c78c61903aa4f6a2a5a Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Tue, 5 Nov 2024 16:58:49 +0200 Subject: [PATCH 136/286] Improved iperf_udp_recv() debug messages --- src/iperf_udp.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/iperf_udp.c b/src/iperf_udp.c index 150b8c69e..190548599 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -61,6 +61,7 @@ iperf_udp_recv(struct iperf_stream *sp) int first_packet = 0; double transit = 0, d = 0; struct iperf_time sent_time, arrival_time, temp_time; + struct iperf_test *test = sp->test; r = Nread_no_select(sp->socket, sp->buffer, size, Pudp); @@ -73,7 +74,7 @@ iperf_udp_recv(struct iperf_stream *sp) return r; /* Only count bytes received while we're in the correct state. */ - if (sp->test->state == TEST_RUNNING) { + if (test->state == TEST_RUNNING) { /* * For jitter computation below, it's important to know if this @@ -87,7 +88,7 @@ iperf_udp_recv(struct iperf_stream *sp) sp->result->bytes_received_this_interval += r; /* Dig the various counters out of the incoming UDP packet */ - if (sp->test->udp_counters_64bit) { + if (test->udp_counters_64bit) { memcpy(&sec, sp->buffer, sizeof(sec)); memcpy(&usec, sp->buffer+4, sizeof(usec)); memcpy(&pcount, sp->buffer+8, sizeof(pcount)); @@ -109,7 +110,7 @@ iperf_udp_recv(struct iperf_stream *sp) sent_time.usecs = usec; } - if (sp->test->debug_level >= DEBUG_LEVEL_DEBUG) + if (test->debug_level >= DEBUG_LEVEL_DEBUG) fprintf(stderr, "pcount %" PRIu64 " packet_count %" PRIu64 "\n", pcount, sp->packet_count); /* @@ -131,6 +132,8 @@ iperf_udp_recv(struct iperf_stream *sp) if (pcount > sp->packet_count + 1) { /* There's a gap so count that as a loss. */ sp->cnt_error += (pcount - 1) - sp->packet_count; + if (test->debug_level >= DEBUG_LEVEL_INFO) + fprintf(stderr, "LOST %" PRIu64 " PACKETS - received packet %" PRIu64 " but expected sequence %" PRIu64 " on stream %d\n", (pcount - sp->packet_count + 1), pcount, sp->packet_count + 1, sp->socket); } /* Update the highest sequence number seen so far. */ sp->packet_count = pcount; @@ -152,8 +155,8 @@ iperf_udp_recv(struct iperf_stream *sp) sp->cnt_error--; /* Log the out-of-order packet */ - if (sp->test->debug) - fprintf(stderr, "OUT OF ORDER - incoming packet sequence %" PRIu64 " but expected sequence %" PRIu64 " on stream %d", pcount, sp->packet_count + 1, sp->socket); + if (test->debug_level >= DEBUG_LEVEL_INFO) + fprintf(stderr, "OUT OF ORDER - received packet %" PRIu64 " but expected sequence %" PRIu64 " on stream %d\n", pcount, sp->packet_count + 1, sp->socket); } /* @@ -183,7 +186,7 @@ iperf_udp_recv(struct iperf_stream *sp) sp->jitter += (d - sp->jitter) / 16.0; } else { - if (sp->test->debug) + if (test->debug_level >= DEBUG_LEVEL_INFO) printf("Late receive, state = %d\n", sp->test->state); } From e03c2cc3bf6b1c8f0937e66e56c71bb230006f78 Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Wed, 20 Nov 2024 08:23:02 +0200 Subject: [PATCH 137/286] Changes per reviewer comments - limit omit time to MAX_OMIT_TIME --- src/iperf.h | 1 + src/iperf_api.c | 2 +- src/iperf_error.c | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index f297587d1..539c4a17c 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -447,6 +447,7 @@ struct iperf_test #define MIN_INTERVAL 0.1 #define MAX_INTERVAL 60.0 #define MAX_TIME 86400 +#define MAX_OMIT_TIME 600 #define MAX_BURST 1000 #define MAX_MSS (9 * 1024) #define MAX_STREAMS 128 diff --git a/src/iperf_api.c b/src/iperf_api.c index f5d07084e..c5ac43e27 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -1493,7 +1493,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) break; case 'O': test->omit = atoi(optarg); - if (test->omit < 0 || test->omit > MAX_TIME) { + if (test->omit < 0 || test->omit > MAX_OMIT_TIME) { i_errno = IEOMIT; return -1; } diff --git a/src/iperf_error.c b/src/iperf_error.c index 3388d376e..e06723ba6 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -213,7 +213,7 @@ iperf_strerror(int int_errno) snprintf(errstr, len, "this OS does not support sendfile"); break; case IEOMIT: - snprintf(errstr, len, "bogus value for --omit"); + snprintf(errstr, len, "bogus value for --omit (maximum = %d seconds)", MAX_OMIT_TIME); break; case IEUNIMP: snprintf(errstr, len, "an option you are trying to set is not implemented yet"); From de2456c7627b18e0bf441c159ca919841539bdb6 Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Thu, 21 Nov 2024 10:40:35 +0200 Subject: [PATCH 138/286] Change help to make current -n/-k behavior a feature - end test at the end of the interval --- src/iperf_locale.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/iperf_locale.c b/src/iperf_locale.c index 32883da84..470a5cc7a 100644 --- a/src/iperf_locale.c +++ b/src/iperf_locale.c @@ -170,8 +170,10 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" " bits/sec (Linux only)\n" #endif " -t, --time # time in seconds to transmit for (default %d secs)\n" - " -n, --bytes #[KMG] number of bytes to transmit (instead of -t)\n" - " -k, --blockcount #[KMG] number of blocks (packets) to transmit (instead of -t or -n)\n" + " -n, --bytes #[KMG] transmit until the end of the interval when the client sent or received\n" + " (per direction) at least this number of bytes (instead of -t or -k)\n" + " -k, --blockcount #[KMG] transmit until the end of the interval when the client sent or received\n" + " (per direction) at least this number of blocks (instead of -t or -n)\n" " -l, --length #[KMG] length of buffer to read or write\n" " (default %d KB for TCP, dynamic or %d for UDP)\n" " --cport bind to a specific client port (TCP and UDP, default: ephemeral port)\n" From 53d645d8057d1aefd55f2b984b494d319f5313ad Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Thu, 21 Nov 2024 12:31:02 +0200 Subject: [PATCH 139/286] Do not try to cancell NULL thread --- src/iperf.h | 1 + src/iperf_api.c | 1 + src/iperf_client_api.c | 102 ++++++++++++++++++++++------------------- src/iperf_server_api.c | 32 +++++++------ 4 files changed, 76 insertions(+), 60 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index 7d14a3453..b541d2c8c 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -193,6 +193,7 @@ struct iperf_stream struct iperf_test* test; pthread_t thr; + int thread_created; int done; /* configurable members */ diff --git a/src/iperf_api.c b/src/iperf_api.c index 34f08bc81..7b69fe0c3 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -4498,6 +4498,7 @@ iperf_new_stream(struct iperf_test *test, int s, int sender) memset(sp, 0, sizeof(struct iperf_stream)); + sp->thread_created = 0; sp->sender = sender; sp->test = test; sp->settings = test->settings; diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 67b05cc69..8807541ff 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -715,6 +715,7 @@ iperf_run_client(struct iperf_test * test) i_errno = IEPTHREADCREATE; goto cleanup_and_fail; } + sp->thread_created = 1; if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d created\n", sp->socket); } @@ -753,22 +754,25 @@ iperf_run_client(struct iperf_test * test) if (sp->sender) { int rc; sp->done = 1; - rc = pthread_cancel(sp->thr); - if (rc != 0 && rc != ESRCH) { - i_errno = IEPTHREADCANCEL; - errno = rc; - iperf_err(test, "sender cancel in pthread_cancel - %s", iperf_strerror(i_errno)); - goto cleanup_and_fail; - } - rc = pthread_join(sp->thr, NULL); - if (rc != 0 && rc != ESRCH) { - i_errno = IEPTHREADJOIN; - errno = rc; - iperf_err(test, "sender cancel in pthread_join - %s", iperf_strerror(i_errno)); - goto cleanup_and_fail; - } - if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d stopped\n", sp->socket); + if (sp->thread_created == 1) { + rc = pthread_cancel(sp->thr); + if (rc != 0 && rc != ESRCH) { + i_errno = IEPTHREADCANCEL; + errno = rc; + iperf_err(test, "sender cancel in pthread_cancel - %s", iperf_strerror(i_errno)); + goto cleanup_and_fail; + } + rc = pthread_join(sp->thr, NULL); + if (rc != 0 && rc != ESRCH) { + i_errno = IEPTHREADJOIN; + errno = rc; + iperf_err(test, "sender cancel in pthread_join - %s", iperf_strerror(i_errno)); + goto cleanup_and_fail; + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d stopped\n", sp->socket); + } + sp->thread_created = 0; } } } @@ -791,22 +795,25 @@ iperf_run_client(struct iperf_test * test) if (!sp->sender) { int rc; sp->done = 1; - rc = pthread_cancel(sp->thr); - if (rc != 0 && rc != ESRCH) { - i_errno = IEPTHREADCANCEL; - errno = rc; - iperf_err(test, "receiver cancel in pthread_cancel - %s", iperf_strerror(i_errno)); - goto cleanup_and_fail; - } - rc = pthread_join(sp->thr, NULL); - if (rc != 0 && rc != ESRCH) { - i_errno = IEPTHREADJOIN; - errno = rc; - iperf_err(test, "receiver cancel in pthread_join - %s", iperf_strerror(i_errno)); - goto cleanup_and_fail; - } - if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d stopped\n", sp->socket); + if (sp->thread_created == 1) { + rc = pthread_cancel(sp->thr); + if (rc != 0 && rc != ESRCH) { + i_errno = IEPTHREADCANCEL; + errno = rc; + iperf_err(test, "receiver cancel in pthread_cancel - %s", iperf_strerror(i_errno)); + goto cleanup_and_fail; + } + rc = pthread_join(sp->thr, NULL); + if (rc != 0 && rc != ESRCH) { + i_errno = IEPTHREADJOIN; + errno = rc; + iperf_err(test, "receiver cancel in pthread_join - %s", iperf_strerror(i_errno)); + goto cleanup_and_fail; + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d stopped\n", sp->socket); + } + sp->thread_created = 0; } } } @@ -835,20 +842,23 @@ iperf_run_client(struct iperf_test * test) } sp->done = 1; int rc; - rc = pthread_cancel(sp->thr); - if (rc != 0 && rc != ESRCH) { - i_errno = IEPTHREADCANCEL; - errno = rc; - iperf_err(test, "cleanup_and_fail in pthread_cancel - %s", iperf_strerror(i_errno)); - } - rc = pthread_join(sp->thr, NULL); - if (rc != 0 && rc != ESRCH) { - i_errno = IEPTHREADJOIN; - errno = rc; - iperf_err(test, "cleanup_and_fail in pthread_join - %s", iperf_strerror(i_errno)); - } - if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d stopped\n", sp->socket); + if (sp->thread_created == 1) { + rc = pthread_cancel(sp->thr); + if (rc != 0 && rc != ESRCH) { + i_errno = IEPTHREADCANCEL; + errno = rc; + iperf_err(test, "cleanup_and_fail in pthread_cancel - %s", iperf_strerror(i_errno)); + } + rc = pthread_join(sp->thr, NULL); + if (rc != 0 && rc != ESRCH) { + i_errno = IEPTHREADJOIN; + errno = rc; + iperf_err(test, "cleanup_and_fail in pthread_join - %s", iperf_strerror(i_errno)); + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d stopped\n", sp->socket); + } + sp->thread_created = 0; } } if (test->debug_level >= DEBUG_LEVEL_INFO) { diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 9727cdddb..aa601c3ec 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -448,20 +448,23 @@ cleanup_server(struct iperf_test *test) SLIST_FOREACH(sp, &test->streams, streams) { int rc; sp->done = 1; - rc = pthread_cancel(sp->thr); - if (rc != 0 && rc != ESRCH) { - i_errno = IEPTHREADCANCEL; - errno = rc; - iperf_err(test, "cleanup_server in pthread_cancel - %s", iperf_strerror(i_errno)); - } - rc = pthread_join(sp->thr, NULL); - if (rc != 0 && rc != ESRCH) { - i_errno = IEPTHREADJOIN; - errno = rc; - iperf_err(test, "cleanup_server in pthread_join - %s", iperf_strerror(i_errno)); - } - if (test->debug_level >= DEBUG_LEVEL_INFO) { - iperf_printf(test, "Thread FD %d stopped\n", sp->socket); + if (sp->thread_created == 1) { + rc = pthread_cancel(sp->thr); + if (rc != 0 && rc != ESRCH) { + i_errno = IEPTHREADCANCEL; + errno = rc; + iperf_err(test, "cleanup_server in pthread_cancel - %s", iperf_strerror(i_errno)); + } + rc = pthread_join(sp->thr, NULL); + if (rc != 0 && rc != ESRCH) { + i_errno = IEPTHREADJOIN; + errno = rc; + iperf_err(test, "cleanup_server in pthread_join - %s", iperf_strerror(i_errno)); + } + if (test->debug_level >= DEBUG_LEVEL_INFO) { + iperf_printf(test, "Thread FD %d stopped\n", sp->socket); + } + sp->thread_created = 0; } } i_errno = i_errno_save; @@ -909,6 +912,7 @@ iperf_run_server(struct iperf_test *test) cleanup_server(test); return -1; } + sp->thread_created = 1; if (test->debug_level >= DEBUG_LEVEL_INFO) { iperf_printf(test, "Thread FD %d created\n", sp->socket); } From fa183fd11762266b6bbdbbbeb5a27aa2a4196fb2 Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Fri, 22 Nov 2024 15:42:10 +0200 Subject: [PATCH 140/286] Remove init line per reviewer comment --- src/iperf_api.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index 7b69fe0c3..34f08bc81 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -4498,7 +4498,6 @@ iperf_new_stream(struct iperf_test *test, int s, int sender) memset(sp, 0, sizeof(struct iperf_stream)); - sp->thread_created = 0; sp->sender = sender; sp->test = test; sp->settings = test->settings; From beadb59b90e8d3339d31f9f15525108072fde135 Mon Sep 17 00:00:00 2001 From: Rudi Heitbaum Date: Mon, 9 Dec 2024 10:13:02 +0000 Subject: [PATCH 141/286] fix build with gcc-15 --- src/iperf_api.c | 8 ++++---- src/iperf_api.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index bad0a63ad..901aec301 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -603,25 +603,25 @@ iperf_set_mapped_v4(struct iperf_test *ipt, const int val) } void -iperf_set_on_new_stream_callback(struct iperf_test* ipt, void (*callback)()) +iperf_set_on_new_stream_callback(struct iperf_test* ipt, void (*callback)(struct iperf_stream *)) { ipt->on_new_stream = callback; } void -iperf_set_on_test_start_callback(struct iperf_test* ipt, void (*callback)()) +iperf_set_on_test_start_callback(struct iperf_test* ipt, void (*callback)(struct iperf_test *)) { ipt->on_test_start = callback; } void -iperf_set_on_test_connect_callback(struct iperf_test* ipt, void (*callback)()) +iperf_set_on_test_connect_callback(struct iperf_test* ipt, void (*callback)(struct iperf_test *)) { ipt->on_connect = callback; } void -iperf_set_on_test_finish_callback(struct iperf_test* ipt, void (*callback)()) +iperf_set_on_test_finish_callback(struct iperf_test* ipt, void (*callback)(struct iperf_test *)) { ipt->on_test_finish = callback; } diff --git a/src/iperf_api.h b/src/iperf_api.h index 2b71613e9..5e2519e47 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -213,10 +213,10 @@ void iperf_set_dont_fragment( struct iperf_test* ipt, int dont_fragment ); void iperf_set_test_congestion_control(struct iperf_test* ipt, char* cc); void iperf_set_test_mss(struct iperf_test* ipt, int mss); void iperf_set_mapped_v4(struct iperf_test* ipt, const int val); -void iperf_set_on_new_stream_callback(struct iperf_test* ipt, void (*callback)()); -void iperf_set_on_test_start_callback(struct iperf_test* ipt, void (*callback)()); -void iperf_set_on_test_connect_callback(struct iperf_test* ipt, void (*callback)()); -void iperf_set_on_test_finish_callback(struct iperf_test* ipt, void (*callback)()); +void iperf_set_on_new_stream_callback(struct iperf_test* ipt, void (*callback)(struct iperf_stream *)); +void iperf_set_on_test_start_callback(struct iperf_test* ipt, void (*callback)(struct iperf_test *)); +void iperf_set_on_test_connect_callback(struct iperf_test* ipt, void (*callback)(struct iperf_test *)); +void iperf_set_on_test_finish_callback(struct iperf_test* ipt, void (*callback)(struct iperf_test *)); #if defined(HAVE_SSL) void iperf_set_test_client_username(struct iperf_test *ipt, const char *client_username); From 01888d2e2a133e044e5b3bf6fe2712b4c4b7d510 Mon Sep 17 00:00:00 2001 From: Martin Ottens Date: Wed, 11 Dec 2024 17:18:14 +0100 Subject: [PATCH 142/286] Fix Segfault in iperf_err(exit) --- src/iperf_error.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/iperf_error.c b/src/iperf_error.c index e06723ba6..da24f895a 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -60,6 +60,7 @@ iperf_err(struct iperf_test *test, const char *format, ...) if (test != NULL && test->json_output && test->json_top != NULL) cJSON_AddStringToObject(test->json_top, "error", str); else { + if (test != NULL) if (pthread_mutex_lock(&(test->print_mutex)) != 0) { perror("iperf_err: pthread_mutex_lock"); } @@ -77,6 +78,7 @@ iperf_err(struct iperf_test *test, const char *format, ...) fprintf(stderr, "iperf3: %s\n", str); } + if (test != NULL) if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { perror("iperf_err: pthread_mutex_unlock"); } @@ -111,6 +113,7 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) } iperf_json_finish(test); } else { + if (test != NULL) if (pthread_mutex_lock(&(test->print_mutex)) != 0) { perror("iperf_errexit: pthread_mutex_lock"); } @@ -128,6 +131,7 @@ iperf_errexit(struct iperf_test *test, const char *format, ...) fprintf(stderr, "iperf3: %s\n", str); } + if (test != NULL) if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { perror("iperf_errexit: pthread_mutex_unlock"); } From 3f66f604df7f1038a49108c48612c2f4fe71331f Mon Sep 17 00:00:00 2001 From: Sarah Larsen Date: Fri, 15 Nov 2024 23:23:05 +0000 Subject: [PATCH 143/286] Add a variant of cJSON_GetObjectItem that does type-checking. This avoids a potential server crash with malformed iperf3 parameter sets. (CVE-2024-53580) Vulnerability report submitted by Leonid Krolle Bi.Zone. Original version of fix by @dopheide-esnet. --- src/iperf_api.c | 98 +++++++++++++++++++++++------------------------ src/iperf_error.c | 6 +-- src/iperf_util.c | 38 +++++++++++++++++- src/iperf_util.h | 1 + 4 files changed, 90 insertions(+), 53 deletions(-) diff --git a/src/iperf_api.c b/src/iperf_api.c index bad0a63ad..fa06dc830 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -2347,72 +2347,72 @@ get_parameters(struct iperf_test *test) cJSON_free(str); } - if ((j_p = cJSON_GetObjectItem(j, "tcp")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "tcp", cJSON_True)) != NULL) set_protocol(test, Ptcp); - if ((j_p = cJSON_GetObjectItem(j, "udp")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "udp", cJSON_True)) != NULL) set_protocol(test, Pudp); - if ((j_p = cJSON_GetObjectItem(j, "sctp")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "sctp", cJSON_True)) != NULL) set_protocol(test, Psctp); - if ((j_p = cJSON_GetObjectItem(j, "omit")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "omit", cJSON_Number)) != NULL) test->omit = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "server_affinity")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "server_affinity", cJSON_Number)) != NULL) test->server_affinity = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "time")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "time", cJSON_Number)) != NULL) test->duration = j_p->valueint; test->settings->bytes = 0; - if ((j_p = cJSON_GetObjectItem(j, "num")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "num", cJSON_Number)) != NULL) test->settings->bytes = j_p->valueint; test->settings->blocks = 0; - if ((j_p = cJSON_GetObjectItem(j, "blockcount")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "blockcount", cJSON_Number)) != NULL) test->settings->blocks = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "MSS")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "MSS", cJSON_Number)) != NULL) test->settings->mss = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "nodelay")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "nodelay", cJSON_True)) != NULL) test->no_delay = 1; - if ((j_p = cJSON_GetObjectItem(j, "parallel")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "parallel", cJSON_Number)) != NULL) test->num_streams = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "reverse")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "reverse", cJSON_True)) != NULL) iperf_set_test_reverse(test, 1); - if ((j_p = cJSON_GetObjectItem(j, "bidirectional")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "bidirectional", cJSON_True)) != NULL) iperf_set_test_bidirectional(test, 1); - if ((j_p = cJSON_GetObjectItem(j, "window")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "window", cJSON_Number)) != NULL) test->settings->socket_bufsize = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "len")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "len", cJSON_Number)) != NULL) test->settings->blksize = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "bandwidth")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "bandwidth", cJSON_Number)) != NULL) test->settings->rate = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "fqrate")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "fqrate", cJSON_Number)) != NULL) test->settings->fqrate = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "pacing_timer")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "pacing_timer", cJSON_Number)) != NULL) test->settings->pacing_timer = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "burst")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "burst", cJSON_Number)) != NULL) test->settings->burst = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "TOS")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "TOS", cJSON_Number)) != NULL) test->settings->tos = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "flowlabel")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "flowlabel", cJSON_Number)) != NULL) test->settings->flowlabel = j_p->valueint; - if ((j_p = cJSON_GetObjectItem(j, "title")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "title", cJSON_String)) != NULL) test->title = strdup(j_p->valuestring); - if ((j_p = cJSON_GetObjectItem(j, "extra_data")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "extra_data", cJSON_String)) != NULL) test->extra_data = strdup(j_p->valuestring); - if ((j_p = cJSON_GetObjectItem(j, "congestion")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "congestion", cJSON_String)) != NULL) test->congestion = strdup(j_p->valuestring); - if ((j_p = cJSON_GetObjectItem(j, "congestion_used")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "congestion_used", cJSON_String)) != NULL) test->congestion_used = strdup(j_p->valuestring); - if ((j_p = cJSON_GetObjectItem(j, "get_server_output")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "get_server_output", cJSON_Number)) != NULL) iperf_set_test_get_server_output(test, 1); - if ((j_p = cJSON_GetObjectItem(j, "udp_counters_64bit")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "udp_counters_64bit", cJSON_Number)) != NULL) iperf_set_test_udp_counters_64bit(test, 1); - if ((j_p = cJSON_GetObjectItem(j, "repeating_payload")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "repeating_payload", cJSON_Number)) != NULL) test->repeating_payload = 1; - if ((j_p = cJSON_GetObjectItem(j, "zerocopy")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "zerocopy", cJSON_Number)) != NULL) test->zerocopy = j_p->valueint; #if defined(HAVE_DONT_FRAGMENT) - if ((j_p = cJSON_GetObjectItem(j, "dont_fragment")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "dont_fragment", cJSON_Number)) != NULL) test->settings->dont_fragment = j_p->valueint; #endif /* HAVE_DONT_FRAGMENT */ #if defined(HAVE_SSL) - if ((j_p = cJSON_GetObjectItem(j, "authtoken")) != NULL) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "authtoken", cJSON_String)) != NULL) test->settings->authtoken = strdup(j_p->valuestring); #endif //HAVE_SSL if (test->mode && test->protocol->id == Ptcp && has_tcpinfo_retransmits()) @@ -2571,10 +2571,10 @@ get_results(struct iperf_test *test) i_errno = IERECVRESULTS; r = -1; } else { - j_cpu_util_total = cJSON_GetObjectItem(j, "cpu_util_total"); - j_cpu_util_user = cJSON_GetObjectItem(j, "cpu_util_user"); - j_cpu_util_system = cJSON_GetObjectItem(j, "cpu_util_system"); - j_sender_has_retransmits = cJSON_GetObjectItem(j, "sender_has_retransmits"); + j_cpu_util_total = iperf_cJSON_GetObjectItemType(j, "cpu_util_total", cJSON_Number); + j_cpu_util_user = iperf_cJSON_GetObjectItemType(j, "cpu_util_user", cJSON_Number); + j_cpu_util_system = iperf_cJSON_GetObjectItemType(j, "cpu_util_system", cJSON_Number); + j_sender_has_retransmits = iperf_cJSON_GetObjectItemType(j, "sender_has_retransmits", cJSON_Number); if (j_cpu_util_total == NULL || j_cpu_util_user == NULL || j_cpu_util_system == NULL || j_sender_has_retransmits == NULL) { i_errno = IERECVRESULTS; r = -1; @@ -2596,7 +2596,7 @@ get_results(struct iperf_test *test) else if ( test->mode == BIDIRECTIONAL ) test->other_side_has_retransmits = result_has_retransmits; - j_streams = cJSON_GetObjectItem(j, "streams"); + j_streams = iperf_cJSON_GetObjectItemType(j, "streams", cJSON_Array); if (j_streams == NULL) { i_errno = IERECVRESULTS; r = -1; @@ -2608,16 +2608,16 @@ get_results(struct iperf_test *test) i_errno = IERECVRESULTS; r = -1; } else { - j_id = cJSON_GetObjectItem(j_stream, "id"); - j_bytes = cJSON_GetObjectItem(j_stream, "bytes"); - j_retransmits = cJSON_GetObjectItem(j_stream, "retransmits"); - j_jitter = cJSON_GetObjectItem(j_stream, "jitter"); - j_errors = cJSON_GetObjectItem(j_stream, "errors"); - j_omitted_errors = cJSON_GetObjectItem(j_stream, "omitted_errors"); - j_packets = cJSON_GetObjectItem(j_stream, "packets"); - j_omitted_packets = cJSON_GetObjectItem(j_stream, "omitted_packets"); - j_start_time = cJSON_GetObjectItem(j_stream, "start_time"); - j_end_time = cJSON_GetObjectItem(j_stream, "end_time"); + j_id = iperf_cJSON_GetObjectItemType(j_stream, "id", cJSON_Number); + j_bytes = iperf_cJSON_GetObjectItemType(j_stream, "bytes", cJSON_Number); + j_retransmits = iperf_cJSON_GetObjectItemType(j_stream, "retransmits", cJSON_Number); + j_jitter = iperf_cJSON_GetObjectItemType(j_stream, "jitter", cJSON_Number); + j_errors = iperf_cJSON_GetObjectItemType(j_stream, "errors", cJSON_Number); + j_omitted_errors = iperf_cJSON_GetObjectItemType(j_stream, "omitted_errors", cJSON_Number); + j_packets = iperf_cJSON_GetObjectItemType(j_stream, "packets", cJSON_Number); + j_omitted_packets = iperf_cJSON_GetObjectItemType(j_stream, "omitted_packets", cJSON_Number); + j_start_time = iperf_cJSON_GetObjectItemType(j_stream, "start_time", cJSON_Number); + j_end_time = iperf_cJSON_GetObjectItemType(j_stream, "end_time", cJSON_Number); if (j_id == NULL || j_bytes == NULL || j_retransmits == NULL || j_jitter == NULL || j_errors == NULL || j_packets == NULL) { i_errno = IERECVRESULTS; r = -1; @@ -2706,7 +2706,7 @@ get_results(struct iperf_test *test) } else { /* No JSON, look for textual output. Make a copy of the text for later. */ - j_server_output = cJSON_GetObjectItem(j, "server_output_text"); + j_server_output = iperf_cJSON_GetObjectItemType(j, "server_output_text", cJSON_String); if (j_server_output != NULL) { test->server_output_text = strdup(j_server_output->valuestring); } @@ -2715,7 +2715,7 @@ get_results(struct iperf_test *test) } } - j_remote_congestion_used = cJSON_GetObjectItem(j, "congestion_used"); + j_remote_congestion_used = iperf_cJSON_GetObjectItemType(j, "congestion_used", cJSON_String); if (j_remote_congestion_used != NULL) { test->remote_congestion_used = strdup(j_remote_congestion_used->valuestring); } @@ -4960,7 +4960,7 @@ iperf_json_finish(struct iperf_test *test) /* --json-stream, so we print various individual objects */ if (test->json_stream) { - cJSON *error = cJSON_GetObjectItem(test->json_top, "error"); + cJSON *error = iperf_cJSON_GetObjectItemType(test->json_top, "error", cJSON_String); if (error) { JSONStream_Output(test, "error", error); } diff --git a/src/iperf_error.c b/src/iperf_error.c index e06723ba6..fede216bc 100644 --- a/src/iperf_error.c +++ b/src/iperf_error.c @@ -60,11 +60,11 @@ iperf_err(struct iperf_test *test, const char *format, ...) if (test != NULL && test->json_output && test->json_top != NULL) cJSON_AddStringToObject(test->json_top, "error", str); else { - if (pthread_mutex_lock(&(test->print_mutex)) != 0) { + if (test != NULL && pthread_mutex_lock(&(test->print_mutex)) != 0) { perror("iperf_err: pthread_mutex_lock"); } - if (test && test->outfile && test->outfile != stdout) { + if (test != NULL && test->outfile != NULL && test->outfile != stdout) { if (ct) { fprintf(test->outfile, "%s", ct); } @@ -77,7 +77,7 @@ iperf_err(struct iperf_test *test, const char *format, ...) fprintf(stderr, "iperf3: %s\n", str); } - if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { + if (test != NULL && pthread_mutex_unlock(&(test->print_mutex)) != 0) { perror("iperf_err: pthread_mutex_unlock"); } diff --git a/src/iperf_util.c b/src/iperf_util.c index 3d0c7831b..b5c661bbc 100644 --- a/src/iperf_util.c +++ b/src/iperf_util.c @@ -430,6 +430,42 @@ iperf_json_printf(const char *format, ...) return o; } +/********************** cJSON GetObjectItem w/ Type Helper ********************/ +cJSON * iperf_cJSON_GetObjectItemType(cJSON * j, char * item_string, int expected_type){ + cJSON *j_p; + if((j_p = cJSON_GetObjectItem(j, item_string)) != NULL) + switch(expected_type){ + case cJSON_True: + if(cJSON_IsBool(j_p)) + return j_p; + else + iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string); + break; + case cJSON_String: + if(cJSON_IsString(j_p)) + return j_p; + else + iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string); + break; + case cJSON_Number: + if(cJSON_IsNumber(j_p)) + return j_p; + else + iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string); + break; + case cJSON_Array: + if(cJSON_IsArray(j_p)) + return j_p; + else + iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string); + break; + default: + iperf_err(NULL, "unsupported type"); + } + + return NULL; +} + /* Debugging routine to dump out an fd_set. */ void iperf_dump_fdset(FILE *fp, const char *str, int nfds, fd_set *fds) @@ -621,4 +657,4 @@ state_to_text(signed char state) } return txt; -} \ No newline at end of file +} diff --git a/src/iperf_util.h b/src/iperf_util.h index a371cfcaa..02b280ec5 100644 --- a/src/iperf_util.h +++ b/src/iperf_util.h @@ -53,6 +53,7 @@ const char* get_system_info(void); const char* get_optional_features(void); cJSON* iperf_json_printf(const char *format, ...); +cJSON * iperf_cJSON_GetObjectItemType(cJSON * j_p, char * item_string, int expected_type); void iperf_dump_fdset(FILE *fp, const char *str, int nfds, fd_set *fds); From e68dad6a3e5e1264932362ff4e2334528e0a0492 Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 13 Dec 2024 16:08:59 -0800 Subject: [PATCH 144/286] Update release notes and version numbers for iperf-3.18. --- RELNOTES.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 2 +- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/RELNOTES.md b/RELNOTES.md index e5b1275c5..62b98d64c 100644 --- a/RELNOTES.md +++ b/RELNOTES.md @@ -1,6 +1,68 @@ iperf3 Release Notes ==================== +iperf-3.18 2024-12-13 +--------------------- + +* Notable user-visible changes + + * SECURITY NOTE: Thanks to Leonid Krolle Bi.Zone for discovering a + JSON type security vulnerability that caused a + segmentation fault in the + server. (CVE-2024-53580) This has now been + fixed. (PR#1810) + + * UDP packets per second now reports the correct number of + packets, by reporting NET_SOFTERROR if there's a EAGAIN/EINTR + errno if no data was sent (#1367/PR#1379). + + * Several segmentation faults related to threading were fixed. One + where `pthread_cancel` was called on an improperly initialized + thread (#1801), another where threads were being recycled + (#1760/PR#1761), and another where threads were improperly + handling signals (#1750/PR#1752). + + * A segmentation fault from calling `freeaddrinfo` with `NULL` was + fixed (PR#1755). + + * Some JSON options were fixed, including checking the size for + `json_read` (PR#1709), but the size limit was removed for + received server output (PR#1779). + + * A rcv-timeout error has been fixed. The Nread timeout was + hardcoded and timed out before the `--rcv-timeout` option + (PR#1744). + + * There is no longer a limit on the omit time period + (#1770/PR#1774). + + * Fixed an output crash under 32-bit big-endian systems (PR#1713). + + * An issue was fixed where CPU utilization was unexpectedly high + during limited baud rate tests. The `--pacing-timer` option was + removed, but it is still available in the library + (#1741/PR#1743). + + * Add SCTP information to `--json` output and fixed compile error + when SCTP is not supported (#1731). + + * `--fq-rate` was changed from a uint to a uint64 to allow pacing above + 32G. Not yet tested on big-endian systems (PR#1728). + +* Notable developer-visible changes + + * Clang compilation failure on Android were fixed (PR#1687). + + * `iperf_time_add()` was optimizated to improve performance + (PR#1742). + + * Debug messages were added when the state changes (PR#1734). + + * To increase performance, the old UDP `prot_listener` is cleared + and removed after each test (PR#1708). + + * A file descriptor leak was closed (PR#1619). + iperf-3.17.1 2024-05-13 ----------------------- diff --git a/configure.ac b/configure.ac index 073d07dcc..66c1e97a5 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ # Initialize the autoconf system for the specified tool, version and mailing list AC_PREREQ([2.71]) -AC_INIT([iperf],[3.17.1+],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) +AC_INIT([iperf],[3.18],[https://github.com/esnet/iperf],[iperf],[https://software.es.net/iperf/]) m4_include([config/ax_check_openssl.m4]) m4_include([config/ax_pthread.m4]) m4_include([config/iperf_config_static_bin.m4]) From 2a2984488d6de8f7a2d1f5938e03ca7be57e227c Mon Sep 17 00:00:00 2001 From: "Bruce A. Mah" Date: Fri, 13 Dec 2024 16:09:39 -0800 Subject: [PATCH 145/286] Regen. --- aclocal.m4 | 582 ++++++++++++--------- config/ltmain.sh | 736 ++++++++++++++------------ configure | 1279 ++++++++++++++++++++++++++++++++++------------ 3 files changed, 1715 insertions(+), 882 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index 37e331823..8abca2297 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -22,7 +22,7 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # -# Copyright (C) 1996-2001, 2003-2019, 2021-2022 Free Software +# Copyright (C) 1996-2001, 2003-2019, 2021-2024 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # @@ -31,13 +31,13 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl -# Copyright (C) 2014 Free Software Foundation, Inc. +# Copyright (C) 2024 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of of the License, or +# the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you @@ -54,7 +54,7 @@ m4_define([_LT_COPYING], [dnl # along with this program. If not, see . ]) -# serial 59 LT_INIT +# serial 63 LT_INIT # LT_PREREQ(VERSION) @@ -82,7 +82,7 @@ esac # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], -[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +[AC_PREREQ([2.64])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl @@ -632,7 +632,7 @@ m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before -# AC_OUTPUT is called), incase it is used in configure for compilation +# AC_OUTPUT is called), in case it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} @@ -667,9 +667,9 @@ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. -Copyright (C) 2011 Free Software Foundation, Inc. +Copyright (C) 2024 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." +gives unlimited permission to copy, distribute and modify it." while test 0 != $[#] do @@ -746,7 +746,6 @@ _LT_CONFIG_SAVE_COMMANDS([ cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. @@ -989,6 +988,7 @@ _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE + # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ @@ -1039,6 +1039,21 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ rm -f conftest.* fi]) + # Feature test to disable chained fixups since it is not + # compatible with '-undefined dynamic_lookup' + AC_CACHE_CHECK([for -no_fixup_chains linker flag], + [lt_cv_support_no_fixup_chains], + [ save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-no_fixup_chains" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([],[])], + lt_cv_support_no_fixup_chains=yes, + lt_cv_support_no_fixup_chains=no + ) + LDFLAGS=$save_LDFLAGS + ] + ) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no @@ -1063,7 +1078,7 @@ _LT_EOF echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF -int main() { return 0;} +int main(void) { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err @@ -1088,13 +1103,32 @@ _LT_EOF 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; *) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' + if test yes = "$lt_cv_support_no_fixup_chains"; then + AS_VAR_APPEND([_lt_dar_allow_undefined], [' $wl-no_fixup_chains']) + fi + ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi + _lt_dar_needs_single_mod=no + case $host_os in + rhapsody* | darwin1.*) + _lt_dar_needs_single_mod=yes ;; + darwin*) + # When targeting Mac OS X 10.4 (darwin 8) or later, + # -single_module is the default and -multi_module is unsupported. + # The toolchain on macOS 10.14 (darwin 18) and later cannot + # target any OS version that needs -single_module. + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*-darwin[[567]].*|10.[[0-3]],*-darwin[[5-9]].*|10.[[0-3]],*-darwin1[[0-7]].*) + _lt_dar_needs_single_mod=yes ;; + esac + ;; + esac if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else @@ -1140,7 +1174,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], -[ if test yes != "$lt_cv_apple_cc_single_mod"; then +[ if test yes = "$_lt_dar_needs_single_mod" -a yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi @@ -1270,7 +1304,9 @@ lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` + # Trim trailing / since we'll always append absolute paths and we want + # to avoid //, if only for less confusing output for the user. + lt_sysroot=`$CC --print-sysroot 2>/dev/null | $SED 's:/\+$::'` fi ;; #( /*) @@ -1382,7 +1418,7 @@ mips64*-*linux*) ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) +s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when @@ -1397,7 +1433,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; - x86_64-*linux*) + x86_64-*linux*|x86_64-gnu*) case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" @@ -1426,7 +1462,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; - x86_64-*linux*) + x86_64-*linux*|x86_64-gnu*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) @@ -1509,7 +1545,7 @@ _LT_DECL([], [AR], [1], [The archiver]) # Use ARFLAGS variable as AR's operation code to sync the variable naming with # Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have -# higher priority because thats what people were doing historically (setting +# higher priority because that's what people were doing historically (setting # ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS # variable obsoleted/removed. @@ -1559,7 +1595,7 @@ AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) -AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_REQUIRE([AC_PROG_RANLIB]) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) @@ -1570,15 +1606,8 @@ old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then - case $host_os in - bitrig* | openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in @@ -1710,14 +1739,14 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. + gnu* | ironclad*) + # Under GNU Hurd and Ironclad, this test is not required because there + # is no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; - cygwin* | mingw* | cegcc*) + cygwin* | mingw* | windows* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, @@ -1739,7 +1768,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=8192; ;; - bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) + darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` @@ -1899,11 +1928,11 @@ else /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); +int fnord (void) __attribute__((visibility("default"))); #endif -int fnord () { return 42; } -int main () +int fnord (void) { return 42; } +int main (void) { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; @@ -1960,7 +1989,7 @@ else lt_cv_dlopen_self=yes ;; - mingw* | pw32* | cegcc*) + mingw* | windows* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; @@ -2328,7 +2357,7 @@ if test yes = "$GCC"; then *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in - mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + mingw* | windows* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` @@ -2386,7 +2415,7 @@ BEGIN {RS = " "; FS = "/|\n";} { # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + mingw* | windows* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` @@ -2461,7 +2490,7 @@ aix[[4-9]]*) # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl - # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the @@ -2555,7 +2584,7 @@ bsdi[[45]]*) # libtool to hard-code these into programs ;; -cygwin* | mingw* | pw32* | cegcc*) +cygwin* | mingw* | windows* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no @@ -2566,15 +2595,29 @@ cygwin* | mingw* | pw32* | cegcc*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' + # If user builds GCC with multilib enabled, + # it should just install on $(libdir) + # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. + if test xyes = x"$multilib"; then + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + $install_prog $dir/$dlname $destdir/$dlname~ + chmod a+x $destdir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib $destdir/$dlname'\'' || exit \$?; + fi' + else + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + fi postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' @@ -2587,7 +2630,7 @@ cygwin* | mingw* | pw32* | cegcc*) m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; - mingw* | cegcc*) + mingw* | windows* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; @@ -2606,7 +2649,7 @@ m4_if([$1], [],[ library_names_spec='$libname.dll.lib' case $build_os in - mingw*) + mingw* | windows*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' @@ -2713,7 +2756,21 @@ freebsd* | dragonfly* | midnightbsd*) need_version=yes ;; esac - shlibpath_var=LD_LIBRARY_PATH + case $host_cpu in + powerpc64) + # On FreeBSD bi-arch platforms, a different variable is used for 32-bit + # binaries. See . + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE( + [[int test_pointer_size[sizeof (void *) - 5]; + ]])], + [shlibpath_var=LD_LIBRARY_PATH], + [shlibpath_var=LD_32_LIBRARY_PATH]) + ;; + *) + shlibpath_var=LD_LIBRARY_PATH + ;; + esac case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes @@ -2743,8 +2800,9 @@ haiku*) soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes + sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib' + sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib' + hardcode_into_libs=no ;; hpux9* | hpux10* | hpux11*) @@ -2854,7 +2912,7 @@ linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no - library_names_spec='$libname$release$shared_ext' + library_names_spec='$libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH @@ -2866,8 +2924,9 @@ linux*android*) hardcode_into_libs=yes dynamic_linker='Android linker' - # Don't embed -rpath directories since the linker doesn't support them. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + # -rpath works at least for libraries that are not overridden by + # libraries installed in system locations. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; # This must be glibc/ELF. @@ -2901,7 +2960,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) # before this can be enabled. hardcode_into_libs=yes - # Ideally, we could use ldconfig to report *all* directores which are + # Ideally, we could use ldconfig to report *all* directories which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, @@ -2921,6 +2980,18 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) dynamic_linker='GNU/Linux ld.so' ;; +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + netbsd*) version_type=sunos need_lib_prefix=no @@ -2939,6 +3010,18 @@ netbsd*) hardcode_into_libs=yes ;; +*-mlibc) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='mlibc ld.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' @@ -2958,7 +3041,7 @@ newsos6) dynamic_linker='ldqnx.so' ;; -openbsd* | bitrig*) +openbsd*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no @@ -3018,6 +3101,17 @@ rdos*) dynamic_linker=no ;; +serenity*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + dynamic_linker='SerenityOS LibELF' + ;; + solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no @@ -3115,6 +3209,21 @@ uts4*) shlibpath_var=LD_LIBRARY_PATH ;; +emscripten*) + version_type=none + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + dynamic_linker="Emscripten linker" + _LT_COMPILER_PIC($1)='-fPIC' + _LT_TAGVAR(archive_cmds, $1)='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(no_undefined_flag, $1)= + ;; + *) dynamic_linker=no ;; @@ -3290,7 +3399,7 @@ if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in - *-*-mingw*) + *-*-mingw* | *-*-windows*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) @@ -3399,7 +3508,7 @@ case $reload_flag in esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi @@ -3471,7 +3580,6 @@ lt_cv_deplibs_check_method='unknown' # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure @@ -3498,7 +3606,7 @@ cygwin*) lt_cv_file_magic_cmd='func_win32_libid' ;; -mingw* | pw32*) +mingw* | windows* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. @@ -3507,7 +3615,7 @@ mingw* | pw32*) lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; @@ -3580,7 +3688,11 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; -netbsd*) +*-mlibc) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else @@ -3598,7 +3710,7 @@ newos6*) lt_cv_deplibs_check_method=pass_all ;; -openbsd* | bitrig*) +openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else @@ -3614,6 +3726,10 @@ rdos*) lt_cv_deplibs_check_method=pass_all ;; +serenity*) + lt_cv_deplibs_check_method=pass_all + ;; + solaris*) lt_cv_deplibs_check_method=pass_all ;; @@ -3662,7 +3778,7 @@ file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in - mingw* | pw32*) + mingw* | windows* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else @@ -3714,7 +3830,7 @@ else # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in - mingw*) lt_bad_file=conftest.nm/nofile ;; + mingw* | windows*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in @@ -3805,7 +3921,7 @@ lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in -cygwin* | mingw* | pw32* | cegcc*) +cygwin* | mingw* | windows* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in @@ -3837,16 +3953,16 @@ _LT_DECL([], [sharedlib_from_linklib_cmd], [1], m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], - [lt_cv_path_mainfest_tool=no +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_manifest_tool], + [lt_cv_path_manifest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes + lt_cv_path_manifest_tool=yes fi rm -f conftest*]) -if test yes != "$lt_cv_path_mainfest_tool"; then +if test yes != "$lt_cv_path_manifest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl @@ -3875,7 +3991,7 @@ AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-mingw* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) @@ -3950,7 +4066,7 @@ case $host_os in aix*) symcode='[[BCDT]]' ;; -cygwin* | mingw* | pw32* | cegcc*) +cygwin* | mingw* | windows* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) @@ -3965,7 +4081,7 @@ osf*) symcode='[[BCDEGQRST]]' ;; solaris*) - symcode='[[BDRT]]' + symcode='[[BCDRT]]' ;; sco3.2v5*) symcode='[[DT]]' @@ -4029,7 +4145,7 @@ $lt_c_name_lib_hook\ # Handle CRLF in mingw tool chain opt_cr= case $build_os in -mingw*) +mingw* | windows*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac @@ -4080,13 +4196,14 @@ void nm_test_func(void){} #ifdef __cplusplus } #endif -int main(){nm_test_var='a';nm_test_func();return(0);} +int main(void){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD + if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -4256,7 +4373,7 @@ m4_if([$1], [CXX], [ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) + mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style @@ -4332,7 +4449,7 @@ m4_if([$1], [CXX], [ ;; esac ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) + mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], @@ -4458,7 +4575,9 @@ m4_if([$1], [CXX], [ ;; esac ;; - netbsd*) + netbsd* | netbsdelf*-gnu) + ;; + *-mlibc) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise @@ -4488,6 +4607,8 @@ m4_if([$1], [CXX], [ ;; psos*) ;; + serenity*) + ;; solaris*) case $cc_basename in CC* | sunCC*) @@ -4580,7 +4701,7 @@ m4_if([$1], [CXX], [ # PIC is the default for these OSes. ;; - mingw* | cygwin* | pw32* | os2* | cegcc*) + mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style @@ -4684,7 +4805,7 @@ m4_if([$1], [CXX], [ esac ;; - mingw* | cygwin* | pw32* | os2* | cegcc*) + mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], @@ -4726,6 +4847,12 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; + *flang* | ftn | f18* | f95*) + # Flang compiler. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) @@ -4808,6 +4935,12 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; + *-mlibc) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. @@ -4824,6 +4957,9 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; + serenity*) + ;; + solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' @@ -4959,7 +5095,7 @@ m4_if([$1], [CXX], [ pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; - cygwin* | mingw* | cegcc*) + cygwin* | mingw* | windows* | cegcc*) case $cc_basename in cl* | icl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' @@ -5017,7 +5153,7 @@ dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. @@ -5029,9 +5165,6 @@ dnl Note also adjust exclude_expsyms for C++ above. # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; - openbsd* | bitrig*) - with_gnu_ld=no - ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes @@ -5132,7 +5265,7 @@ _LT_EOF fi ;; - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' @@ -5142,6 +5275,7 @@ _LT_EOF _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + _LT_TAGVAR(file_list_spec, $1)='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' @@ -5161,7 +5295,7 @@ _LT_EOF haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=no ;; os2*) @@ -5188,7 +5322,7 @@ _LT_EOF cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; @@ -5267,6 +5401,7 @@ _LT_EOF case $cc_basename in tcc*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) @@ -5287,7 +5422,12 @@ _LT_EOF fi ;; - netbsd*) + *-mlibc) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + + netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= @@ -5589,7 +5729,7 @@ _LT_EOF _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is @@ -5606,14 +5746,14 @@ _LT_EOF # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_cmds, $1)='$CC -Fe$output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' @@ -5825,11 +5965,15 @@ _LT_EOF # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; esac ;; - netbsd*) + *-mlibc) + ;; + + netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else @@ -5851,7 +5995,7 @@ _LT_EOF *nto* | *qnx*) ;; - openbsd* | bitrig*) + openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no @@ -5894,7 +6038,7 @@ _LT_EOF cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; @@ -5930,6 +6074,9 @@ _LT_EOF _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; + serenity*) + ;; + solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then @@ -6188,7 +6335,7 @@ _LT_TAGDECL([], [hardcode_direct], [0], _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting $shlibpath_var if the + "absolute", i.e. impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR @@ -6246,7 +6393,7 @@ _LT_TAGVAR(objext, $1)=$objext lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' +lt_simple_link_test_code='int main(void){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other @@ -6431,8 +6578,7 @@ if test yes != "$_lt_caught_CXX_error"; then wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= @@ -6452,7 +6598,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' else GXX=no @@ -6661,7 +6807,7 @@ if test yes != "$_lt_caught_CXX_error"; then esac ;; - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl* | ,icl* | no,icl*) # Native MSVC or ICC @@ -6714,6 +6860,7 @@ if test yes != "$_lt_caught_CXX_error"; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' @@ -6760,7 +6907,7 @@ if test yes != "$_lt_caught_CXX_error"; then cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; @@ -6801,7 +6948,7 @@ if test yes != "$_lt_caught_CXX_error"; then haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=no ;; hpux9*) @@ -6828,7 +6975,7 @@ if test yes != "$_lt_caught_CXX_error"; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "[[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then @@ -6893,7 +7040,7 @@ if test yes != "$_lt_caught_CXX_error"; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " [[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then @@ -7125,6 +7272,10 @@ if test yes != "$_lt_caught_CXX_error"; then esac ;; + *-mlibc) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' @@ -7141,7 +7292,7 @@ if test yes != "$_lt_caught_CXX_error"; then _LT_TAGVAR(ld_shlibs, $1)=yes ;; - openbsd* | bitrig*) + openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no @@ -7232,7 +7383,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' else # FIXME: insert proper C++ library support @@ -7247,6 +7398,9 @@ if test yes != "$_lt_caught_CXX_error"; then _LT_TAGVAR(ld_shlibs, $1)=no ;; + serenity*) + ;; + sunos4*) case $cc_basename in CC*) @@ -7316,7 +7470,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. @@ -7327,7 +7481,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' @@ -7565,10 +7719,11 @@ if AC_TRY_EVAL(ac_compile); then case $prev$p in -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. + # Some compilers place space between "-{L,R,l}" and the path. # Remove the space. - if test x-L = "$p" || - test x-R = "$p"; then + if test x-L = x"$p" || + test x-R = x"$p" || + test x-l = x"$p"; then prev=$p continue fi @@ -8218,7 +8373,7 @@ AC_SUBST([DLLTOOL]) # ---------------- # Check for a file(cmd) program that can be used to detect file type and magic m4_defun([_LT_DECL_FILECMD], -[AC_CHECK_TOOL([FILECMD], [file], [:]) +[AC_CHECK_PROG([FILECMD], [file], [file], [:]) _LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types]) ])# _LD_DECL_FILECMD @@ -8234,71 +8389,6 @@ _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED - -m4_ifndef([AC_PROG_SED], [ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # - -m4_defun([AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -IFS=$as_save_IFS -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f "$lt_ac_sed" && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test 10 -lt "$lt_ac_count" && break - lt_ac_count=`expr $lt_ac_count + 1` - if test "$lt_ac_count" -gt "$lt_ac_max"; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -]) -SED=$lt_cv_path_SED -AC_SUBST([SED]) -AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) @@ -8345,7 +8435,7 @@ AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in - *-*-mingw* ) # actually msys + *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) @@ -8358,7 +8448,7 @@ AC_CACHE_VAL(lt_cv_to_host_file_cmd, ;; *-*-cygwin* ) case $build in - *-*-mingw* ) # actually msys + *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) @@ -8384,9 +8474,9 @@ AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in - *-*-mingw* ) + *-*-mingw* | *-*-windows* ) case $build in - *-*-mingw* ) # actually msys + *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac @@ -8401,7 +8491,7 @@ _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], # Helper functions for option handling. -*- Autoconf -*- # -# Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2022 Free +# Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2024 Free # Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # @@ -8409,7 +8499,7 @@ _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. -# serial 8 ltoptions.m4 +# serial 10 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) @@ -8526,7 +8616,7 @@ LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) +*-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) @@ -8721,29 +8811,39 @@ dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- -# implement the --with-aix-soname flag, and support the `aix-soname=aix' -# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT -# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +# implement the --enable-aix-soname configure option, and support the +# `aix-soname=aix' and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. +# DEFAULT is either `aix', `both', or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) - AC_ARG_WITH([aix-soname], - [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + AC_ARG_ENABLE([aix-soname], + [AS_HELP_STRING([--enable-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], - [case $withval in - aix|svr4|both) - ;; - *) - AC_MSG_ERROR([Unknown argument to --with-aix-soname]) - ;; - esac - lt_cv_with_aix_soname=$with_aix_soname], - [AC_CACHE_VAL([lt_cv_with_aix_soname], - [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) - with_aix_soname=$lt_cv_with_aix_soname]) + [case $enableval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --enable-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$enable_aix_soname], + [_AC_ENABLE_IF([with], [aix-soname], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)]) + enable_aix_soname=$lt_cv_with_aix_soname]) + with_aix_soname=$enable_aix_soname AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member @@ -8774,30 +8874,50 @@ LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- -# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# implement the --enable-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], +[AC_ARG_ENABLE([pic], + [AS_HELP_STRING([--enable-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for lt_pkg in $withval; do - IFS=$lt_save_ifs - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS=$lt_save_ifs - ;; - esac], - [pic_mode=m4_default([$1], [default])]) + case $enableval in + yes|no) pic_mode=$enableval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [dnl Continue to support --with-pic and --without-pic, for backward + dnl compatibility. + _AC_ENABLE_IF([with], [pic], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])])] + ) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC @@ -8833,7 +8953,7 @@ LT_OPTION_DEFINE([LTDL_INIT], [convenience], # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2022 Free Software +# Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2024 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # @@ -8958,7 +9078,7 @@ m4_define([lt_dict_filter], # ltversion.m4 -- version numbers -*- Autoconf -*- # -# Copyright (C) 2004, 2011-2019, 2021-2022 Free Software Foundation, +# Copyright (C) 2004, 2011-2019, 2021-2024 Free Software Foundation, # Inc. # Written by Scott James Remnant, 2004 # @@ -8968,22 +9088,22 @@ m4_define([lt_dict_filter], # @configure_input@ -# serial 4245 ltversion.m4 +# serial 4441 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.4.7]) -m4_define([LT_PACKAGE_REVISION], [2.4.7]) +m4_define([LT_PACKAGE_VERSION], [2.5.4]) +m4_define([LT_PACKAGE_REVISION], [2.5.4]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.7' -macro_revision='2.4.7' +[macro_version='2.5.4' +macro_revision='2.5.4' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # -# Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 Free +# Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2024 Free # Software Foundation, Inc. # Written by Scott James Remnant, 2004. # diff --git a/config/ltmain.sh b/config/ltmain.sh index 2a50d7f6f..3e6a3db3a 100644 --- a/config/ltmain.sh +++ b/config/ltmain.sh @@ -2,11 +2,11 @@ ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2019-02-19.15 -# libtool (GNU libtool) 2.4.7 +# libtool (GNU libtool) 2.5.4 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 -# Copyright (C) 1996-2019, 2021-2022 Free Software Foundation, Inc. +# Copyright (C) 1996-2019, 2021-2024 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -31,8 +31,8 @@ PROGRAM=libtool PACKAGE=libtool -VERSION=2.4.7 -package_revision=2.4.7 +VERSION=2.5.4 +package_revision=2.5.4 ## ------ ## @@ -72,11 +72,11 @@ scriptversion=2019-02-19.15; # UTC # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # -# Copyright (C) 2004-2019, 2021 Bootstrap Authors +# Copyright (C) 2004-2019, 2021, 2023-2024 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license -# , and GPL version 2 or later -# . You must apply one of +# , and GPL version 2 or later +# . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. @@ -143,7 +143,7 @@ nl=' ' IFS="$sp $nl" -# There are apparently some retarded systems that use ';' as a PATH separator! +# There are apparently some systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { @@ -589,7 +589,7 @@ func_require_term_colors () # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is - # useable or anything else if it does not work. + # usable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes @@ -739,7 +739,7 @@ eval 'func_dirname () # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. -# value retuned in "$func_basename_result" +# value returned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () @@ -897,7 +897,7 @@ func_mkdir_p () # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. + # list in case some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done @@ -1536,11 +1536,11 @@ func_lt_ver () # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # -# Copyright (C) 2010-2019, 2021 Bootstrap Authors +# Copyright (C) 2010-2019, 2021, 2023-2024 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license -# , and GPL version 2 or later -# . You must apply one of +# , and GPL version 2 or later +# . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. @@ -2215,7 +2215,30 @@ func_version () # End: # Set a version string. -scriptversion='(GNU libtool) 2.4.7' +scriptversion='(GNU libtool) 2.5.4' + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + year=`date +%Y` + + cat < +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Originally written by Gordon Matzigkeit, 1996 +(See AUTHORS for complete contributor listing) +EOF + + exit $? +} # func_echo ARG... @@ -2238,18 +2261,6 @@ func_echo () } -# func_warning ARG... -# ------------------- -# Libtool warnings are not categorized, so override funclib.sh -# func_warning with this simpler definition. -func_warning () -{ - $debug_cmd - - $warning_func ${1+"$@"} -} - - ## ---------------- ## ## Options parsing. ## ## ---------------- ## @@ -2261,19 +2272,23 @@ usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: - --config show all configuration variables - --debug enable verbose shell tracing - -n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --mode=MODE use operation mode MODE - --no-warnings equivalent to '-Wnone' - --preserve-dup-deps don't remove duplicate dependency libraries - --quiet, --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG - -v, --verbose print more informational messages than default - --version print version information - -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] - -h, --help, --help-all print short, long, or detailed help message + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information + --finish use operation '--mode=finish' + --mode=MODE use operation mode MODE + --no-finish don't update shared library cache + --no-quiet, --no-silent print default informational messages + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --reorder-cache=DIRS reorder shared library cache for preferred DIRS + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. @@ -2306,13 +2321,13 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname (GNU libtool) 2.4.7 + version: $progname $scriptversion automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . -GNU libtool home page: . -General help using GNU software: ." +GNU libtool home page: . +General help using GNU software: ." exit 0 } @@ -2502,8 +2517,11 @@ libtool_options_prep () opt_dry_run=false opt_help=false opt_mode= + opt_reorder_cache=false opt_preserve_dup_deps=false opt_quiet=false + opt_finishing=true + opt_warning= nonopt= preserve_args= @@ -2593,14 +2611,18 @@ libtool_parse_options () clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error - *) func_error "invalid argument for $_G_opt" + *) func_error "invalid argument '$1' for $_G_opt" exit_cmd=exit - break ;; esac shift ;; + --no-finish) + opt_finishing=false + func_append preserve_args " $_G_opt" + ;; + --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" @@ -2616,6 +2638,24 @@ libtool_parse_options () func_append preserve_args " $_G_opt" ;; + --reorder-cache) + opt_reorder_cache=true + shared_lib_dirs=$1 + if test -n "$shared_lib_dirs"; then + case $1 in + # Must begin with /: + /*) ;; + + # Catch anything else as an error (relative paths) + *) func_error "invalid argument '$1' for $_G_opt" + func_error "absolute paths are required for $_G_opt" + exit_cmd=exit + ;; + esac + fi + shift + ;; + --silent|--quiet) opt_quiet=: opt_verbose=false @@ -2652,6 +2692,18 @@ libtool_parse_options () func_add_hook func_parse_options libtool_parse_options +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + if $opt_warning; then + $debug_cmd + $warning_func ${1+"$@"} + fi +} + # libtool_validate_options [ARG]... # --------------------------------- @@ -2668,10 +2720,10 @@ libtool_validate_options () # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" - case $host in + case $host_os in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 - *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + cygwin* | mingw* | windows* | pw32* | cegcc* | solaris2* | os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; @@ -3003,7 +3055,7 @@ EOF # func_convert_core_file_wine_to_w32 ARG # Helper function used by file name conversion functions when $build is *nix, -# and $host is mingw, cygwin, or some other w32 environment. Relies on a +# and $host is mingw, windows, cygwin, or some other w32 environment. Relies on a # correctly configured wine environment available, with the winepath program # in $build's $PATH. # @@ -3035,9 +3087,10 @@ func_convert_core_file_wine_to_w32 () # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. +# $host is mingw, windows, cygwin, or some other w32 environment. Relies on a +# correctly configured wine environment available, with the winepath program +# in $build's $PATH. Assumes ARG has no leading or trailing path separator +# characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. @@ -3180,6 +3233,15 @@ func_convert_path_front_back_pathsep () # end func_convert_path_front_back_pathsep +# func_convert_delimited_path PATH ORIG_DELIMITER NEW_DELIMITER +# Replaces a delimiter for a given path. +func_convert_delimited_path () +{ + converted_path=`$ECHO "$1" | $SED "s#$2#$3#g"` +} +# end func_convert_delimited_path + + ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## @@ -3514,6 +3576,65 @@ func_dll_def_p () } +# func_reorder_shared_lib_cache DIRS +# Reorder the shared library cache by unconfiguring previous shared library cache +# and configuring preferred search directories before previous search directories. +# Previous shared library cache: /usr/lib /usr/local/lib +# Preferred search directories: /tmp/testing +# Reordered shared library cache: /tmp/testing /usr/lib /usr/local/lib +func_reorder_shared_lib_cache () +{ + $debug_cmd + + case $host_os in + openbsd*) + get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` + func_convert_delimited_path "$get_search_directories" ':' '\ ' + save_search_directories=$converted_path + func_convert_delimited_path "$1" ':' '\ ' + + # Ensure directories exist + for dir in $converted_path; do + # Ensure each directory is an absolute path + case $dir in + /*) ;; + *) func_error "Directory '$dir' is not an absolute path" + exit $EXIT_FAILURE ;; + esac + # Ensure no trailing slashes + func_stripname '' '/' "$dir" + dir=$func_stripname_result + if test -d "$dir"; then + if test -n "$preferred_search_directories"; then + preferred_search_directories="$preferred_search_directories $dir" + else + preferred_search_directories=$dir + fi + else + func_error "Directory '$dir' does not exist" + exit $EXIT_FAILURE + fi + done + + PATH="$PATH:/sbin" ldconfig -U $save_search_directories + PATH="$PATH:/sbin" ldconfig -m $preferred_search_directories $save_search_directories + get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` + func_convert_delimited_path "$get_search_directories" ':' '\ ' + reordered_search_directories=$converted_path + + $ECHO "Original: $save_search_directories" + $ECHO "Reordered: $reordered_search_directories" + exit $EXIT_SUCCESS + ;; + *) + func_error "--reorder-cache is not supported for host_os=$host_os." + exit $EXIT_FAILURE + ;; + esac +} +# end func_reorder_shared_lib_cache + + # func_mode_compile arg... func_mode_compile () { @@ -3692,7 +3813,7 @@ func_mode_compile () # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) + cygwin* | mingw* | windows* | pw32* | os2* | cegcc*) pic_mode=default ;; esac @@ -4086,6 +4207,12 @@ if $opt_help; then fi +# If option '--reorder-cache', reorder the shared library cache and exit. +if $opt_reorder_cache; then + func_reorder_shared_lib_cache $shared_lib_dirs +fi + + # func_mode_execute arg... func_mode_execute () { @@ -4270,7 +4397,7 @@ func_mode_finish () fi fi - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs" && $opt_finishing; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. @@ -4295,6 +4422,12 @@ func_mode_finish () for libdir in $libdirs; do $ECHO " $libdir" done + if test "false" = "$opt_finishing"; then + echo + echo "NOTE: finish_cmds were not executed during testing, so you must" + echo "manually run ldconfig to add a given test directory, LIBDIR, to" + echo "the search path for generated executables." + fi echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" @@ -4531,8 +4664,15 @@ func_mode_install () func_append dir "$objdir" if test -n "$relink_command"; then + # Strip any trailing slash from the destination. + func_stripname '' '/' "$libdir" + destlibdir=$func_stripname_result + + func_stripname '' '/' "$destdir" + s_destdir=$func_stripname_result + # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that @@ -4569,7 +4709,7 @@ func_mode_install () 'exit $?' tstripme=$stripme case $host_os in - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= @@ -4682,7 +4822,7 @@ func_mode_install () # Do a test to see if this is really a libtool program. case $host in - *cygwin* | *mingw*) + *cygwin* | *mingw* | *windows*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result @@ -4910,7 +5050,7 @@ extern \"C\" { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in - *cygwin* | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; @@ -4922,7 +5062,7 @@ extern \"C\" { eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in - *cygwin* | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; @@ -4936,7 +5076,7 @@ extern \"C\" { func_basename "$dlprefile" name=$func_basename_result case $host in - *cygwin* | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *windows* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" @@ -4962,8 +5102,16 @@ extern \"C\" { eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + case $host in + i[3456]86-*-mingw32*) + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + ;; + *) + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/__nm_//' >> '$nlist'" + ;; + esac } else # not an import lib $opt_dry_run || { @@ -5111,7 +5259,7 @@ static const void *lt_preloaded_setup() { # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in - *cygwin* | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *windows* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` @@ -5187,7 +5335,7 @@ func_win32_libid () *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || @@ -5454,7 +5602,7 @@ func_extract_archives () # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw +# incorporate the script contents within a cygwin/mingw/windows # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. @@ -5462,7 +5610,7 @@ func_extract_archives () # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is -# the $objdir directory. This is a cygwin/mingw-specific +# the $objdir directory. This is a cygwin/mingw/windows-specific # behavior. func_emit_wrapper () { @@ -5587,7 +5735,7 @@ func_exec_program_core () " case $host in # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) + *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 @@ -5655,7 +5803,7 @@ func_exec_program () file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done - # Usually 'no', except on cygwin/mingw when embedded into + # Usually 'no', except on cygwin/mingw/windows when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then @@ -5787,7 +5935,7 @@ EOF #endif #include #include -#ifdef _MSC_VER +#if defined _WIN32 && !defined __GNUC__ # include # include # include @@ -5812,7 +5960,7 @@ EOF /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ -int _putenv (const char *); +_CRTIMP int __cdecl _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ @@ -6010,7 +6158,7 @@ main (int argc, char *argv[]) { EOF case $host in - *mingw* | *cygwin* ) + *mingw* | *windows* | *cygwin* ) # make stdout use "unix" line endings echo " setmode(1,_O_BINARY);" ;; @@ -6029,7 +6177,7 @@ EOF { /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX namespace, but it is not one of the ones we know about and - have already dealt with, above (inluding dump-script), then + have already dealt with, above (including dump-script), then report an error. Otherwise, targets might begin to believe they are allowed to use options in the LTWRAPPER_OPTION_PREFIX namespace. The first time any user complains about this, we'll @@ -6113,7 +6261,7 @@ EOF EOF case $host_os in - mingw*) + mingw* | windows*) cat <<"EOF" { char* p; @@ -6155,7 +6303,7 @@ EOF EOF case $host_os in - mingw*) + mingw* | windows*) cat <<"EOF" /* execv doesn't actually work on mingw as expected on unix */ newargz = prepare_spawn (newargz); @@ -6574,7 +6722,7 @@ lt_update_lib_path (const char *name, const char *value) EOF case $host_os in - mingw*) + mingw* | windows*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). @@ -6749,7 +6897,7 @@ func_mode_link () $debug_cmd case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra @@ -6773,6 +6921,7 @@ func_mode_link () finalize_command=$nonopt compile_rpath= + compile_rpath_tail= finalize_rpath= compile_shlibpath= finalize_shlibpath= @@ -6813,10 +6962,12 @@ func_mode_link () xrpath= perm_rpath= temp_rpath= + temp_rpath_tail= thread_safe=no vinfo= vinfo_number=no weak_libs= + rpath_arg= single_module=$wl-single_module func_infer_tag $base_compile @@ -7079,7 +7230,7 @@ func_mode_link () case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) - func_fatal_error "only absolute run-paths are allowed" + func_fatal_error "argument to -rpath is not absolute: $arg" ;; esac if test rpath = "$prev"; then @@ -7255,7 +7406,7 @@ func_mode_link () ;; esac case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; @@ -7275,7 +7426,7 @@ func_mode_link () -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; @@ -7283,7 +7434,7 @@ func_mode_link () # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; @@ -7303,7 +7454,7 @@ func_mode_link () esac elif test X-lc_r = "X$arg"; then case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; @@ -7326,7 +7477,8 @@ func_mode_link () # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) + # -q M?Fp89Nd zH;3H7RS6@V=9j{*UrTDMUyoq8M#8ebv4jR@buwfze7s%nk^9OhLJPUk=}oRd+M9W~ zSL76BzqacdYX#9NzpU2M_E>IE)FXS0 zUyf<}^Go?5x7l;yDVp!Hf0zVaHD2GomF)d0`tyQRbYGt*%<-e0_rHi^O?=`*Y8)O|$QLMi|QRPl= zYiIXDDA3@&9kVG+JfyeZ~sm*`Wh%r)Bf(-u;4DkVfnMSVk;y?T^LPqMbfHnyCBI>b+Hu74Q4wO#3F3Tk2GzwXO2N)Py`r&V5esnm+aXI)H ziPglQ@`;D7cYE58{Bq$KcuSF&cNvYMu!P&<|CN<#xmV4epz3oYY@$hF;=_uiq{#B8 zH=Gl-;eF1kD-q!w)B=pzF z6^{^XF>F=Dddt_#PlZmI&kaYl9RQQF7w7JPHOSoVf?Z>8iSg`38Z9L;V$18iu z=-xuZ@c_CY!8jJL;4*;#*_{@Bagxg1aa@qD9Q-Ku^g z-{%86JG)P9K8Jm6?bDej!`q8fnREU3!p5mrwMW_3|Eacb=M<>kcoEXsQSqTVs67h( zMdfY;9S5%IGqS^=0$d@AzNmKKmzM4@rCwX~np)OW@U2RNz5SKkfW*CIE6#%Jv}|PN zwsBoPy-aoVRaaGC@)~3xr^v5A87sXkkeexxfm^s0g~L1YF8}y9S7eVW#RTWYOE2#rt8K&2u*0LWOK~$FEF&;6NG^MaNe;f%3f@l^&`+tc=FMc{V_DPXT=BPD} z{I!iwo2jR`0QV_P9xvUXd)RTgWHly|cB?MA)6O3|ASh;>SVptSoT>~Qj9-b7p2d$cXix{QS*D=DI5(G?i)m z^`>hX$6Vk#p(frXf9zT4ezOn~-Hr$U3~4HmT(Q_sr_KyVsaqe7{D)z#NVmc9{hILY zWci-HbJ)>=7?l)8>&MK_ULJ4CWaY2r_dPkN=`eFLYQ6=j3V#@t3HK3sFn2rmymvmw z&Itn5lBpY=4Zi2Wdh*3rJ80EkknZ~?#Y~H9@-Fp>_5hZ%bONRGDJ`ogy=`^f;bS=w zi(}61_KGxT6C-3{>af-9=|jACnK*52;Yx0^mq< zJgif2+b^5w9uOM8KQK{0TEA5Hy+etFKGaHg@azqT!a|H)y zjZC0&Y1Z%TyKsJf$L_ojVd~4$)98SMTV@c`0;06n1M~~Yp8bmRZ1|!FIO{EZ$7vkx z`22Lcbya9=yTvBf=v+%PZ9&5K#I;;KCX^#AmJ(3Bmf`T z&5E`o-7=zy`Y!9lx=V@8R z>2o5tOIjKod!obgw>{>3X5*LJk|JeT7Eh7x`Q?5qp2MXeK+VfslH%P zCczkoy(HRJn~i}sx#H3dJ41un&RU;_M16=c*{Jkpr77EZYGfj3 z2M%tvTghiZ4e);N+jq?ZOLpn*(!%!br+Vr#Mg?b z6JC&Bc$Oypw$Hj+C!qO9*vIiadgn&%cFlE=Y5(;CkokOv>^2Sy)p0gDMnF=eB-LG6 zP%uLBfVgkHLZ}&^9imAk(=@-Ytc~X-wJ`Ej8TMFv6=y+5{4|VGHLZig~T=I2AsB^tg2CtgZJ-X8+FkT^btxxwIE0 z_~!!!v5K99cl@_K+?Air&xyXZp(%xRkc?J;&==nmdjeWjPt9bZ?))?vtKmBP~YI7QWdDZTJ+S?tL3X9VV1C1YP)I#P%w7VnL$m?%VTJ}G72_g(h#?63;> zqSzZY?AW(zW)ic#CiQx6mvM`Ls_h@k;E=oq72dvxAy>Erp+M%$S8=!w35tW0pM) z-10bYcQZoOQ`a@M!2NBv;c}#6JV^cq;40_dO>OO?k+RGNTOCLH$l*E1p9j|I*iDN+ zTtSN4&0Vtc9%-TAR8c|#7rrBRUKJwY5iEcHC4VdTWjD<-cULYOg$>(41DWvmC(WMF zvdYR8okBa|GPJZz|W2s0M+RP!ugGNvVMAq(6~e zUT<<3pJdi?)BnhssfPtR)y6$709VA!nT}cyMq3i=kXlgmQtkwu%7_Z@$?VOt^NPkP}a z&M30fg~5Z`g^5>wRsX7qxjQW@r%zk>;)tE9otz$*k-^=wiQDR$@>y?2K6rROsN1dP z7O3@MsC&M?d{5DpmKD7Ks836Q{>?#muS)loECF<(j$}fc=<#yCA3;)P-)22rtp~!m z8_1k_?1%%rnhJ{c<|M9b`C=hIjy+gJ$8ZkN%ma3GuD3j^di9pRrPp`@=L;>*nJb6T z()b3bM_UNE-`BOgqVD3!=O%65&1Ca=LEc9AfuhZPykHj8<_S2aZ=Qv>YiFff&H0SD zsPzfyg@r;8;Nm}Tq4(lvbt^Vs6dNoSVAfM{G>Xb3nkS`q7FcFH>S--~po{IRAEzW2 zo%?6+PA1r@0OipDJS|q<47D9Dv(0^8UiQ0c&zK?m#z=jdlxqLM+(xpc$9~1>_8X~E zmt~Gl{$6hX+^jEI9RC!Cob${D%F6mkF-?9ZagUmxvqTfwuc;=-7b8Wf4SKHQif5qy zsHODDE-!DiaSSf#Gco5k2k^5PEiLE-fB@ktTKA;1F-#0^g;>c~w}k88ZtF+ZWP6+$ zc|pm#ac;!tKC-RJzUUIEaNA57J@=e=;6Ul!*4z8$rEE)d`LO{!=66w_==wa1cXNcOOf$QreA_!f@GGBLT%`Bz}?l`OJ;Ew3iMSeh{Cm zedP5Lg?J6$@-R=Cf7uJr#{7DZO;^T?X#KZ7fc&uV>CW{I(Z;s}vr>zTi+Rz9Ro`gS zO*WqsPxBm_RxWDWC0A-q{(gS-ws+zAp=$Bb`K?`%tyVj~ovk<0u?(itPHmA({QYyD zo5gx(W0Y0a#Hjkh6N?)Y$BM@0Ud+5|^jm*ZICMpvG|uwZ%O0}f_uRY@o^N>CCI|P$ z#5c`G?=;Po0}fV0gE3`R(!&)WceePl!!L*%c?&2 zT8>6+ndRk(kzk$uCygs|&^|4VE0(SvH=QjVeI?X7o^C=si<6TUswH~sM~$bCL76qZ z>yX$ig`9!%pSEXtcf9b2IV@CHziCR)CVcRD+&w*G+Jk4ANqWeK zyoq2A9KTXAgb8FY>$+=Pjh=3hD^1~bOsMvqGW7=F`@(#oM}+T;k^kh&(X7HAe*N5H z*6^ia!L98PfMDTnN%tjxVx#6LM?TVSe-@^eOH_*5`CJrKd^fhwH(@rs`VF>SSN=f2 z0dlTW?4S^UoMp!K{km;}VMS+~KHe%;d&gZz7SQGH^d@t7Wzm+jyi1se)TZCF^bHFz)0z>(aX2J0)$VjHU9X=Y}HWd{WUnN_Y z6ibtAM96zGLM}Dsu@p74sw|EWKXH^08V8ljij+zmuidY~W*fP?f3Mq!`=X+dPj@u( z6#X5#49_8p?qZSrR9aTDGo|Lk1nUgfh3^is0>{jsz6(sYC%W4X?!A5;+-jw3%nW$E z^cr(bYF+`!RsR=q>vQK@VOBhN{m>xZz!&?0y`m0}A;DN8(tZwL6KOZ}@< z90+g0achMHg#&hBvW{3>Pveat=1)A_f zZQpU*+-F%_NnJB=QievLV{qQfx9CIpbq&!?(!@=Shr8jEq;^VFB$S47|B_x|4+I2l zimN4>wu-<3)SNCKfG`&P^Mf{;*pv&s#%}IVe8@1V``#Na6y|;LhuiY|M+;2o?i#+h zXLqwI4CubxzYN17aajf*#O{CEh!6i3?yA}7wh4UUPfpq_9Y3a}z*+)S++-*jIHI4LDrAI}+BF$)@3&cf0;(fYT@>~mxLg5og56LMq@l72?aUCT;OheN- z@R9Q@W_tt2-|Tx?7bWwOOGe~{y&`&erL7nX(fdY>0`=(*Eo*|jaK@gCB+55U)Axx^ z72A|)Atg%P<><-wJ8YU>udl_?Bg_Jt3gzpp>C4AeKiWf6IqIW}r%!kWPI;MFE*bh) zyDU#HQ~=L~r}zIthT`HRKiuGiHEK1T;V#Y$*NCBIhT|^F(9;Ac`XE1_;gZRDfzaXb zQe{eih5RlWewPcZ-& zThj>zQhb(AQ7D2e$*rOa+mW-}n0Hsup|{>uz&cSldh%6nWy5i_7z#zpO4~d#X2dXr z*$Bb$TjLMTw2nhsL{3B-Nb3LP%0zD+6aqA_FR3Uqk)cxF(XvLhs8tdrmbOPXwXjfJ z8#8ZSHHd>TlbM4njZ%qEj)16a3{tbK2VP|Y5A;KpT6K;5H+b@ox-Xc_M6H#X;9CyM zQ80P23jg1K|Nk}u@Zacod*?#&g?!;&G3fpIL1yZ)@1Gw~(di`M0)?-8;S^w-gfDeb zM%F(+{NIC6|91%fKR*P5nI}*(vX(PRTZAG^kdcGyR|I2$c6OJ^N<9lOl5*l8bBy6I zvsShb*R|NeBr)*ofcINg_U~Sa(k?Zfv03R(-j_%k*?SEPmtAjp-`52j%cga!nCx&Q zyky9&d{I=IZfcA}c6^@=@?hPe3S-tM}it z4i4)7eM?4A#6!N(9=ts!OVOzfgI|Ml255Ze4RWk}5O*VFmoj)WjK1GOExVhEr z4o9SeUYzji*0d&j+C|Q-s@BGMqVkW=0e#ux2ayUU1P8wRSCPilupPd!X z{|NL{X37eQSTPDwr+(NeQ8Fu#puX)TbL(K2S`R95{MY-S+^t#rZX&n*tO%#k{OvEc zRs1syDMc{8A9G^@u@B(Rt3-Bm6!7$uvbVt@jbgW@$nr$`SXH~$GzuexA9mgxwI7EwB|iDM+V(Nxzh z@(b|J7D$5sv~1-o^9Rd4EnU71SWdC;G_^c3sQk@8(9Ti}chBTNc-q~im{P^)IsM5;GZ-89TR6pR&^Satqn4Md>$rAi~{`tgt=Uf$d@3R zW`!fCQ5S$ioJ{m~O>CXzPW`Rc62&MOo;*fYm^wMUeG37SL<>tbJpGg5RFhg-O3X(d zG?n!N(8A#ZWfuQV0N+(OlpQpl5Eisalo$n7vpZXl0Ko0>-uRe*uZQmf96~xTEOCaY zHV;tPmu>F9wIP&2gG^P_3yQVXr`$wCMxiqqiwVCw0HMJx$Sel&w1z(Lgl zkFTT}RCp_M=_;`;o-vt!)&h?0_{ruwkiqr# zriQezT!o0&!*2TgOeC&^%pfUrQ_NV6$?sv+M7&8vzNOdIKZz|R{IRdh3A|%&T!wEAydTJXzxLXnq|T4;g>lCsN*tVBOM#7}0(&L<{{_fl zR2^Y#X!50kZCrNE`9VW~vM>-vk#{Hjyb_Zin?7;&HWa-GdWVBGU^%l0M_V67FUIGP^LgNG`VWryUv@yKk+2JSP;6cnSzMn+BmX3jkD#5lt z`a!DT&%J}4sMND~!dONR(_A^wK#5~jJ#X|;s07%X6B@r*nuILb#ZLgysHyPG*~v$- z;(zB{Ril`!s631077wnq9*d|G;`Md`4;a3Kt?UC~`XZ8-Bj3VlK7X;qNT2*~#l58n zY{y61BFV+YVJJb2f>V$1JNT`j)gwH8CUUxA*!H6npVeEft(904A|N6t1mU@~_y{;x z3QYW7y`I^{fh1;frq0CH>X43yCM1u06_C?!v9@ReQ zYALI2d`5nW!P-VhQi!nd&4U#dL{!S;vo!P>S#h^|PTZ>OO7}rH2XWm)zOxI% zr;*58@DMQK(VjYTG4d6~;k|ZV*E(iyH$oC&*^}Bu4mQQ_dc&1P(_`o{-KIaeaL4zUkcV8c-8g2-p3P#zAWd#$r?I{7dC%UgFev*gK;ph~*d^r< z`oT6=`OFff4|U?YbUv=#T>bGw;!=~(WE>(7w(syS3o9B2*Ks_DA3N+1 z?u6Rdlm{G{d^{N4DE+QmN0+LJX>88}wl18yn_I**B~JACNxUZPMkLe{ECnF=vWC}` za8y;=72Ukjtcq;QcGC%|m`4uFE0;_faQLbi^+%nn;S@g7aErf}{f^qT@ zvC7lNRfWFjnT~Vly|I#XEalocgTVqShCjP0o5d+m@-^0$S~#bHJ0{0+nG>lZSf zjn)vD7s5yVMrc+J22Q|Ad1Zdt4=hc{q6~LExRmBLncqQQvwT2U+S`oqHmkV7ih2i%yl7Z+j!2ls^Ey>3-se(o_h| zFBcm71n2x{9vT$X?6(rv^$Ti?`iIs~Tc(!Tft4?>YTAUQF@p|>#7UPIdEKi9@c8RXx86E+tmtyjl zREOE~!Rg1rxFGG4*R(>1EVx37Z=EV?%RxfPmmU0Qg7dhZ%kv&|Ep~3ZF1EXK=L4+p z*;C&EFU?i~OXXU0eMrzIWe~_WxJ8>v@DWbD%GG&CdQXMeAqul`WjT8Y!%URKPGetO z8h$VMKaj%-6AXFN77@MC?m9@cz6c5mEaBnD?}ePozMO<4jJ`Gd^PZL_c&_L^acdWN zJjkB#3LSATLQCOU%Ui@u#UU%ZFDQ+Orh281Z>kjaj9rM8c6gjz2_vQge zM?pCl>MV`A(sJ}{~uFk)qcJF7YwV#W}=Wjjz+=w#VX zTQbK_YiC#JINx>`!TSjtZU}PT^l~#_4b&bmfvu53jm*Dgr?uWgjPaD6H~PkDdwoVI z3+Zbqt27lJ`U^@}Pw4eIa8&u6JDwhIiVM)v#9lrGANWfm(rM@q?xp?O!cw5blxl(h z=DAeI#~8(X4KKJZaW_=Vxu3&Ro43}8J*q;407oyo0}T!l_PN zf{2QK*aUAVENcDZuU=XbSM>HmaBRL02O!Ub_J-7e0w;FXJYhN{78AmM3Can^!sZ_X z>tihjLvWG3sf$Ul2Coo;N)Y)Ir-4TtYWxtOS>d0LgfF>svnQNBwQ^t`nVwkxVs=r5 zDbvX|fPCuSMq%;!Pm*4i*1^LdY*|XUjNE5Ip&t9Hi$c1`+d`ILhJC4$@xn96z@J?2 zUi^VkRW!Y8AQ)cHhfXkyyX4KcbAlxl_?oh2xa*tU zA8Yf|UYcv^P3^9;P%*;EFPj+FOEO}^)R;{5kWf2OzvHwHzDh`>r7h{h9@MT1%b%C3 zr1)wdD!1{}W+g05voAj@5^up^pV#k1@~>emka zIDRGnrgihLsh)1k0}sg?w_u+`HlFl{%6DsalYMBH_cw(#74mYC`UU_3{XQj2Ft`hY z!58?kuxqC>o+x(U)GpmNWgI$;kXY+hQ~E1MXlUFpmR3k@rLHR|lM||)$ODrfT6R-@ zdXKzP4oXR=<@M$m*=lP$-QJ0NP;bhPy=>s98~&g+toL#GG_2yZO_{zR-46%^Xj_bF zoTWCpF-y@hwi$M=Q}UUYiz`?)AIb_YK~$SCvflebHh)9T>nGIy)-409etkbAZnT^H z4#V*)UNGm#fE|6ESwj7FVAGQ=DMt%9`}mK4ogvKYGokkNSL;eP^FBEI;uKJpFI)io zC)I_%TpnI1Z%BNP&P!Y7m8~t#dU^iL+I`P0eV&E}s)h*g>whmJ;gdi<+(frv+c6EX zOa50~W~zf>N>u8%We7kY8S8<=bK*{19@S%Ebq$m@QP&J0Uh|GzzlD%c#KH-};o~Q{ z-j}lYp0ISr8kO&gj*hV=xlTRj9=SSNvR2*?Dp>zPnTeTe1froMbCNE%-@tJ(Sa`MXS{@{gt_h;Dmn zi?49}PAmV_&=8^^DQ-{H?fLAy`HzQ*~c`~v{pJ=$c4S~9MX1v@+FJ^tzY1z9AIp+5plfMAI) zQaZh6h*SwQ8ildD?))-7_F&HvnL~Fy;RxU{s2rdO>4F^c9`-)G#f?pwrm?M_Ag<*K zJ%S*2va>jR?$hE4g7R{SL)&VV)d#D8sKyZ1w64Nur!PW7* zjI2?CJny&)8#kqym-k;sfN09~AJx_*8U{ukdNAzZ=`XAUpmhXOX0GYie%Ohj$3c;a z!#R$%L5sJn%}JgRD$2hREUR z1JtK@egvlk4VjIAU9Ls>(NAxJCa;E%j<33Y982~&zt-T#g@r zJSrZF&eHLmocL;2N~K8#9JasaU`cnuvuDWKwiB44ee|h}x!vIBW^ie#X%7CESL7O< zSNe5JiYasGoS~AvMFL@3TWWb262$t-nfnc~XzKg-fwSrm2^##XlOKA~vY52&EzOR% zc~C`_pO}|NEUz3qnWJ0rDJ^PxY*SVc=nPo2&7QmQfBirzMVl8ez#9XTwx>Nsfy=Ms z>8(cR}RmpjNsrq#T6R)|9 z!T|g2!AF!4uc{CHI&%xRP4<*7R(`$SZ)CVXbZuJlsigPd)aYrMQ!q7R|I4;!_P9;{ zURm_9{%jqAzcPORx;rvwTc477Aiht>vHFz(&Ncm07`(j9EyKl4R#Gnvc;bWQK$lVn zd-0WJ(;e+8%Xqua7V{>oG^3l({2RliazLf9&903k{gH;>Q0pb8V-W!`ED*00v~W z)LhM~Fy`C}yb%5jHqvAeB3)ddQG~(L;Xp^lbsZvU zS!j0{d9<;I+Mz60oxDoJRRM|m3{nBk={Td^HWPaNGYzMq%jBAll$JQ7KEg9+{_&nZ zy!b^Cp}znPNj>10tWo0)0?;qYncjP1AD@Z1%5qJkbRY<#4UapGX4A<+t);WX=b0j9 zJNQB8wAo=*$-5WQ#DF$d?3TY@nyg@7JbOE~kr>ak6p42H`Nfwf zyX#Oc&+~#AtY?fstV`!tWy(~W#y7e>(dMVyH)~h9wO*fPFF>W5fqnZR6f+8pHV{s> zpXw;$cy}ir*G{Yb#}tTAy<7}k?Zn(rjD~(xC_qXa!fqewF#ET84ewQ$8eDKFw-6aa z@M+*Pr1L!l=z}xX79~4JMzm%N-{q}Kx*MU>Jb2WuaID7n%}+p=mH z34WK?#_3kNC-%zBQ<5d2HsB|WQzx!0>l7N(RgYdZv6Fb)=Z$UeYv1M=4sgxdXQheHRJu*!S6SeO>G&p!FLVDxL zwaqKLS7OuZC@D?(CKTlEP4}G-hRRIIoKL!D$I=4xv*Txyrrw5@IlfUSL8u&&b$n~|{o~hxJ&9wz*Y&{SLyuox$ImgSTrS6Z znB$<80I~SIKCnedOVBWmO4=~d$6gnfUNR}M{hBWkm{;Gq`jteycDi_2#u%pa zUf|k0?dY4|^ljoqE~e$W&nEW|ol_9UXzj{S%|deo_K&&h=lMJ*84tjuC9sJi^#`*9@h66W{*8Kwp+A6Z$!8}eWb-z>hFg_O}7h?l?jYTq8$ z3+Rmu1O8MCOJ9PJ8aJF(@$@njEjMPbpF-Mzc6Fm1K4n?E)~)J)uYLII4$+|gS1zt3 zg*I65spqDf?wg|RPM91xlt+1ugB=mOkPfrA9*&OJ6I%gpJZjYuKZ%+$KXw&=3t$7% z3Hu*p;(UR$dp^#w>nN)~;^eaFz`o;QqbK5|qr#Ur>oWyxie~ zgtd8x>N|3s{oI+`lR~#zQfJ9x%FT`ylp&%w|L$Nc*}>ijf}~f+D-ix&^ir!XO`T=T zqPKq5GMo9}DejJj37gMn^<<=vpH#~1r8d^4PmqY0ILDIh_+UpAGNj2mlPKtLq9S0( zRjM~nxD-TjxJR>sB=l+&fp5^G9J(a0c)s%(pm<}$lm85FU|-GcT05YzHlOv%N#?!n za_1d7mC!$ZL`{)VxuPanWguGk`oJD5=(MeNn1nL0O| zuYk0GPSh7U-LAr~o`1U}{qFv2jG0f>{tWbt+#iTzp`n2iITT=3I3S&ja3|G}dar5{ zj}#X{8P-t;e?&I(f|$(=ziz8SxBu{K&iMZ8B?o`p{DvN==5ti!<1po>&>}t#{IDXE zxgON07@~5duxmy*DLiVJOf;gvm=0kt#|0BwU+hlBSY2|et->^xW>BhkfQk=Fey#ir z-^g0+a&|c11w_6>`#&@wG@QwFPj+?NyyvRTtgg~{jwe7CA$cJtct?~MvtDSi$Hi%3 zMY8|$S{xpp6VQUCiT#HA%dcgH-~0@dMT`8!VsIJk3oy`12EZjD4hMF2sm%ahgUec^ z`@7Ray@h(gAIt~9@GfR`QDY#3{)rEiABM}qnjoA9c#a+K0VbWd@r?@7Z*p085Jli# zkrGvxK&mY)fR+Cv|pDu_^*XIGbNA`1^VU~Vqy|Wj1?B+#*jct8@E8&#B-Ph*wJlDc+;w*1S-qcojQ1Z1?uIfC zRU0(;Dc6Ef`o*qXm>v=6>aU+jkx`XA=?W!CrJBdH_2R?O*Z8+qWP4dkbuHTkYXtGC z-ZwhtT5ibw1QiU%mcU$MXe83~Nxe6a7H3@j(DrVq7!iId`_9-@!R!$DSFvi}OKRU> zRfEYv>SPcbR?oK&+;9%3P?URHequnRoDFHJ%pB6m3PxP5$TaJLgd8AIa88qZNK~P) zuyO1b{O@j{R{HOB_7PmK!P=>XV!MLE+M391yeVZ8&3p0nWAzGBRMb4k`emc{q|WvR54;- zA{Up2PtS9^ux>7?8gP>0;sD@Y2YN%P1TBN%nEcCPkw{mRWb!a#P2MUL;H_=<_FH02 z6((kfh|cQCy%Q0_*@W+2joZIwpdmKi~k`{0j(G$<&{wSl#G-uOui6Am{$;G z#nmp{hT5EdZN^*PIkHN(X*yrq1(gs2pRZX#_IamL3uy^y|4<&iSah8)Z!V!N@_^zD ztu}Nkb^>R5xlZ8^(!VuLbyn*lqsNp0ur1x~r~lF?NtV`DNd3^-8>8x3NP^-LMz*^G zKlNp)%>&JGkjxtq=^U1l)J)4s>!1D>iesOb`kjgOO6Lz#EQ4U$xOJ{xKbWFn`Iw1etH6sq(X%`{rE)u_W+0D3RTvP!TS=SgJD3V&LH0{kJQlo}qW~1C z!!9?9o(ito5`kCqZQu$DT)?f#?8LLF(5b$lA4#~PV@`10zX8l>^2#!_FD3}))Ii)r z?~=N4=L1DZJ;uS86eSbLN!4$x%@|?y%YGxv&hmiu@jvPg0H@qwoyc5b)S~oF)vtMc z6My(N@=OV&YPxT!$g;m^fS8d)DrQ)mRdrObKARp%h1-soprM&KP)%gzp7&Jyojk2T zHuCfZmEh!3;#tGnse%lqIwh{=6^Dv-uE?a>_nut$$V_=u%2?y*%Hh~HdSpJrjMD$@ zDmLI^L(d7Z@Jpxc?_0>)9JP7V+ckOOF&8#EgR`8@AdTIHOy%}6%h8tQ1IPC5q!~}+ z;w$;Hx0Bau0=lV3I(D~xq%o&0$KDIJ*IDI8i{8s*|6X|ci;fW)Kd}nvZIrrZ`Aa$n5Sd+zl=iw}0=OWeA({Crfn0@w==(4K6Nb5ZB1Z{1=s__6V>zd z?&IgSOuznWFn3@4)uv?|EvG$DJ(o)lpMc|6wR*Z11==9jvx%7(I48DJe6|fOD+(Ly zy^VzTdMv5`tvJkxZoX^E#M@%;YBPh+>#i(YX4=hL(h>CdyBk4HXIZjW=QM4I4kp3g z^#g{T6Ahm?geTyBw2cI*;`_bUYqVXKY{|BovyZ)OZ!da_X{bEKnO9J3f^kM3JOjpr zd&e93)GuuGr$*+X@4hN?(ATf<{_Q!sPfWA4^jxo5!PYRH!mh|0KON}& z$Tqd-`Fuiq_pDa(sC>~Z^gfOlgp*|a=&#a*ShAAAvM4oTd5IgfCujtWeTzl?DyzJpxp^M&jtYJ&Xo-Y&2h_k$*ZrEd38n$z5CFW~K z{Zc**IBm;IZMKj2r*69V!|FQS2DbZm#)jRouaJ+BBf0f3^MGQpS#HU?vwH0^)-ADZ}G*N)SGclZb#M4|SC*J7s_L~7jJ&f8)H(4nsx-5;(zXV;n62|@MP!=04! zysWezN)iK0+kOTr^@oK~(lq-}vbXs!egkIh=!nW@{J;S7bJu+>yx@Lc_rAu)2u3L} z!xrBWUvx6{LY_CXqJ~fyON+Qc^T#BW~S$%T2X6Het27{wt=+q2X0cHE#)cI&FtTo)U3mq z>K%A@9Rov|wPufX*HUgUF(pZ5{3@VdwY20^U4OyxajW@Th3?RrZN4<8>fEPu#TVk` zT&{!(%-ka+oI+hOZEI*X?QDa_a1ygTtGy3zCG)q2iqC#tXbq8`q0Ui(>2>G{Hs@cC zJJ;$F+F4c{2C>xQ5vn9MT+VsIZSh6Wd-LYhO|i5}Ps}S*y0-f!`cJ-NVQx%2$_ig} zsoPZzCKXqanl;bzL&cyNZcu^Bz~Kb1Sr|HLyszEU$8*U9ij9t#yPiX3XQJ4SO&OAF zs`$0H{^~YY90}6kUtd_6l76h_recrQR%*C(Bl-8}FmWj6(U`*xP9<4umiMD9$@hN? zLv3wrYI+-x-@wPU@Qdd450B8-ys^@NfG-FHLtj6qH#mD(kE&+Rkho=7;lt(R5w}sxTsC7t`gT2 z5fbhO7>*>NsYX=yY$pD4v)tp2sUBIJGiyO9h+4T=Gxb zj7j}kS*om%pP3Fja*AJlckF255ZJ>mi{&}*7l^*Lq|KkNfMg3T5#L|S=*X_?1 zTN?S?A9kG|S8B?0KX*e4vV}TX#rslDP@4P96>@-5Kt)vEK=!` zPLVDtX#=IDK~hp$8YC3~X=!O`Bn9a>d~>7kdw=&|_{L=nhv?a7pS9PT@yusFYn?6u z`woKOZAZG-hqZ&WFw4xhvWAN02K%#E>0dpt$QxSzh4|9d>(^6*KB0>53yV77X0^4P zRNZ!=7$M@WdD1rLapXE~`zfbwZ_nN3T9GzG$@B^xSD>(`&1#HjLCeVRltgtr>^cHi z3)8WB4R(E!7osMiW-KS+9fAAFT`|Rl38_JM~ zGpB8zLW=8U$SU@=|7Ypv!fQ&VaTa|No=YCJX}$;M6HhfabEc$a*~?bF!A7n+bcGLbD1UeBf-fzt@AQriLu? zR*QE|G#PIj6qQwp75yJ|zJ2%|o9Q+Ib{z|>$MQ&XJI_?8f6y3OV1bCQ(|IktC%e~c z5z+;|=A$nDJ592$75FY~RLn1Vn43R2nrP2rC2G+JOd|bs?EKPzg|19sP1foV+ViH9 zxRef&B;#hJGfek07!AAD8a=gs_O-UKAu}~$A3Stkd0(!FxYfxIm4P26r`=5hhN|=1=sYy@E;Rqpd{nWAbEV3Y7W<@noUd$2)kvYcT zN=e$byxao5R6Dwd+>>V_5v0}xGd3jYk;GfCw&PlY`3Beax6b+GB}(_~*miaEUh9Y- zp$%h+Ki8vqqO>KqsEDJ~YG2#JWw+#e_m-Jzee1~0b5-goe?6d-K^3R*umX1`9rZ5#>a{@sTC)S~1NRJJZ@G;9 z+}x({6M{dN$2>oClBD66ByHE#7?ys@A`jcHJ$KYIa>V06tmhT3ozcIxk{4_eoGKd{ z6~~3S#dZyD#9YR?pma;~YVFX@;yGy_A0LIahzhlagT*|q-8CWMN&}hU?1Gt@fh;SI zPjS+3e)gm%TuID+EmCdAHkopsp5pR>xR%hAKY`M%0@&;-h)|^CH@aywk48i(Sd>yP z=S$BRrAdB~uqRSHW8tGHxPhsZ8tZK8Qn&!*f#;U$c2aFh%IFVwo6M3r#Crb|bw-h+f*iwhJF!I;7@ zef*SPj!NAutN3PW<b-r zi*nf{Q%7lCO`03r^OI)Vqc@V&NA|Q=&m81DdS;VcxvEL-G*-X_M>&{2rZO(=qi3uC z>J5jcl+JcET+@B_#A=Lc)Y=l1%-^0?ZZ`oci2t>NIP=Dmx#9eG0s_TPzNc4RM13$t zzT`I_Rg~2U4Yo0iC*9cuC&}t1`H@N-k@mRMYWPBrW_o&%tumMvL<^yp4vj-P9+!oL z9Nn+puS)VLoIFzQ#UecWeugxaV$NN;8^I{`CjAK;+cYK}z5r9y1V~Eqw)LE5f**di zzpqQEIU{itFFcsT*kVFYx!5nd=FiLIEvLSDizN5quttRI8po~m()rn8qQgUnkk(kU z!l#zzoI0QYA*Q;5hyO)_Su(dBmuHnRx1;^MT)Fv81_P)H9!J~0RAKBb#<8v<)wb;1 zUKCuJMhj44WnQ;l{V;xYreHeq9*?W)^619h3t2AQm{W53{-@3-`d>4Ltww~#AE1VQ zDdLpp;#{FZ|9m4muoi0d$Ao8hz6V?DQXS2P^nc%*)4h*QTMDP^%Qi9DXHyG=m~)Zl zkrqk)rH`7i-iyma=NwL%qy>>6>zTbQ8g4{XlfE`((9YN@^M;T$4Sa{@8%Wp2%Zbdw zpG`j3QvUsN-o-v|Z(cO}R$&no+F4uf1C$RQOc|`F&Sr6uc&}$IE-!;X4m+#aP!7Y6 zssGvuyWT1O77?&5>(b`jgJ1>SXzDxSum$cVyDEQGjh(&NX}X|Mxtm)3f_ED4E%-xR-_dUrOm+~CK1$~ z%fMf)q3$vo7fK~#3+tnBM4bqN&fQg_oGHoy}$YP!MB~qZm0pV>IGIN z)fSbz)j+v@8yh95ekHe4Z5NgIJAdD-4V&${+a6KV6A#E0jREagB(Qm?n)0tv_?^nX&aQDND6P!hGro^qTkVUU;I7P_@AecWvG&wa$^|hewH~EH(8dA zM+luhe6oEes__`6hxhtq46xlg@zu=MuZ{4m!1LOt3v?;q$p90!ZY>^mL9qn;^sX9h zL{qI*bT+{R&4!Xmc6MyN7qxy$3mas*RnDg==egXu_pzw#@qw5mn{w;Gd*R^UCd{{K z1P?0aY;M(Pbd(&beA#xp+-#iI6vMf@qHT5XGlRC{u$K!Df8*1^eqsQ)SVmBnwNJcK zpw9z~AOM>Zw!D&v6`IV^CGVfH7Ke{S%KyYf;ip?ANy>==oje{etI58?OvS zWc9&a1r}vy4sT_Y?Tfj6`yC*a3(eDUb)5U2>&~m1gg*_@(4S&DSs$d^1i+T*}ha z^_r^42Mv;FG04pYW(|cFM8Q+!YuIj9l%M=|oPL>BwBH+stc(;0sX-wx5%`s0EMq?F zCZsNC5vV3x5x<{#neZ%?mstW)GKf5qNAM&wJMIaN^r=5t@tb;LwrpOUVyKqmrdMKF zEX~?Rg%ai4|O?59F<&E`mQ^I_* zo`_2ZJw?@WCMiFw8r8fOv`$O5b{n0>50H5BxX4h5(0VUi0r|PWdEyx`y^j`HRWe@B z_0bZ&Va#$N`Z}WelvvrsL~R6$g14N>n&}S$?-5Zt(xt4MnS#VVGiw2*6KHqlv5d)>l~%LB8+omKipDE=Qb zvD9iJ4#}q1R^WM@nk0f;?O7557^RB?k!1cf;?l0Xmly%3`r%?~ePjfkm}f*0iW+3+ z{iQw4?fsU+hV_kege8Iabfz)auW`lOh7f&MF@EW~>c*T{yZq#=D$SyZZC8QVKAwm*j++Tz?46uwpFP!o*>6oL!sf z44PJlMKMAgqXQ~{1$bQS>;tSUY`AjuB|65_JUrcpGCGIp+}%9DOw}*qvb;lile+BD zB?OzCKDyTsoPB^gkvv3rR&xRN)}hj_b2^~DLdLFP$b)Yg?=NeBB+YJjf99mT<(Adc ztnto*1su4J_0`2p95Jg4@uG}1ywkzPqCx98@5N6Jk1ze6>nNXQm^ld-$zNCX5~HSl zcuFyEkRHr~W;5eJ9{HwH)XXD1{BVWENsg(b$EK`5&Dll0%=)61^CL$J!870jx+`kFWav(^{joTuWaG`R2wN9Z^L)Kp}aKI28M@+ zV})>gL%mN+t&UXjd>kLr@VP5?S!h2!joH1rCs(!z4xvGzBtd@m{)5C^=lpi5IwUYy zwmzZ0g)_t2$Y-;$iP3vA4jUZ$AAL-dORR+|gqH=Is{D+G8tv~jsAozmfty5yo{tnl z^%kyr?B_EwOzzR$ID3a1(;DUx^lnbU9obUtBLc}MQm)#MhAD;m4zSk4zK!!y|rO|JSb<2M(L&&0IxnX}o$CJt za9x5Od)?1&RX3h7NjNv>_DI>66#1a=1Z-SFF%sp;NoHLkzbFpBn6*e{?56XHTUSC;8FWU|y`$n;pea)?E88LgF z0+8b1b+1AtFR@bv?6_u1ck18&b9NByTV=(=@1-xgope1%tA-Pb9N1Ba42%@a!4`=T z=KYu(4#Y`!XFDo*DY&)X{CU}q@a&KG2*S1Gu7&f2zR4k#FK_~Xwo<=mhnG{^h`bjb zxY$O!nc%Xs+m;=P4-stg(4iu1wYg9Pa_kgCR_LJ>*_1vb|A}&v&=zWT2Dh^nfVx`I1DqyPXVV?VFuF`kPa9k@=?T4+IF6}qnVR<_$R$Ze&`%l@c;iLWd5xHk1anbJm(*` z_}4%F_X`Ax|4qXGCgIpa{$~j=4gZ^j|DPv;56VTIgj zyPMI$8D;kmdspK`dp{!m<IPNZsRg3sBxhS7fOgRPnl+g9^8h8-b*t5l&hDdvux}0LTo4ur0v&>QWfcyW~E8 zOhrDvv)9LC-Jt@zzmQLxfs5!6mL|t@GOA!|dpR@Zn*`EXJXowTdx@M%gkk|iek~iG zQ8nK(@R+|KlQwE(rfiseNz`^0nFc_!y^#p_mvvHAb4CFNkvZHWswIi)*fCgOMef0r zgu*H;1Dx*sE8>X8VebCTz3<-qI=*?ObLY~NyP>)UE(f{r+FgL+KaJ9wj%5d1wQJIN ziVBy*FCwq)!ZQ!f&wnQ$Kid6m`>VDZ=*iV(k+XorSASAU^s# z4bXEGn;6}6k`v!I$%xvxcBZtJ+LiyNO7}qOM+8tKRRPWU^YEP)@DWM4aP`HT+moJt z62oVZ`mV(z=PwUtEPA@nuRSF5^x;kKTeEriB8A)=_~bWVfJd6DIm)=% zIyvP$`=a*(P7g9M-LO*RDl!dCYp4Irc7)Ig@>JwI!BLVDSlG&UJ2bU7)qrmO{@cPF z8N+t%c6|AhM#{g(&9On*mIJMm21_|i2G!UNW{2>s6#UGak6yqX;Ji*KJY&y$6m$7# zU14+x$jX415FH`1j7`WDUy;(ZLesPOl1LS@8=FvqL{al!?((?Kgztb6Yre5F-_x}f zLj-4SRsGeXK)c}Lf0e;+(0KS)9wWhk&UzGm+(BUG_=nu<<$3=G8Ww*49+(Da72{uF z^(>iOd%r*OGSko~7Zecl&|HV7e7#GL3@+^*3hTtQHJv)8@Fi*+9Vx_op+gHFjP+mT zJL^?E{BPW)mC~!v`}b2owF0;BIzFKbbwU;kdt-336~pDDvjb%)Jp<6kXrQ6sn@!l0 zAX5ER2*Rh4!DI=fAh9IlX{QwWd6>YjMvkt&EjPGZ-Jkv_JU%imR$@GS8x5a0%ICZE zCG~Hfz<+twKn=;VxgmOku9Fr6C-=_38e73xyS3;C501*dg}klfJ{ERdT~@Gx@OR9k zrO^%eei3D_K6>P(jC2%M&=3Td8@*j{QXsQ|X3o$RkbpKqBUJX!>4l)*@_POHPZw|( zIYQ5%v?1#h!e7I8ll{F0f^1Tw!;>YyVgAEf9%vK50ct6K8(8oafH9+o^=UlS#&9+l z@}VkF%wMx;cz$#pvzDj}XO59?{M%$`c?>Nh^%6M7L)stATewLj{x^- z15pnb=)2+BQ-NAC92@Jp;JH7v48#1 zs^(&8)ui*Q?G@-NiNJpw8_96OOG&E8=V;X~ts2a~JOasiR`0*=7aoFWlYt^kL3y`1 zI65})A02WaO@dy9_jYg?i1p06vF*zA?4Q#F*@0f5Mxynf3B@zKCOP)sqzrr?5-zXt z*vaR}C?}!62-{F%qKOdhsuvr$sri5CK-dXex57df03t7B4*y&-4Qm+_<9QUO;5oJd zS0GK8KQ0>HjC?y_W24WXfk=Y^#>_*KisiQm1o=a1(Cu`Q$JL?`_~35TR6%e8IBHrF zM(gY<;d-!W30sHcakfB)^L;zE9ezK7C}*G{jT~0;hwPBIiPiZ|>p3nc0%z|@T5o&r zBssu-=kQNCt=#^@R@#3VF)1*HI@KFH)>CvxyJ>Kz6bN^gh+qWzAO+B4Fa){bANGeB zq5vG|=jrOXgqei%^pYCUAnXLPnB9R`I_JNRL01lQ0&gkI>3A+3+ixT}5mI<)Fi_-7;)LZ2}f+&=lwTSo430dWugN1&UOgf6v-z|%EE>vya(K$5)|4Rp2$7s2a5e#HTK zFX`;W6U3Y$$-?=u&p&|jOu)&`{y4aa1;RwWYzNU$FG-dvXt;@0=cs&AD98V=AA8Y& zVG=5OY>dLZBVlkFa_3d-^e!lJHDO3Ta5RHk4pbx(swCxFZlQuE)%VUW`CvdJfbwnU7yW?o& zMFX89UIa4#nU}W)Z=PE2{OebGC{-?9iaFWq!w76)6@>;*$h$dHwma+n6)uKPYD=!c z(T{aEj{SucV*Vwc1T{)y$pq-p(16jyaXctiB-44>0e4Rg-AD&SM~k#sQ%rQtA4!V; zCwn9!{W}$o$UpGV2%;(T)>hC~`SS76b7w$heGcAp9%Og0z_)}zwz)RJXAUlvh)90g zV(nG_Ohh^i!(i5ftmoG(8xQoN;b2kxe|`I#+<##mURXj>MUUxERc{Pjk4(1HgTzE* zP9kwB{5dwR^fYL*?hUu*Bg(2%)Hg37{TV9Wr}r0FH^N9$)e)$EEtpg8*n+>dz3IiG zKMB0FnupQ+ud&gB{pOQXuvF(k+boBES)mfksvJf{Ds)Zb8nfdJ@t68)>FdVY7a3UHRE$B z3%%6z8{5n;4t8p461UIyoE3D^3A$GH_!z*TP+au{XX~&7YSvHdUb!=yn>(re`Xbl$ zDt6x;FGpe~Uj=oT6@cy1Wb}2MH+MHK`8Mp87>Z$4-fj~kFrYXNnJAPVxwsxy(YNm# zJTtFeHE4)NB;b_T?WUYqW{v)G;77@9sho32hWvK!}1S$6^h6) z-t?P*yiAi1>MVAO3XR8xYRPr4XbbzzDLjkzhI#s>X1Sb^cGx>0iaF|0IyynbS;46L zdEyNj1!vT=2+=e#$N*jn$Snk(?6?a)*}+++vcZB`FC4H;$5#+1m~_MAh-%G?zc$2! zqE8bsKTNrL-95B0)UcFLl`CrUtrudmG;7Wq@J$-d_d~IY2M`Jukd329j>j2 zxIUImm|^?nLTk_Gb2X*JFL{lZQ_jfj?lqO9z`N=gVZ=pNwFJQtE<65<;CjarG$Q^(-J)vYizC1+EKTpl9U2@$f3nGyt(TJPl3tA6+EEK}v( z+4UYwMpX=Q)aHftch-Ij(yv;`%1AAq)`wLBn4vBvjQU~J^*CT1CyR6qtK$0yiGzoO zq19GJj%`I7is}oFS>s1r z^YCt&3!#B3ewf;uuT`8b z+Uy=b)LPMW4|XKJ7V_04bF5ff*e4^$<%h@M-e>VY!}QXHVJat)|h{xByd#{wqZpdQ%R zi2zuuRLpi|iD5b5;hY~4itB0UlBHLCVyxk8m5w!EIuOF*3N{f{XX4!GMFs|H4%MG0 zutIzHS7N*2&k&E6xkrQlB+;YCO?6Zu_H)cMf#BRfNSfYirWWUfuGgO}P_MNZt+^xJ z%07bx38XRX#Q+n}{~jZHbSrOck3U6pmJI)XSb;%=QJ#mqun))DTAfSPdT&L%02Ve! z`R@2+n4Go2NQ6w)`t~(N^$%LYNQt4ynuJE#gg(CNsJ(lUfs~6q`JnA%dS4$2@G?S2@Q|U48OSlXQ)PfnlI} ztFPA0si$+|5x9Cq3|<{Y-~&3DLrhtTVcl)+qlKa8#50R@Ve4=bOa>N8pl>ipR?xBP z9)#P}>5H%BS(V0I%=4EAu&Vsd(brLt?~71x`|!xQ*DKfP`LyLbD+r6X>^%FKV(h~m zZ8iLzoh5>l5wAs0EkoRLNh5(6P{EzP25J?|5MU(4lyxn<5 zEsD|oDEW5fqBu(geKXa^ZhWQoERqi=89#W@9dchj;uYGP6*nca zZ=h^@bJvZ&Aroc(rL$P-;C?I;q~V2>nFZY%zPyo4*A&o6)a9VftwKKXFF4QpZT35U2Zxh=wbEowh z<2E)}Hoh1fDq`B~^8~waQB-s+Nm$mvU)-H8IqDWQ#+oEbm!an#FK0>dK7VR^Q@Ybz zqnX{~_Utrw(c#k?y^lM0>>HvcK4-Au+>&aox##oL^P8+ewwO*0?)thlyM(x3h_@0; zpWIip&;b@6z8AIr_(>FM?A9)pGYBnitWHfGan}6!oI2*X!br|}_m%ku+O>0?`DY%N z@TDKE#Qvfp^!0}d%dBkt3OuBuJ(tul2Z>5LRJB`sA`qz>!*$Mi4VDu;J5Qctv?YWp zCr{kQvW7*UyQYQjZ%uQ~nRk^v6vM5#M1-3v&mcmNB-`J4$+i-74_f9ZJ)QGl`1cMx zT(N0BC%XGHoyeD-G}99HV}!*UD>i2$Pm}z;c8-i5725dVY=B8~sM|86rt=nqrFVp} zQOsoYzlwjxVW>jZiuOScDs-q@DtQ!jxlr#;`wQzS8JTmQ{cdZpZj6Pfemk3v%u{viLGAVLeQc(`DPD75Rl687h+R?Ethc>A z#1jxzdPS|!FOlldw(#ZGclC6TR?C|qE_Ng3xZ={>utz2gofn4QJs8ySFoKSeS2ZWp zJ6~4g4ZdW2LB@@A-Y1z7srhQyf@OnoEyivhQku~m;BqBl3PzkA=r!{2X`Rin2{~PRwiTJEQ1Tw+0SIs&V+k zA?0PdvGdN5>6@1okz}uQCWzAgMfo_7?J|%2YipE?dA7Kx+e~&CsrjMu-Mb58?=w(X z^b7-ylLb3u&FcH}^+O~m6opX#NHRPRj=Wc$eR5Yc^Gp*yMRL7wH^r=U`TV%_&}Xey z9sBv)WjnLD%*&BCT6KDs4+hI54Sr=Y37~X?Q&8pHE2;{^h%4rE4{~xLZ`%kQi|pB64K)r7Pzcr@V7u z|6X`GO%x<{g6XkKlfQ=@(fm@C%)x2%gz(^s<0MhZ*vm|)tCo=IV3|?!pLaM=P&xmi z=V%Qk8C<+xbQaBy#2}S}7ilavLwUX*-X!YIxcDYYjv#rOJ8EyH-=*!z$))1yAaI*0 zgP(%w^_i;(N{&Wf7=M{@urB(YANykQ-mPJs^W_SvYv;gm0wJTvt*;w?`IdHpI>0U8 z&hi|d-9x7QiL_Zhn8blf>&?+25-WJ({TrLUri1H%R=~`ON=g#@gHUxBA-l@$<_q>G zf>+iU^v$np*PVv^E|uQnS4u~j%16pUAX1xZJkD^ZTJ$l?TKGhWaEk=K>oxrT=S6tNFn%*E(xrV;C`mj zz#%Hm%x^&kF`rgenQdRr6onDkC|*j#6ui2V?}fg7aW3w|Q$WS= zu#a1R_aQcq(qmjXQFjhOL~PXw+|gW6-!zWs-9`WeBvJ&rv6fOV2(r`!+?R^2RTuW- zOT+t;7}35$h7#92b{z4NM4?>ttL$@KjueS%77dM2` z;uL{UQ4USgLj@_~Q)UutFB0hl*=jFqrlE0cA^;khOF&dxFex*akgPzEb_w$tD7ccT z4^}cM2g;z(*izDM?K&eGsooZ!A=Ek`nhqQ5QK;)c_bwjx*yQbm=fwlG->BJ7@9vvm zig6;BYV2GY2zqDetbU?Wh#7#x>)>X8ere5vbF%(vlB;nQFmvCT>{hBAaffF(b(pvh z4gBG;ubtUKYO~MJX80qt5Fj`8DzSXBbA%1=0({=m9V~1$e{n-LO%IU^o~qYVKHT8? z7hN*~G~xEX=fdEfW}~rf2r@>(o$94tto^6nQ2OYonEGg=2_Ux7 zIOarCaQoy2-~=yzh?RYN;Sg_rbCfnW_}qjr$M>fORlVt8^lSq29!c6mmtBSwXd9xa zDRgzY_r*|D^#rXcx~}etj<}jvF9^Oz>omPl|LBPa#J>7=B!0{LjHXifb+lhL2fVcdI;vcZk- zy$w$M7NnQiw>@V0WY;z&F7Dp?I(Mn$RLJvg=jo&y8tZQynE=|Qeb8HA{so_7b5ho; zuEb+Ik%6I%t1F0y9hOL3zajt(5GJrcNWb_v9H%{s$!7b0(x6t9rLdS$j{+&EwS_Z| zHXJo8AMO*xaq*jkIN}NpPvkMUgQo=vs2FBI1(=f3LlY|!3BH_hqh8p0`N8frFvX-- z*tjb*N$ZBVDIZ3>C+jtyYsYg+(6s{oQ7t9j-ZW#u(t62KGioxBzgWzu-bggl6xhh6 zB&R~HsJ$7!JOIP?DuQw;Z{y5SZx&i#3s9fY*i5dq)u@qCFZs-?%@dtYQpuuO=z1PV z2Mit}_lAE)NywQ=)Dh1J{Fugy`*gXrGdnwBT??kDJM@($T^Ko`aS#O;-1*n(mAtx$ z)9(C9X#LyNqLsRCpNN;KqEGk*_fjn!-tytze%xdeAl6|yM547^yElj2R8W6|bfd!f zK;=`*%t(0cr^YNo(;Ig3rw=Eb3a3vmHX8Bn5dsqs3n4%nf$EI+&0rCSNZ#NgoROME z%8ul_iFsq{k7v7rCaAzIkb8fgiFU+oLsj0OXHeYU6IsTOjBXY=pO63Qj$)Zf1{e{m zWE)P}}tc>E(nd@gbG#O5mQGht5#sr)_a@GPSdUZ zl-JpraNu@f;HfGiBACu0l5|UthU?4t2^3lytVGv)k4Z4H`(C7X@49)c8IQQxpDfyL zO<^fv)O(w(;8^CY4T0>jM0CX9N>SaWogGCpm~KQP<4ITN`hzB@A=)T- zP(A*Tt;EEWgT6za@&Q$6A+z$!G3E@sDHU2fT2mIU2IXEn${)@_f7(Qr1RnJ@cXS>a zkMHXD!|F1bvx&L~`m&tr%iHaqfN1L&OFx7m93W?hX*;lUD5<-*lqK23^*&w01j}Jq z*TWLcnxZ3i$%m&6>MsDJaSo<$BAIlV>cdxn%LB5vcd7;__UE|XOw7+fy;PpB21xMU z^qw}m+R^%`gEfC_mj-{(rC9sLS^n`c7lfv%&foGq$zF%f#&$AS}2I zBjMTdMwj~5GbCHy>g`bE0&F*H@;X(e{tT>^;m(~u+RsS$eMsZBX;y-uOAu7O(W>Bk@l z41P`k{m)Ug-zDlRnczs=ia-ab1tXBv zhzuZOvR^-P=)O0>KuNC#kS0Tar&P1^|5Ol>5=u2}6Tp1DczTVNq+Y-#S4Vc&`fO}VXLtUL(jyjmXjkK4% zb6dvz@w9@J(NQh0Q8!ottQ?QN&K?30q5XQ4sl|Bh$L&IO6`C6yOVhq4=;Lr`~1A?)d`_l>u9Vhe>wFu9m zY>FRWy<{Ss7td=YdTsY>gN*=_%u2cT-MfTDJ2a%IxBzV2Mt}rEBo^mjz5!GECYtsH zO-jN-HtUo<6h1-wxu0~}Ov}eGDn9~!y8dg`;CUca4uP{M>aU!x>4V^l^+OTiiQTFl z3F}6I-Los568^bUsx&kt=l@!AKeOjtjXT6)($lY|fvQyeu%0pU)v*GY==H%l&+z_! zZUo3I1Hi68_{K6aQF*2bo3C4oG0DX_b{n27d>43QJfjSW*!XF7og)J>TPkC!XLZL* z*S>yA^`!ejR&$pj)F3Rx=ji^hL8d z{%)tGn?U|(+DX*(E)Qm+8D|$0E;WP$r7A<>i=0EkMfTo=N8Ye#U98tZfC9W4Q;h2Q zvALc7FPnUYs82=CW$Tb~7C4AC_APh29!@9zNrF}Lf4O^`a#Q#FHotxb{Y+vl@u9TN ziFLj+=oNlX8-u%cb=wKF5!=d;-Z+)3R5wCsNPd9GwJzh>JC z;b;wy4o0j}C7)r${dOHG$3kDxx70# zOA@17@PO<3QdiJB_J5doFDyWzEST>$*SPMuSF=4-Opt~Ymdc6;;-`?WyWtUZ3=Hi} zatIN^z@S)z;bGG~a&F1Hc@Abs2Ow6l2j-WhRORe!2v6+_(t5-~yBuOstJ+n2`#yf--Oqg(?- zCqe=QcUz}nIe{tY@Ar7SJC5=SpAVWJy(Hh2GZdMQ<-ulOM$`wdQ?Ul#y@N+JVdaZ^G%BRwMxJST`&ojN5p@cIup1?gs7q2=&E`lv+n%x*Lo#CG-V^ zb#{Dcye_mK;?)_oB)Z4~ar<7Ya&K@MD0tJ2$8l$3MMB^MeOVJ0Y_q{7;lJ7XVoS{> z6p9x4Ya`&L63-M>Q}ek+i?YXuaf+uOL7eS!D|5BKF9oy{#Eom#mgM}lJZTWCB_Zk| zlk?MkyPZHnlz9>dp{3YlGg#h4aYH@lNQ|n(Ex$#Wk>#4A1BRj7lE<&;R&JW$wwb=X z-U8Utu>A8^-{2_EhM-CkWL03!3hsS28M*2d*r^d;5KACQfrqd69zZw1&<e{Jusfs=qJr zbwFo)?&G9kPDp`zbOlS|*q5djsj7o)ji!LS*dWI{{^v*9rq8+lx&+%(TYEDu$?(Z7~h$S=)6xbBrc_sS6 zxMu$=Ys%~t3#X?g3-8*AlF~b`#-osVhu&if)w_e3xd0*CFAwZd8mwY^IrX`2Q}aaW zl?KYau*$qZv^f$ByjDqT3WSaxlSg`c;eb6aznjH3yNx>#tl2wH1qZK;vb|jt(h!aS*!13}0&QKj)e{mT<=xMn!*6Zepg(q{!{5NHocz;h$HfQiRLsaPhe0Me(mwG(XQrMZU zKpvt@_#*1cX~MI0%+O>a1;j4g7!F0j!w>Jop}H7SNO})O&~2Zj`gGi#@8`W))k^4q z&3w#kWX*|*X+K4Wl2mOfiw~!_DURVxzA(7?$+u+@D6Ho^_YA`$RSM62K2e~4RHCHj zc9{s30t>=KArWMKTpwJDa8V1H;`=OOD50gjd>}3y^!oJ%t<4dqnQUu&Tfx+2c$R<^ zy%{?w4iea=^cPf|9ss0(sWi@v`_WqYT^KZW8U==$^g= zeiee5m{uDip>53+z6M2zA#LzU=1H~b?yf^NI@@dL>eZS|^e0CEp0FkzCb_zgB~Vv_ zK4Wi_(=&Lw8&KLL8xaPE#17r)61~QKq$xVwB}EW^8{DXf5*Gz*jnAGO<*Q;wfwy5+ zjzIxc>v%mSDfBPJWnHx_zEADEoC4-A=(0%;(D~SG37F<`mg7mV%R1@C6 zu!ZPhqvZOwN?Yr*7z)gs9TLGF_*Dzo(o5nd*+O{)@DU4m}JyCVSVViD;Hu7#5u5|a<(+T z9o&Z5j_Yml7Fu&F{i|;owjN;p5`uM4gJtHmwu~6soP#bS5Klv!AwodvN;tVffwSN1 z1_6Rz;DB7{ z7f{J{4S-6s!q5JREhFK&l$j2|+#&|Wg&xgEH}F!P-+Cy2@Ps|IRtEl4Ty>{!g z;v7YwY#qt;dZ9@sw_5O_`;arur@7K53WR z9F|BO)mi>_`j0CWO)U#&72#*O*e)w{bcPW?AOQ}&5(Mm0chDQVna&$?d*{<^Y7kga z@Y8ThK%JFhF{%i?a^v1P-?%yV25+I7Wg{LT&WV==sWxXIfMrx1=0K8q;V*5$eG6!J zWpoAJ{w6R^NYVhu2a-+t%gH~$(}EAt5a2iN zFKpLd-rOIDQb@?^GC>x9LF?B{;5yzw;~nYt8^c4!mFCGnMM%cQUSP?o0_h^O#vtM{ zwC;R&$Sc18%0fPRqDE&~fQ|2a-_M1#`8aH;)AsFHCN0emQ_;6nrbl+W&Rv8oxh#O< z{81X)6(DI}15Gh)*FAic6{xzVh&jt)mI@#Y6jtGa|NAtwa9ssT6cWJ( zZ^b9F-l!|utl^pHTiVbyhYW|LmPM-sY@Mm}o74e|e6KX+=&#?gE9$-1l29)!~t5*b(NMBkxt_>{h*Ere?hhN}B+K7_nY{Y#_8L#gT{p24nCTAdSphuW63Fooqwah0sD}-2#*RzF zG*m&SY?&1mYP3Fp4p8D%Tb$EPHOf%F^~r8H-@EsR`4xo65U1XK_AOV=C}Ze}gnB!W z7*MSYhM&m1S~&H5l2H))TIK5-)EQ#w{T>VEU^JJ00mw3wxN;l9H3BN+M5=vXmU-1z zA8_zBeOD2!)E35ml=(F5(DT*ysB78sfSB2zhE!cK%oZyne=_JEd`qvgW!Szll6eCe z{|n{)GQm?z*A?A9Od0NtJl$(cjL1cQ>bmbidd{Zub^=p;qA&R`)-$fhU?bdwcR zbjHU^hj^}FRYl?e%8E3m6+WHjkkTtojg_~5(1H=MK?IRx5J^HeID;%nYj+_PYS!In z)DZkRkjfLKM|wV+YKH$jXbaK+9e}7n@mS)7MQ_l{uomSg?@|6>m#-6HvRfgivrdh^ zUJ$IK)K;a|dxirN9)K8t zQOLX$)Hu-^S82kwlmZAH7=zQq5F6X|ClU2a6QMAr5V z0mC_)O29-o7U&0Oi`N&7pY&=jt@+UPo+Uj#5A+^j!DJ*MQJ9svHj9&F(3IdzV?JZv z6dkT9M>q|{b%Xf|A|;BqX_JEwFWt(YDeA1XnVCxjZ4O7E#Oa~+p|oHTCI~d8GbJH3 z$9xs)K4?C*^nu;j(-e(>Mx2=hkB*+gF-HJ&j4)xk>HKYe!wJQCD5H6|Nwx!YV#-SW zw&_rfPm8B7B1IC67{RyXA?6ttFkA(}Q$Nt~8IDh|4CV;1P6bEaxSAW{H(?`*2w=c2 z6Bb3T*MOT0kTD=cnRDQ#e;#n(HJKa(oO^)LBs_Z_GTB9>^74nW7hxxwlRsvM$W7Az8RsBzP2}llKz9fjjuLu5SsAp|WvDC7(ByF($#D-8O$7I0+N>SVwOa<7 zat4sB6lZ_F-QghIYuHio1WNHGFfa27;#i@;-~b*5^&R{9bJQKHQNUzN)w+NQPzxQw z;B-oO$S(B&U14=!7{1DO+vt-I%`#QwS9XtQq01*i>~9P%T^;$6K%LK7m^WVOy5Vy} zF&lJiinT|U4}slS8hXe$Aw@BO9UXVhIx_a@o?$b3SFudO>HZ|bp+aFgQY=68)1ziN zYQ00#wZsrrmvd#{MB`)8&CTL54+xGMWgccqH1!XP4yZy(=T+D6X1|}s4+FJWdpQTr zADCi{Q1bXecBS<>*2><#$2saEGw`%hAi66ybk+d4jp#>U>6(dM>X;Fn^nw~F;y!5G zIJi1WBbnJyBToGbR^1Z_XMKp6>AChuIZbO6MYICwS}ePACp(EXqw&L_xO^~hdB`#Q zu3OzTX7Y@=Jd*|f1Fxuve9t&{`qK*A;?)4+TR>UY6NF9GB&GZOSc~yFKwx>}S=qve;|34b489d34qsRN90|io}MU8&#_YX~fN(N#ODmXB^EnWLb^k02mlHxl6g59!``?bIgWlm-hvLV`zXymsNB$z%d%XmQ^ot!Jyw%dB!{XqG`bwIsC+(E4%=r-q&Zs_Y#u&mCYkNC}M# z>l^OaQE-Pspg=fNrbAa~qXSiVLr9vHRFGSAd`kwXfMvg*Qt3B$YiF^F8q51vM=v8x zOp{~_h`pfQx^%J%<$R9u!w)H_bdL4F_19@;nqG^oSWXhPDO8lQ<+(Y4^pNqGy}M%m zDeWa7y*fq6qR0M)qXacJ0M*cn-&_=g#x3TRPSVhYR6N=r?O_*f3=1ogM8temrLGzG z2=pf>7jwBSdV{W9z7&sroHFrIR~Qi;4-^Z>B(c6=`?}%Xp=8a5L~7OcAIgZ;0{b+? z^XB%k1XN%3^F3x5fjTFtzH%E9Y?z$_L{(3Abh{n=Kla``9P9RtAHR{2l$4ARQ5lhy ztU|IvC@P!WNhl*(S+|Dlosn5~Lb9{VszkQz%&b6fhEzF$GI1B7J6OW^{vRUzJKeFSh1jQU8#uei8ty zz`EMGNguB|os3p<_5Eqm&uaP&@ZMIwzs+(4?WRto6W7OxToQ)pyeEigPEg{BOhgyE z-nl&0kTkD}p!2naL?|R(4L`+xwO88R42Ei+dDNLLGdvRER#l?<$+I#96*4f%lF!US zbtp?gmou6;kA2K5$W8FnxEaA@i#9GlvZLS-a0wCtSeAWLN#y8hh``c?V*~4oenpe; ztAWf*oU1#}sjnV7Z_W(R?<=mC(&x5f&-yL%XF0C_TnC~Uc0p9L$nKFC@=~#*8?Lp_ zm=i$!1de^7ItUghSZ$Nu5BKH>{>Di1-|{`jf-ANXoPJ=z5I#h#Q!pC{vK!#1)F|@{ z1WbbTn;AW@)iC!NliK$Vxl2}zgL3wY84wMgCc9`VVX@?3fawFTY2ydDMuJNFVJnFi zn5INr0R%|ZSPZ2oEZcW);?6hz<0(=okOFI0Rh5*V28xx%={!aA+}#vdxB0CpwWnJ@ z#lInFi3iXcMUWqBnMx+*5CLkCQX^Ab9b(+3@)3u=yxfoJX%M$(b3aCB|Dh`o_yzPD z08{g@oij!s(x+T13V~^_h`;wWJ_LRZq|0+Hk|W~*ed#zp>zc_#)S?DzV_s{LIS)G^ zpFUfv0~yg!E0IK|5ivkh+wJOnjWE+>Irqj6kUL=B?1AdVM+o>!6@2RoQX4li&BGHY zmlxmuU<~ojbA{Y=4c^9rIB}un;yK?cfqIBAUDNNn(a`bJVi7Exo!~HC_(i4U7@TZJ zgtCq}L&hyPTUV&$75so#AUDYml>_?s?%G#kVFx5G zsiz=4U|Re0HLMNO=B{;@bQDPmO+fPd=P`8^uDrN4ZGh$|qbC!vhqIgrXHM8~wcoI> z%L}?rL=tdD+H9{~WU+Guzb2+68CDl~O97l$@NT;J&l-ao-(awQ0Rh}5*ra%7uRKs~ z?w!kaY(!Jg=PN-3SQrtH4=M#pWfrTbKmx6rHX?xuD+j<|-;(#fc+LIZ_YD~n?z#{d zY#R^tcyEY4FbmCcQ=V9wYV{Awh2%mO6Tuly*9zZ3L$2js^O}oEb)s^K1bAu?1G?6| zr(4E(X5AzT41=MihZLYrAefZEMC1X%1bhSrD@XT;xFTHhi<7HDL=#Xg!nVyjc_N6W>vThiP%F~ApM@nEh!g~OPjddE1b0b znP!@fFFK7_8z6CJ-~e3(3*yrY$qf~8l3>IxV21QGg{b6>teRov7JaL~j0`iHkFGOf zaK(ko7F>q>Uk)JU9wenUy~Zi{mbR)=Ruzm~`kBc#e}Zs6Yi2TbDU1|g=`VtKod49{ zaa+EU8vM%hyN&n{ex^K@)%0c)z>Uh)MfUXW3?esra8T*cNa4dP7(G8}Mh?)Kt*^S% zbRA$KO?!q&S%vQ~2$h{X=GIBgkLq8qadK;(0X2khGH5M` z>Hww;=APEqBqCB}nRsuuC((23J&^Fw|PR!iD_WmIeZs zeFtxvBE==g!hW~WC+VLWWW#;Q0{2oNBLRw&v;0(v$$%<5fK(3n?s?d4MfBB`ja|Bv zYVd3*OW$Z{8lj5up!%l$sqZ$=J$B+;xWvmiOpetw$?Boc2Eu{0wARA&CdMhRsSnRg z8uyc4d4*VjtfhvIyFyn~)F+S4p{CA1@PgY)47ikuOr(-skmIu3#bMob!Bz!3c6z*01oUAXx7`)a$i&%K1Dfnsbkb^#$vA0Z{wv7LYR;2$gitS)Y(u!S5evbnnlavP1WcFmc1RENi!-e9%= zW&D_%=@3f&020^FIE%FYv1y7_i9lv!8vA~Nh-t8Q5aI~oRFEJQ_h)}5`77FPSE8l} zBLE`-PRor-3qs(zN`v~BEj zb7RVNn(iWk2;+J2gI#?XiD5ywTehr>3 z$%dQ>#pYL@$QI50(fKRvXHMLc+%6#obVXQY-EzyC3qB6>rZ!olq8>sHmx^WDf&mOH zF0J^6m%!pZtAz=~${>E=eeAH`M@S9O$%ha!_1k@d;HyMCkq1fu0_S3$Vt3IPJ_0~6 zN|FUX(8=-*%{#8c~W9+!}u??JpybQ&sOPx2dUDmpmkWc{) zXbTlKsLsl84+Mr!To*5oymwj|7s4E-q!S@N5@!y0fA*TC3SEe7gVG6uY7Q`+ThunB zz+_ie2jP|kra)SMv5xf7rRr}ZNld;nPYR%n0l^~h&y?#>p)V1e$x8a7!xCIWEvA!5 zeB$ih19wdacRPv1UYt#!x3?BN#CK6;AKM${XTOa!w20Y!j89t9DR4SE$28dQJ-*O?D(ai|MOId8PR5kz4( zr*W{pGU5#8n$A5^r`n!TuyB9l+gRMnX~60{e&EL3*%Gg17iCg*MS=*(MaXe-^A%vI zs8D4SVJI`FFx{%Y^!6qjzQl>zP+Lw>9oj}5*&pI#FATr{=l9zms$QjY<+4@CA%79s zt$;kUqfXcXud7js$`d>s9)Z&}_{jE<8B({z-9hjY61N}0xl=k-;q>kPL%Xr6E~w58 z9B2qE@{{k8E4;rTNq4!&xaaCID4l8bzpxE>@f}uN-ZWcBL;0Mn{x0lJ}5)-1%L!VZ~!25G%}sJWM=HZ^)=%+ z>rP4VthO>r0E{7+?$^C;yto!9flw8Hn9^HRH5Kv{!!qBIG@i9_E+r+nT4EO_f{t=G z0pD&YS0jXY2je#Ffe+lH`CX^Cm0PaA4n~pGxMz2<9EPJ1=tw}wG(7I)Nm{iy#y91S z;p&g(`*x$sGdtLN7#t0p+j1wYJ~auf?VuNx)QQ$bRX=@I+W?1srz(@!A!N6>xxlq| z_Eb<^(F9&0k}`K3%e0|LB3qmobD}2p7zWZ?1b3*lHw~L}=13big)c71-&Gkl%Hfcd z^X0zSs9EW!E20D%P5gZ*p`))iA?DzrEY4tL*6v`*@`gk{nP<%cYk~;Wf=rXOvS{Wk z$chEiJ_Tk318mr?PL?@!hOXd#oZ{#NDZLMIEx++mF-(OrHat0MelfonkHq}f{br&q z){0)0>D=;h{*{Fkv9oVSlHfLWyoLXm6CaM{&Rgp%M&^ij(3~dqQC0}vfyTptMuhMU zr)#_d3^@4PI)7S_Y~P0u?Yr)sWPp$c8#Y^D_TJVyQ_q*j2U#q-iS98IlVJiFIHkb} zZ1#WY0VW+h1Mt7r_wGe+?$xaEzIt(XGvX7}e=I#zK1MuJtBH_~u;4cu2{iU@eEgOm zf={h!zH-=G&5qfzx?5*^Gng*OLcAU_fdGBuhUy5Kd1Aq1Hj9tK%1$_)uL&BQ$G(P& zFa%f1WLP8;TyXpLlIg~ksV@YWWyrD|Lt8)LIHf5Ze8Vw6pC*O5^%6tCeY$*5R!3i$ z-(j&!fjbqj316}tf;L&yZoKE<#^9XpzJ7(*wsyXuW_Q*!fgmDs?nj-p2n=@t8xL1K z@dZ!(&E{c1k+NPN$~UOZKJdXGt@IQrs?(Bpe;Vw7|A_j|UTR2Ig}T zut*Sb({hdRG~j>75#gz`h49tMWbPx;&g8o=1D7CFZa;0b0H6a$GOAhAr7c@&t}UMSsk(1iLzKW?QIvda7Tbo~25 z2LloezQ`7peC+tX__zh1_N%d6lfJ8=&68R;?w^16!RN{MKIUUL2D}cP^rJqCf+d#? z15q{-ZuH$DZqq-Wb zC~16q@ew=>2f=ewd3=EYO4D?tZf}C#4HN7BK6B3YXTFA{F4?c);llJ*k^v@yX#kHV z-cwnJni0<8Fg<|V8H?Cyfq(9`64T^%V(|LSx);^H`3r~Ak!4ChH4%!Oidy#zk*7x+ zb^)m{82wN%4u(VRyvK*WAHv(axMPqC@pWJfXbN|sXk0QsY$54QW z>NQZX0Ya)MRmxU*1Dr$ub-IzpPq)s}Vx)lic_3e4Ui(I7JuORp4MP*CSmYtm+xX!m z2A3u>L}g`26V`KM`)x01y6FyuyziaHi@hvRIgqZ`Ed!A-R04{$7QnP}hbqqFoeHqs z?qhJC3Uh~l+5I5U*8n^qsL*2vM8Vg@3|Ik;V|(TGb09yuxR_@;O+r6q72Q3QTD-ZP$v#W;FXkt2)j7RJt0+!nb=$gcswHiAAMO@ig_ zE(^i_czUWWTgL(j6b8T+WJ-M0%vKcNM=f%fBFyWFE^^s0m`sfg4E7DCGocht;=%Ai zU$jE$O2x^5$y*X>XMs2&2*-Txt|K#>=K-M|R(>ioylAbmN&P6oNiilWAc3?i z;fZu4FknUAjIL2%TE(1NC{Y8Lc?r)5Fd;C(lN#5rYOXyfGNqoU=DWnR@MNeu z`>ao?{>#KT;MAot4Klu>l-QdahcJfslxFxW%MXDD?SPGV=(X#sJCH99D~kpBEC2;~ zkS5G=Wh$08zj2Q(MH&z&A*g`c+VG%?d%Z4LLNF9Kc>TlY<0>(iJ4c9hb4!7xu}hED;!K<7YZ*5USSwBy;*$WQ zkXwEN<&Tj5ZJ{>bl%FO`80|5udD{u~9e6VFU4YarlKPAQvCR~S;y=MH5f@o$vpqe^ z#O!qgNl*6u+(S@03sr5QM?I{YS?{BofcK$0C5Lyc0DTHU?8rR`PVT@68BdhNGg(*{ zS>;!P2Y?885o^QxzS&0ju#N}ci9H_`bt2N4ZYT28@NbH;k>v(2(}wKgAB#B>2Foj zz)=O~#tTeB1B5`oL20#c$7T;?*kom(Q0I)r;|D0K7rZ%?87Q;iU8TLB^nTGS$)U@ zLWCj2;WOlsPHaHB!U;vG)FVh#2KFQy2y^+g9JP8rD0EBWJK4Z3haL4E2MW8<*h?*b-98Fs zr}0qh-j%KEqs|ht=ZOF?+Z#y6j`+G+qKa{z^x+ewem#6!K@0LP!@aJ!B9tOV~6@CA%nJZv9)WZr2@}fbu z*+MOdSOKevL|w=(^B+PtC1z#%GMJ--?GT zpVOzs*+3DP*62PA9Rzbax}b>MdJjUfJvluSQr{Oa{$u;C>{|Jq7i5)>AsH3?%zksP zC(N&Cer&tm^yzLWn0l~A?FYOpa82JJ(aUqA*opS!aYDmq0HF*Go&+cwb7_!4xxKJ( zYjCcmq!arf1y(6f$~$)_v*jjEhh|e1K{Fm==6{Pt+!{LAmyZf4;#t4 zOHfFk6Lf{BnDj|1W;MmI2e1H{+)@x!SNyqT3{X;$>4T>nn@&-Ek0P(Q*(E#-Y4~tJ zNEt7d+JF9B-ud!*wJD^3@AO)HF?x{Fsd*K+QtifCSuR||i6CQuK`zr5CmxUhM$Lm# zu&k3(g+UTd;r=tKK)LxLZptF39NER}ig^Kc9(GFvKF6a`u5Xoju%D^cbCSeF%p!~_vL&FhW+t!8l3?c5OXi z6!MIXwS)E;9BtvhvdkX~@as-}Zsikzw6?J*)r0jwxahW|sU)ALt(kibm$sI^L4+## z^pb|>b-O3g(?9O_cBWJHoPN^LD{{F~hWU&OYc(acI{ETd#c}%x+iBW79Q(s0P3`z`{KGtNmJ9pT-m6OIHJZ=|D9>LfPY#%rKm3 z!LV7RK`&z4JWmJ!E?NT?j=^Pv^?p-=pxn9gM5|`6jO}r^LLG5J9KE+pLpmr)zaYJ% z;OX3PxsfpUYoS)K?~+gf*^YSgq_td%oBk0RZa4LO!Db9fARy6JNu4Y$V7K{BWx}mo zN1SAU3-Wi5-JEnhHWKW}9xXCjHIz&<{KlfQq7zfTCsHz++_bL-Q7YJX;Xd|;Krf;3 zo%0SEuN8`CI$SD!=|==UK2+kCBvrl!DgclQKGkdTv;|M4Bj0AfdcP8aAc+avD#6+2 zV}NhO$OGnO@ki&e5XYoljw2nm&42>CSngt~b^N&J2iWX@LMhw_hX=qRY5|`lU4PU^ zHmT6wH3cANF34LMo#)3OeDqOwGale90>Y;-aWm3ZDhggD*XATa>VhHR>144BqE89z z7i44*aO)2E-;e`~<`xAz3ax8ROikqOg8pN~!QeI49U}Iu%R4ZfRK8v`sWLp>-OmDx zD=^ew4#ygRxNCVY6On;HoaDRS?1y1t8{8~{(zj#2sdgu6v%1RSPmNOU{#{jsVy*zM zZ1yLTqW|1TkW;jpcpe~q9e#lbOQoeV|7LiY`--w{PPUItX*>#@0zp1%mDCBTCe0#P zEP$c$nZi%60sVF7n`@ZAr8t5jAxYE4356fO>Bcnx zJO%jAK3`X;&W(Fc+Qa%gyG|jr{i}Spxx5rPi0P#D+7QC&l(Hk6tAMjT;8&CB)SbiB z?>M;Ij-3NQ1(42it|{NHDHktTe={C389TUl=RBy-0Bydw>b2{nWoG29GqX832Jm({ zK|!a0w=|uif&iirV3{s_??wLXOcG|V$H2+lnf9K zR4B4<6CI}(*s5idx9gEYu2@{}O`iq{0?v_EfDdm`#EB;gc!c)gT8}t8E zRHZ0sK8S4)6_(hlCbnbyy5FDihfj9g%ClDf;FX@v(lj=y3+85rdv{$sC7;Y71|3<>YK7Itb<*hRxTzJqA9@t) zFwaS>K+wA}{p@m@Z$NpGxoy7jvDW8=k39r3N_qSj?ic@XAz43CB53>gIRm4J!$x^a z^ZmMxLEeq1Rw^9TMAw?;1lei27G^6mKP%F;wY|&Cl53W0a0YgdXn4nP`FiJY@6yaz z@H3{AdoA)*wi%@C(q4|o;x}8#pxRQf7(z* z>fR$_fnw5nF*&m-aBL+1JexYBo9wx(TtiqzbEOG7E5&oA)kU3U_vhZXQl)0I$2xP_ zK7J)~CgVfhs;jRqhtzF_ZR77H&?b9KYB}JFJjd&@yE^#imyyoy99B!jc5k?13utHd zy;cc`2hnGdQMLr#$C`?c>YlaSv`xkV&0~QER$ce|QL^Mng^ZR}(`-?t5oxTjJRG z=|^|IkS*iD7(Bc>Zo7RL4z1*HS2T8prj3q35jojnhW?nv)yY}j?Jw#QD(+ZnmeaX8 z+c$J3$Uc6vRPdmuLuQ1d(_FZQ=!+&&iciIppVW7lxqPppNs4Nw&h2=Z@yAx!s z5m~h|GIt&fylAB|Y()=Q6y{ZAIx5<-r_J_fwMpnvHTFkDPyLyd?5FbXY`(kdrB0Br zxN^{u+aRgaxfIuAYW7M~AVzeZ+4H9hy`#uUTa3c=lv^jw?ABzB?r{EWrMS9$T~{S- zoM@TONVMuDpX5lJ1MDxqGr95_>8_S9Fh7`!{2?h@d3%lMQ`T*h-jKM}UzrPwz|r}K zgll?u^}@wSqMH|#PI=Fy#3?Z)v@UHd_@S{XT zMuUX%*)n&3f|Gq2gJoaNeCWv2V#gPnJ@m>{c`6oO@OU`9_HFj9HgDjj7t_6s$^Lv? z`m^q22U+%0`H2!6t+B;m_q4LH*0?SloNM}4&OFo*6)JMbZ=kNClJ5Gd<^?egzi zh4lTF@~^cCTNf+EdAM|M)42X93batEhS67uVkHUkz{6G&1*ca zEYmP?&hd2cnD|>agDJNSCu@hFrwdLwrN!9(NA@*{yIm;zM5hAQf$dHUU6l(Cv;qnWHmAMLmLmWJw+C@0H-kR0ti6Z4G)5r?Is@Nyz#% z)T_r^3!+3s-!r1;#T^n=bsR`_8|M`COS(1{R{I5il}KKape)%vnO^Wh5W=cVPbfGf z>(0BmW!o1C30*ZBAB5A=)riiOj!5ueXQDr=%X5^zb)&!m=*=a$e9`Fsb~Bt|dRdSr zF1*{F*-~7hRB$OF&T}pe8Mo6(1b6%zFK4sL3IeSxpioMa@!5oDZHOpKyVwk6^fUxThh;ZbQxD zgw%k`)^HbZ+otcv1A)z;0JimI+5Y^D+LQ}R=NwF6mLXy^(F47D+si9W*MLFaPK?OQ zXx`Exc8yP>DRYoroXL-F?*m07hTSSTnZ6V;oOOjhYlB5RK=SfNg0JOP`xRiOk1xKy zTMT1>DGL=Fa)=X?Iak=0Z`e(c34I@Q=u^4o$@r>rOHx(l4;G;MmPm#@=^z}?I@dQ@ zJXqRcUo9TcXV8+CZKz&=1M80LeZCjWoy}jlZu6VKsE;6=_^#( zE&ZbKJLzF)4Ip7?S6lBeySP!azLpP1R=bOdy>;u~y{E0e#Kf5K$5s&A*VKv7?tzL* zk&RK+0NNw7n^TMLRGN5n-lkeKJ`<0E18_4bFHuOW-JZ z{HDacqPdD=oTs4=Yjl-;xx?iNva5>?2_uE-o?T)fhS?eA7nVLSD3b`qSGqr9bL%H^ zv0m|WlhAiy>?>v`p-fsmzmaU|%J%Ws=)?r?^=%86!`Dmge!VU?zk27LeFkB`Q2T4` z7mQ=RnGrTx6J!bVW?l`0_7r-n8CrR)7CJ$-bC>fXREVLCJ0W{h&)K65eN8c9a&5yR zP49m&^%bu_#^&_FR7-ySa8V4Z-|Hwn)ax$tcGjdkV#dMcI%D5*4xRICZx;#UOQjTp zXff$)qYY_&Wh9!~wR^r^y7a8G#5#uc@sF-%dUfqd^|H$rIp|RH8yXhct{}fZH0LF? zOxo-gQjHEAnS2$M8qXi|ObkQawzlo8r@LI|-^wpHov~g9XCWWIHzmEi9-z!%-EdLJkqsbvVfR{NU%V%#P<=xk_6t;vOwoFC{v3*VppuBgQ;dCtjBlx6UkP6Z(PAkr}FD(a+*-CX=s`i9j zgIM|T1~JK5%UGWY7#cDcOV%5=9h%vGx~}$jY)LN{7wh|j-p-l`m?RDBdcK}C2_4Ue zy;nrvjrtc4d9lYq8)vRh#uEuC_VPU&)AKIn`c;j;zQ1$&;4)X&&YTEm>=}}bo)MF4rzFSkxsx@(oODX>Rca~fOKcW8J z6@9(zn>omSGbwNuYgl`B(Yk$=hkvHzqOD4J0Jeo8g-i4bblg;JW48JJFg<-MBKkH6 zI#;@zRq#3mrtgViJX+MB!??Xcb=BN;+q#}M#HScFqi22~@Ul+s!1HEWmH^3Yo?G^z zmT@0*m-2zn#*=*>-frz^{l+AiU_MF7_?cwy`(0!dmG8@^eC@lT#W6p3vLr`(PJ^Xa zHuI*8?|LV%&=mE@xrDSn$CJ<|;^0%&%N%|h=T1oVxjI~EvnifTmCy||O#HMU`T%U# zrgiC6`%-e37zL+p+0|U4E@})`82m;gU-GljuM!MOC$b1K* zBxgTGNY1`$kG*YX-Yf0$EPKOKc`*Z-+!<-^Tpe~L^WQJdzT(cjn*XZ!x+yc z@j6TFD_v2ZpfkDu(@{yny=3^!kNi6{JcTE?p3T8*4wzrdP+)q&g?2 zHrhkTt?yY=UXuFidA*(oN=3Znw6@F53XD#B8^+5y^OAgM;aZiE+WjECPieCY_ceX~ z$^k^Ch$?pk)6e8S-Vnf~K3|-?mgN8S4XC|zhxBkq^`uz zz{)<${}~6=)O5S<+RvV`BTes`ZtGu(0-9ul;)l`vT6xTN!3OM)Y-9psF+u}m+;qwP z5-TAq-;3f@n1&J=U5F{Fow8IH|?iQ59iUkzu_5~ znE{dSz02$>p#h9bv}&$V!kH&~_u+c%6Oi)%Rb!iN(#SC9H@V%qeAMLYS!?N@{6V>X z;p>&)VAVoTqv<5~dd-LX*sK=e7`Gf9i4d`xry5Sie)Y6lsf4ZXF`D0gtgWv{&W2_XX|%7dmwA3=a8Nb zvw5A*iHr~(Bd|Y)n#aLmx^kO5aBzHblDD-<*xyUMw8ydmw$!Hx@v(a&*5`+}=Iq4u zeUKI6`<^+oj}a@e$&iMv0t4fEp5U_k#v$mWz4~79)Y6nA8w~^lpcBl&YWc;5g&EJ< zxSlXQ&Ssb#a&44NGkWK|MX%tfJ1%{`ej;Y{Uj4vNWK1IurTK_bC&U}TS68;yC3JDw z%!X+yt!LYvfck;&hP+`@PaO@%d9$(wAuemUZHI_si; zJ7=6uxs6l4B<9T9acJ?1mTXm%y}LNhZ(3E77XIZ~czkueH6LtsS$?N>WoCw}UqM#_ zU3@^~J~Jvf4_`v#Z@CM45e6%53`UKr{i&aA^gtMBg8Y4V_IiTI((2X3gxxyq1yxBc zyxw3@)_^2#wN8BqOf3sUPwh6ZR>)J4(7weXd|L((8c9f+cb&WRF}8n((y$PzF^Q$( zyj6mAWU_&=BeziI`jfZ(?FOdqscrppDzF*u^C#mFN$qAG*&Y};a6WioF9TArjW?`7 z_1xOB1jH$jh8i99lAt*tzGmM`D{jzz=v=8hZ(rHFU(DuL0-1_A+QGg#A*AYw#+W#| z+s?YQacRZ``-RE=`r>xE_*TpKPDFPZC&2lsDdm$4I*laj933#zk9LXN$e z5Z?)H-}5pp?SQ(rj_X!-$FR9@G_1ob!;f)U0R?UucC{a){l{T$W?DE#=dCo6pF?*) zxR!%=0rDx6#EZilOZyW%R?0ezZ(sJFA7FJGHO307Xl<02>)x-G#3Vuq7T2oc*tWm* z*rivKHqW;(axcS(>vWb~guzeVx4wD!`&ny9f5tvO8P`B?xpX6W=;u}kqajnyN?KiBB-6z#3hM~h;hw8O zyK0va%1qA>joWeW&UPp?bdshf1u2Jtys0^S46@r8xTNi_?iRC|t9@QV7LHYHVNmeH z11Crszyq|QtH$2e2h0lK1qit~33?Gao>WqdWUgmEEhWeINZ1f+XPCU^Kcb zX&Xu~z0EdoNqj7HlOUZORZ0Ie1e$i|dx+MgY}zO_!l-c%z;|T=uW(Q@&wqv=1*Rq* z6Qt&VbDg_@PC-irS{fH{edg*i7s<#^b66 zRAZUj*B9)!Q{_xCaiXaeepC_qDk^cK*XQWQII1L?7$&p+OR^>!YoDmAWQk`WZX4Z_#X2FmgC`SGpz)3 zoXcGuXf2W=L?=D&?=+-L_p>xp&deSF2 zh=@3O7lF6TDjHs>7j!&Q*-c1YSxZXEiQgDkpm)n|Zk@LrVW;$=_0`w-6D~KEd-#_- zc3Qg8!QnljRa5?viu>bd&{rGP#wYMM&clsf^)nIlc+-f8BOA z^xbhzetYRXZ~|PG3Vqx{HFm5w=z|nmuQgT>z0_zK>3H6GOZ`F=zEM4g09+J(U>6+{ zOJXB&n_0ZM)x_ne%lu8@5g0RQUPq67y=UG&VHJ^nqGN2#Yo*rMTDh@9cju`30bhf` z&|9Yw31mACy^8=t3XMn5wI`zU=aa@n=wt!IwI$zQSNEk~`>+x%FSNhn@N(lHm3qBi zYOvGOJpKfS-u*Mx{kjCFI21xywTfc zuYS+a-oN4@Nee`ik`3-%o}iQRL$NxD`+P$CD*i?!#+_tDfxE5)V%k^`f;%n6f?*Fm zTA#mOMzgs|3IlnSXs%>3fxumuCt!BowgQvU=j5m^^ttC#gz=(7#xa;#Ea5IF`YS8j zihz6r@S2?Amsf}Qlk$%5>^o_G0zw%X*wx5rmjhkjdKq`rELP+w{K$p)52FI!)6b(c zi5KR2|2x4q)GQU8Jf*IVQ_gp#QuvQG@lxR{r=GueI{t2P5%}qXOvehx~E( zr$#MA{m_W#?U}#+J7VwnTo{KZ&&I^w?6DL}ps-f~dWSq3>t(~b_AH%4U%njN;o<=zAi&Yy zTxa8jvNvqD6e4M(UIz!4+D?L56D$U2oI-y>K(~|MZ6TtpP9`mbwoFSDYLccV05eFR7SwVXLt_$}}|AyMaGBY%&YQeh&cyAkj378rc z^c*tY=f9(ARaik8t4A6vC$i^%xZIGR;P{5zCTLVUs&EqBAqNex)QFKWo|z%3=Itx> z+tvnYAGxyv^uUd+b>M!9Empv?`d3oKhI_+hAoHEyoJ`haZDt6%Nz52f6jICupYCd40h? zL~;Bu{M8LmD}(OB+%&l}f&UK%(+2%2@&El_YiJW5_;~olPb~Mb+FV(C_ zr2h3ahP(mu@3%=+(*IUII~Q??5V8FG^8da3H#Po8_CIX#KZg5FiT~HO+F0eV&>t+o zA7%hY@_z#7H!=SI5VaNCCbL_QCNpQn`^y7d886D8I3X7%dt%wJs0RC{^#q?>ed`vH z_>*zyJ8o~M`Mz{p?d)_fgVDs4N@eRN+X)r1We=&~w^2{tTx57UsdQleL#unWO2Ocg z(OJWMfvV$2d~Qdz9+2}gV%`+_QM>t}^AaJ+cHqKltj&>tNMB=}u-FgG*~V@LV|)KF z#LZ}e|LB(*dfcC{(7*rt8cz+W|B(exhySs||JVUfft|l@>Rv!Wk!6J3>9uuImGZ{QaLVJRN@+Hx{MtHusHmFy`e>B8x>d?b3wgS_Y2{_A-Zr>7 z;v;qV2R2-?xOMB+30ttA>+@c`!19aS=l1Z>4|vg`TDsZ3tuGlS7SON8kqftdewmkN z^+2S#XyL79GX!od{gnO=%*+ePv_oU95kmu?CB@DSr&gykl;mVyJ*i45FBVRdQ0ijM zJ;|Ni@YnDzWFcVzVfQ}EU(A1jQpRl?_nEQ2NIhKcUGcTUK7St^c?)dyis(sk2aYv^ z^^YGd_ll=Vm5Wi2Yun1g1Le%kkJ{4wxmxW4g%mUeW4Uml_T}tAz{}Z@3)Vjejt=cJ zyY}MifnL4q8(j*29R`J@^thk!H#Lqy}4;&lb#9i>%DQ zXcbipLDNV#H`aCf($>_QCt$np&pm1X|0lkq&+=cjH{5^q14Ms}|jR zuAwc8C`)dY9sXGLN4xA}$*}Fn5Iy(zP7K#mG|^tzYJ0k93#!*_&5br~%@ZIJ_z$Ii?n4W7fbOsuO~3QR>|nLQ=*yn$J1SWZ>Yqf; z%Y;&HUr^pCta(IY$R+!wKtKH_y)$FZzLe_U1+tSp3-;Rk-MoVA+Qa$`! zEJIrQM0V{rF}_wmWM>lM@_{dF26uxNqD(lieHrED$D4q3W7bDs#i zFW39Zk`vtEc4(1u3x$xy$WyiB{J1MN4X1T@PjY@AK&##v*Xn>>q#DAdHaq} zt(<>u4HN}RNL`wM?YOm;Rvr*nHv6dQ>t*Gb4~`L>s#R4d*RhC->PJ*#i0a*!s_()h znEe(f+mluPa^5iT0PeZr&&v#-o~|2BNm(k#(OrxotS5N%m*8fRFi*8-6cV1E5og8r zV@V%i=YL2|P#f-}d;Di8YD(xiulP>i=RV>xKl{@1o_i&!$<6(QZ5ifmp9&Ylq7sVD zjVGx8TpwYJhAztmw2P8lnVoy&esE{jE%-CkSsL2N+}gAszqV5IN5rsc_$ZSf`_Cd;aCmfoODFq!0{kYd%V~_Iph} zewAO4Tsp$!+2qn#)%w#AW)o(6il>IDpr58!@1%OlpMh3r@k78tV5D1B;-D(yhUsuv z@%;IvP|D@%PWQeD3I1R);t1n{zWK`?=l|SNcN*A=B@N{F+}8&7q1rFu@8-|TM*bfw z!uqdUSm74KzD1_9)Re9T!k3hWJ-OdK{$YYv5p=7* z^XA-aZOe8Jb`eO zoNAB@JN9P#aFaX7;>%8KF%(S{Rdzp?XK6%XrA_uV& z5;^2n?x3B9`ig~Rot$+3;dz02%q}>W$P==0n=4T-B5!kND#Q>*CwxpG0$N8#96kbX z(v1i0F8@VBof~J~u4sC-3TLKS3S;kp7XB z@nq5HtHQ|!zoss2p!jcoso)lbSCQK#y0J)ge{5H5ztO2&h)uPrL+8gFy>GLx=;qVWO*abz~A70md!Mgg4srr z2^IwG1jPU&Od#8(JM2HqRpAKCh4bysDG)AOYF1^lUwsODZR7cW7OJ7ik0CR_ub@9n z3?-t`2WMjl`-0wf`+|WVt&VttYf~`n@L5yPy|4w44g$*CpjGNF=sox!t|}n~lGOzw z&ArN0Y&7iM@26YFX}hn&F%mWq`;zlXr2JDbCTXDj5l@2piuq?l3Zem1bfN*j+g51R z`xYWbY0HPw zw|wrP;K*DnXN4BB)uy{=yxQBP|Jgyv8XVO_yKk-8pjuTt(-YY_W0+(7`LmI9ZpLmv zTkc$53m+bPOK;;ClJq~XYRtcN!#|7-)PO9C)YQN$=)8|ALT6W6!(C#Z4CQJ@SFjc$D!0tzp`86UE* z0z*sPK!RW;=zJ{BK&1j3zR$cmB_$ZWa*OrofQJUfSRRq2ZyqzRAUID&m$S#Z>O4@PxFs- z*Vqe#7g1f7TxfI1&J&!V_Qxn8zR```nNI37%9;p^a;EbA=%A(!s2$ z01$?W4VZsl@C0qQoQ0nW;)CnOv97go=07;(WMsf>yX@9fZMmKe3Sf-=01lZhbG_oa z#O@RmXx}c+TuKxCGZDPaRq_`z%~^_qOdJ> z=i9q;a`LrTQf^*3)z7%-)0HsS{JHPlspcb#K4FOsgd&#U9iYW4A}6GO`+u;~O=N2d zWr5Ahqa%56Giz_6O4?z#QwAn{yYS}4R$lD`Xd_+3%>E;1SXjaI?JT>i#67t%M*5qC zI0Iu0q12`BT*vh9^3v!LSb6>lUai5GWP!WYKRmKFYAi5Xt5TStPIZLc;QW1S9d9-N z-3=!|rKp7*SsDD0z5KK>xnY32l}D2fUVgh|L4b|QQ2*Hjd%WF1k?I(u$Y8oZsDi3h;Gk^D4 zMF}ix{41~ovW+KAUT){Pw{qU>OmkNlGCuk8MM8uaX(|T09_xh^WCQN`Rq(o(?&=t6 zrSup4)~>iN@Y9;`Gm&28$brZmLAADREsq*-$IFmEY0@W|x?!y6OFST39h*jMFs zuHQRy-T|n3Q7`>k&C=av*dD(>5ws*M7>yVZ!`2<_1<4KZa$tqY3?)^Ag}}GZ{qULp zOy#0|&sKJ!>4&}l?21uD(yIyo<_>q*1_>_`=vF^plfhcc4$ogo3&A;Fndm))d>X;{ zQR@GT3gTl2t({69Fzw8GqI z?L2{e%VPF_X!;t_^d-|cvnP*ELG6zpniJF!hy1D!WqL?Gi#&Y9cc{3W3NPT*)X%tV z_#?OMuU^1up#`n(db=oS{d43(nxLUR;_6G`_VO?R;4xSd5lX=kFOf1QdA$5_e|{NO z<$9U3+kYgNE+0rPt_GWRea~sPxhJjkfxA79szt(}U&7dJNm_jwgmsx2EX#TR88|VB zgLoq_g#TfNKt~vOQ28BMv>1pdNktybe=h^ORxyS^=mluR>F#`p#2Ee6Pq<%Tp-RcF z^kt?D2FaHPi4k#W!)EuZ{;W!Q0XGE(-oFU2_#m^0Yo^pm{T~9@KzKze8F8fPuXefz zn?Su(ZL~vMMtYkxb*XIk&?GmwKmRW~JfL*8h%#rv?0lq$B z-sqNzKEIw}cYIghqoZW?nbI$gmsxGQKo~LXuN9Vh875rs^H+FaUTMH~Ii00FtwD#xPs` zrF`bu8SPc`{#k9?>hXebTbhKtJiZh?{8Xb+K*7cgn8Id@@)>6Kc(|qi=+*Ru@lS1d zv&?;%;{3pSUSDiR2J)aStKP;e5xx$*_Jsb6wGgcgl{EMjLjea!3Af-ahy ze_wD&v>7+fPAvTrmxLG74anHELD9gTx!O487=oYvDto2pKNlxhRK9N&4fH)qrd!D4 zw&sPxduS=@gUcR09fY{4H;@#fhw}VlVqs!wC-QhDME8%+Xww7Zyv+Ia7H_-bV?lu^ zg_JYnR2=Iqe`Hf`f&ym~Y|zI9bTr>DeMw-K`<|SCDK9G;m_$|Cn1O@&4{HwFeL3+E z9TpS!X(}~KdV#m5)D}SsM_i5DntGHyyGjchPnYk}ezTyXWYOgi#F-n|?1tbkn5&rh z(YBj$$tnZG;a{uGL?2#hL%BGCWWM&mIvS)?J$lkk*TPmZ>WF%y-?3L_>S;?wI zW)ed7=J{N=&N;v5dCot-^E&5ublu?^ASW% ztIALhtq$9pjAa4ezxC7UmBR6(3MYuF4<9f+tAY3Ys!rpWd~w6iSsQ1da9BXPx*EZ(BbDo6F^&PN?p!aNExm8^x*8f0(|1m1$T0X}EW;xY=H{tV3Wbi?xWq(IV z-$`3zJO4gecQV?(q?QM|>f1YP0GUMsCJBFN$bEzj-AVD}B@w&J3;o=%vo4Mee}6f? z{ncm3F<*Gh#Bp#t2`dxR$wlmp)HKCQ29Zg64o;S(j0&x@RDd1|zs&#@BCCplIKf{l ztq4A5W&JNQ1@;^*@o&5Si8|0rKyd^}8vS%yLiGg_*Q^m-%a&YOPfZW+BDIu@=1_(c zr!J(0Hpu#kdXgHK!qLEUZ?6tuB{a;SC4$@RyY!r*d9VwP9er{XHRd)GBp*UutjJ8N zcMomv<*6O$6nMEKtzSIlsE7Zh^es}to6o7~9-t45RJ6boyX){owB~#;vVax=kz>8!G@Ca!kst<;8>gjXWe*t@# zcg{l{tKIu}!z+A-+7C<2X}ckbPEHXqZOot6WxLE2$c5!U zEGyN!Go1Ck0!gp~Em8Hv=SNrCm6R3+lpg|`U=-lMo6ZO6Tf_8-t2Xvz#NWZEs92t8 zF`QiSmyLo$VP^yA8G4+!nYZiTs_{gzi~HC!RFPl$J}QVGwBds4m~i!0!jn+p9(*ju z(Vg`#I-G(>pvpH}KXRf31CBty(BIW)*kf|7Y`^aqa`vArz^kgutmq+XWkR3%Xlm~L zS+r<#nHyrdydFM^xOaI{@brKrxVu~zmGcp!R_FR=t!!z1NXHtcdNf_ye!n!99uiL9 zL_LN-??Uzha7n6wb%L_`R{fNdASpU|F!Vsno9ni})p)gy_)XIV2EYbx+FdY&PuMPH zfYYA}!~MEU{h6o5D5oA7$Zz?Tj2B|@yLt3QjH$)d*0K*t@apoHHS{GE;eI8YYqeXwQOIZ8?pyz#=p%OU&q1_C(SN>h-c3Rl zIfMVHLmsC_l`D|MAdF&W`BW5Pl9y)oKhF1hGkG3$sLxE(LgyBCB z+*$}W_A?Qf2O~ZH7Xm0`L3woF7HRWd39b1@*z!e1;n+l+C@Yg z*BtkMkT;0@*c!l5s!C$=WzT6-%@^kRmM?3a^2+XgjZ#mI=G*zVR#> zY7Rx8BxD&}`wC?R6GR0t$^R#%Q~m-8zOiPGTVVaqS*FclQF#EMcVR0yuQ2bsS=Zm# zO~CC5qVYw@19heISf0&^!dJgqSZE}sr6f#xpIoL=|iqYS9Q|NWBL1H zUHMn+KCAgo6kR#ZDG;Z|c<^rKVwkj3@@4-G|!Sk76)v_`>}p(%QL_SsWx zUlIf7aFzUjEPu$aD9|nDpB0!1P2_F+@ki_Js>f``)5l$6DUH~7|V%PdI$3n*nz+~Z5lG|Z9Mfl3(N4)0&8dgVfH$^Id0p)LtH z0#3khlvf}84i;M72J#0Y23P>&z&v)SmyyM`C)Nc!*vZDxQohdA~)w3N>WR;^A<^`V99F%YWPp2Vc5YANy$QeN>=cGZop?P-`$CHYyDPVk4* z1|eEkjy3vmd0ra0Gxm_YZG>3{RJlBs?&XLVV*2Ui z?%SCT|HK72YWZx52j&_!Y-=9v7w7TqRcJ089SdE#296D&L}^yWrJNCXD)@wEZA`ZcUyF zf=hJSAh4ig3d;xx@^I%+I~bluJQ!NaVv#&e9efN9Kzmy93qwo6KGI8@lX0L>PfQGn zwzW@^f0#YXf!F^EULAb$|CELExoOThQcRD752%hG_v9drd4@TKmXkrH-j7(e0(?2C?KpjUt5t5Vhuv~w) zkehv8HFnpptf|TVh?dz!kj@WZFd}CT6)rMSaj-VDG+BLC*LwFU)DM5-yynE_0^{_W zYCBT(yI&+~cj`OV^LYm5FVop~t5><%G}Z^u5fy6p#NIaILHuVJIOjOBC#IIwL8NeP z?NUQ6|HlVX6jMQlC^kja44*&yjw{9_h=^V%Q^vwN!SOZH26CV z8A#xHI8ic79=lu?lToIgJ&U8%lLFGGU>AWMVX3i~ak|ID*Bg`>z5eGYpz1IzD=B=q z{cwc2HvV(JieCD*;{5T)Q;7^r;fVkR@!Ti+#j~Jj;Tq_}(9O3s8*McEYeOYrh+MXv zGkjlBdd9!nkBC4X?)zduUT#ld8l9U}KEND#j>w_XfL;UVftTs-#sl-&M;raS=_25^ zgQU}N9Y-s<+^5IFKuxm^-qmq-XNBTM*4fcf>Yiv#6Gai*b|v{8B8ywAK5Bc*)A{yh zHy)k8K^3_E9qzOd zdjK%2-4p~&R728xh9+{rIL$yI$_)qJH}~z~^(YDDD2;^9l zV>jAANAt6hQ8rYp(Cl!h^EW!WKa$$lLJinyMC1%8FF7DCR@!-D1=idg6wAB)Nn>Nn zfUOc^Z>w&s@UC+}5nH}5sC3z#vx%IEO!U-gzuu zHf@CUE8Q_XQ{_rt>JjzFg_bWL?hqruKo;WO(B3vSwh{Sak*)8Or}`xX=Q?8^YWm#? z^cy!V0nUe5JMMWhN$#sdB=22A;C>P;v!lO2s9t~&0xGqRNs}FINQJT8POGVbqZc;f zPc-42o1nn&+0JmibbnLCDeQ@Rd?;A#R#Np@g$OPRFZa%l${qWweQFz5~x1ue^>PEzy zgsr6j{}C0I%wHr{AB>)_CMo7*j>#xqmZzWF^HzzK=8P)h_2IJZv*w|s@9_zYn&Fb` zKWh17R!RNf#ewk}vl{%)qOsIY8X5MQx@HfuE4EIy1I1!<>TO6g?yxYaUX5eL41A9| z{6@6krkZXK;09(wRB{Ll$>yH_?Yb2^)n`{16LoXo&wX{f^kU4X(iw4t@}4xO=Afn_ z7d+G;LsHHp3+d}%JW}#w#-pUM2?E&{)RZpamPwp@B2%F}X?Xi29n(2RqR@gUc8P7P zWW&I!m;D}qIT!4#2Hg6N^WI-pnst?|5UJZd!gH1{=Fa7y;RU*2VYdfIDsNvoNK83`~KPYg*jxOb{41>F>LB=F6WQ=ObTwjlpX zen$8q71O5Pcsge0yj=h8re4&#loAd;Vx~S|Z;%{mMi(a=E5G&HTCdi!jQUBp7~|;$ zWB%Mu)kTxp<((am^qmvFl9E$vUOJRQm}MgL@Zj1tLt-c{27i4dX7tyjZG~E!AdmY3 zt`(JZdLhv%Dw3ngk$5b};A!Hv-pLwnzh~>yHq(yjiEh1pU=kY_FJ@BhkT9;GjK5w# zQ(osL@_8}g_02w44EK?a96ohxeZ#fN87>4F&hi@$ z4!SR|Du3|yoLA0l%j;r-)-)4<1?09c(!>&m3%yrk-acKrkxFqWw=J%}Ah{3U)e9!5`9Em%|3J-@p$)CdndwI3EyPvOfcKPN>7-Fd!x zldt08!}E17m7xX#7Zx=t(>{kiw*Il^)j2w3&648DXHuRx!Fc$5(Ux2oL=Jabdver1 zZn@17ea%XCH$FGtaptC^7iA=Bmi`J4xaV;nTYnb|h(kC-w&x{$9pYP3vMZ${Ch%RcxA4hF~wCGFHv8zMB!{4=#3U3$B zUK=Pb6k^09AJa&d-`$r<5%<0RfzOeX4eRh6+fDx1M-=TLx}rhFgLcA&znnQSHb zAR7kF?W~`5^mej2 zm=NmD_TE4lA641wRm~n$EK~3K_wUYDJBl*mVebF7wNdN1xT;XPG&HAQTlw09Od)2- zY0uzIyr4lhnodUd9~u7ITNl_j5yX+j|bQ@~^iI?-UK^} zFwx~wBN~iOl6I1WP8XNh*M^H|-AZTVt7_6>U@mLD%I8ioytMTu>@wG zJx!=x_VlbNn%SPFkr&Xh;vntD5nD-Ir&5m&bH{I5_L79WZ|C{7=3mjn zd#jyUKQW){Iq`$8iosbp?)SdK)`&MWMdQDHYW@iA)6k8`-OK)QvP|D9_2;N&m$^QD zvy>!_)lUL^(VR-ZJ{8Jj3yq|6;i;egt$k%>m=)ze z`LzD&O&oK6DJm@=E*7H)^0r$}9j#?s(Uuiw9b415q{N>?@y(oX#+y-3%Q3C?T{C=m z1OoPUvknbigG3qk`|#{HQ2!I zsgJECNzK&IC6*fa__tT~bX~Sb$c%C+az`We_aJ|S|7{i05cM{k1*0yEyuiI|HAzPV zdHW8IvF|vG?eyFbjE!~=G7ce_z%V^V_0EM43G5KZ!;oD?8tqmv~QZJLX7O$5-Ee*TSFIqxJjrhT_k<=J%=Ky zMmOZCj9;F;{L%}y0mq^DlYebe<(p9d&94Cy&|kP6r~Nj6r_8LoqmNx=RR4LEN;-ek zj5tQ<|9z8`^5QR+f;6*(G@rzarLYmh!1%8j7P^|gxqJTUZ?YM!4!DM;m&B*s1 z*LezcHai;d-GglGj8*n&fGA13?kp7j={e+{fBuAc4^v)R!aIC(&G@7&h}q4dQR#w5 z8L@W)S##d%YiGZJUnaL^77V~_IIEjCwlG6=oq_aLvz|KDMR-AjD><-UgB_9vRR#Qv zEgBB^@4tZ;ywSf}B5zJYOkp$}{t^R|@qqwPmksQtOLq zv-LxsMygW2!+wEWZ&;S;=#Z&3oR+p zmCzxS`yPg)?fnp3QgQ;WyIGRSCNm3dCmX%4jW>(**<$KQtt@B$7gMrum+ifI@ygMN z_NmhA0^{rHo!KW3!5I9>r7Y+{Xu}s!J}&yD(kG;&p)s{Wzqoi4*6yXtJty4a1uVLV zD6CH?QvB_!TVjkPgkRm6pYZkN9}e!iZSmO51J``hKuO_IwD)5*+>Z>&s$FYxD!N5O zlN5QlDG)@iUnmS8p-rR@Vt0iJ*bC-QPnK2jt zj^)X;8?kJFQp_+PV)9|;SY4U?O>lK+bicaG1D_?|w>|~nq+s*pd>o33AI1HELr3B2 zKT947CCSl3n$4jEkL?;M&j_n?;ta_}6ZcwEbMMTMW_SP4yV6{6CY;3qUqxHAuJ_h% z*lWBr9x1AqGbM*uSvi(1{bt0*4(EZ>?>;8QOK%aN7gClQxOz4K9#l%OH*&Yi*;VV}AVlref>m z(=$=`A1w(fwze&9@m=3(lHv>0TQ{HR#`mf5p-P5GsuZ%;q0APCfbjvvAqbAKzjco;60itdJ;=+gmla z`e?;-LYa{2B3Tlb%cDphN|LkZ=;6gEURKIh7Uw^X4rg`|0sFCr8XuV$4kzBEM<&bC zs~bsQFUKx@rLlCk)NtZZ=@NLP`f=xYXSmeL@<(1{CdLM@)A*}6nu*{h=;cRqK{x{tw+uu5pPd1sj+w95j z1p;V01>M5X$^7?ZFqSA}=Y0+36?iMmAt!h&wY)2Vdv1nQWASo-_TMS-OsY>Cd3#)u z;=A5N=%WY42fhyd9tDY=Cfb?fqgA%Q913T+l+7mhq+=JF#Le9;x%ozmR(CIDs|&=T z6;y63&L@9CMyeo>Qe^4G=! zpSx7YNsik8j$JIiA2X`F-8#`Uwd%kUUeCxZ6itS>x}_)c-GKvWF8WL4HZ}mB=C;Ub zeNU72Ufzuj68zKFH6OInccKDOrZOgpP8A$r21#!VnhDhfl zpn*TUX!1UpJn!|@wDWR39-@d)yQL51E-YwzjAv+m|1RTufpSMAv}q&ibR5y%=s9gB z?z4Q_u)#j?@8jN&q4I|RvwDex2qPZJ>;SWa82oPO-+undFw?&89Kk`zBhdP64wPOA zTirD76Z#YF5UHkaRHc#GxI*s`FzUf@HTpwL_U~Mpvp~|ILO7y3*pv;bdzq4sH(h8f z8$M2NVCir^U?U|1{==z;KYS(^dVRipAd{6 zu9-`_M;uXWXDtf2-3J^)%gUe}8F1$`3pG&^L zHl81-sqo>?;-V8u&-0r3(B3QlZO0*4;YH`FPTtC7ZpY;{VA4sOpg7-<9kMxX!7O8q>C; z-7A~QL=`1FHUf3p?^mxsKW}}e#57Zqv7`+0GeUY-bN_My$p+g*G7$O9cgVVrjdFOOeICx z|MhfQF{AByM!ZkyrhBhF@ZZuBL~jDz%1V7=y7d$)vIto7vvVY4kw6a`wu9$$ENCkL znirW=JiYjW=*N;*!In=U5WbvWLIhI#(FH)MM3|lR-LITdjKZIQt);!?r_Z1N+$>ej zr|CrLv19ajn6Ij0Kn8V^0H@k7$UgbtL7|ZHS0-Vf*5Ljc@ZN*rEk!mtvP6B%Soc?; zNBhEi{p*cJF=g6)F%(uHLBwsmuHkz8`X#(wGaL9>9M9GtTYErZ555C^3c*ZOGC1pY zEs3gpAuBK<_g*5#7A`VhkWsNxLSS3O6)!MmukG*eI<#rM!V!WM` z^XD0HnyrtCF=oS95<*EJ+4eixeec2WePCyAQC!~ntWFN*jZJ-1n+Jme3Hq3VvlmLr zWH+gnQw)7v#v)A<>M}0R2yZ=S9aM``AsV?eSA4K9$2&h1h;lbXS=m!|BzwEYR1AJ) zH7_46gU)x&k!X%uYbu+r4Y8abg7)rL3fJdlo1a(X)KJITeHqAev%NpA*Brd$a{=y1 z5iNTOdZh9=@!fxEO_g{1Lqcu9HO%N}TQ{4T5Gr4Y6Jcn}6xm`zXDE>9a44eHz?9A4 z-x9t#nJgNuJ9j+h+iz$rYnY)5+FbrSC{SfKnBt`Vzk7b29*qmX3&_>Y@P+>MfSXi( zEj<71ZCYh*_zw925KM9`ST3*6AIR;jGYc}Z&*+zIowMR$dG}(s^NX4ira0|=ovnNk zItE)O=lcs~zd8YZKE1PINXqDNC%Ch z{b&25LH}m5RM}=K&~G%lHO&3E=$SiYTen7sur+Da(eywc>O#d(LXT z5e+JIR*?3a{MZ>F9SnCDqkuZ+uTvv+NNdTei&2Jo1i&SBwdvry=@DW9Pk zr+R|!AL**AP!DP|mELbPP;jZQCnR@tEa)B)5&D!dQPQo&i*UZLdSA*%N?5_art83b zZHG+(uY|NxG%4~f)#TzlD2@3j2iAs7!*msDmjL&oMlwDo}!}oMR-=g`L%xV_2=KnyN$jV)0Uq=GxH+vRHN=&_J#qd@$rN5vVFMtucUk zc}nBSv&|%e7h&Cr2#aW9T#t! zr)1YysFe_MqTy)i^bc+T-Puz#AX_!xWlN9g4rglm@-_SI?kCQ#0ctJl7Ei0~7{9#Y zaNVnY(?##I$VZwLddgWT7iL)PcLJ;`LIG$=U z5FdEm?RtSmgh=%SS4RCkcl@>gl~>C*+N`T$MX zH#BGP#7GH4DrcS)QC}WF02oZL>!gY5ZiLR!%a@J&)A55NuSOqgjke8BPJ8y1-e(P%{%D7x7ctFuO z8*$-BqV5?(#V0f3i5X#(?N#g%Bz5V8VN+w{2id{V!B z`bQF!6$T`j%aR(lSzV9gjHHEtRjr z0O)tCkGOjZrh`lfoh85w^1u~M)wGU>Zo_FPxZM7dEaJ8hcXz%`txbg%9pOA_)7D3o zg<$m1FNkMDdBjOC=z=~0h2LpXW&o@sXVQ!m1}Dg4*vg{fsD)|z}^6kyHyZw(^ z_^Vc!`8vcXJAlNZ-?SN|Ym`D_u68n< zKRIjAL%&@y;z7nzeC9?4)nOmh-vCstECe@D<(@IvN@uSo!DeS^f$oPXmvXrFN8%VB zR7;fq;59u1GX++S!Zi@8W88DkFE1^gWMU9xo?l2QXgG5^ef3GpEG_3A`w*{Ko zrgW+TR{)~3p~$QVsap&cy6Go=G?|iIaq8oa=IvcRvIbVl$=T(s_ZaKL9oq4;9Xt`a zxO=ap=(jdE=<9xfEG8Cu?|~=uAu4lt6XZ^uW<$*uh9oR8q2geL;SF;L;dlfRIyZ(R z=~NdBltX2JNd(MsIt>EkCy2M-YVSmeI_B*SkD`-exFKXTOpqT?*xEw@+pdkqH`Uen z(@S25+z79f3R)CF^6#T{8w9gF)rFA8L?H!~ThJiS|I=|{lF95>pc>BlpJC3z3*(1T z789vUKeL?mV?9IRyjMqV*P=s0VMch-6%y38MBO$RZGgx~K!hzv`SFgH!S#%ZYl^dt z$}`e*z855`VCcqj>CVb-Nj z+tYgoYy5J(B*)rFPPtc)N?~9e76F8;^yruva{8qzN(EmhEmwewh^{Wxfoj_)pj1d< z^t#0ds-Si%3c#Ncy{;x_aaFv;PA}oD%FcXnW4r~Y&y@lX{>Q|2IQ>QKkvNk^;1g1a zDof~nU zwO6X)cd+8Qp5W;IMPsYq$i+CJ00#cuAGmfo%{io>ALpq&S} z;~v-DQaDs8cqTxz>fsUcK7wzi(WQ|&eA50&ys3@kv4s<-Dc*u|pVZGxi;GZzo7(sS zHt|hKLb6w$@}V4HpK6IVl)Lh6w#!@+$9v?|Y`Y_?HTR^q0e~UJhfSVDk#N zaW^GNF*|}IqnYE8x>PbODnKF8mIEnF3slsc$uSvi+>4dI7i7$@9*3$$?H923-`Hlo z?0BnEf8yCk2iP4Y!1KH2Z~2fQ7$2C-t832nY9w#jV5g!$oKTvD@Gn-n4sxo20iPHn zX93vm=)>a4T*1YBMJ0cs&l3$SwYQ+QsNxTyoqZUa@*&uV11)`7c0~pbbl~f08MBrY zAn|j{7luR}2PCV5IEdkOpMkYMV2_msT^+t@6&_M%YHG4$->a$0XKSYljCC$@L+jC^ z5NBzss3361vrk*+I`A(j31>;d=+)U%>$9K6Grv_?81+(((h3s2DD)V4j3oo8awX(7 z{=?bRakBQmz$(HUp=Zmv(A)2aGXvEf;CpW%y+NOv3jziloX%%j~L7l%Hj z!yYox4$2jLoZeRF62qxp(mvOW438Tmi$-|V3Kx$c=Iry%`#+ucTRn&oWdmrjwZ-51 zJ}z=^n(TGAS1)Bxsf#fl;r^JKlKDdRAWF5%Ujh2PtS;@D6wIZVmB2j!7E4WUe+M8^ z=ou4SPo{F%sY2}^05@oZl|?t7Nu9HlS|`9d-7Q$l76eh?2Z@n)@eL&xRZhB5dR|)b z@>ou{VTgMYpZ6k8_amZQ@v!MRQy_D&V`8kFV4kqG^zDOSQ_Xn!r$*mUGvQY%YY6)r z4~6F5-TlU7(RrjfqS%;DE2>Eo3qNAd0gxI9SUG7@``VfcLo(0V-99<57ET%3R1>u! ziSrOl%2=u|G)O6%C~R*slV6QnZ-!fbZa|Oa*%p4LQ^ntnIh@>wt{~OG;vDZmEEuDC z{+fs`Dw@Eod(d#)9R^JKQI3nHB=|jJ^P8cMlOa4L2ljmD+@T~-#c}*_a0K=}Nb2=H zU0__E2q%v)X#wQ;z|Y@{^5jg82I->_lEWVTu&bwFq^}J$ZRd=9U1G02vDusk3ZAN@ zOLqw#g{OnFy#0R@8%hnJ5@RxBibZ9!iescfSFB8lzG z$vDvO`&^^VTlu#L%Sr$#_Opfs%a<`KMY+O1I|M3EmXdiGZb4mgytx*3mlO;^u zVf$4Xl}_UyI(`0Y@AH2`L_*&G&5b7?@90!K^bHiIhGrFQtbd|&-i#F>?B~Fhla9c6 zDA(66U9$~??9R(-g!)oCHDVru?#Af0JJV~iL7&f{9a*VwYORaQJAN~qjl4#@r>Y;bwmT;d?>_;&3L>tOMqC>p301N6h{Ol^Y zQSr?qE<~r+qilWN`UtTZ0pOOHt|{1nNGvr8R?~cf+qAN2uUAt<|PEARL{sUi; zm?I~inL0WS;IrJ=+rQkW&2)7tmXwqQqgc9!hnStu)q%ryo5S1@9=>0*kSnz& z$2q|D0VU$A%Q+SibQ{VH6`(N%u-U(Y3`li@j~}F-@JD3s5iNKtUVbP5!-Oc1;2Th3 zr=d=5<)y-c_^x?=!Ng+-W)o^w57rHr;^mgcJ!ZkU6a^sa-HDM;gUBFI83n zw}%_ng}~n7Awwaz00O0-(+VqQlPAUSwY3sLVSy5<%dZ3imgP*DNsi9Vwh)53ptC@# z5gX(wp1OI&O5iHb{WlPk=?5<`8@v^i@ zw?V6$TY@xTCp^c$t3W|^YzFWI0C!2>WRQn>68H_^v{YF^O)?n$l<0!@$)Li0BQ?1* zyOaqup(pY2sD!F#u>FIvi?IilFLx$5mwhhKeXijG@c21!@+3C*!$qD2ZaI^#j}5r^ z{r)}Hl9yi_brXspp%VXy$Q?EXxrr}%3V^Rtzf))qF3Zk7JKuxL{oS>1J|-Peq+q%H zbva0HoYyqxeeDsowq{0S;0|S1>T4r*bR|pfv4-Ne&Ll5s|5K!72sI5cKHMLue}Ssu zRAcF=A~@yVUErpoX#9XMC}jL!R4R9OaJga82DH^aA9%6%Tr7Xseb$A)y+HEfj5j0X@{$_YkN}+8Rs%T81Z2|YYs)|m0 zj33tmO{aX&`Cwy^Kij&F>n@`GI-Wc$!)!+=!tZwvBr4RDS{#1>fQ8tCtI2Esad}P% zNP*%r``vW^QTj2C^Dr4RmP#*@ltuj%s_2_}-kYa6UNz*vP$6+N1+{;UNN z9S|Zo-^*2WP3cYbh9{@W-mXt6aJI>!Fo&5gz$z95;G07jR2~ZU9v|Vel=PpUv@*KA z=YCw6!9$vlxln;kZv>2*%4*~H*eF}<1#nYF-jrnVRXBu%Zy0kA6J)f)0BHb(8!m*? zLlHtEuqF{i5>)mn)_o}enJUOwb%PhvqXnUjQ%|Gy0HIWZc?(o4V7dD5h}R(o@aSQ> z+5u}P5$E>V=esuzAnjIZEAQCrV0HE^Ur#aP5Qj=YV4By$$eYQt9}m~}=MJocl&A=8 zM=AHONC2u%Qe-g4V{C@)%bUPpvXI^*%(=w4!-}x2;iW{FOjxpw8Nf2)K`m2M|0EDA zl{kljoTK#{@nFCqe*=B7s^CBHn2MVw-xvgfOmPCB25cN>p8IhEewQH#C4BV=Qu+c2 z{_>q!8SQ<+HxQTtXC!VlN*5-T=aA@?SB-Q(s+bq`1jQ}I_3eIvN&=O|d9VZVf@TKv z72q*BJB)k+%@QGe)4Wt-qzH|xgd;yaoOWRb@f@zWMsDt*Ey( zQ=yv_oQb>R5?PP_ulWxjsKW6WVur;4i;ItkfMthgmnE_8A1aDJvj*3fSUOd&tS$%y z=73*u%{z7Hni|Bs?q_~khdPf))g+tv#@D#l=%Ux>vR2+1UnccUij#cI6^php%tJ6 zfQjGl7yF%!#43PB^%)|F*nD3m;`-%K-92;g+v8Rt$ovNSeAb)Ph?xS!bM#BDIYQnO zDC%_1==V@Qpn}f7H;;EeT@x%pFt$n zH{Kh{&YT{>%H)&aY6+lRAGc9w#&& z5E2ATP%hw^?MgI7&O!(=0?+KF-0*vsVRTsog#_Jz=2gDF`>*8QND)mM8b)^R#T4iXj%@9F$Kp) zueMDneOpb6{UF)2z!}bB>)VG$@E?IjdfqEcf8HPlY$kwL zAQ7`T69tnaW+G%crv;#y7x$N~Z_kG$!;j$Y0;T{2y>Ri zH{vHYHu4uZof9KtC?VNdXmX)CDKbV2Oed|3sC1wvpqnOO<8|B}k|)v;3^xi*VFqKJ z3tagZ*LPn&;Trj&#NS2|*F5hrRrFFFobzq3Je%m@ z@$&aD!<@|*r5P?)K^P5x6!BE!9+eoZ2D!Nsk&#iTam*<)7*;)3WIBncA=RaeMu$+} z8zMk1m%t%0A$Y^ntk0@Aiz+uo9Nd4WK$*sC|N}kmpbplFY-jvXy)3 za7lA}zq^k0G=gcBzfQCjLFVqH)EO00a=(H1PL!;x@WXBfsHxf|pa&}!M7bPxR?^s< zP1jRsFne0v(30ypoVvl;dDF%H zfQ^`fv4;9m!56=4=<>plWQD>GhVY2?Og*Q?zHujH8^a#w0?2s;`ngbpfI`$?u9J9z z7+)XYKOF9D6o5}N3CWRgh(gS-2L>;sG_mgz6DJ4DSm!NjdYxa02381jA!l-o^|bra zqya?Adn-(O{{jk8MiLTK(v!14@upLblDJaTc9lHs&$HH2bd&XN>Y^G7>=Mic<+YYd zJyC6ZaBA1SMS1g}E**)o&0l`cp@O2J0F$Ex7g$;V-R0Hq0{MF6+wcq~H=?3&Q7>Qc zRY%J_|0iIN;CJ~gSHtFlm925Z+e|wD#^*thE@y~U7OR+@;?a$Fxfhk@0|HGu4|tV~ zfW5&gLl9TULn9fys2Ss82x&x+_pD@1(qH6KCr1YF#HqfE>h5siYWU;I&F~pMKAS~m z&I#5a6fimLUx4bNB=z(~CChr6Mk`5G)h;j#upS?b;|0u3YGCuf0O_d#WcpThC+d~J z@-}T^!NSAFj(HXh>*~(|o@?sCL&%F(>IopPw2mr}kVc?p2=dw1KoVxB;>|gIT!iH0}Lg#6eq)k#eh zLt)hm6&0{TAQGsHMvk}y-$Ma1tKnf3A%tg~nGT5p5Py<^41@VqFy)gxqb#TMpObf5 z1y$-mot<)%ILe8qlW=&iK(iq29XLzihMYR7s0BA`|k9 zsI``3!SMt(5vYd<0?}!JBNMnq>Tnf9cOkqA8tObFQCj+@tM~e|`nll7OxB3CoowZ= z9voMj{|%)euGA2If}C0$HhZAEh-Y}V9g+%}fq!h#s3khRPJO45O-Jskfc6ARh8^_s z1LYvvuK>s)ZNQ>}hT|dEA!$qa2?xD4qF+~h=JW&gvk3-h{s5Lczo_6<44Oy0_j2g4 z5S`&?Kt{Fm_XHc7@xSXwRR&Tv!Xkr;!+?)a#y7}t4f1uFn@gC(rA-WO3@;1oeNxNP!S_P#BdwFGqrhGMf0oii-fJ{fI%Ml?99HwTyHDafZqd$V@f6&G%$W~{^&l;{q( zX8Mj#6f~yyc-+e}0PZ+VM2On@;3TWJDbs(a@dpY!cp2iD6!NG!lZJ8~fC*f8-{QTC z%B!%di%Xr4g*#hVe2#`_2;lq)lMgg362v2@n!lskDZDC(d3^+t@iCx3kU~EFsnx|! zwNs@y_~a9LLdyXb)Q!COg5orYH=Yvfhag(a%vH>3ul{ z0FTr|>74aZi=}G3eQkV9NLb-ka;co!kMM9jrmfalsGOo`75* zh$$+)ApLmFkI0u1hn63r=se)>l~X&X=x`M~uf4J?19aAoB81pz@UaHqe4iOdCE9?W zS!?id;w^nX!zU1JR`jh`! z9_LMvAS*06fd7Ai5Qi|d-=VHZ*8TP&M6^CGTOD2yL!Va^F8ly^d8|N(A4(ADJo>{R zI%4!jcQZrmQy79U+PI_?RUk!xoqmtv`uvw3XN@9mc{6#i!iqqy{&Ml5OWhGYsOJwM z+K_aMn67}ID}-*ZKh4mEX!aANpBeFZ>#k0NZ|uS#qVWCp?JJ>i`$}rwueBotv=TCW z7!GfMn5Z-Ko?Dplw3Q{eS`fRT+R-7-t%N(Mx1IQc`^CQM<1d)W$4 z;pmWzd8XUU+T*!BAZnReap7|~e4Q{h^9 z+Ok_Fh-~Nm7O3!^c$;;(aPf`u4gQ7;l1@&;q;6~FuUqUN;GJ$lZ3@w*5@nmOFeSJ- z4kfPg)awqCs-5lmemC$I8{kt+Wchri!EyvbV7+LxA-0(O(gHTgAo?aB^W(4eq$f4E z-AyOIqO9jo71r>iTe@)jK?4xXu+lyDb?lWp9I>mFE;3(wxFAEKYxe;1I4n03l?f2F zYvBHaEnSSpNT}>fho0OJ)P<{?I{V6k>$XumkZkD9?T+JT?Yxl ztX-VuP`LYnMg1}7AYtNG&UXxc@YKu021EHDN_|j22WD7b8Rp&>=rXKFkx(;xNi4UF z-PHk5KI8U)09WAK7E~W+X9`+7P0Vk$qeKCd^_GwV zBKG)TLD)E|&P1Th2s;yk@;hC)ipGRgbU0kpC%^EYIu`d5fDXu5+M9?O9l##8^y5={ zGR}Zt&_##}L8!xxeqGvw7cZ{MNJP*6od_pzbwB-`2#1A>y_3Q*R;@byM9nGW(r(K2@v2hbj2Z_pg?F% zL3Gv64<`D&{{|k|41~HkVebx|DxJeCG`#3_DM}<*by^y3dBw_s(+0z!#Di%u`!kkirP9sH&_pgI|)gM#qllc~o;&UTIa^Kft_bZylhWrcAq+3%qT3!U&W&gaknCI6haw{W5*p&r|Z zdTb>LDfL(=ek`3Ja+tfwvjl4X417xjOD8NPIkNXKJJ4*5#Z`k0>VI$e;1sG}F}&Vl z5t{`|Xfk0Z3*K|yFAzlFJ@=xwGPn>5eXM7`o4^HRX3%y8i z5N|k&yohLF<9KXzgcTId^@RgDzGpf|{XU{Y6(GImP<82X$e_G?r%3i^G97ZjB8;r3 z1>5jogj?>BCAy+~S`H7kPQCDKwg6!#=yart| z^67xXRQ;yIUXlx-VGThQWlj~bj;!-&5TsK zy?7idPp+KRtF1I&?gp>;Lz|K3uRq#bcXr6m;7!cI6#+v?#KJIg0BwYJ;<=<0Z&bpv zl9Wp#`jw@ae5?)LoGhw);$OV)roWpFd4bR&{~-Ww$uh!D8zEFr;`iI`_SyWpO=s!Q zZ<7V7MS|;rMX(fYjv=MEsw`y?k3ui<0UrRH2L>RT20#{`KRU|N>q!ZEop6&E4{UT(s5;@9BHJ3F^3gzwwX9r4B{Ah2YvhyUFl{fs?-*yDbPkZyufj82` zFyiQ~APO44BK74e(T>I}g^$Yxp)%Ec7nG`hKMR%lKV*FeJeKeG|BWP+l_VpQG7Ci+ z8HtSSJtG>VG9&v*B_Ug6CVTI_ix85%M`m`&UjK7Hs?YEH`roflug`j(=f3XiI@dYx z^FHr$-RHS!+1BLZFKpNa#Qn-LFy3`mW_$4x?<@`fP*Qe9l!xdQggIa-`R*de)O#Q+ zWu&!zLmIn*2R}Sn|D*mA^!!+ytd-kGCLdWo*A*)0lFl}om^``H%xrVC-+K)ABN`cvorP)m_nv=x{zF>g5GIa{W-dD7 zkXwBY7hCJEcxy_Ev4K&yS6Ev!a_&T>9fZkoMM~#tUyarJg@@_tbUMxOcE2DGDao+U z+vD0(SzW9+6T;B~0RnRd9tSSW#&wvvk8wpmm1U%W!_b0TZWUNos?5C)TkoKXpS&2_ zI;_~N&z-n@gzOgEH+xy@Z-Km}m!wBzg@n@Zs_0%G-d-JKIp$z^kM+2N>)jrKfS zq6gBMwkw^F9!L72LgJWDykD$5OUHnf&d_Z6;dUIm!o}6XJp1jg|;l3#P*ox z@GA=1T8pb|Gl2=mQN^d=CC;($KhDl9tv#$O&_NS(o^fpQ5470}^(=%;(uWQzakLB|pn(gtL{(2Z9B^9oaG|^%D zqQP%YMA11p1CWu`@W^D0I68=?>GZ&Nn+$FwGB{-mAlz=(v zm!G0B-mrAc_i^V_jT-F6y|OZGNmDsa>HBi04k1je@C3;#r`0BnQ(;3=%i+9HgvW!% zsG3*J;ZadJ{iW)8b{6GK%Gp`C9_C)e1AW=)wqJk0y8L(wtUj;r+ifV?HYC7w*v{Jr zQ$TAyPIQa8Aa(%_52JX4^2AAD_Gu58Ew<8SDOo!%`bu&V)4Beo?Aij(#76?8v~q_f zZa%9|%-*A2->tA&R}t0{-YX@WTdN2A`fli&H-;njiMFJNUDwuU?v^a*AdaBJBGgR`q;(#_+^)sKKp9JctUpAXH})RP?|=1uQLH zF2(aKB|4t8&(k(0&Ye2xnL0xD(O^20s_74(2*|S?vTn1Q$pedfXqE!?A4KAMT|5^y zt%NgL5mfM!6JSKd*!u3>Vpmz>{mp7s{y110mHlJ!ckibn0smKxx;ZO{}`nY3Ko|a{C#ldm4`iJk+g!!_ay)!SS$;^HDB0EMU7uW(Hp!2q^ zJ@WN3x}Jx;Y*gcN{$4IP{LlwDm}lf9M`ueFhcv%kZVC6HSikg68F_Q^ zUVNiGT92#ZEYhTTNZ{(esOH^4m9A_cJI=v7dc$}E&BAv>wn}y5`?yT8b%8H|Fy&gSNKnqd?5jUunld7`1~kj6w!_r6Jb5jv6$5zg$Q8!_Vz%$%(l&)(+RR zF;pvOW!-SV_SLcqg<@Q9tIVAOqnVC*U^fGQ*unR5x*hhjfyfx{f%Q&nc|3msS`y$zss=4DzzG+Of}sc~ zTUCnh=c56D{%i(+W9nT46(hkfc`x0ah>k(%3sYt;dFGmm|A31n?GOH(jgY-AgwkwZnfKNT9k2W3;t7>QWq4W--HIUwZy-!F` zeSPh^edan;giK5Xp6bk|c0IIwj(^nxA`M2lRuX%(z(=eGUs`*b2*_}EaMh%bHr~TL zB*Zr9fe$mU6K#?M%UP}740!uoSB9g(i@`3ys6|O*`uJCNXYl~axiyoYMyYOtry<>E zT)rtB!nf0FdQaqw+h%VT7h4QsbiGy*&NzZ$Vfd}gPK^V)0>6HJbN7b3>Y0EUTAF-Mv#BN?{d5C;s}(6debQ2<&5xPXR3 zclPceRixO9(lOz5kJ4EPuhXo`JXe0b<^A0cZPVJZ0N7+MchM84A!LcC;<-PL?*bQYrx2v>3*KpD zC?xWI%l0f*xB7|imx|(xuf(BdOaYN+@TW%Bly8tI6KieMnFsd4ryXn)v447$K9g)A zqg^mEFoHG-HnJ|I;)DULEis3F^|Yej{cN7U`zk#l){q3O7p4mBvPBT8>ieh*XhjuR zMrk=l`O`<<1%O>bU;~_e_S4xLL=O8&hJ{iw)h_Lp+_z%(XemXFnExah+DG26tMR=e zLoAKcGNnF8^AJ9{@+_m!ee|Pvv0hLwYh(?)6|wMV+5kmr5wj&%oMWt;KICK!@|V!( zKDQ#59iSuycf{OzQy}raPu(7wG|f0kSkqyPdta-IrGW>?etWK zHk+ezH@4#srdTP4VmpAMHzY`Ih{QJUl6pPt8LSq-5dtu} z=GAIQz$?g$0AR>wKM3`qI0?oRk0LE;S#UkM#LO^8@6`0>Bnqc(O z8n9A;S+NTuO@yw5->SOVYW1S%yJ6A0g0gA=tlX0sS}90OAC1tOj)X5=l2*u2xuhL& zlF%4p&*@{K(AV?NUDa(l@H$P?mHx)_2zx&E7Mrb7TUNh|j0NNXP@0GS+%)$ty4y6e zD;}mtkh}&274G9!`m+S(az~ZX6@n?NddFZ677Wj6ik7@zTuIYSz46*N)Q9{8><%>O zPE$9WrEBXcEFasCFjAelVGj=;)=c?YeD^9P4M?zYydY3Af@6RrHXzQzP~vQKbUP&T zkcb^i#Pd7y1xC8ODR7Td*HlneFN;erTn2Ox2~sc$=qVuxBzlmU zgRhk`LyR4_`iZfd6aGnvo)q^p6e6{*=t!(;!extcBsTC!K7i+QkW0u zibZqU&jpYALdo#`AhP`PA{Hluu0OG~mX&?RYbZ!a;SJ&W+cI?hrk-CU)-&yfwLuLe z^e846zf_n=&oo+v^>ZZPH^4VAqm(__$568=1i-kpq!<;5nkUhdA1j;a^EZiCGhH!w zbHeiqdeNaa3-wC_CL7rf_2_9Wz8i^9w7s^2IzUgL$vEi8>gS&M^&de!3V z*?GnL+%mulLJ)2<6d@w6VYn3L5Xo;Nh z0Ag5sL&)k-2uP)@t4e=W72X>t;9&T|py}ExF({$~KVTT_e5O3Wj%ZulsRe`cDaF zP%p)}fWqf7irSZ2Bg5zm7cs?XDnpf%f8T3{R)m{=EDD9TD4ygo6f?;(fUPAH(9C0A zcGM_$k~{mCpYIz6Y3U$wOwCEy0KXn2!bW`9uFT1?>;LN7l%xy97hQ`Ih$r`t`x<+m9BQh%W zq96RA&k^QC>EXA}Dk=C1901R^%T!qJ3KEiCwqt+g?Qqd-ywUcp!$n$Ie8Y?G7Yk5& zCLw)LvP_=YizT106HD$Oxu1L{z{ctCz3dURUc0vc4Yjx?PkfDsxX2SQ%f}6tt3bVJ z=v4IE9Mw|d=l(ddx_?GSRz^Pf!qlDkp3BBj#&i9%M5Ma8V4pg$BVdXW2d;K?$5w^R z(-gO5SQz#wT|(L?%pM!f^yw=hZ+yU$e4T)78}-#<5xP~|M2Lr3eCoT@`8j-Oq!G8i z#X*~cPC@7i)be?PPfQ5**{JAuLkEU*0MMFf3S|2M@`1W9yj@fDmHtM7%>rCAUc8^N zp3q~42P5GZRw||)PaLGaRWt7VqsjvX+)mRG;G2&o;QexjES<>Kk#%GUXJ6st3(|1( zu_bV8tq>3Mdz4~EUltiu9Hm%P#n53ig`&~5YQDfcm5=^<+lJ8(0FYtJ1ov6!RKN<* zjWBrnt+Ta04e`z2OD~2*;f#n$M!=3>jVO6QDqL#4>`MA5NqI6S_-4W;vT+;?GU2Qi z)j7ZVKAqfJEPzA^KNNZ3ry*pESa{>7=5r;I8=KXM(HWtp@Es^r_O3LI#^m-dmwG~i z>a}m*o7;fKPGBW6No4{6R^JO>_fxqk0n>U)LnzTg1O(>JrEy{Xw6nifF6TV6Y3?7(?Q#xp8M;1o(Va24v!+Fa$c2) z(avw}7jBd_Qw@7N0S;2NyXoWte--P&NixX0c1fHX3MwwN{PX5RnvDRyA2ryBIPg7a zZxz@T9rpY`jRVKZBRpA_m=gT1ei z%vvhgXlsimr%cV7se*$ufVRwX2mcK@<5Q1Ni3vpUI#!FoadOnvS5e zmjzxpQo!*#%x%s1GoS}WMPA`>v(nLZYDKRr7VhGygz3ZBUL+$;YM#PlKF4n`v-Qlk z{?rUP@k>v`Bx_hqkg;N;UnCxJ^RVX6$$NpiSgpQDPln^b5ak0Ae%{=C=yzV1W_ob@ zw8uS(DhlA5Al;OKb(dp>1CUip9@;mF#Jb!3{8bl(9hn?0I`+qsSGDLgsB)I5pYf*XZ7c)5VKT zbPM`yjy8_y87{E8Lbj;C4!l`&%x5XM9l4B(rE<&_^S-2j(N89lhd4ja&Z~o!qbG-I zPs1tM2tuw_e4h_pW1Ed5ub!aO){cTY&TkW6+q=RpDAVSK!+wV?_U5ZGUM`whAJZ>$ zo~nQh2S^Epp#n%Jy2d8tGH@tf0ysFpDaG?9RysUgzS4f(ul}}uI!MU})JiZe91ryZ;JC|B5o=-iOlO#(s4WACE}5~w zN0+=ba`>sFm4I>#f@cC^eP}KJjg|CBDtIiZwS0;!iUf>Y@VmuHJC}DGjHf&0o1=Y;;+bx67-WC{LbvXo(X@gTvVRNUP9x z`5HxQH*mIJdx}tTN)<0kfAVJo6zYS54!L7l6J+P=TM{*=Nkda(3KaQvHjB0QcP$LH zfQe;cdEJv^J{RTZ>7ly^W zi}h9@@*3U&c1q&$@?zw(%=MH7v2wubw`dIV%I({4LJ{#3elR=y(x*`{772!yU4Q#SYcpk7A?`OIwiMeRvHB$qqwSKd(059cZR+x z)rNJ>tsO%!lF!P^w`#pyIiOTz;sc3h-)^cVi@EBN>(@*ce@1ZfR9}02)@%I~;`ae4 z(LYWa8ZUz9xfYan9nG=XDxBGh5`T2s2KgHE^pQXg-s$rF!I@by%cRBFH7U4id>-P+ zs_VwL@y9T>d&0LB&K#1qI^KR`q2Pl{TIST`A#ya*ocE~WPrw)!(D`uA_h`Tw#UKf^ z$%;|NvaOa*Iy+D=Nqvp2gMM<;yyewv}ZddO%H-3MC{) zn|vPU_wBS-hII}{0s{*WiCp1OlU`neOOpgZH^?I(+gOvkN0qMjB_|k?A?n6MRSxHg zm{8kXnvJR6TMDS}KK&LpQdjr!v6s>}At5TAZDF>!T52$aC6Z-YpkDYu)U|b^!}tA$ z%b6NJQQ+o@6VQ!XUTzU<%>zWn(;?7g_${>aa+?`$crT z3+Op>HK(AoreC@9YOQ>)%X@DKkM<#K6h_%(%rx!ZTpmE3FdrUCe(p4=SOgYBYeDEm zz{CI}A^lPB(yy563XuLaDM5~+qNoIfN%_%U6j(w#&|z3LhwR#OA9mhjemvM6D6Re^r}l;IN4a9C2@5ZEe7e@Dg>$GtW%MAC+&Z> z^H$gmy-0KhVVdp=s4qWcu0Te3?6)dqweTyv&yc=^ILo{N0hGUPBRzPD`!-J&=N4OC z_Zq@j6YwlVA$t>RbDYQ*%#SPwk-pl-?hSC8^+Cx;0b`lLfQgbkJSN|DHGCpZi#PNS zHx)ztnDsKsPB~wBTW<=Kb?I7J%AZ=GOw4Sbrd|u+ReaQ$B|=%Jv$fT}MZe__45Lc> zT;$)<(lET1JWZW@^UNVJ&bW!vM7~x-qmT6{u|q377VlrZN6q{)_^5%P6b|z@0FA+6 zvnpF>iSIRjd(UYnp#rF~a=1PZ)FyIEn>$;*Ee1hYhCmLUfII%zsKwo6KM zLc7E(`@b_6Hu%0WWVwL@#;c>{>*_WZl$CIdsnv_DitSg+^OR3cA^r*YnXxBs?hB| zV?p;&t_wqNu7AL|d=h7<_Rj#yo*l9XHS9lHYA=*^}> zAW*P~cU~?4JGtcY>ju>%E;oB^6wiDE({b3gXwW0L$-A|x87N7i)d<<~SB25;_a>EJ z6y$zNH|l=~@|J_-7&v^7jUXQr*bC__n(1(Cy|lxe4JmUXh{vhE488`w0&isczzM5igZ7As-pYy=89t~0VAa6Sr_6>y5it%0A!?BJmh3{s>iMgDJDVAkcEWr+ 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 =fCh^Dh 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 ZO!8(oboRqWj5S-N?E4m4$Q~tIqEL21 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/_esnet/static/icon-github.png b/docs/_esnet/static/icon-github.png deleted file mode 100755 index a9c6940069f1dec14d417cdcfd2649ca6b29c922..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2432 zcmbVOX;c$g7LGy)tDuQCAW8_dEJ8LQB$3FHrA3UgDFhJ+p@1}GAt@wArhzasYz?#< zimhl%qk|#_Mo`giC>cQ9Xcm=4G$CRPwUdum^OJ@`wX>y^Qi1;`EqgC%ibDqjX5d}1Xr0M<{$j|YMP ze(av)HULKGBnU&oz%cF>xa-~clLAXgN1A>)XLj=l10WB8iwGr#7pu+?r0OVs8q9n1Lu3+Fk@Y3P6R!qQQ zKd69-4BSVj!ngrgrbGr{-SMt20wRforBLuBH+Kq!M9uyan8{M5kCwpK& zJvi8!EH;iF#NvFi1@9QR1Q3+c353+tRD7x{ULuPpkZ3fTmV-=ofi+y@d&D4L;UbpX zE;6tHxj-hAfT;2P8}KNml|`P@E$815Mv+#JTW+Z+)HWR)MwCq&UVv{U#!hHZX+gpGOd zI)hEpcM|8+cUVU%yg?sdvunNqBu*}>KhRa?l=HMv zPfBgDUb5D3dhqpthN4E#Ety+3s+q|Qdrn#v$YO}QrH;O}#5($+-i;#1fYc4`Z&3a9*)(QDJrhpXC=!&9#Q&ZyxG5znAF z`SH?6m1pzqp^{^>PU~hdQX9p7nNE}{7)m*f^vu6WKs}(^?dT|Wzv!|ZB0K()^d_T5 z^-cfLt`(j?3ht*|{OvwVFsnDgtCjFAXCthj;mljzzviwRs3}J~mv$CK?<(2sk#)5Z zvM7AX&~PRY(&&`eAD4u`;d*#Er4!lT)KnPHtl_}}*!k8eTE>!Fa6lcIIzqmHkfp;f?@ zua7RTZ+a4GqNgavA3aChohxE>uNrV|4G=u-@7Et|SM<7fcTfb-2IKKVZqLn7NK;ae z`ngFWV=JfS#gQzPD5(#p^59{p{XS4U@8Q+9vb}M6{#KYIL2$Nyq$DuffeP7FqZ1A| z-rrliZ@*@Fwr+o4O}OrbTIn6#np$$}l4|*(0ZLIq#CjEQVp```%NXiH)v2DugAL;% zosOPh&@-~2<9WVDwB2m))v0YZJx`(vnhO-k?RNeF)@7$=X7kc_@PCT0Ii5_qnRkKY z(9?8E8F`~%|B8L{>uKQ=87+Pm?YZM76HXIq4EyHB{*VcmiLN6t$X6AUUKPceqt8yJ zy9{c$npe?L&#VLMecu>(tg*9I7n=I`UfPjg`(AfK`OLmI_Qgo7(WSs_#^}JEauu@3 zX~7}D(awfa{L6!XJxHwMXE9wU%L)U(i==ahvW{M_$v$q3*=)1(RGCFyZt5$HViQa7 zmGt|5I$CnZZpTvFwzcmoj7*Yp|pPIg{nB@?YWoZavSQ8;WoTQJqW z{l=M}?GGf4ta~}=^$$qV%B=YV?fzg4QM5E_NrQ%3+M11ZT-|nip>i%ulU(iklg6lm zPhcJI>O4O4!=ncMxwAtv;fL;KifKW~@waRC9)Cd`8N`LVkCk1kf9bYG#=X*L8Syaw ztUva$|2S z?6CFi&)$#05DQdu++~M5b0?dE>KMVz)ZP2+qAse&%I8F9T!xhUd35KL&X&3s^~Usm7hB9cQLFx?9V3;IMv5Y}(#yov2Q?LUzpdn>ET HH(K>?;V17u diff --git a/docs/_esnet/static/iperf3-logos-0410_6.png b/docs/_esnet/static/iperf3-logos-0410_6.png new file mode 100644 index 0000000000000000000000000000000000000000..5526c6c299a484fac5ac8bc5da16ff4fbec3ece8 GIT binary patch literal 31459 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 z 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%0AMH*cg~HLuFM+uF4Vxi@;HZtEVZeE2uIc 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

+4&EUF&b4y`Vf;!gl!4xc}7X#8>j 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 zξ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 Sv#i_z0000

- [ESnet] + [ESnet]

diff --git a/docs/_esnet/templates/navbar.html b/docs/_esnet/templates/navbar.html index d458cf2e6..c763d8c8f 100644 --- a/docs/_esnet/templates/navbar.html +++ b/docs/_esnet/templates/navbar.html @@ -34,7 +34,7 @@

  • {{ link[0] }}
  • {%- endfor %} {% endif %} -
  • +
  • {% block navbarextra %} {% endblock %} {% if theme_source_link_position == "nav" %} diff --git a/docs/conf.py b/docs/conf.py index 4c8c54ed1..82bcc22a4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -112,7 +112,7 @@ "navbar_site_name": "Section", "navbar_links": [ ("Index", "genindex"), - ("ESnet", "https://www.es.net", True), + ("", "https://www.es.net", True), ], } @@ -176,7 +176,7 @@ #html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +html_show_sourcelink = False # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True diff --git a/docs/dev.rst b/docs/dev.rst index 6a90ec6c3..a8de99b5f 100644 --- a/docs/dev.rst +++ b/docs/dev.rst @@ -3,7 +3,7 @@ iperf3 Development The iperf3 project is hosted on GitHub at: -http://github.com/esnet/iperf +https://github.com/esnet/iperf This site includes the source code repository, issue tracker, and discussion forums. @@ -14,7 +14,7 @@ Mailing Lists The developer list for iperf3 is: iperf-dev@googlegroups.com. Information on joining the mailing list can be found at: -http://groups.google.com/group/iperf-dev +https://groups.google.com/group/iperf-dev Project Constituencies ---------------------- @@ -146,7 +146,7 @@ Versioning ---------- iperf3 version numbers use (roughly) a `Semantic Versioning -`_ scheme, in which version numbers consist of +`_ scheme, in which version numbers consist of three parts: *MAJOR.MINOR.PATCH* The developers increment the: @@ -223,16 +223,14 @@ Release Engineering Checklist 9. Merge pull request to `master` or other appropriate integration branch. -10. Create tag and tarfile:: +10. Create tag and tarfile. + The result will be release artifacts that should be used for + pre-testing. One will be a compressed tarball + (e.g. ``iperf-3.20.tar.gz``) and the other will contain SHA256 + checksum (e.g. ``iperf-3.20.tar.gz.sha256``):: - # Assuming that $VERSION is the version number to be released... - ./make_release tag $VERSION # this creates a tag in the local repo - ./make_release tar $VERSION # create tarball and compute SHA256 hash - - The result will be release artifacts that should be used for - pre-testing. One will be a compressed tarball - (e.g. ``iperf-3.20.tar.gz``) and the other will contain SHA256 - checksum (e.g. ``iperf-3.20.tar.gz.sha256``) + ./make_release tag 3.20 # this creates a tag in the local repo + ./make_release tar 3.20 # create tarball and compute SHA256 hash 6. Stage the tarball (and a file containing the SHA256 hash) to the download site. Currently this is located on ``downloads.es.net`` diff --git a/docs/faq.rst b/docs/faq.rst index b203e2a8f..c10f70893 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -12,7 +12,7 @@ What is the history of iperf3, and what is the difference between iperf2 and ipe base. For this reason, it was decided to make the tool single threaded, and not worry about backwards compatibility with iperf2. Many of the feature requests for iperf3 came from the - perfSONAR project (http://www.perfsonar.net). + perfSONAR project (https://www.perfsonar.net). Then in 2014, Bob (Robert) McMahon from Broadcom restarted development of iperf2 (See @@ -262,7 +262,7 @@ A file sent using the ``-F`` option got corrupted...what happened? I have a question regarding iperf3...what's the best way to get help? Searching on the Internet is a good first step. - http://stackoverflow.com/ has a number of iperf3-related questions + https://stackoverflow.com/ has a number of iperf3-related questions and answers, but a simple query into your favorite search engine can also yield some results. diff --git a/docs/index.rst b/docs/index.rst index 20266f57f..486eccbcc 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,6 +3,8 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. +.. image:: _static/iperf3-logos-0410_6.png + iperf3 ====== @@ -27,8 +29,8 @@ and macOS. At this time, these are the only officially supported platforms, however there have been some reports of success with OpenBSD, Android, and other Linux distributions. -iperf3 is principally developed by `ESnet `_ / -`Lawrence Berkeley National Laboratory `_. It +iperf3 is principally developed by `ESnet `_ / +`Lawrence Berkeley National Laboratory `_. It is released under a three-clause BSD license. iperf2 is no longer being developed by its original maintainers. diff --git a/docs/news.rst b/docs/news.rst index ca6e250cf..bc8949d3a 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -90,8 +90,12 @@ iperf 3.16 uses multiple threads to serve parallel tests for improved throughput on high-speed links. It also includes support for OpenSSL 3. More details are provided in the release notes. +Older News +---------- + 2023-09-14: iperf-3.15 released --------------------------------- +................................ + | URL: https://downloads.es.net/pub/iperf/iperf-3.15.tar.gz | SHA256: ``bdb77c11f72bce90214883159577fa24412013e62b2083cf5f54391d79b1d8ff`` @@ -105,7 +109,8 @@ This version of iperf3 also includes several other minor bug fixes, which are summarized in the release notes. 2023-07-07: iperf-3.14 released --------------------------------- +................................ + | URL: https://downloads.es.net/pub/iperf/iperf-3.14.tar.gz | SHA256: ``723fcc430a027bc6952628fa2a3ac77584a1d0bd328275e573fc9b206c155004`` @@ -120,7 +125,8 @@ This version of iperf3 also includes a number of minor bug fixes, which are summarized in the release notes. 2023-02-16: iperf-3.13 released ----------------------------------- +................................ + | URL: https://downloads.es.net/pub/iperf/iperf-3.13.tar.gz | SHA256: ``bee427aeb13d6a2ee22073f23261f63712d82befaa83ac8cb4db5da4c2bdc865`` @@ -128,7 +134,8 @@ iperf 3.13 is primarily a bugfix release. 2022-09-30: iperf-3.12 released ----------------------------------- +................................ + | URL: https://downloads.es.net/pub/iperf/iperf-3.12.tar.gz | SHA256: ``72034ecfb6a7d6d67e384e19fb6efff3236ca4f7ed4c518d7db649c447e1ffd6`` @@ -137,7 +144,8 @@ updated version of cJSON and adds a few new features. 2022-01-28: iperf-3.11 released ----------------------------------- +................................ + | URL: https://downloads.es.net/pub/iperf/iperf-3.11.tar.gz | SHA256: ``de8cb409fad61a0574f4cb07eb19ce1159707403ac2dc01b5d175e91240b7e5f`` @@ -146,7 +154,7 @@ Discussions are now supported. 2021-06-02: iperf-3.10.1 released ----------------------------------- +.................................. | URL: https://downloads.es.net/pub/iperf/iperf-3.10.1.tar.gz | SHA256: ``03bc9760cc54a245191d46bfc8edaf8a4750f0e87abca6764486972044d6715a iperf-3.10.1.tar.gz`` @@ -156,7 +164,7 @@ make not work correctly in some circumstances. It is functionally identical to iperf 3.10. 2021-05-26: iperf-3.10 released --------------------------------- +................................ | URL: https://downloads.es.net/pub/iperf/iperf-3.10.tar.gz | SHA256: ``4390982928542256c17d6dd1f56eede9092649ebfd8a97c8cecfad12d238ad57 iperf-3.10.tar.gz`` @@ -167,7 +175,7 @@ been added (``--time-skew-threshold``, ``--bind-dev``, these new features can be found in the release notes. 2020-08-17: iperf-3.9 released ---------------------------------- +............................... | URL: https://downloads.es.net/pub/iperf/iperf-3.9.tar.gz | SHA256: ``24b63a26382325f759f11d421779a937b63ca1bc17c44587d2fcfedab60ac038 iperf-3.9.tar.gz`` @@ -179,7 +187,7 @@ to enforce a maximum throughput rate. More information on these new features can be found in the release notes. 2020-06-10: iperf-3.8.1 released ---------------------------------- +................................. | URL: https://downloads.es.net/pub/iperf/iperf-3.8.1.tar.gz | SHA256: ``e5b080f3273a8a715a4100f13826ac2ca31cc7b1315925631b2ecf64957ded96 iperf-3.8.1.tar.gz`` @@ -188,7 +196,7 @@ iperf 3.8.1 fixes a regression with ``make install`` in iperf 3.8. It is otherwise identical to iperf 3.8. 2020-06-08: iperf-3.8 released -------------------------------- +............................... | URL: https://downloads.es.net/pub/iperf/iperf-3.8.tar.gz | SHA256: ``edc1c317b0ae31925e5eb84f0295faefbaa1db3229f4693e11d954d114de4bcd iperf-3.8.tar.gz`` @@ -197,7 +205,7 @@ iperf 3.8 contains minor bugfixes and enhancements. 2019-06-21: iperf-3.7 released -------------------------------- +............................... | URL: https://downloads.es.net/pub/iperf/iperf-3.7.tar.gz | SHA256: ``d846040224317caf2f75c843d309a950a7db23f9b44b94688ccbe557d6d1710c iperf-3.7.tar.gz`` @@ -211,7 +219,7 @@ omitted from the manual page. This will be fixed in a future release. 2018-06-25: iperf-3.6 released -------------------------------- +............................... | URL: https://downloads.es.net/pub/iperf/iperf-3.6.tar.gz | SHA256: ``de5d51e46dc460cc590fb4d44f95e7cad54b74fea1eba7d6ebd6f8887d75946e iperf-3.6.tar.gz`` @@ -220,54 +228,54 @@ iperf 3.6 adds the ``--extra-data`` and ``--repeating-payload`` options and fixes some minor bugs. 2018-03-02: iperf-3.5 released -------------------------------- +............................... -| URL: http://downloads.es.net/pub/iperf/iperf-3.5.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.5.tar.gz | SHA256: ``539bd9ecdca1b8c1157ff85b70ed09b3c75242e69886fc16b54883b399f72cd5 iperf-3.5.tar.gz`` iperf 3.5 fixes a bug that could over-count data transfers (and hence measured bitrate). 2018-02-14: iperf-3.4 released -------------------------------- +............................... -| URL: http://downloads.es.net/pub/iperf/iperf-3.4.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.4.tar.gz | SHA256: ``71528332d751df85e046d1944d9a0269773cadd6e51840aecdeed30925f79111 iperf-3.4.tar.gz`` iperf 3.4 fixes a number of minor bugs and adds a few enhancements. 2017-10-31: iperf-3.3 released -------------------------------- +............................... -| URL: http://downloads.es.net/pub/iperf/iperf-3.3.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.3.tar.gz | SHA256: ``6f596271251056bffc11bbb8f17d4244ad9a7d4a317c2459fdbb853ae51284d8 iperf-3.3.tar.gz`` New minor release of iperf 3.3, fixing a number of minor bugs. 2017-06-26: iperf-3.2 released -------------------------------- +............................... -| URL: http://downloads.es.net/pub/iperf/iperf-3.2.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.2.tar.gz | SHA256: ``f207b36f861485845dbdf09f909c62f3d2222a3cf3d2682095aede8213cd9c1d iperf-3.2.tar.gz`` New minor release of iperf 3.2, with new features, bugfixes, and enhancements. 2017-06-06: iperf3 update, June 2017 --------------------------------------- +..................................... https://raw.githubusercontent.com/esnet/iperf/master/docs/2017-06-06.txt 2017-04-27: iperf3 update, April 2017 --------------------------------------- +...................................... https://raw.githubusercontent.com/esnet/iperf/master/docs/2017-04-27.txt 2017-03-06: iperf-3.1.7 released ---------------------------------- +................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.1.7.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.1.7.tar.gz | SHA256: ``a4ef73406fe92250602b8da2ae89ec53211f805df97a1d1d629db5a14043734f iperf-3.1.7.tar.gz`` This version of iperf3 contains two documentation fixes, but is @@ -275,9 +283,9 @@ otherwise identical to the prior release. 2017-02-02: iperf-3.1.6 released ---------------------------------- +................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.1.6.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.1.6.tar.gz | SHA256: ``70f0c72d9e60c6ecb2c478ed17e4fd81d3b827d57896fee43bcd0c53abccb29d iperf-3.1.6.tar.gz`` This version of iperf3 contains two minor fixes. Notably, one of them @@ -285,9 +293,9 @@ unbreaks JSON output with UDP tests. 2017-01-12: iperf-3.1.5 released ---------------------------------- +................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.1.5.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.1.5.tar.gz | SHA256: ``6e1a6200cd38baeab58ef0d7b8769e7aa6410c3a3168e65ea8277a4de79e5500 iperf-3.1.5.tar.gz`` This version of iperf3 makes some improvements to the fair-queue-based @@ -297,9 +305,9 @@ review the release notes for this version. 2016-10-31: iperf-3.1.4 released ---------------------------------- +................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.1.4.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.1.4.tar.gz | SHA256: ``db61d70ac62003ebe0bf15496bd8c4b3c4b728578a44d0a1a88fcf8afc0e8f76 iperf-3.1.4.tar.gz`` This release fixes a few minor bugs, including a @@ -308,12 +316,12 @@ cjson. 2016-06-08: Security Issue: iperf-3.1.3, iperf-3.0.12 released ----------------------------------------------------------------- +................................................................ -| URL: http://downloads.es.net/pub/iperf/iperf-3.1.3.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.1.3.tar.gz | SHA256: ``60d8db69b1d74a64d78566c2317c373a85fef691b8d277737ee5d29f448595bf iperf-3.1.3.tar.gz`` -| URL: http://downloads.es.net/pub/iperf/iperf-3.0.12.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.12.tar.gz | SHA256: ``9393d646e4e616f0cd7864bc8ceacc379f5d36b08003a3d8d65cd7c99d15daec iperf-3.0.12.tar.gz`` These releases address a security issue that could cause a crash of an @@ -331,21 +339,18 @@ distributions), as well as several other fixes. 2016-02-01: iperf-3.1.2 released ---------------------------------- +................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.1.2.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.1.2.tar.gz | SHA256: ``f9dbdb99f869c077d14bc1de78675f5e4b8d1bf78dc92381e96c3eb5b1fd7d86 iperf-3.1.2.tar.gz`` This release fixes a couple of minor bugs, including one that results in invalid JSON being emitted for UDP tests. -Older News ----------- - 2015-11-19: iperf-3.1.1 released ................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.1.1.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.1.1.tar.gz | SHA256: ``62f7c64eafe19046ba974b3ef2d962a5597194d6fbbddde328a15a5e74110564 iperf-3.1.1.tar.gz`` This release fixes a few minor bugs. @@ -370,7 +375,7 @@ and/or supporting the user base. 2015-10-16: iperf-3.1 released ............................... -| URL: http://downloads.es.net/pub/iperf/iperf-3.1.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.1.tar.gz | SHA256: ``4385a32ece25cb09d4606b4c99316356b3d2cb03b318aa056b99cdb91c5ce656 iperf-3.1.tar.gz`` This release adds support for SCTP on supported platforms, better @@ -381,7 +386,7 @@ platforms, and a number of bug fixes. 2015-01-09: iperf-3.0.11 released .................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.0.11.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.11.tar.gz | SHA256: ``e01db5be6f47f67c987463095fe4f5b8b9ff891fb92c39104d042ad8fde97f6e iperf-3.0.11.tar.gz`` This maintenance release adds a -1 flag to make the iperf3 execute a @@ -391,7 +396,7 @@ other bugs are also fixed. 2014-12-16: iperf-3.0.10 released .................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.0.10.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.10.tar.gz | SHA256: ``a113442967cf0981b0b2d538be7c88903b2fb0f87b0d281384e41b462e33059d iperf-3.0.10.tar.gz`` This maintenance release fixes building on MacOS X Yosemite, as well @@ -400,7 +405,7 @@ as making the -w option work correctly with UDP tests. 2014-10-14: iperf-3.0.9 released ................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.0.9.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.9.tar.gz | SHA256: ``40249a2b30d26b937350b969bcb19f88e1beb356f886ed31422b554bac692459 iperf-3.0.9.tar.gz`` This maintenance release fixes an issue for a situation in which @@ -413,7 +418,7 @@ when interrupted. 2014-09-30: iperf-3.0.8 released ................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.0.8.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.8.tar.gz | SHA256: ``81b8d91159862896c57f9b90a006e8b5dc22bd94175d97bd0db50b0ae2c1a78e iperf-3.0.8.tar.gz`` This maintenance release is functionally identical to 3.0.7. It @@ -423,7 +428,7 @@ incorporates updated license verbage and a minor compilation fix. 2014-08-28: iperf-3.0.7 released ................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.0.7.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.7.tar.gz | SHA256: ``49510e886f9e876cd73dcd80414bfb8c49b147c82125585e09c2a6e92369d3f2 iperf-3.0.7.tar.gz`` This maintenance release fixes several minor bugs. Of particular @@ -438,7 +443,7 @@ note: 2014-07-28: iperf-3.0.6 released ................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.0.6.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.6.tar.gz | SHA256: ``3c5909c9b286b6503ffa141a94cfc588915d6e67f2aa732b08df0af73e21938 iperf-3.0.6.tar.gz`` This maintenance release includes the following bug fixes: @@ -458,7 +463,7 @@ the source distribution. iperf3 project documentation can now be found at: -| URL: http://software.es.net/iperf/ +| URL: https://software.es.net/iperf/ This is a GitHub Pages site. In an ongoing series of steps, content will be migrated from the iperf3 wiki to GitHub Pages. @@ -466,7 +471,7 @@ will be migrated from the iperf3 wiki to GitHub Pages. 2014-06-16: iperf-3.0.5 released ................................. -| URL: http://downloads.es.net/pub/iperf/iperf-3.0.5.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.5.tar.gz | SHA256: ``e1e1989985b17a4c03b0fa207004ad164b137e37ab0682fecbf5e93bcaa920a6 iperf-3.0.5.tar.gz`` This is the third maintenance release of iperf 3, with few more @@ -491,7 +496,7 @@ officially released. iperf3 downloads are now hosted on a new server at ESnet: -| URL: http://downloads.es.net/pub/iperf/ +| URL: https://downloads.es.net/pub/iperf/ Going forward, new releases will be made available in this directory. Older releases will, at least for now, continue to also be available @@ -500,7 +505,7 @@ at the previous location. 2014-03-26: iperf-3.0.3 released ................................. -| URL: http://stats.es.net/software/iperf-3.0.3.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.3.tar.gz | SHA256: ``79daf3e5e5c933b2fc4843d6d21c98d741fe39b33ac05bd7a11c50d321a2f59d iperf-3.0.3.tar.gz`` This is the second maintenance release of iperf 3.0, containing a few bug fixes and enhancements, notably: @@ -519,7 +524,7 @@ file in the source distribution. 2014-03-10: iperf-3.0.2 released ................................. -| URL: http://stats.es.net/software/iperf-3.0.2.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.2.tar.gz | SHA256: ``3c379360bf40e6ac91dfc508cb43fefafb4739c651d9a8d905a30ec99095b282 iperf-3.0.2.tar.gz`` **Note:** Due to a mistake in the release process, the distribution tarball referred to above is actually not compressed, despite its ``.tar.gz`` extension. Instead it is an uncompressed tar archive. The file checksum is correct, as are the file contents. @@ -549,7 +554,7 @@ https://github.com/esnet/iperf 2014-01-10: iperf-3.0.1 released ................................. -| URL: http://stats.es.net/software/iperf-3.0.1.tar.gz +| URL: https://downloads.es.net/pub/iperf/iperf-3.0.1.tar.gz | SHA256: ``32b419ef634dd7670328c3cecc158babf7d706bd4b3d248cf95965528a20e614 iperf-3.0.1.tar.gz`` During development, there were various distributions of the source From 553b075f7bc95125c455264500dbe7f2785ffbf0 Mon Sep 17 00:00:00 2001 From: Justin Stitt Date: Wed, 15 Apr 2026 14:48:43 -0700 Subject: [PATCH 284/286] iperf_auth: fix heap-buffer-overflow in Base64Decode A heap-buffer-overflow was discovered in `Base64Decode` when processing malformed input, such as a single '=' character. The issue stemmed from an unsigned integer underflow in `calcDecodeLength`. For an input of length 1 with 1 padding character, the formula `(len*3)/4 - padding` resulted in `0 - 1`, producing `SIZE_MAX`. In `Base64Decode`, this value was truncated when assigned to an `int decodeLen`, resulting in `-1`. This caused `malloc(decodeLen + 1)` to call `malloc(0)` and a subsequent out-of-bounds write at `(*buffer)[-1]`. Changes: - Modified `calcDecodeLength` to explicitly check for underflow and return 0 if padding exceeds the calculated base length. - Changed the type of `decodeLen` from `int` to `size_t` in `Base64Decode` to ensure consistency and avoid signedness issues. - Added a NULL pointer check for the `malloc` allocation. Full summary: The vulnerability was a heap-buffer-overflow in `Base64Decode` in `/src/iperf/src/iperf_auth.c`. Root Cause: The helper function `calcDecodeLength` calculates the decoded length of a Base64 string using the formula: return (len*3)/4 - padding; where `len` is the input string length and `padding` is the number of '=' characters at the end (1 or 2). When the input is a single '=' character: - `len` is 1. - `padding` is 1. - `(len*3)/4` is 0. - `0 - 1` results in an unsigned integer underflow on `size_t`, producing `SIZE_MAX`. In `Base64Decode`: int decodeLen = calcDecodeLength(b64message); *buffer = (unsigned char*)malloc(decodeLen + 1); (*buffer)[decodeLen] = '\0'; The `SIZE_MAX` returned by `calcDecodeLength` is assigned to `int decodeLen`, which casts it to `-1`. `malloc(decodeLen + 1)` becomes `malloc(0)`, allocating a minimal chunk (1 byte). `(*buffer)[decodeLen] = '\0'` becomes `(*buffer)[-1] = '\0'`, writing 1 byte before the allocated buffer. Debugger verification: Before the fix, the debugger showed `decodeLen` as `-1` (int) and ASAN reported a write 1 byte before the allocated region. After the fix, `decodeLen` is `0`, and the program runs without error. Fix: The fix involves: 1. Modifying `calcDecodeLength` to explicitly check if `padding > (len*3)/4` and return 0 to prevent underflow. 2. Changing `decodeLen` to `size_t` in `Base64Decode`. 3. Adding a NULL check for `malloc`. Co-authored-by: CodeMender Reviewed-by: Meder Kydyraliev Signed-off-by: Justin Stitt Fixes: https://issues.oss-fuzz.com/issues/474401004 --- src/iperf_auth.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/iperf_auth.c b/src/iperf_auth.c index 095ac0e06..e41fe1863 100644 --- a/src/iperf_auth.c +++ b/src/iperf_auth.c @@ -135,14 +135,20 @@ size_t calcDecodeLength(const char* b64input) { //Calculates the length of a dec else if (len >= 1 && b64input[len-1] == '=') //last char is = padding = 1; - return (len*3)/4 - padding; + size_t decoded_len = (len*3)/4; + if (padding > decoded_len) { + return 0; + } + return decoded_len - padding; } int Base64Decode(const char* b64message, unsigned char** buffer, size_t* length) { //Decodes a base64 encoded string BIO *bio, *b64; - int decodeLen = calcDecodeLength(b64message); + size_t decodeLen = calcDecodeLength(b64message); *buffer = (unsigned char*)malloc(decodeLen + 1); + if (!*buffer) + return -1; (*buffer)[decodeLen] = '\0'; bio = BIO_new_mem_buf(b64message, -1); From d7e6e69ab60d29525159d3fe95608a33326600d1 Mon Sep 17 00:00:00 2001 From: Ronan Pigott Date: Mon, 20 Apr 2026 12:19:21 -0700 Subject: [PATCH 285/286] Remove a stray carriage return from the service file --- contrib/iperf3.service | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contrib/iperf3.service b/contrib/iperf3.service index 6806745c3..a691d0790 100644 --- a/contrib/iperf3.service +++ b/contrib/iperf3.service @@ -5,8 +5,7 @@ Requires=network.target [Service] ExecStart=/usr/bin/iperf3 -s Restart=on-failure -DynamicUser=yes - +DynamicUser=yes NoNewPrivileges=yes PrivateTmp=yes PrivateDevices=yes From 212a2fe3ae2e600617a1fde7e6a1a0a1488a341f Mon Sep 17 00:00:00 2001 From: DavidBar-On Date: Sat, 2 May 2026 12:12:39 +0300 Subject: [PATCH 286/286] Limit UDP GSO number of segments in a message to the allowed value --- src/iperf.h | 1 + src/iperf_client_api.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/iperf.h b/src/iperf.h index a6052737a..b7f4575a9 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -494,6 +494,7 @@ extern int gerror; /* error value from getaddrinfo(3), for use in internal error /* In Reverse mode, maximum number of packets to wait for "accept" response - to handle out of order packets */ #define MAX_REVERSE_OUT_OF_ORDER_PACKETS 2 +#define GSO_MAX_DG_IN_BF (1 << 7UL) // 128 - the Linux Kernel limit hardcoded as `UDP_MAX_SEGMENTS (1 << 7UL)` in `udpgso.c` #define GSO_BF_MAX_SIZE MAX_UDP_BLOCKSIZE #define GRO_BF_MAX_SIZE MAX_UDP_BLOCKSIZE diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 165193ba6..03d1fc7b3 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -420,7 +420,7 @@ iperf_handle_message_client(struct iperf_test *test) int iperf_connect(struct iperf_test *test) { - int opt; + int opt, n; socklen_t len; if (NULL == test) @@ -526,7 +526,11 @@ iperf_connect(struct iperf_test *test) test->settings->gso_dg_size = test->settings->blksize; /* use the multiple of datagram size for the best efficiency. */ if (test->settings->gso_dg_size > 0) { - test->settings->gso_bf_size = (test->settings->gso_bf_size / test->settings->gso_dg_size) * test->settings->gso_dg_size; + n = test->settings->gso_bf_size / test->settings->gso_dg_size; + if (n > GSO_MAX_DG_IN_BF) { + n = GSO_MAX_DG_IN_BF; + } + test->settings->gso_bf_size = n * test->settings->gso_dg_size; } else { /* If gso_dg_size is 0 (unlimited bandwidth), use default UDP datagram size */ test->settings->gso_dg_size = DEFAULT_UDP_BLKSIZE;