Full Code of esnet/iperf for AI

master a5549203c979 cached
108 files
2.5 MB
654.9k tokens
754 symbols
1 requests
Download .txt
Showing preview only (2,618K chars total). Download the full file or copy to clipboard to get everything.
Repository: esnet/iperf
Branch: master
Commit: a5549203c979
Files: 108
Total size: 2.5 MB

Directory structure:
gitextract_cn_k7htu/

├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── build.yml
├── .gitignore
├── .gitlab-ci.yml
├── INSTALL
├── LICENSE
├── Makefile.am
├── Makefile.in
├── README.md
├── RELNOTES.md
├── aclocal.m4
├── auth_test.sh
├── bootstrap.sh
├── config/
│   ├── ax_check_openssl.m4
│   ├── ax_pthread.m4
│   ├── compile
│   ├── config.guess
│   ├── config.sub
│   ├── depcomp
│   ├── install-sh
│   ├── iperf_config_static_bin.m4
│   ├── ltmain.sh
│   ├── missing
│   ├── mkinstalldirs
│   └── test-driver
├── configure
├── configure.ac
├── contrib/
│   ├── Dockerfile
│   ├── README.txt
│   ├── iperf3.gp
│   ├── iperf3.service
│   └── iperf3_to_gnuplot.py
├── docs/
│   ├── 2017-04-27.txt
│   ├── 2017-06-06.txt
│   ├── Makefile
│   ├── _esnet/
│   │   ├── LICENSE
│   │   ├── README.rst
│   │   ├── deploy.sh
│   │   ├── static/
│   │   │   └── esnet.css
│   │   └── templates/
│   │       ├── layout.html
│   │       ├── navbar.html
│   │       └── relations.html
│   ├── building.rst
│   ├── conf.py
│   ├── dev.rst
│   ├── faq.rst
│   ├── index.rst
│   ├── invoking.rst
│   ├── news.rst
│   └── obtaining.rst
├── examples/
│   ├── Makefile.am
│   ├── Makefile.in
│   ├── mic.c
│   └── mis.c
├── iperf3.spec.in
├── make_release
├── src/
│   ├── Makefile.am
│   ├── Makefile.in
│   ├── cjson.c
│   ├── cjson.h
│   ├── dscp.c
│   ├── flowlabel.h
│   ├── iperf.h
│   ├── iperf3.1
│   ├── iperf_api.c
│   ├── iperf_api.h
│   ├── iperf_auth.c
│   ├── iperf_auth.h
│   ├── iperf_client_api.c
│   ├── iperf_config.h.in
│   ├── iperf_error.c
│   ├── iperf_locale.c
│   ├── iperf_locale.h
│   ├── iperf_pthread.c
│   ├── iperf_pthread.h
│   ├── iperf_sctp.c
│   ├── iperf_sctp.h
│   ├── iperf_server_api.c
│   ├── iperf_tcp.c
│   ├── iperf_tcp.h
│   ├── iperf_time.c
│   ├── iperf_time.h
│   ├── iperf_udp.c
│   ├── iperf_udp.h
│   ├── iperf_util.c
│   ├── iperf_util.h
│   ├── libiperf.3
│   ├── main.c
│   ├── net.c
│   ├── net.h
│   ├── portable_endian.h
│   ├── private.pem
│   ├── public.pem
│   ├── queue.h
│   ├── t_api.c
│   ├── t_auth.c
│   ├── t_timer.c
│   ├── t_units.c
│   ├── t_uuid.c
│   ├── tcp_info.c
│   ├── timer.c
│   ├── timer.h
│   ├── units.c
│   ├── units.h
│   └── version.h.in
└── test_commands.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/CONTRIBUTING.md
================================================
# iperf3 Contribution Guidelines

Thanks for contributing to iperf3!

This page contains some guidelines for filing issues, pull requests,
and other sorts of interactions with the iperf3 project.  These are
guidelines and not hard rules, and it is intended that common sense
and good judgement will prevail.

## Support

iperf3 is officially supported on Linux (various distributions),
FreeBSD, and macOS.  Support may be provided on a best-effort basis to
other UNIX-like platforms.  We cannot provide support for building
and/or running iperf3 on Windows, iOS, or Android.

Before asking for help, please check with your favorite search engine
or the
[iperf3 Discussions site on GitHub](http://github.com/esnet/iperf/discussions)
to see if your question might have been asked (and maybe even
answered) before.  https://fasterdata.es.net/ has some information on
the use of various bandwidth measurement tools, including iperf3.  The
iperf3 documentation Web site at http://software.es.net/iperf/
contains various bits of helpful information, including a list of
[frequently-asked questions](http://software.es.net/iperf/faq.html).

We specifically discourage the use of the issue tracker on the iperf3
GitHub project page for asking questions.  Questions posted in the
form of issues may go unanswered.  Please use the
[iperf3 Discussions site on GitHub](http://github.com/esnet/iperf/discussions)
to ask questions of the community or
alternatively use the iperf3 mailing list at
iperf-dev@googlegroups.com (posting requires joining the list).

## Code

If you have improvements or bugfixes to make to iperf3, we'd love to
hear from you.  We prefer changes to be submitted in the form of pull
requests on GitHub, although we can (probably) accept simple patches
as well.  If in doubt, ask.

Before making any submission to the iperf3 project (whether it be code
or documentation), we urge you to consult the iperf3 license, in
particular the section quoted below:

```
You are under no obligation whatsoever to provide any bug fixes, patches, or
upgrades to the features, functionality or performance of the source code
("Enhancements") to anyone; however, if you choose to make your Enhancements
available either publicly, or directly to Lawrence Berkeley National
Laboratory, without imposing a separate written license agreement for such
Enhancements, then you hereby grant the following license: a non-exclusive,
royalty-free perpetual license to install, use, modify, prepare derivative
works, incorporate into other computer software, distribute, and sublicense
such enhancements or derivative works thereof, in binary and source code form.
```

If you're considering changes that will have an architectural impact,
we strongly encourage discussing them with the iperf3 maintainers
before doing a significant amount of work on the code.  We might be
able to provide some guidance.  Also, we're more likely to accept a
submission if if it doesn't involve rewriting large sections of the
code.  Even if you're going to fork the code and maintain your own
changes privately (which you're perfectly welcome to do) we might able
to give you guidance so that future iperf3 changes won't conflict with
your work.

## Conduct

We expect that iperf3 interactions via the issue tracker, mailing
lists, and so forth will be conducted civilly.  Language that is
deemed appropriate or abusive may be removed, and we reserve the right
to ban users from accessing the project for repeated offense.


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
_NOTE: The iperf3 issue tracker is for registering bugs, enhancement
requests, or submissions of code.  It is not a means for asking
questions about building or using iperf3.  Those are best directed
towards the Discussions section for this project at
https://github.com/esnet/iperf/discussions
or to the iperf3 mailing list at iperf-dev@googlegroups.com.
A list of frequently-asked questions
regarding iperf3 can be found at http://software.es.net/iperf/faq.html._

# Context

* Version of iperf3:

* Hardware:

* Operating system (and distribution, if any):

_Please note: iperf3 is supported on Linux, FreeBSD, and macOS.
Support may be provided on a best-effort basis to other UNIX-like
platforms.  We cannot provide support for building and/or running
iperf3 on Windows, iOS, or Android._

* Other relevant information (for example, non-default compilers,
  libraries, cross-compiling, etc.):

_Please fill out one of the "Bug Report" or "Enhancement Request"
sections, as appropriate. Note that submissions of bug fixes, new
features, etc. should be done as a pull request at
https://github.com/esnet/iperf/pulls_

# Bug Report

* Expected Behavior

* Actual Behavior

* Steps to Reproduce

* Possible Solution

# Enhancement Request

* Current behavior

* Desired behavior

* Implementation notes



================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
_PLEASE NOTE the following text from the iperf3 license.  Submitting a
pull request to the iperf3 repository constitutes "[making]
Enhancements available...publicly":_

```
You are under no obligation whatsoever to provide any bug fixes, patches, or
upgrades to the features, functionality or performance of the source code
("Enhancements") to anyone; however, if you choose to make your Enhancements
available either publicly, or directly to Lawrence Berkeley National
Laboratory, without imposing a separate written license agreement for such
Enhancements, then you hereby grant the following license: a non-exclusive,
royalty-free perpetual license to install, use, modify, prepare derivative
works, incorporate into other computer software, distribute, and sublicense
such enhancements or derivative works thereof, in binary and source code form.
```

_The complete iperf3 license is available in the `LICENSE` file in the
top directory of the iperf3 source tree._

* Version of iperf3 (or development branch, such as `master` or
  `3.1-STABLE`) to which this pull request applies:

* Issues fixed (if any):

* Brief description of code changes (suitable for use as a commit message):



================================================
FILE: .github/workflows/build.yml
================================================
name: GitHub Actions Build Test
permissions:
  contents: read
on:
  push:
    branches:
        - master
  pull_request:
    branches:
        - master
jobs:
  cppcheck-test:
    runs-on: ubuntu-latest
    steps:
    - run: echo "This job was triggered by a ${{ github.event_name }} event."
    - name: Checkout Repo
      uses: actions/checkout@v5
    - name: install dependencies
      run: |
        sudo apt-get -y update && sudo apt-get install -y cppcheck && \
        cppcheck . --force --inline-suppr
  build-test-ubuntu-ish:
    strategy:
      matrix:
        os: [ubuntu-latest, ubuntu-22.04, ubuntu-22.04-arm]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v5
    - name: install dependencies
      run: |
        sudo apt-get -y update && sudo apt-get install -y build-essential
    - name: build
      run: |
        ./configure && make && make check
        timeout 300 src/iperf3 -s &
        ./test_commands.sh localhost
  build-test-macos-ish:
    strategy:
      matrix:
        os: [macos-15, macos-14]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v5
    - name: install dependencies
      run: |
        brew install coreutils
    - name: build
      run: |
        ./configure && make && make check
        timeout 300 src/iperf3 -s &
        ./test_commands.sh localhost
  build-test-sanitizer-address:
    runs-on: ubuntu-latest
    steps:
    - run: echo "Running address sanitzer"
    - name: Checkout Repo
      uses: actions/checkout@v5
    - name: install dependencies
      run: |
        sudo apt-get -y update && sudo apt-get install -y build-essential
    - name: build
      run: |
        ./configure CFLAGS="-g -O0 -fsanitize=address" LDFLAGS="-fsanitize=address" && make && make check
        timeout 300 src/iperf3 -s &
        ./test_commands.sh localhost


================================================
FILE: .gitignore
================================================
*~
*.a
*.la
*.lo
*.o
*.orig
*.Po
/Makefile
/autom4te.cache
/config.log
/config.status
/iperf3.spec
docs/_build
docs/_static
/libtool
src/.deps
src/.libs
src/Makefile
src/iperf_config.h
src/version.h
src/stamp-h1
src/iperf3
src/iperf3_profile
src/t_timer
src/t_units
src/t_uuid
src/t_api
src/t_auth
examples/.libs
examples/Makefile
examples/mic
examples/mis
.vscode/


================================================
FILE: .gitlab-ci.yml
================================================
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/development/cicd/templates/
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/C++.gitlab-ci.yml

# use the official gcc image, based on debian
# can use versions as well, like gcc:5.2
# see https://hub.docker.com/_/gcc/
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/development/cicd/templates/
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/C++.gitlab-ci.yml

# use the official gcc image, based on debian
# can use versions as well, like gcc:5.2
# see https://hub.docker.com/_/gcc/

image: gcc

build:
  stage: build
  before_script:
     - apt update && apt -y install make autoconf libssl-dev
  script:
    - ./configure CFLAGS="-g -O0 -fsanitize=address" LDFLAGS="-fsanitize=address"
    - make
    - timeout 300 ./src/iperf3 -s &
    - ./test_commands.sh localhost
  artifacts:
    paths:
      - src/iperf3
      - src/.libs/*

# run tests using the binary built before
test:
  stage: test
  script:
    - ls

deploy:
  stage: deploy
  script: echo "Define your deployment script!"
  environment: production


================================================
FILE: INSTALL
================================================
Installation Instructions
*************************

Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
Software Foundation, Inc.

This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it.

Basic Installation
==================

These are generic installation instructions.

   The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation.  It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions.  Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').

   It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring.  (Caching is
disabled by default to prevent problems with accidental use of stale
cache files.)

   If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release.  If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.

   The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'.  You only need
`configure.ac' if you want to change it or regenerate `configure' using
a newer version of `autoconf'.

The simplest way to compile this package is:

  1. `cd' to the directory containing the package's source code and type
     `./configure' to configure the package for your system.  If you're
     using `csh' on an old version of System V, you might need to type
     `sh ./configure' instead to prevent `csh' from trying to execute
     `configure' itself.

     Running `configure' takes awhile.  While running, it prints some
     messages telling which features it is checking for.

  2. Type `make' to compile the package.

  3. Optionally, type `make check' to run any self-tests that come with
     the package.

  4. Type `make install' to install the programs and any data files and
     documentation.

  5. You can remove the program binaries and object files from the
     source code directory by typing `make clean'.  To also remove the
     files that `configure' created (so you can compile the package for
     a different kind of computer), type `make distclean'.  There is
     also a `make maintainer-clean' target, but that is intended mainly
     for the package's developers.  If you use it, you may have to get
     all sorts of other programs in order to regenerate files that came
     with the distribution.

Compilers and Options
=====================

Some systems require unusual options for compilation or linking that the
`configure' script does not know about.  Run `./configure --help' for
details on some of the pertinent environment variables.

   You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment.  Here
is an example:

     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix

   *Note Defining Variables::, for more details.

Compiling For Multiple Architectures
====================================

You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory.  To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'.  `cd' to the
directory where you want the object files and executables to go and run
the `configure' script.  `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.

   If you have to use a `make' that does not support the `VPATH'
variable, you have to compile the package for one architecture at a
time in the source code directory.  After you have installed the
package for one architecture, use `make distclean' before reconfiguring
for another architecture.

Installation Names
==================

By default, `make install' installs the package's commands under
`/usr/local/bin', include files under `/usr/local/include', etc.  You
can specify an installation prefix other than `/usr/local' by giving
`configure' the option `--prefix=PREFIX'.

   You can specify separate installation prefixes for
architecture-specific files and architecture-independent files.  If you
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
PREFIX as the prefix for installing programs and libraries.
Documentation and other data files still use the regular prefix.

   In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files.  Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.

   If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.

Optional Features
=================

Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System).  The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.

   For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.

Specifying the System Type
==========================

There may be some features `configure' cannot figure out automatically,
but needs to determine by the type of machine the package will run on.
Usually, assuming the package is built to be run on the _same_
architectures, `configure' can figure that out, but if it prints a
message saying it cannot guess the machine type, give it the
`--build=TYPE' option.  TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:

     CPU-COMPANY-SYSTEM

where SYSTEM can have one of these forms:

     OS KERNEL-OS

   See the file `config.sub' for the possible values of each field.  If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.

   If you are _building_ compiler tools for cross-compiling, you should
use the option `--target=TYPE' to select the type of system they will
produce code for.

   If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.

Sharing Defaults
================

If you want to set default values for `configure' scripts to share, you
can create a site shell script called `config.site' that gives default
values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists.  Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.

Defining Variables
==================

Variables not defined in a site shell script can be set in the
environment passed to `configure'.  However, some packages may run
configure again during the build, and the customized values of these
variables may be lost.  In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'.  For example:

     ./configure CC=/usr/local2/bin/gcc

causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script).  Here is a another example:

     /bin/bash ./configure CONFIG_SHELL=/bin/bash

Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
configuration-related scripts to be executed by `/bin/bash'.

`configure' Invocation
======================

`configure' recognizes the following options to control how it operates.

`--help'
`-h'
     Print a summary of the options to `configure', and exit.

`--version'
`-V'
     Print the version of Autoconf used to generate the `configure'
     script, and exit.

`--cache-file=FILE'
     Enable the cache: use and save the results of the tests in FILE,
     traditionally `config.cache'.  FILE defaults to `/dev/null' to
     disable caching.

`--config-cache'
`-C'
     Alias for `--cache-file=config.cache'.

`--quiet'
`--silent'
`-q'
     Do not print messages saying which checks are being made.  To
     suppress all normal output, redirect it to `/dev/null' (any error
     messages will still be shown).

`--srcdir=DIR'
     Look for the package's source code in directory DIR.  Usually
     `configure' can determine that directory automatically.

`configure' also accepts some other, not widely useful, options.  Run
`configure --help' for more details.



================================================
FILE: LICENSE
================================================
"iperf, Copyright (c) 2014-2026, 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."

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

(1) Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

(2) Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation and/
or other materials provided with the distribution.

(3) Neither the name of the University of California, Lawrence Berkeley
National Laboratory, U.S. Dept. of Energy nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

You are under no obligation whatsoever to provide any bug fixes, patches, or
upgrades to the features, functionality or performance of the source code
("Enhancements") to anyone; however, if you choose to make your Enhancements
available either publicly, or directly to Lawrence Berkeley National
Laboratory, without imposing a separate written license agreement for such
Enhancements, then you hereby grant the following license: a  non-exclusive,
royalty-free perpetual license to install, use, modify, prepare derivative
works, incorporate into other computer software, distribute, and sublicense
such enhancements or derivative works thereof, in binary and source code form.

=====

This software contains source code (src/cjson.{c,h}) that is:

  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  THE SOFTWARE.

=====

This software contains source code (src/net.{c,h}) that is:

  This software was developed as part of a project at MIT.

  Copyright (c) 2005-2007 Russ Cox,
		     Massachusetts Institute of Technology

  Permission is hereby granted, free of charge, to any person obtaining
  a copy of this software and associated documentation files (the
  "Software"), to deal in the Software without restriction, including
  without limitation the rights to use, copy, modify, merge, publish,
  distribute, sublicense, and/or sell copies of the Software, and to
  permit persons to whom the Software is furnished to do so, subject to
  the following conditions:

  The above copyright notice and this permission notice shall be
  included in all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

  ===

  Contains parts of an earlier library that has:

  /*
   * The authors of this software are Rob Pike, Sape Mullender, and Russ Cox
   *              Copyright (c) 2003 by Lucent Technologies.
   * Permission to use, copy, modify, and distribute this software for any
   * purpose without fee is hereby granted, provided that this entire notice
   * is included in all copies of any software which is or includes a copy
   * or modification of this software and in all copies of the supporting
   * documentation for such software.
   * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
   * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
   * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
   * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  */

=====

This software contains source code (src/net.c) that is:

/*
 * Copyright (c) 2001 Eric Jackson <ericj@monkey.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *   derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

=====

This software contains source code (src/queue.h) that is:

  /*
   * Copyright (c) 1991, 1993
   *      The Regents of the University of California.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   * 3. Neither the name of the University nor the names of its contributors
   *    may be used to endorse or promote products derived from this software
   *    without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   *
   *      @(#)queue.h     8.5 (Berkeley) 8/20/94
   */

=====

This software contains source code (src/units.{c.h}) that is:

  /*---------------------------------------------------------------
   * Copyright (c) 1999,2000,2001,2002,2003
   * The Board of Trustees of the University of Illinois
   * All Rights Reserved.
   *---------------------------------------------------------------
   * Permission is hereby granted, free of charge, to any person
   * obtaining a copy of this software (Iperf) and associated
   * documentation files (the "Software"), to deal in the Software
   * without restriction, including without limitation the
   * rights to use, copy, modify, merge, publish, distribute,
   * sublicense, and/or sell copies of the Software, and to permit
   * persons to whom the Software is furnished to do
   * so, subject to the following conditions:
   *
   *
   * Redistributions of source code must retain the above
   * copyright notice, this list of conditions and
   * the following disclaimers.
   *
   *
   * Redistributions in binary form must reproduce the above
   * copyright notice, this list of conditions and the following
   * disclaimers in the documentation and/or other materials
   * provided with the distribution.
   *
   *
   * Neither the names of the University of Illinois, NCSA,
   * nor the names of its contributors may be used to endorse
   * or promote products derived from this Software without
   * specific prior written permission.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
   * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
   * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
   * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE
   * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   * ________________________________________________________________
   * National Laboratory for Applied Network Research
   * National Center for Supercomputing Applications
   * University of Illinois at Urbana-Champaign
   * http://www.ncsa.uiuc.edu
   * ________________________________________________________________
   *
   * stdio.c
   * by Mark Gates <mgates@nlanr.net>
   * and Ajay Tirumalla <tirumala@ncsa.uiuc.edu>
   * -------------------------------------------------------------------
   * input and output numbers, converting with kilo, mega, giga
   * ------------------------------------------------------------------- */

=====

This software contains source code (src/portable_endian.h) that is:

// "License": Public Domain
// I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own risk for whatever you like.

=====





================================================
FILE: Makefile.am
================================================
SUBDIRS = src examples


================================================
FILE: Makefile.in
================================================
# Makefile.in generated by automake 1.18.1 from Makefile.am.
# @configure_input@

# Copyright (C) 1994-2025 Free Software Foundation, Inc.

# This Makefile.in 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.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.

@SET_MAKE@
VPATH = @srcdir@
am__is_gnu_make = { \
  if test -z '$(MAKELEVEL)'; then \
    false; \
  elif test -n '$(MAKE_HOST)'; then \
    true; \
  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
    true; \
  else \
    false; \
  fi; \
}
am__make_running_with_option = \
  case $${target_option-} in \
      ?) ;; \
      *) echo "am__make_running_with_option: internal error: invalid" \
              "target option '$${target_option-}' specified" >&2; \
         exit 1;; \
  esac; \
  has_opt=no; \
  sane_makeflags=$$MAKEFLAGS; \
  if $(am__is_gnu_make); then \
    sane_makeflags=$$MFLAGS; \
  else \
    case $$MAKEFLAGS in \
      *\\[\ \	]*) \
        bs=\\; \
        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
    esac; \
  fi; \
  skip_next=no; \
  strip_trailopt () \
  { \
    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
  }; \
  for flg in $$sane_makeflags; do \
    test $$skip_next = yes && { skip_next=no; continue; }; \
    case $$flg in \
      *=*|--*) continue;; \
        -*I) strip_trailopt 'I'; skip_next=yes;; \
      -*I?*) strip_trailopt 'I';; \
        -*O) strip_trailopt 'O'; skip_next=yes;; \
      -*O?*) strip_trailopt 'O';; \
        -*l) strip_trailopt 'l'; skip_next=yes;; \
      -*l?*) strip_trailopt 'l';; \
      -[dEDm]) skip_next=yes;; \
      -[JT]) skip_next=yes;; \
    esac; \
    case $$flg in \
      *$$target_option*) has_opt=yes; break;; \
    esac; \
  done; \
  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@
pkglibexecdir = $(libexecdir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
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) \
	$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
	$(am__configure_deps) $(am__DIST_COMMON)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
 configure.lineno config.status.lineno
mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/iperf_config.h
CONFIG_CLEAN_FILES = iperf3.spec
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo "  GEN     " $@;
am__v_GEN_1 = 
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
am__v_at_1 = 
SOURCES =
DIST_SOURCES =
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
	ctags-recursive dvi-recursive html-recursive info-recursive \
	install-data-recursive install-dvi-recursive \
	install-exec-recursive install-html-recursive \
	install-info-recursive install-pdf-recursive \
	install-ps-recursive install-recursive installcheck-recursive \
	installdirs-recursive pdf-recursive ps-recursive \
	tags-recursive uninstall-recursive
am__can_run_installinfo = \
  case $$AM_UPDATE_INFO_DIR in \
    n|no|NO) false;; \
    *) (install-info --version) >/dev/null 2>&1;; \
  esac
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
  distclean-recursive maintainer-clean-recursive
am__recursive_targets = \
  $(RECURSIVE_TARGETS) \
  $(RECURSIVE_CLEAN_TARGETS) \
  $(am__extra_recursive_targets)
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
	cscope distdir distdir-am dist dist-all distcheck
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates.  Input order is
# *not* preserved.
am__uniquify_input = $(AWK) '\
  BEGIN { nonempty = 0; } \
  { items[$$0] = 1; nonempty = 1; } \
  END { if (nonempty) { for (i in items) print i; }; } \
'
# Make sure the list of sources is unique.  This is necessary because,
# e.g., the same source file might be shared among _SOURCES variables
# for different programs/libraries.
am__define_uniq_tagged_files = \
  list='$(am__tagged_files)'; \
  unique=`for i in $$list; do \
    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
  done | $(am__uniquify_input)`
DIST_SUBDIRS = $(SUBDIRS)
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/iperf3.spec.in \
	$(top_srcdir)/config/compile $(top_srcdir)/config/config.guess \
	$(top_srcdir)/config/config.sub \
	$(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \
	$(top_srcdir)/config/missing \
	$(top_srcdir)/config/mkinstalldirs INSTALL README.md \
	config/compile config/config.guess config/config.sub \
	config/install-sh config/ltmain.sh config/missing \
	config/mkinstalldirs
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
  if test -d "$(distdir)"; then \
    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)
am__relativize = \
  dir0=`pwd`; \
  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
  sed_rest='s,^[^/]*/*,,'; \
  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
  sed_butlast='s,/*[^/]*$$,,'; \
  while test -n "$$dir1"; do \
    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
    if test "$$first" != "."; then \
      if test "$$first" = ".."; then \
        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
      else \
        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
        if test "$$first2" = "$$first"; then \
          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
        else \
          dir2="../$$dir2"; \
        fi; \
        dir0="$$dir0"/"$$first"; \
      fi; \
    fi; \
    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
  done; \
  reldir="$$dir2"
DIST_ARCHIVES = $(distdir).tar.gz
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 -a \! \
            \( -name .nfs* -o -name .smb* -o -name .__afs* \) \) -print
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSCOPE = @CSCOPE@
CTAGS = @CTAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DLLTOOL = @DLLTOOL@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
FILECMD = @FILECMD@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LD = @LD@
LDCONFIG = @LDCONFIG@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OPENSSL_INCLUDES = @OPENSSL_INCLUDES@
OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@
OPENSSL_LIBS = @OPENSSL_LIBS@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
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@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
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@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
runstatedir = @runstatedir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
SUBDIRS = src examples
all: all-recursive

.SUFFIXES:
am--refresh: Makefile
	@:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
	@for dep in $?; do \
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
		&& exit 0; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --foreign Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    echo ' $(SHELL) ./config.status'; \
	    $(SHELL) ./config.status;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
	esac;

$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
	$(SHELL) ./config.status --recheck

$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
	$(am__cd) $(srcdir) && $(AUTOCONF)
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
$(am__aclocal_m4_deps):
iperf3.spec: $(top_builddir)/config.status $(srcdir)/iperf3.spec.in
	cd $(top_builddir) && $(SHELL) ./config.status $@

mostlyclean-libtool:
	-rm -f *.lo

clean-libtool:
	-rm -rf .libs _libs

distclean-libtool:
	-rm -f libtool config.lt

# This directory's subdirectories are mostly independent; you can cd
# into them and run 'make' without going through this Makefile.
# To change the values of 'make' variables: instead of editing Makefiles,
# (1) if the variable is set in 'config.status', edit 'config.status'
#     (which will cause the Makefiles to be regenerated when you run 'make');
# (2) otherwise, pass the desired values on the 'make' command line.
$(am__recursive_targets):
	@fail=; \
	if $(am__make_keepgoing); then \
	  failcom='fail=yes'; \
	else \
	  failcom='exit 1'; \
	fi; \
	dot_seen=no; \
	target=`echo $@ | sed s/-recursive//`; \
	case "$@" in \
	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
	  *) list='$(SUBDIRS)' ;; \
	esac; \
	for subdir in $$list; do \
	  echo "Making $$target in $$subdir"; \
	  if test "$$subdir" = "."; then \
	    dot_seen=yes; \
	    local_target="$$target-am"; \
	  else \
	    local_target="$$target"; \
	  fi; \
	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
	  || eval $$failcom; \
	done; \
	if test "$$dot_seen" = "no"; then \
	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
	fi; test -z "$$fail"

ID: $(am__tagged_files)
	$(am__define_uniq_tagged_files); mkid -fID $$unique
tags: tags-recursive
TAGS: tags

tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
	set x; \
	here=`pwd`; \
	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
	  include_option=--etags-include; \
	  empty_fix=.; \
	else \
	  include_option=--include; \
	  empty_fix=; \
	fi; \
	list='$(SUBDIRS)'; for subdir in $$list; do \
	  if test "$$subdir" = .; then :; else \
	    test ! -f $$subdir/TAGS || \
	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
	  fi; \
	done; \
	$(am__define_uniq_tagged_files); \
	shift; \
	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
	  test -n "$$unique" || unique=$$empty_fix; \
	  if test $$# -gt 0; then \
	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
	      "$$@" $$unique; \
	  else \
	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
	      $$unique; \
	  fi; \
	fi
ctags: ctags-recursive

CTAGS: ctags
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
	$(am__define_uniq_tagged_files); \
	test -z "$(CTAGS_ARGS)$$unique" \
	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
	     $$unique

GTAGS:
	here=`$(am__cd) $(top_builddir) && pwd` \
	  && $(am__cd) $(top_srcdir) \
	  && gtags -i $(GTAGS_ARGS) "$$here"
cscope: cscope.files
	test ! -s cscope.files \
	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
clean-cscope:
	-rm -f cscope.files
cscope.files: clean-cscope cscopelist
cscopelist: cscopelist-recursive

cscopelist-am: $(am__tagged_files)
	list='$(am__tagged_files)'; \
	case "$(srcdir)" in \
	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
	  *) sdir=$(subdir)/$(srcdir) ;; \
	esac; \
	for i in $$list; do \
	  if test -f "$$i"; then \
	    echo "$(subdir)/$$i"; \
	  else \
	    echo "$$sdir/$$i"; \
	  fi; \
	done >> $(top_builddir)/cscope.files

distclean-tags:
	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files

distdir: $(BUILT_SOURCES)
	$(MAKE) $(AM_MAKEFLAGS) distdir-am

distdir-am: $(DISTFILES)
	$(am__remove_distdir)
	$(AM_V_at)$(MKDIR_P) "$(distdir)"
	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
	list='$(DISTFILES)'; \
	  dist_files=`for file in $$list; do echo $$file; done | \
	  sed -e "s|^$$srcdirstrip/||;t" \
	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
	case $$dist_files in \
	  */*) $(MKDIR_P) `echo "$$dist_files" | \
			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
			   sort -u` ;; \
	esac; \
	for file in $$dist_files; do \
	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
	  if test -d $$d/$$file; then \
	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
	    if test -d "$(distdir)/$$file"; then \
	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
	    fi; \
	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
	    fi; \
	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
	  else \
	    test -f "$(distdir)/$$file" \
	    || cp -p $$d/$$file "$(distdir)/$$file" \
	    || exit 1; \
	  fi; \
	done
	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
	  if test "$$subdir" = .; then :; else \
	    $(am__make_dryrun) \
	      || test -d "$(distdir)/$$subdir" \
	      || $(MKDIR_P) "$(distdir)/$$subdir" \
	      || exit 1; \
	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
	    $(am__relativize); \
	    new_distdir=$$reldir; \
	    dir1=$$subdir; dir2="$(top_distdir)"; \
	    $(am__relativize); \
	    new_top_distdir=$$reldir; \
	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
	    ($(am__cd) $$subdir && \
	      $(MAKE) $(AM_MAKEFLAGS) \
	        top_distdir="$$new_top_distdir" \
	        distdir="$$new_distdir" \
		am__remove_distdir=: \
		am__skip_length_check=: \
		am__skip_mode_fix=: \
	        distdir) \
	      || exit 1; \
	  fi; \
	done
	-test -n "$(am__skip_mode_fix)" \
	|| find "$(distdir)" -type d ! -perm -755 \
		-exec chmod u+rwx,go+rx {} \; -o \
	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
	|| chmod -R a+r "$(distdir)"
dist-gzip: distdir
	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
	$(am__post_remove_distdir)

dist-bzip2: distdir
	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
	$(am__post_remove_distdir)

dist-bzip3: distdir
	tardir=$(distdir) && $(am__tar) | bzip3 -c >$(distdir).tar.bz3
	$(am__post_remove_distdir)

dist-lzip: distdir
	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
	$(am__post_remove_distdir)

dist-xz: distdir
	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
	$(am__post_remove_distdir)

dist-zstd: distdir
	tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
	$(am__post_remove_distdir)

dist-tarZ: distdir
	@echo WARNING: "Support for distribution archives compressed with" \
		       "legacy program 'compress' is deprecated." >&2
	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
	$(am__post_remove_distdir)

dist-shar: distdir
	@echo WARNING: "Support for shar distribution archives is" \
	               "deprecated." >&2
	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
	$(am__post_remove_distdir)

dist-zip: distdir
	-rm -f $(distdir).zip
	zip -rq $(distdir).zip $(distdir)
	$(am__post_remove_distdir)

dist dist-all:
	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
	$(am__post_remove_distdir)

# This target untars the dist file and tries a VPATH configuration.  Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
	case '$(DIST_ARCHIVES)' in \
	*.tar.gz*) \
	  eval GZIP= gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
	*.tar.bz2*) \
	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
	*.tar.bz3*) \
	  bzip3 -dc $(distdir).tar.bz3 | $(am__untar) ;;\
	*.tar.lz*) \
	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
	*.tar.xz*) \
	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
	*.tar.Z*) \
	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
	*.shar.gz*) \
	  eval GZIP= gzip -dc $(distdir).shar.gz | unshar ;;\
	*.zip*) \
	  unzip $(distdir).zip ;;\
	*.tar.zst*) \
	  zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
	esac
	chmod -R a-w $(distdir)
	chmod u+w $(distdir)
	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
	chmod a-w $(distdir)
	test -d $(distdir)/_build || exit 0; \
	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
	  && am__cwd=`pwd` \
	  && $(am__cd) $(distdir)/_build/sub \
	  && ../../configure \
	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
	    $(DISTCHECK_CONFIGURE_FLAGS) \
	    --srcdir=../.. --prefix="$$dc_install_base" \
	  && $(MAKE) $(AM_MAKEFLAGS) \
	  && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
	  && $(MAKE) $(AM_MAKEFLAGS) check \
	  && $(MAKE) $(AM_MAKEFLAGS) install \
	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
	        distuninstallcheck \
	  && chmod -R a-w "$$dc_install_base" \
	  && ({ \
	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
	  && rm -rf "$$dc_destdir" \
	  && $(MAKE) $(AM_MAKEFLAGS) dist \
	  && rm -rf $(DIST_ARCHIVES) \
	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
	  && cd "$$am__cwd" \
	  || exit 1
	$(am__post_remove_distdir)
	@(echo "$(distdir) archives ready for distribution: "; \
	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
distuninstallcheck:
	@test -n '$(distuninstallcheck_dir)' || { \
	  echo 'ERROR: trying to run $@ with an empty' \
	       '$$(distuninstallcheck_dir)' >&2; \
	  exit 1; \
	}; \
	$(am__cd) '$(distuninstallcheck_dir)' || { \
	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
	  exit 1; \
	}; \
	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
	   || { echo "ERROR: files left after uninstall:" ; \
	        if test -n "$(DESTDIR)"; then \
	          echo "  (check DESTDIR support)"; \
	        fi ; \
	        $(distuninstallcheck_listfiles) ; \
	        exit 1; } >&2
distcleancheck: distclean
	@if test '$(srcdir)' = . ; then \
	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
	  exit 1 ; \
	fi
	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
	  || { echo "ERROR: files left in build directory after distclean:" ; \
	       $(distcleancheck_listfiles) ; \
	       exit 1; } >&2
check-am: all-am
check: check-recursive
all-am: Makefile
installdirs: installdirs-recursive
installdirs-am:
install: install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive

install-am: all-am
	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am

installcheck: installcheck-recursive
install-strip:
	if test -z '$(STRIP)'; then \
	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
	      install; \
	else \
	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
	fi
mostlyclean-generic:

clean-generic:

distclean-generic:
	-$(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"
	@echo "it deletes files that may require special tools to rebuild."
clean: clean-recursive

clean-am: clean-generic clean-libtool mostlyclean-am

distclean: distclean-recursive
	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
	-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-libtool \
	distclean-tags

dvi: dvi-recursive

dvi-am:

html: html-recursive

html-am:

info: info-recursive

info-am:

install-data-am:

install-dvi: install-dvi-recursive

install-dvi-am:

install-exec-am:

install-html: install-html-recursive

install-html-am:

install-info: install-info-recursive

install-info-am:

install-man:

install-pdf: install-pdf-recursive

install-pdf-am:

install-ps: install-ps-recursive

install-ps-am:

installcheck-am:

maintainer-clean: maintainer-clean-recursive
	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
	-rm -rf $(top_srcdir)/autom4te.cache
	-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic

mostlyclean: mostlyclean-recursive

mostlyclean-am: mostlyclean-generic mostlyclean-libtool

pdf: pdf-recursive

pdf-am:

ps: ps-recursive

ps-am:

uninstall-am:

.MAKE: $(am__recursive_targets) install-am install-strip

.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
	am--refresh check check-am clean clean-cscope clean-generic \
	clean-libtool cscope cscopelist-am ctags ctags-am dist \
	dist-all dist-bzip2 dist-bzip3 dist-gzip dist-lzip dist-shar \
	dist-tarZ dist-xz dist-zip dist-zstd distcheck distclean \
	distclean-generic distclean-libtool distclean-tags \
	distcleancheck distdir distuninstallcheck dvi dvi-am html \
	html-am info info-am install install-am install-data \
	install-data-am install-dvi install-dvi-am install-exec \
	install-exec-am install-html install-html-am install-info \
	install-info-am install-man install-pdf install-pdf-am \
	install-ps install-ps-am install-strip installcheck \
	installcheck-am installdirs installdirs-am maintainer-clean \
	maintainer-clean-generic mostlyclean mostlyclean-generic \
	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
	uninstall-am

.PRECIOUS: Makefile


# 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.%


================================================
FILE: README.md
================================================
iperf3:  A TCP, UDP, and SCTP network bandwidth measurement tool
================================================================

Summary
-------

iperf is a tool for active measurements of the maximum achievable
bandwidth on IP networks.  It supports tuning of various parameters
related to timing, protocols, and buffers.  For each test it reports
the measured throughput / bitrate, loss, and other parameters.

This version, sometimes referred to as iperf3, is a redesign of an
original version developed at NLANR/DAST.  iperf3 is a new
implementation from scratch, with the goal of a smaller, simpler code
base, and a library version of the functionality that can be used in
other programs. iperf3 also has a number of features found in other tools
such as nuttcp and netperf, but were missing from the original iperf.
These include, for example, a zero-copy mode and optional JSON output.
Note that iperf3 is *not* backwards compatible with the original iperf.

Primary development for iperf3 takes place on Ubuntu Linux, FreeBSD,
and macOS.  At this time, these are the only officially supported
platforms, however there have been some reports of success with
OpenBSD, NetBSD, Android, Solaris, and other Linux distributions.

iperf3 is principally developed by ESnet / Lawrence Berkeley National
Laboratory.  It is released under a three-clause BSD license.

For more information see: https://software.es.net/iperf

Source code and issue tracker: https://github.com/esnet/iperf

Discussion forums: https://github.com/esnet/iperf/discussions

Reporting security vulnerabilities: iperf@es.net

Frequently Asked Questions: https://software.es.net/iperf/faq.html

Obtaining iperf3
----------------

Downloads of iperf3 are available at:

    https://downloads.es.net/pub/iperf/

To check out the most recent code, clone the git repository at:

    https://github.com/esnet/iperf.git

Building iperf3
---------------

### Prerequisites: ###

None.

### Building ###

    ./configure; make; make install

(Note: If configure fails, try running `./bootstrap.sh` first)

Invoking iperf3
---------------

iperf3 includes a manual page listing all of the command-line options.
The manual page is the most up-to-date reference to the various flags and parameters.

For sample command line usage, see:

https://fasterdata.es.net/performance-testing/network-troubleshooting-tools/iperf/

Using the default options, iperf is meant to show typical well
designed application performance.  "Typical well designed application"
means avoiding artificial enhancements that work only for testing
(such as splice()'ing the data to /dev/null).  iperf does also have
flags for "extreme best case" optimizations, but they must be
explicitly activated.

These flags include:

    -Z, --zerocopy            use a 'zero copy' sendfile() method of sending data
    -A, --affinity n/n,m      set CPU affinity

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
already been fixed.  Then submit to the iperf3 issue tracker on
GitHub:

https://github.com/esnet/iperf/issues

In your issue submission, please indicate the version of iperf3 and
what platform you're trying to run on (provide the platform
information even if you're not using a supported platform, we
*might* be able to help anyway).  Exact command-line arguments will
help us recreate your problem.  If you're getting error messages,
please include them verbatim if possible, but remember to sanitize any
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
---------------------

Although iperf2 and iperf3 both measure network performance,
they are not compatible with each other.
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/.

Known Issues
------------

A set of known issues is maintained on the iperf3 Web pages:

https://software.es.net/iperf/dev.html#known-issues

Links
-----

This section lists links to user-contributed Web pages regarding
iperf3.  ESnet and Lawrence Berkeley National Laboratory bear no
responsibility for the content of these pages.

* Installation instructions for Debian Linux (by Cameron Camp
  <cameron@ivdatacenter.com>):

  http://cheatsheet.logicalwebhost.com/iperf-network-testing/

Copyright
---------

iperf, Copyright (c) 2014-2026, 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.

If you have questions about your rights to use or distribute this
software, please contact Berkeley Lab's Technology Transfer
Department at TTD@lbl.gov.

NOTICE.  This software is owned by the U.S. Department of Energy.
As such, the U.S. Government has been granted for itself and others
acting on its behalf a paid-up, nonexclusive, irrevocable,
worldwide license in the Software to reproduce, prepare derivative
works, and perform publicly and display publicly.  Beginning five
(5) years after the date permission to assert copyright is obtained
from the U.S. Department of Energy, and subject to any subsequent
five (5) year renewals, the U.S. Government is granted for itself
and others acting on its behalf a paid-up, nonexclusive,
irrevocable, worldwide license in the Software to reproduce,
prepare derivative works, distribute copies to the public, perform
publicly and display publicly, and to permit others to do so.

This code is distributed under a BSD style license, see the LICENSE
file for complete information.


================================================
FILE: RELNOTES.md
================================================
iperf3 Release Notes
====================

iperf-3.20 2025-11-14
---------------------

NOTE: iperf-3.20 incorporates all of the changes in prior iperf3
releases, including iperf-3.19.1.

* Notable user-visible changes

    * Millisecond-resolution representations have been added to JSON
      timestamps. (PR #1846)

    * The reorder_seen metric, where available, is now available in
      the JSON output. (PR #1278)

    * A division by zero error has been fixed. (PR #1906)

    * Some command-line options were not properly restricted to the
      client or server; this problem has been fixed. (#1892 / PR #1894)

    * The combination of `--udp` and `--file` is now explicitly
      disallowed. (PR #1909)

    * It is now possible to get both the full JSON result object as
      well as streaming intermediate JSON result objects. This
      functionality is enabled by using the new `--json-stream-full`
      command-line flag, in addition to the existing `--json-stream`
      flag (PR #1903)

    * Sends with `--zerocopy` are now properly seeded with data
      instead of being all-zeroes. (PR #1949)

    * The `--server-max-duration` flag is now allowed on the iperf3 server to impose
      a maximum duration on timed tests. (PR #1684)

    * The `--rcv-timeout` flag is now ignored for `--bidir`
      tests. This change prevents premature termination of
      bidirectional tests. (#1766 / PR #1946)

    * Several errors in the authentication code were uncovered when
      building with OpenSSL 3.5.3 and later versions. These were
      fixed. (#1951 / PR #1956)

    * Various issues in the iperf3 manual page were fixed up. (PR
      #1887, PR #1927, PR #1936, PR #1941, #1891 / PR #1952)

* Notable developer-visible changes

    * A build failure with uClibc has been fixed. (#1888 / PR #1890)

    * It is now possible to use the API to load RSA keys from a file.
      (PR #1889)

    * Some calls to sprintf() were replaced with calls to
      snprintf(). There were no hazards in the code as written, but
      this change might help silence some compiler warnings and
      potentially prevent future vulnerabilities. (PR #1929)

    * Proper error handling has been added to the `unit_atoX()`
      functions. (PR #1394)

    * Some memory handling errors in `t_auth` were fixed. (PR #1953)

    * Minor enhancements and fixes to GitHub Actions workflows (PR
      #1919, PR #1928, PR #1942).

iperf-3.19.1 2025-07-25
-----------------------

* Notable user-visible changes

    * SECURITY NOTE: Thanks to Han Lee with Apple Information Security
                     for finding and reporting several memory errors
                     including a buffer overflow within the
                     `--skip-rx-copy` option, and two memory errors
                     within authentication, including a heap overflow
                     in the plaintext password and an assert.
                  
    * An off-by-one heap overflow has been fixed in authentication.
      (CVE-2025-54349, ESNET-SECADV-2025-0003)

    * An assert in authentication has been removed. (CVE-2025-54350,
      ESNET-SECADV-2025-0002)

    * A buffer overflow in the `--skip-rx-copy` option for zerocopy
      has been fixed. (CVE-2025-54351, ESNET-SECADV-2025-0001)


iperf-3.19 2025-05-16
---------------------

* Notable user-visible changes

    * iperf3 now supports the use of Multi-Path TCP (MPTCPv1) on Linux
      with the use of the `-m` or `--mptcp` flag. (PR #1661)

    * iperf3 now supports a `--cntl-ka` option to enable TCP keepalives
      on the control connection. (#812, #835, PR #1423)

    * iperf3 now supports the `MSG_TRUNC` receive option, specified by
      the `--skip-rx-copy`. This theoretically improves the rated
      throughput of tests at high bitrates by not delivering network
      payload data to userspace. (#1678, PR #1717)

    * A bug that caused the bitrate setting to be ignored when bursts
      are set, has been fixed. (#1773, #1820, PR #1821, PR #1848)

    * The congestion control protocol setting, if used, is now
      properly reset between tests. (PR #1812)

    * iperf3 now exits with a non-error 0 exit code if exiting via a
      `SIGTERM`, `SIGHUP`, or `SIGINT`. (#1009, PR# 1829)

    * The current behavior of iperf3 with respect to the `-n` and `-k`
      options is now documented as correct. (#1768, #1775, #596, PR #1800)

* Notable developer-visible changes

    * iperf3 now supports a callback function to get the JSON output
      strings. (#1711, PR #1798)

    * iperf3 now builds correctly with gcc-15 (#1838, PR #1805)

    * Various memory leaks were fixed (#1881, PR#1823, #1814, PR#1822)

    * A potential segfault crash was fixed (#1807)

    * Improved warning messages when reading malformed JSON messages
      (PR #1817)

    * The Github CI configuration was changed to use a more up-to-date
      set of runners (PR #1864)

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 optimized 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
-----------------------

* Notable user-visible changes

  * Version number has been corrected. (#1699)

* Notable developer-visible changes

  * No longer signing tags

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
---------------------

* 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, and will
    generally result in significant throughput increases (PR #1591).

  * 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 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

  * BREAKING CHANGE: iperf3 now requires pthreads and C atomic
    variables to compile and run.

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
---------------------

* 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
---------------------

* Notable user-visible changes

  * fq-rate (PR #1461, Issue #1366), and bidirectional flag (Issue #1428,
    PR #1429) were added to the JSON output.

  * Added support for OpenBSD including cleaning up endian handling (PR #1396)
    and support for TCP_INFO on systems where it was implemented (PR #1397).

  * Fixed bug in how TOS is set in mapped v4 (PR #1427).

  * Corrected documentation, such as updating binary download links and text
    (Issue #1459), updating version on iperf3 websites, and fixing an
    incorrect error message (Issue #1441).

  * Fixed crash on rcv-timeout with JSON logfile (#1463, #1460, issue #1360,
    PR #1369).

  * Fixed a bug that prevented TOS/DSCP from getting set correctly for reverse
    tests (PR #1427, Issue #638).

* Developer-visible changes

  * Getter and setter are now available for bind_dev (PR #1419).

  * Added missing getter for bidirectional tests (PR #1453).

  * Added minor changes to clean up .gitignore and error messages (#1408).

  * Made sure configure scripts are runnable with /bin/sh (PR #1398).

  * Cleaned up RPM spec, such as adding missing RPM build dependencies, dropping
    EL5 and removing outdated %changelog (PR #1401) to make.

  * Added a fix for a resource leak bug in function iperf_create_pidfile(#1443).


iperf-3.12 2022-09-30
---------------------

* Notable user-visible changes

  * cJSON has been updated to version 1.7.15 (#1383).

  * The --bind <host>%<dev> option syntax now works properly (#1360 /
    #1371).

  * A server-side file descriptor leak with the --logfile option has
    been fixed (#1369 / #1360 / #1369 / #1389 / #1393).

  * A bug that caused some large values from TCP_INFO to be misprinted
    as negative numbers has been fixed (#1372).

  * Using the -k or -n flags with --reverse no longer leak into future
    tests (#1363 / #1364).

  * There are now various debug level options available with the
    --debug option. These can be used to adjust the amount of
    debugging output (#1327).

  * A new --snd-timeout option has been added to set a termination
    timeout for idle TCP connections (#1215 / #1282).

  * iperf3 is slightly more robust to out-of-order packets during UDP
    connection setup in --reverse mode (#914 / #1123 / #1182 / #1212 /
    #1260).

  * iperf3 will now use different ports for each direction when the
    --cport and --bdir options are set (#1249 / #1259).

  * The iperf3 server will now exit if it can't open its log file
    (#1225 / #1251).

  * Various help message and output fixes have been made (#1299 /
    #1330 / #1345 / #1350).

  * Various compiler warnings have been fixed (#1211 / #1316).

* Developer-visible changes

  * Operation of bootstrap.sh has been fixed and simplified (#1335 /
    #1325).
    
  * Flow label support / compatibility under Linux has been improved
    (#1310).
    
  * Various minor memory leaks have been fixed (#1332 / #1333).

  * A getter/setter has been added for the bind_port parameter
    (--cport option). (#1303, #1305)

  * Various internal documentation improvements (#1265 / #1285 / #1304).

iperf-3.11 2022-01-31
---------------------

* Notable user-visible changes

  * Update links to Discussions in documentation

  * Fix DSCP so that TOS = DSCP * 4 (#1162)

  * Fix --bind-dev for TCP streams (#1153)

  * Fix interface specification so doesn't overlap with IPv6 link-local addresses for -c and -B (#1157, #1180)

  * Add get/set test_unit_format function declaration to iperf_api.h

  * Auto adjustment of test-end condition for file transfers (-F), if no end condition is set, it will automatically adjust it to file size in bytes

  * Exit if idle time expires waiting for a connection in one-off mode (#1187, #1197)

  * Support zerocopy by reverse mode (#1204)

  * Update help and manpage text for #1157, support bind device

  * Consistently print target_bandwidth in JSON start section (#1177)

  * Test bitrate added to JSON output (#1168)

  * Remove fsync call after every write to receiving --file (#1176, #1159)

  * Update documentation for -w (#1175)

  * Fix for #952, different JSON object names for bidir reverse channel

iperf-3.10.1 2021-06-03
-----------------------

* Notable user-visible changes

  * Fixed a problem with autoconf scripts that made builds fail in
    some environments (#1154 / #1155).

* Developer-visible changes

  * GNU autoconf 2.71 or newer is now required to regenerate iperf3's
    configure scripts.

iperf 3.10 2021-05-26
---------------------

* Notable user-visible changes

  * Fix a bug where some --reverse tests didn't terminate (#982 /
    #1054).

  * Responsiveness of control connections is slightly improved (#1045
    / #1046 / #1063).

  * The allowable clock skew when doing authentication between client
    and server is now configurable with the new --time-skew-threshold
    (#1065 / #1070).

  * Bitrate throttling using the -b option now works when a burst size
    is specified (#1090).

  * A bug with calculating CPU utilization has been fixed (#1076 /
    #1077).

  * A --bind-dev option to support binding sockets to a given network
    interface has been added to make iperf3 work better with
    multi-homed machines and/or VRFs (#817 / #1089 / #1097).

  * --pidfile now works with --client mode (#1110).

  * The server is now less likely to get stuck due to network errors
    (#1101, #1125), controlled by the new --rcv-timeout option.

  * Fixed a few bugs in termination conditions for byte or
    block-limited tests (#1113, #1114, #1115).

  * Added tcp_info.snd_wnd to JSON output (#1148).

  * Some bugs with garbled JSON output have been fixed (#1086, #1118,
    #1143 / #1146).

  * Support for setting the IPv4 don't-fragment (DF) bit has been
    added with the new --dont-fragment option (#1119).

  * A failure with not being able to read the congestion control
    algorithm under WSL1 has been fixed (#1061 / #1126).

  * Error handling and error messages now make more sense in cases
    where sockets were not successfully opened (#1129 / #1132 /
    #1136, #1135 / #1138, #1128 / #1139).

  * Some buffer overflow hazards were fixed (#1134).

* Notable developer-visible changes

  * It is now possible to use the API to set/get the congestion
    control algorithm (#1036 / #1112).


iperf 3.9 2020-08-17
--------------------

* Notable user-visible changes

  * A --timestamps flag has been added, which prepends a timestamp to
    each output line.  An optional argument to this flag, which is a
    format specification to strftime(3), allows for custom timestamp
    formats (#909, #1028).

  * A --server-bitrate-limit flag has been added as a server-side
    command-line argument.  It allows a server to enforce a maximum
    throughput rate; client connections that specify a higher bitrate
    or exceed this bitrate during a test will be terminated.  The
    bitrate is expressed in bits per second, with an optional trailing
    slash and integer count that specifies an averaging interval over
    which to enforce the limit (#999).

  * A bug that caused increased CPU usage with the --bidir option has
    been fixed (#1011).

* Notable developer-visible changes

  * Fixed various minor memory leaks (#1023).

iperf 3.8.1 2020-06-10
----------------------

* Notable user-visible changes

  * A regression with "make install", where the libiperf shared
    library files were not getting installed, has been fixed (#1013 /
    #1014).

iperf 3.8 2020-06-08
--------------------

* Notable user-visible changes

  * Profiled libraries and binaries are no longer built by default
    (#950).

  * A minimal Dockerfile has been added (#824).

  * A bug with burst mode and unlimited rate has been fixed (#898).

  * Configuring with the --enable-static-bin flag will now cause
    a statically-linked iperf3 binary to be built (#989).

  * Configuring with the --without-sctp flag will now prevent SCTP
    from being auto-detected (#1008).  This flag allows building a
    static binary (see above item) on a CentOS system with SCTP
    installed, because no static SCTP libraries are available.

  * Clock skew between the iperf3 client and server will no longer
    skew the computation of jitter during UDP tests (#842 / #990).

  * A possible buffer overflow in the authentication feature has been
    fixed.  This was only relevant when configuration authentication
    using the libiperf3 API, and did not affect command-line usage.
    Various other improvements and fixes in this area were also made
    (#996).

* Notable developer-visible changes

  * The embedded version of cJSON has been updated to 1.7.13 (#978).

  * Some server authentication functions have been added to the API
    (#911).

  * API access has been added to the connection timeout parameter
    (#1001).

  * Tests for some authentication functions have been added.

  * Various compiler errors and warnings have been fixed.

iperf 3.7 2019-06-21
--------------------

* Notable user-visible changes

  * Support for simultaneous bidirectional tests with the --bidir flag
    (#201/#780).

  * Use POSIX standard clock_gettime(3) interface for timekeeping where
    available (#253/#738).

  * Passwords for authentication can be provided via environment
    variable (#815).

  * Specifying --repeating-payload and --reverse now works (#867).

  * Failed authentication doesn't count for --one-off (#864/#877).

  * Several memory leaks related to authenticated use were fixed
    (#881/#888).

  * The delay for tearing down the control connection for the default
    timed tests has been increased, to more gracefully handle
    high-delay paths (#751/#859).

* Notable developer-visible changes

  * Various improvements to the libiperf APIs (#767, #775, #869, #870,
    #871)

  * Fixed build behavior when OpenSSL is absent (#854).

  * Portability fixes (#821/#874).

iperf 3.6 2018-06-25
--------------------

* Notable user-visible changes

  * A new --extra-data option can be used to fill in a user-defined
    string field that appears in JSON output.  (#600 / #729)

  * A new --repeating-payload option makes iperf3 use a payload pattern
    similar to that used by iperf2, which could help in recreating
    results that might be affected by payload entropy (for example,
    compression).  (#726)

  * -B now works properly with SCTP tests.  (#678 / #715)

  * A compile fix for Solaris 10 was added.  (#711)

  * Some minor bug fixes for JSON output.  In particular, warnings for
    debug and/or verbose modes with --json output (#737) and a fix for
    JSON output on CentOS 6 (#727 / #744).

  * software.es.net and downloads.es.net now support HTTPS, so URLs in
    documentation that refer to those two hosts now use https://
    instead of http:// URLs. (#759)

* Notable developer-visible changes

  * Functions related to authenticated iperf3 connections have been
    exposed via libiperf.  (#712 / #713)

  * The ToS byte is now exposed in the libiperf API. (#719)

iperf 3.5 2018-03-02
--------------------

* Notable user-visible changes

  * iperf3 no longer counts data received after the end of a test in
    the bytecounts.  This fixes a bug that could, under some
    conditions, artificially inflate the transfer size and measured
    bitrate.  This bug was most noticeable on reverse direction
    transfers on short tests over high-latency or buffer-bloated
    paths.  Many thanks to @FuzzyStatic for providing access to a test
    environment for diagnosing this issue (#692).

iperf 3.4 2018-02-14
--------------------

* Notable user-visible changes

  * The -A (set processor affinity) command-line flag is now supported
    on Windows (#665).

  * iperf3 now builds on systems lacking a daemon(3) library call
    (#369).

  * A bug in time skew checking under authentication was fixed (#674).

  * IPv6 flow labels now work correctly with multiple parallel streams
    (#694).

  * The client no longer closes its control connection before sending
    end-of-test statistics to the server (#677). This fixes a
    regression introduced in iperf-3.2.

  * Sending output to stdout now makes errors go to stderr, as per
    UNIX convention (#695).

  * A server side crash in verbose output with a client running
    multiple parallel connections has been fixed (#686).

  * The --cport option can now be specified without the --bind option.
    Using the --cport option on Linux can eliminate a problem with
    ephemeral port number allocation that can make multi-stream iperf3
    tests perform very poorly on LAGG links.  Also, the --cport option
    now works on SCTP tests (#697).

* Notable developer-visible changes

  * iperf3 now builds on (some) macOS systems older than 10.7 (#607).

  * Some unused code and header inclusions were eliminated (#667,
    #668).  Also some code was cleaned up to eliminate (or at least
    reduce) compiler warnings (#664, #671).

iperf 3.3 2017-10-31
--------------------

* Notable user-visible changes

  * iperf3 can now be built --without-openssl on systems where OpenSSL
    is present (#624, #633).

  * A bug with printing very large numbers has been fixed (#642).

  * A bug where the server would, under certain circumstances, halt a
    test after exactly fifteen seconds has been fixed (#645).

  * The --tos parameter is no longer "sticky" between tests when doing
    --reverse tests (#639).

  * The authentication token on the server is properly reset between
    tests (#650).

  * A bug that could cause iperf3 to overwrite the PID file of an
    already-existing iperf3 process has been fixed (#623).

  * iperf3 will now ignore nonsensical TCP MSS values (from the TCP
    control connection) when trying to determine a reasonable block
    size for UDP tests.  This condition primarily affected users on
    Windows, but potentially improves robustness for all
    platforms. (#659)

* Notable developer-visible changes

iperf 3.2 2017-06-26
--------------------

* User-visible changes

  * Authentication via a username/password mechanism, coupled with a
    public-key pair, is now an optional way of limiting access to an
    iperf3 server (#517).

  * Ending statistics are less ambiguous for UDP and also now use
    correct test durations for all protocols (#560, #238).  Many fixes
    have been made in statistics printing code, generally for
    human-readable output (#562, #575, #252, #443, #236).

  * Several problems with the -F/--file options have been fixed.
    Documentation has been improved to note some ways in which this
    feature might not behave as expected (#588).

  * iperf3 now uses the correct "bitrate" phraseology rather than
    "bandwidth" when describing measurement results.  The --bandwidth
    option has been renamed --bitrate, although --bandwidth is still
    accepted for backwards compatibility (#583).

  * Application-level bandwidth pacing (--bitrate option) is now
    checked every millisecond by default, instead of every tenth of
    a second, to provide smoother traffic behavior when using
    application pacing (#460).  The pacing can be tuned via the use of
    the --pacing-timer option (#563).

  * A new --dscp option allows specifying the DSCP value to be used
    for outgoing packets (#508).  The TOS byte value is now printed in
    the JSON output (#226).

  * Congestion window data on FreeBSD is now computed correctly (#465,
    #475, #338).

  * The T/t suffixes for terabytes/terabits are now accepted for
    quantities where suffixes are supported, such as --bandwidth
    (#402).

  * Sanity checks for UDP send sizes have been added (#390), and
    existing checks on the --window option have been improved (#557).

  * The TCP rttvar value is now available in the JSON output (#534), as are
    the socket buffer sizes (#558).

  * Error handling and documentation have been improved for the
    -f/--format options (#568).

  * A new --connect-timeout option on the client allows specifying a
    length of time that the client will attempt to connect to the
    server, in milliseconds (#216).

  * The hostname and current timestamp are no longer used in the
    cookie used to associate the client and server.  Instead, random
    data is used.  Note that iperf3 now requires the /dev/urandom
    device (#582).

  * Prior versions of iperf3 doing UDP tests used to overcount packet
    losses in the presence of packet reordering.  This has been
    (partially) fixed by try to not count the sequence number gaps
    resulting from out-of-order packets as actual losses (#457).

  * iperf3 no longer prints results from very small intervals (10% of
    the statistics reporting interval) at the end of the test run if
    they contain no data.  This can happen due to timing difference or
    network queueing on the path between the client and server.  This
    is primarily a cosmetic change to prevent these fairly meaningless
    intervals from showing up in the output (#278).

  * Compatibility note: Users running iperf3 3.2 or newer from the
    bwctl utility will need to obtain version 1.6.3 or newer of bwctl.
    Note that bwctl, a component of the perfSONAR toolkit, has been
    deprecated in favor of pScheduler since the release of perfSONAR
    4.0.

* Developer-visible changes

  * Various warnings and build fixes (#551, #564, #518, #597).

  * Some improvements have been made for increased compatibility on
    IRIX (#368) and with C++ (#587).

  * cJSON has been updated to 1.5.2 (#573), bringing in a number of
    bugfixes.

  * Some dead code has been removed.

iperf 3.1.7 2017-03-06
----------------------

iperf 3.1.7 is functionally identical to iperf 3.1.6.  Its only
changes consist of updated documentation files and text in the RPM
spec file.

iperf 3.1.6 2017-02-02
----------------------

The release notes for iperf 3.1.6 describe changes, including bug
fixes and new functionality, made since iperf 3.1.5.

* User-visible changes

  * Specifying --fq-rate or --no-fq-socket-pacing on a system where
    these options are not supported now generate an error instead of a
    warning.  This change makes diagnosing issues related to pacing
    more apparent.

  * Fixed a bug where two recently-added diagnostic messages spammed
    the JSON output on UDP tests.

iperf 3.1.5 2017-01-12
----------------------

The release notes for iperf 3.1.5 describe changes, including bug
fixes and new functionality, made since iperf 3.1.4.

Compatibility note: Fair-queueing is now specified differently in
iperf 3.1.5 than in prior versions (which include 3.1.3 and 3.1.4).

Compatibility note: UDP tests may yield different results from all
prior versions of iperf3 (through 3.1.4) due to the new default UDP
sending size.

* User-visible changes

  * The fair-queueing per-socket based pacing available on recent
    Linux systems has been reimplemented with a different user
    interface (#325, #467, #488).  The --bandwidth command-line flag
    now controls only the application-level pacing, as was the case in
    iperf 3.1.2 and all earlier versions.  Fair-queueing per-socket
    based pacing is now controlled via a new --fq-rate command-line
    flag.  Note that TCP and UDP tests may use --bandwidth, --fq-rate,
    both flags, or neither flag.  SCTP tests currently support
    --bandwidth only.  The --no-fq-socket-pacing flag, which was
    introduced in iperf 3.1.3, has now been deprecated, and is
    equivalent to --fq-rate=0.  iperf3 now reacts more gracefully if
    --no-fq-socket-pacing or --fq-rate are specified on platforms that
    don't support these options.

    For UDP tests, note that the default --bandwidth is 1 Mbps.  Using
    the fair-queueing-based pacing will probably require explicitly
    setting both --bandwidth and --fq-rate, preferably to the same
    value.  (While setting different values for --bandwidth and
    --fq-rate can certainly be done, the results can range from
    entertaining to perplexing.)

  * iperf3 now chooses a more sane default UDP send size (#496, #498).
    The former default (8KB) caused IP packet fragmentation on paths
    having smaller MTUs (including any Ethernet network not configured
    for jumbo frames).  This could have effects ranging from increased
    burstiness, to packet loss, to complete failure of the test.
    iperf3 now attempts to use the MSS of the control connection to
    determine a default UDP send size if no sending length was
    explicitly specified with --length.

  * Several checks are now made when setting the socket buffer sizes
    with the -w option, to verify that the settings have been applied
    correctly.  The results of these checks can been seen when the
    --debug flag is specified.  (#356)

  * A --forceflush flag has been added to flush the output stream
    after every statistics reporting interval.

* Developer-visible changes

  * A systemd service file has been added (#340, #430).

iperf 3.1.4 2016-10-31
----------------------

The release notes for iperf 3.1.4 describe changes, including bug
fixes and new functionality, made since iperf 3.1.3.

* User-visible changes

  * On systems that support setting the congestion control algorithm,
    iperf3 now keeps track of the congestion control algorithm and
    print it in the JSON output in the members sender_tcp_congestion
    and receiver_tcp_congestion (issue #461).  A few bugs (probably
    not user-visible) with setting the congestion control algorithm
    were also fixed.

* Developer-visible changes

  * Fixed a buffer overflow in the cJSON library (issue #466).  It is
    not believed that this bug created any security vulnerabilities in
    the context of iperf3.

  * Travis CI builds are now enabled on this codeline (pull request #424).

  * Various bug fixes (issue #459, pull request #429, issue #388).

iperf 3.1.3 2016-06-08
----------------------

The release notes for iperf 3.1.3 describe changes, including bug
fixes and new functionality, made since iperf 3.1.2.

* Security

  * Fixed a buffer overflow / heap corruption issue that could occur
    if a malformed JSON string was passed on the control channel.  In
    theory, this vulnerability could be leveraged to create a heap
    exploit.  This issue, present in the cJSON library, was already
    fixed upstream, so was addressed in iperf3 by importing a newer
    version of cJSON (plus local ESnet modifications).  Discovered and
    reported by Dave McDaniel, Cisco Talos.  Cross-references:
    TALOS-CAN-0164, ESNET-SECADV-2016-0001, CVE-2016-4303.

* User-visible changes

  * On supported platforms (recent Linux), iperf3 can use
    fair-queueing-based per-socket pacing instead of its own
    application-level pacing for the --bandwidth option.
    Application-level pacing can be forced with the
    -no-fq-socket-pacing flag.

  * A bug that could show negative loss counters with --udp and --omit
    has been fixed (issue #412, pull request #414).

  * Error handling has been made slightly more robust.  Also, the
    iperf3 server will no longer exit after five consecutive errors,
    but will only exit for certain types of errors that prevent it
    from participating in any tests at all.

* Developer-visible changes

  * Fixed the build on FreeBSD 11-CURRENT (issue #413).

  * Fixed various coding errors (issue #423, issue #425).

iperf 3.1.2 2016-02-01
----------------------

The release notes for iperf 3.1.2 describe changes, including bug
fixes and new functionality, made since iperf 3.1.1.

* User-visible changes

  * Fixed a bug that caused nan values to be emitted (incorrectly)
    into JSON, particularly at the end of UDP tests (issue #278).

  * Fixed a bug that caused the wrong value to be printed for
    out-of-order UDP packets (issue #329).

  * Added a contrib/ directory containing a few submitted graphing
    scripts.

* Developer-visible changes

iperf 3.1.1 2015-11-19
----------------------

The release notes for iperf 3.1.1 describe changes and new
functionality in iperf 3.1.1, but not present in 3.1.

* User-visible changes

  * Some markup fixes have been made in the manpages for Debian
    compatibility (issue #291).

  * A bug where the -T title option was not being output correctly
    in JSON output has been fixed (issue #292).

  * Argument handling for some command-line options has been improved
    (issue #316).

* Developer-visible changes

  * A regression with C++ compatibility in one of the iperf header
    files has been fixed (issue #323).

iperf 3.1 2015-10-16
--------------------

The release notes for iperf 3.1 describe changes and new
functionality in iperf 3.1, but not present in 3.0.11 or any earlier
3.0.x release.

* Selected user-visible changes

  * SCTP support has been added (with the --sctp flag), on Linux,
    FreeBSD, and Solaris (issue #131).

  * Setting CPU affinity now works on FreeBSD.

  * Selection of TCP congestion now works on FreeBSD, and is now
    called --congestion (the old --linux-congestion option works
    but is now deprecated).

  * A new -I option for the server causes it to write a PID file,
    mostly useful for daemon mode (issue #120).

  * A --logfile argument can now force all output to go to a file,
    rather than to a file.  This is especially useful when running an
    iperf3 server in daemon mode (issue #119).

  * Various compatibility fixes for Android (issue #184, issue #185),
    iOS (issue #288), NetBSD (issue #248), Solaris (issue #175, issue
    #178, issue #180, issue #211), vxWorks (issue #268).

  * A --udp-counters-64bit flag has been added to support very
    long-running UDP tests, which could cause a counter to overflow
    (issue #191).

  * A --cport option to specify the client-side port has been added
    (issue #207, issue #209, issue #239).

  * Some calculation errors with the -O feature have been fixed (issue
    #236).

  * A potential crash in the iperf3 server has been fixed (issue #257,
    issue #258).

  * Many miscellaneous bug fixes.

* Selected developer-visible changes

  * Consumers of libiperf can now get the JSON output for a
    just-completed test (issue #147).

  * Detection of various optional features has been improved to check
    for the presence or absence of platform functionality, not the name
    of platforms.

  * Out-of-tree builds now work (issue #265).

iperf 3.0.11 2015-01-09
-----------------------

* User-visible changes

  * Added -1 / --one-off flag, which causes the iperf3 server to
    process one client connection and then exit.  Intended primarily
    for bwctl integration (issue #230).

  * Added various minor bug fixes (issues #231, #232, #233).

  * Added 30-second timeout for UDP tests if unable to establish UDP
    connectivity between sender and receiver (issue #222).

iperf 3.0.10 2014-12-16
-----------------------

* User-visible changes

  * Fixed the build on MacOS X Yosemite (issue #213).

  * UDP tests now honor the -w option for setting the socket buffer
    sizes (issue #219).

* Developer-visible changes

  * Added an RPM spec file plus functionality to fill in the version
    number.

  * Fixed potential filename collision with a system header (issue
    #203).

iperf 3.0.9 2014-10-14
----------------------

* User-visible changes

  * Fixed a series of problems that came from attempting a UDP test
    with a pathologically large block size.  This put the server into
    an odd state where it could not accept new client connections.
    This in turn caused subsequent client connections to crash when
    interrupted (issue #212).

* Developer-visible changes

  * None.

iperf 3.0.8 2014-09-30
----------------------

* User-visible changes

  * Updated license and copyright verbiage to confirm to LBNL Tech
    Transfer requirements.  No substantive changes; license remains
    the 3-clause BSD license.

* Developer-visible changes

  * None.

iperf 3.0.7 2014-08-28
----------------------

* User-visible changes

  * A server bug where new connections from clients could disrupt
    running tests has been fixed (issue #202).

  * Rates now consistently use 1000-based prefixes (K, M, G), where
    sizes of objects now consistently use 1024-based prefixes (issue #173).

  * UDP tests with unlimited bandwidth are now supported (issue #170).

  * An interaction between the -w and -B options, which kept them from
    working when used together, has been fixed (issue #193).

* Developer-visible changes

iperf 3.0.6 2014-07-28
----------------------

* User-visible changes

  * Several bugs that kept the -B option from working in various
    circumstances have been fixed (issue #193).

  * Various compatibility fixes for OpenBSD (issue #196) and
    Solaris (issue #177).

* Developer-visible changes

  * The {get,set}_test_bind_address API calls have been added to
    expose the -B functionality to API consumers (issue #197).

iperf 3.0.5 2014-06-16
----------------------

* User-visible changes

  * Erroneous output when doing --json output has been fixed (this
    problem was caused by an attempt to fix issue #158).

  * The maximum test running time has been increased from one hour to
    one day (issue #166).

  * Project documentation has been moved to GitHub Pages at this URL:
    http://software.es.net/iperf/.

  * A bug that caused CPU time to be computed incorrectly on FreeBSD
    has been fixed.

  * A timing issue which caused measurement intervals to be wrong
    with TCP tests on lossy networks has been fixed (issue #125).

  * Newer versions of autoconf / automake / libtool are now used by
    default (issue #161).

  * JSON output now indicates whether the test was run in --reverse
    mode (issue #167).

  * It is now possible to get (most of) the server-side output at
    the client by using the --get-server-output flag (issue #160).

* Developer-visible changes

  * automake/autoconf/libtool have been updated to more recent
    versions.  AM_MAINTAINER_MODE is now used to avoid requiring these
    tools at build-time.

iperf 3.0.4 was not released
----------------------------

iperf 3.0.3 2014-03-26
----------------------

* User-visible changes

  * Due to several oversights, the source code archive for iperf 3.0.2
    was distributed as an uncompressed tarball, despite having an
    extension (".tar.gz") that indicated it was compressed.  The
    release generation procedure has been changed to avoid this
    problem going forward.

  * Summary structures in the JSON output are now included, even if
    there is only one stream.  This change makes consuming the JSON
    output easier and more consistent (issue #151).

  * A possible buffer overflow in iperf_error.c has been fixed (issue
    #155).

* Developer-visible changes

  * Example programs now build correctly, after having been broken in
    the 3.0.2 release (issue #152).

iperf 3.0.2 2014-03-10
----------------------

* User-visible changes

  * The iperf3 project has been moved to GitHub, and various URLs in
    documentation files have been changed to point there.

  * iperf3 now builds on Linux systems that do not support
    TCP_CONGESTION.  Most notably this allows iperf3 to work on CentOS
    5.

  * An abort on MacOS 10.9 has been fixed (issue #135).

  * Added -I flag for the server to write a PID file, mostly useful for
    daemon mode (issue #120).

  * A bug that could break some TCP tests on FreeBSD has been fixed.

  * TCP snd_cwnd output is now printed by default on Linux (issue #99).

  * In JSON output, the --title string no longer has a colon and two
    spaces appended (issue #139).

  * A buffer for holding formatted numeric values is now
    properly-sized so that output is not truncated (issue #142).

* Developer-visible changes

  * Some memory leaks have been fixed.

  * A -d flag enables debugging output.

  * A .gitignore file has been added.

  * libtoolize is now invoked correctly from the bootstrap.sh script.

  * The test unit format can now be set from the API (issue #144).

  * libiperf is now built as both shared and static libraries.

  * In the JSON output, the "connection" structures are now stored as
    an array in the "start" block, instead of overwriting each other.
    While technically an incompatible API change, the former behavior
    generated unusable JSON.

iperf 3.0.1 2014-01-10
----------------------

  * Added the following new flags
     -D, --daemon	       run server as a daemon
     -L, --flowlabel           set IPv6 flow label (Linux only)
     -C, --linux-congestion    set congestion control algorithm (Linux only)
     -k, --blockcount #[KMG]   number of blocks (packets) to transmit
     	 	      	       (instead of -t or -n)
  * Bug fixes

iperf 3.0-RC5 2013-11-15
------------------------

  * Added the following new flags
     -F, --file name           xmit/recv the specified file
     -A, --affinity n/n,m      set CPU affinity (Linux only)
     -J, --json                output in JSON format
     -Z, --zerocopy            use a 'zero copy' method of sending data
     -O, --omit N              omit the first n seconds
     -T, --title str           prefix every output line with this string
  * more useful information in 'verbose' mode
  * Many bug fixes


iperf 3.0b4 2010-08-02
----------------------

  * Added support for binding to a specific interface (-B)
  * Added support for IPv6 mode (-6)
  * Setting TCP window size (-w) is now supported
  * Updates to iperf_error
      * Added new errors
      * Should generate more relevant messages
  * Stream list now managed by queue.h macros
  * Test structures are now kept intact after a test is run (for API users)
  * Improved interval timer granularity
      * Support for decimal values
  * Many bug fixes

iperf 3.0b3 2010-07-23
----------------------

  * Better error handling
      * All errors now handled with iperf_error()
      * All functions that can return errors return NULL or -1 on error and set i_errno appropriately
  * Iperf API introduced
      * Support for adding new protocols
      * Added support for callback functions
          * on_connect - executes after a connection is made to the server
          * on_new_stream - executes after a new stream is created
          * on_test_start - executes right before the test begins
          * on_test_finish - executes after the test is finished
  * Added early support for verbose mode (-V)

iperf 3.0b2 2010-07-15
----------------------

  * UDP mode now supported
      * Support for setting bandwidth (-b)
      * Parallel UDP stream support
      * Reverse mode UDP support
  * Support for setting TCP_NODELAY (-N), disabling Nagle's Algorithm
  * Support for setting TCP MSS (-M)
      * Note: This feature is still in development. It is still very buggy.

iperf 3.0b1 2010-07-08
----------------------

  * TCP control socket now manages messages between client and server
  * Dynamic server (gets test parameters from client)
      * Server can now set test options dynamically without having to restart.
          * Currently supported options: -l, -t, -n, -P, -R
          * Future options: -u, -b, -w, -M, -N, -I, -T, -Z, -6
  * Results exchange
      * Client can now see server results (and vice versa)
  * Reverse mode (-R)
      * Server sends, client receives


================================================
FILE: aclocal.m4
================================================
# generated automatically by aclocal 1.18.1 -*- Autoconf -*-

# Copyright (C) 1996-2025 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.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.

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.
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'.])])

# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
#
#   Copyright (C) 1996-2001, 2003-2019, 2021-2024 Free Software
#   Foundation, Inc.
#   Written by Gordon Matzigkeit, 1996
#
# 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.

m4_define([_LT_COPYING], [dnl
# 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 the License, or
# (at your option) any later version.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program or library that is built
# using GNU Libtool, you may include this file under the  same
# distribution terms that you use for the rest of that program.
#
# GNU Libtool 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 <http://www.gnu.org/licenses/>.
])

# serial 63 LT_INIT


# LT_PREREQ(VERSION)
# ------------------
# Complain and exit if this libtool version is less that VERSION.
m4_defun([LT_PREREQ],
[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
       [m4_default([$3],
		   [m4_fatal([Libtool version $1 or higher is required],
		             63)])],
       [$2])])


# _LT_CHECK_BUILDDIR
# ------------------
# Complain if the absolute build directory name contains unusual characters
m4_defun([_LT_CHECK_BUILDDIR],
[case `pwd` in
  *\ * | *\	*)
    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
esac
])


# LT_INIT([OPTIONS])
# ------------------
AC_DEFUN([LT_INIT],
[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
AC_BEFORE([$0], [LTDL_INIT])dnl
m4_require([_LT_CHECK_BUILDDIR])dnl

dnl Autoconf doesn't catch unexpanded LT_ macros by default:
m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
dnl unless we require an AC_DEFUNed macro:
AC_REQUIRE([LTOPTIONS_VERSION])dnl
AC_REQUIRE([LTSUGAR_VERSION])dnl
AC_REQUIRE([LTVERSION_VERSION])dnl
AC_REQUIRE([LTOBSOLETE_VERSION])dnl
m4_require([_LT_PROG_LTMAIN])dnl

_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])

dnl Parse OPTIONS
_LT_SET_OPTIONS([$0], [$1])

# This can be used to rebuild libtool when needed
LIBTOOL_DEPS=$ltmain

# Always use our own libtool.
LIBTOOL='$(SHELL) $(top_builddir)/libtool'
AC_SUBST(LIBTOOL)dnl

_LT_SETUP

# Only expand once:
m4_define([LT_INIT])
])# LT_INIT

# Old names:
AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
dnl AC_DEFUN([AM_PROG_LIBTOOL], [])


# _LT_PREPARE_CC_BASENAME
# -----------------------
m4_defun([_LT_PREPARE_CC_BASENAME], [
# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
func_cc_basename ()
{
    for cc_temp in @S|@*""; do
      case $cc_temp in
        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
        \-*) ;;
        *) break;;
      esac
    done
    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
}
])# _LT_PREPARE_CC_BASENAME


# _LT_CC_BASENAME(CC)
# -------------------
# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
# but that macro is also expanded into generated libtool script, which
# arranges for $SED and $ECHO to be set by different means.
m4_defun([_LT_CC_BASENAME],
[m4_require([_LT_PREPARE_CC_BASENAME])dnl
AC_REQUIRE([_LT_DECL_SED])dnl
AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
func_cc_basename $1
cc_basename=$func_cc_basename_result
])


# _LT_FILEUTILS_DEFAULTS
# ----------------------
# It is okay to use these file commands and assume they have been set
# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
m4_defun([_LT_FILEUTILS_DEFAULTS],
[: ${CP="cp -f"}
: ${MV="mv -f"}
: ${RM="rm -f"}
])# _LT_FILEUTILS_DEFAULTS


# _LT_SETUP
# ---------
m4_defun([_LT_SETUP],
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
AC_REQUIRE([AC_CANONICAL_BUILD])dnl
AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl

_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
dnl
_LT_DECL([], [host_alias], [0], [The host system])dnl
_LT_DECL([], [host], [0])dnl
_LT_DECL([], [host_os], [0])dnl
dnl
_LT_DECL([], [build_alias], [0], [The build system])dnl
_LT_DECL([], [build], [0])dnl
_LT_DECL([], [build_os], [0])dnl
dnl
AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([LT_PATH_LD])dnl
AC_REQUIRE([LT_PATH_NM])dnl
dnl
AC_REQUIRE([AC_PROG_LN_S])dnl
test -z "$LN_S" && LN_S="ln -s"
_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
dnl
AC_REQUIRE([LT_CMD_MAX_LEN])dnl
_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
dnl
m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_CHECK_SHELL_FEATURES])dnl
m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
m4_require([_LT_CMD_RELOAD])dnl
m4_require([_LT_DECL_FILECMD])dnl
m4_require([_LT_CHECK_MAGIC_METHOD])dnl
m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
m4_require([_LT_CMD_OLD_ARCHIVE])dnl
m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
m4_require([_LT_WITH_SYSROOT])dnl
m4_require([_LT_CMD_TRUNCATE])dnl

_LT_CONFIG_LIBTOOL_INIT([
# See if we are running on zsh, and set the options that allow our
# commands through without removal of \ escapes INIT.
if test -n "\${ZSH_VERSION+set}"; then
   setopt NO_GLOB_SUBST
fi
])
if test -n "${ZSH_VERSION+set}"; then
   setopt NO_GLOB_SUBST
fi

_LT_CHECK_OBJDIR

m4_require([_LT_TAG_COMPILER])dnl

case $host_os in
aix3*)
  # AIX sometimes has problems with the GCC collect2 program.  For some
  # reason, if we set the COLLECT_NAMES environment variable, the problems
  # vanish in a puff of smoke.
  if test set != "${COLLECT_NAMES+set}"; then
    COLLECT_NAMES=
    export COLLECT_NAMES
  fi
  ;;
esac

# Global variables:
ofile=libtool
can_build_shared=yes

# All known linkers require a '.a' archive for static linking (except MSVC and
# ICC, which need '.lib').
libext=a

with_gnu_ld=$lt_cv_prog_gnu_ld

old_CC=$CC
old_CFLAGS=$CFLAGS

# Set sane defaults for various variables
test -z "$CC" && CC=cc
test -z "$LTCC" && LTCC=$CC
test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
test -z "$LD" && LD=ld
test -z "$ac_objext" && ac_objext=o

_LT_CC_BASENAME([$compiler])

# Only perform the check for file, if the check method requires it
test -z "$MAGIC_CMD" && MAGIC_CMD=file
case $deplibs_check_method in
file_magic*)
  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
    _LT_PATH_MAGIC
  fi
  ;;
esac

# Use C for the default configuration in the libtool script
LT_SUPPORTED_TAG([CC])
_LT_LANG_C_CONFIG
_LT_LANG_DEFAULT_CONFIG
_LT_CONFIG_COMMANDS
])# _LT_SETUP


# _LT_PREPARE_SED_QUOTE_VARS
# --------------------------
# Define a few sed substitution that help us do robust quoting.
m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
[# Backslashify metacharacters that are still active within
# double-quoted strings.
sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'

# Same as above, but do not quote variable references.
double_quote_subst='s/\([["`\\]]\)/\\\1/g'

# Sed substitution to delay expansion of an escaped shell variable in a
# double_quote_subst'ed string.
delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'

# Sed substitution to delay expansion of an escaped single quote.
delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'

# Sed substitution to avoid accidental globbing in evaled expressions
no_glob_subst='s/\*/\\\*/g'
])

# _LT_PROG_LTMAIN
# ---------------
# Note that this code is called both from 'configure', and 'config.status'
# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
# 'config.status' has no value for ac_aux_dir unless we are using Automake,
# so we pass a copy along to make sure it has a sensible value anyway.
m4_defun([_LT_PROG_LTMAIN],
[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
ltmain=$ac_aux_dir/ltmain.sh
])# _LT_PROG_LTMAIN



# So that we can recreate a full libtool script including additional
# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
# in macros and then make a single call at the end using the 'libtool'
# label.


# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
# ----------------------------------------
# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
m4_define([_LT_CONFIG_LIBTOOL_INIT],
[m4_ifval([$1],
          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
                     [$1
])])])

# Initialize.
m4_define([_LT_OUTPUT_LIBTOOL_INIT])


# _LT_CONFIG_LIBTOOL([COMMANDS])
# ------------------------------
# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
m4_define([_LT_CONFIG_LIBTOOL],
[m4_ifval([$1],
          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
                     [$1
])])])

# Initialize.
m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])


# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
# -----------------------------------------------------
m4_defun([_LT_CONFIG_SAVE_COMMANDS],
[_LT_CONFIG_LIBTOOL([$1])
_LT_CONFIG_LIBTOOL_INIT([$2])
])


# _LT_FORMAT_COMMENT([COMMENT])
# -----------------------------
# Add leading comment marks to the start of each line, and a trailing
# full-stop to the whole comment if one is not present already.
m4_define([_LT_FORMAT_COMMENT],
[m4_ifval([$1], [
m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
)])





# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
# -------------------------------------------------------------------
# CONFIGNAME is the name given to the value in the libtool script.
# VARNAME is the (base) name used in the configure script.
# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
# VARNAME.  Any other value will be used directly.
m4_define([_LT_DECL],
[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
	[m4_ifval([$1], [$1], [$2])])
    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
    m4_ifval([$4],
	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
    lt_dict_add_subkey([lt_decl_dict], [$2],
	[tagged?], [m4_ifval([$5], [yes], [no])])])
])


# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
# --------------------------------------------------------
m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])


# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
# ------------------------------------------------
m4_define([lt_decl_tag_varnames],
[_lt_decl_filter([tagged?], [yes], $@)])


# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
# ---------------------------------------------------------
m4_define([_lt_decl_filter],
[m4_case([$#],
  [0], [m4_fatal([$0: too few arguments: $#])],
  [1], [m4_fatal([$0: too few arguments: $#: $1])],
  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
])


# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
# --------------------------------------------------
m4_define([lt_decl_quote_varnames],
[_lt_decl_filter([value], [1], $@)])


# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
# ---------------------------------------------------
m4_define([lt_decl_dquote_varnames],
[_lt_decl_filter([value], [2], $@)])


# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
# ---------------------------------------------------
m4_define([lt_decl_varnames_tagged],
[m4_assert([$# <= 2])dnl
_$0(m4_quote(m4_default([$1], [[, ]])),
    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
m4_define([_lt_decl_varnames_tagged],
[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])


# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
# ------------------------------------------------
m4_define([lt_decl_all_varnames],
[_$0(m4_quote(m4_default([$1], [[, ]])),
     m4_if([$2], [],
	   m4_quote(lt_decl_varnames),
	m4_quote(m4_shift($@))))[]dnl
])
m4_define([_lt_decl_all_varnames],
[lt_join($@, lt_decl_varnames_tagged([$1],
			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
])


# _LT_CONFIG_STATUS_DECLARE([VARNAME])
# ------------------------------------
# Quote a variable value, and forward it to 'config.status' so that its
# declaration there will have the same value as in 'configure'.  VARNAME
# must have a single quote delimited value for this to work.
m4_define([_LT_CONFIG_STATUS_DECLARE],
[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])


# _LT_CONFIG_STATUS_DECLARATIONS
# ------------------------------
# We delimit libtool config variables with single quotes, so when
# we write them to config.status, we have to be sure to quote all
# embedded single quotes properly.  In configure, this macro expands
# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
#
#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])


# _LT_LIBTOOL_TAGS
# ----------------
# Output comment and list of tags supported by the script
m4_defun([_LT_LIBTOOL_TAGS],
[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
available_tags='_LT_TAGS'dnl
])


# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
# -----------------------------------
# Extract the dictionary values for VARNAME (optionally with TAG) and
# expand to a commented shell variable setting:
#
#    # Some comment about what VAR is for.
#    visible_name=$lt_internal_name
m4_define([_LT_LIBTOOL_DECLARE],
[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
					   [description])))[]dnl
m4_pushdef([_libtool_name],
    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
    [0], [_libtool_name=[$]$1],
    [1], [_libtool_name=$lt_[]$1],
    [2], [_libtool_name=$lt_[]$1],
    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
])


# _LT_LIBTOOL_CONFIG_VARS
# -----------------------
# Produce commented declarations of non-tagged libtool config variables
# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
# section) are produced by _LT_LIBTOOL_TAG_VARS.
m4_defun([_LT_LIBTOOL_CONFIG_VARS],
[m4_foreach([_lt_var],
    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])


# _LT_LIBTOOL_TAG_VARS(TAG)
# -------------------------
m4_define([_LT_LIBTOOL_TAG_VARS],
[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])


# _LT_TAGVAR(VARNAME, [TAGNAME])
# ------------------------------
m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])


# _LT_CONFIG_COMMANDS
# -------------------
# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
# variables for single and double quote escaping we saved from calls
# to _LT_DECL, we can put quote escaped variables declarations
# into 'config.status', and then the shell code to quote escape them in
# for loops in 'config.status'.  Finally, any additional code accumulated
# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
m4_defun([_LT_CONFIG_COMMANDS],
[AC_PROVIDE_IFELSE([LT_OUTPUT],
	dnl If the libtool generation code has been placed in $CONFIG_LT,
	dnl instead of duplicating it all over again into config.status,
	dnl then we will have config.status run $CONFIG_LT later, so it
	dnl needs to know what name is stored there:
        [AC_CONFIG_COMMANDS([libtool],
            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
    dnl If the libtool generation code is destined for config.status,
    dnl expand the accumulated commands and init code now:
    [AC_CONFIG_COMMANDS([libtool],
        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
])#_LT_CONFIG_COMMANDS


# Initialize.
m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
[

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

sed_quote_subst='$sed_quote_subst'
double_quote_subst='$double_quote_subst'
delay_variable_subst='$delay_variable_subst'
_LT_CONFIG_STATUS_DECLARATIONS
LTCC='$LTCC'
LTCFLAGS='$LTCFLAGS'
compiler='$compiler_DEFAULT'

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
\$[]1
_LTECHO_EOF'
}

# Quote evaled strings.
for var in lt_decl_all_varnames([[ \
]], lt_decl_quote_varnames); do
    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
    *[[\\\\\\\`\\"\\\$]]*)
      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
      ;;
    *)
      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
      ;;
    esac
done

# Double-quote double-evaled strings.
for var in lt_decl_all_varnames([[ \
]], lt_decl_dquote_varnames); do
    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
    *[[\\\\\\\`\\"\\\$]]*)
      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
      ;;
    *)
      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
      ;;
    esac
done

_LT_OUTPUT_LIBTOOL_INIT
])

# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
# ------------------------------------
# Generate a child script FILE with all initialization necessary to
# reuse the environment learned by the parent script, and make the
# file executable.  If COMMENT is supplied, it is inserted after the
# '#!' sequence but before initialization text begins.  After this
# macro, additional text can be appended to FILE to form the body of
# the child script.  The macro ends with non-zero status if the
# file could not be fully written (such as if the disk is full).
m4_ifdef([AS_INIT_GENERATED],
[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
[m4_defun([_LT_GENERATED_FILE_INIT],
[m4_require([AS_PREPARE])]dnl
[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
[lt_write_fail=0
cat >$1 <<_ASEOF || lt_write_fail=1
#! $SHELL
# Generated by $as_me.
$2
SHELL=\${CONFIG_SHELL-$SHELL}
export SHELL
_ASEOF
cat >>$1 <<\_ASEOF || lt_write_fail=1
AS_SHELL_SANITIZE
_AS_PREPARE
exec AS_MESSAGE_FD>&1
_ASEOF
test 0 = "$lt_write_fail" && chmod +x $1[]dnl
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), in case it is used in configure for compilation
# tests.
AC_DEFUN([LT_OUTPUT],
[: ${CONFIG_LT=./config.lt}
AC_MSG_NOTICE([creating $CONFIG_LT])
_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
[# Run this file to recreate a libtool stub with the current configuration.])

cat >>"$CONFIG_LT" <<\_LTEOF
lt_cl_silent=false
exec AS_MESSAGE_LOG_FD>>config.log
{
  echo
  AS_BOX([Running $as_me.])
} >&AS_MESSAGE_LOG_FD

lt_cl_help="\
'$as_me' creates a local libtool stub from the current configuration,
for use in further configure time tests before the real libtool is
generated.

Usage: $[0] [[OPTIONS]]

  -h, --help      print this help, then exit
  -V, --version   print version number, then exit
  -q, --quiet     do not print progress messages
  -d, --debug     don't remove temporary files

Report bugs to <bug-libtool@gnu.org>."

lt_cl_version="\
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) 2024 Free Software Foundation, Inc.
This config.lt script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."

while test 0 != $[#]
do
  case $[1] in
    --version | --v* | -V )
      echo "$lt_cl_version"; exit 0 ;;
    --help | --h* | -h )
      echo "$lt_cl_help"; exit 0 ;;
    --debug | --d* | -d )
      debug=: ;;
    --quiet | --q* | --silent | --s* | -q )
      lt_cl_silent=: ;;

    -*) AC_MSG_ERROR([unrecognized option: $[1]
Try '$[0] --help' for more information.]) ;;

    *) AC_MSG_ERROR([unrecognized argument: $[1]
Try '$[0] --help' for more information.]) ;;
  esac
  shift
done

if $lt_cl_silent; then
  exec AS_MESSAGE_FD>/dev/null
fi
_LTEOF

cat >>"$CONFIG_LT" <<_LTEOF
_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
_LTEOF

cat >>"$CONFIG_LT" <<\_LTEOF
AC_MSG_NOTICE([creating $ofile])
_LT_OUTPUT_LIBTOOL_COMMANDS
AS_EXIT(0)
_LTEOF
chmod +x "$CONFIG_LT"

# configure is writing to config.log, but config.lt does its own redirection,
# appending to config.log, which fails on DOS, as config.log is still kept
# open by configure.  Here we exec the FD to /dev/null, effectively closing
# config.log, so it can be properly (re)opened and appended to by config.lt.
lt_cl_success=:
test yes = "$silent" &&
  lt_config_lt_args="$lt_config_lt_args --quiet"
exec AS_MESSAGE_LOG_FD>/dev/null
$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
exec AS_MESSAGE_LOG_FD>>config.log
$lt_cl_success || AS_EXIT(1)
])# LT_OUTPUT


# _LT_CONFIG(TAG)
# ---------------
# If TAG is the built-in tag, create an initial libtool script with a
# default configuration from the untagged config vars.  Otherwise add code
# to config.status for appending the configuration named by TAG from the
# matching tagged config vars.
m4_defun([_LT_CONFIG],
[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
_LT_CONFIG_SAVE_COMMANDS([
  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
  m4_if(_LT_TAG, [C], [
    # See if we are running on zsh, and set the options that allow our
    # commands through without removal of \ escapes.
    if test -n "${ZSH_VERSION+set}"; then
      setopt NO_GLOB_SUBST
    fi

    cfgfile=${ofile}T
    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
    $RM "$cfgfile"

    cat <<_LT_EOF >> "$cfgfile"
#! $SHELL
# Generated automatically by $as_me ($PACKAGE) $VERSION
# NOTE: Changes made to this file will be lost: look at ltmain.sh.

# Provide generalized library-building support services.
# Written by Gordon Matzigkeit, 1996

_LT_COPYING
_LT_LIBTOOL_TAGS

# Configured defaults for sys_lib_dlsearch_path munging.
: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}

# ### BEGIN LIBTOOL CONFIG
_LT_LIBTOOL_CONFIG_VARS
_LT_LIBTOOL_TAG_VARS
# ### END LIBTOOL CONFIG

_LT_EOF

    cat <<'_LT_EOF' >> "$cfgfile"

# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE

_LT_PREPARE_MUNGE_PATH_LIST
_LT_PREPARE_CC_BASENAME

# ### END FUNCTIONS SHARED WITH CONFIGURE

_LT_EOF

  case $host_os in
  aix3*)
    cat <<\_LT_EOF >> "$cfgfile"
# AIX sometimes has problems with the GCC collect2 program.  For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
if test set != "${COLLECT_NAMES+set}"; then
  COLLECT_NAMES=
  export COLLECT_NAMES
fi
_LT_EOF
    ;;
  esac

  _LT_PROG_LTMAIN

  # We use sed instead of cat because bash on DJGPP gets confused if
  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
  # text mode, it properly converts lines to CR/LF.  This bash problem
  # is reportedly fixed, but why not run on old versions too?
  $SED '$q' "$ltmain" >> "$cfgfile" \
     || (rm -f "$cfgfile"; exit 1)

   mv -f "$cfgfile" "$ofile" ||
    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
  chmod +x "$ofile"
],
[cat <<_LT_EOF >> "$ofile"

dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
dnl in a comment (ie after a #).
# ### BEGIN LIBTOOL TAG CONFIG: $1
_LT_LIBTOOL_TAG_VARS(_LT_TAG)
# ### END LIBTOOL TAG CONFIG: $1
_LT_EOF
])dnl /m4_if
],
[m4_if([$1], [], [
    PACKAGE='$PACKAGE'
    VERSION='$VERSION'
    RM='$RM'
    ofile='$ofile'], [])
])dnl /_LT_CONFIG_SAVE_COMMANDS
])# _LT_CONFIG


# LT_SUPPORTED_TAG(TAG)
# ---------------------
# Trace this macro to discover what tags are supported by the libtool
# --tag option, using:
#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
AC_DEFUN([LT_SUPPORTED_TAG], [])


# C support is built-in for now
m4_define([_LT_LANG_C_enabled], [])
m4_define([_LT_TAGS], [])


# LT_LANG(LANG)
# -------------
# Enable libtool support for the given language if not already enabled.
AC_DEFUN([LT_LANG],
[AC_BEFORE([$0], [LT_OUTPUT])dnl
m4_case([$1],
  [C],			[_LT_LANG(C)],
  [C++],		[_LT_LANG(CXX)],
  [Go],			[_LT_LANG(GO)],
  [Java],		[_LT_LANG(GCJ)],
  [Fortran 77],		[_LT_LANG(F77)],
  [Fortran],		[_LT_LANG(FC)],
  [Windows Resource],	[_LT_LANG(RC)],
  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
    [_LT_LANG($1)],
    [m4_fatal([$0: unsupported language: "$1"])])])dnl
])# LT_LANG


# _LT_LANG(LANGNAME)
# ------------------
m4_defun([_LT_LANG],
[m4_ifdef([_LT_LANG_]$1[_enabled], [],
  [LT_SUPPORTED_TAG([$1])dnl
  m4_append([_LT_TAGS], [$1 ])dnl
  m4_define([_LT_LANG_]$1[_enabled], [])dnl
  _LT_LANG_$1_CONFIG($1)])dnl
])# _LT_LANG


m4_ifndef([AC_PROG_GO], [
# NOTE: This macro has been submitted for inclusion into   #
#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
#  a released version of Autoconf we should remove this    #
#  macro and use it instead.                               #
m4_defun([AC_PROG_GO],
[AC_LANG_PUSH(Go)dnl
AC_ARG_VAR([GOC],     [Go compiler command])dnl
AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
_AC_ARG_VAR_LDFLAGS()dnl
AC_CHECK_TOOL(GOC, gccgo)
if test -z "$GOC"; then
  if test -n "$ac_tool_prefix"; then
    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
  fi
fi
if test -z "$GOC"; then
  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
fi
])#m4_defun
])#m4_ifndef


# _LT_LANG_DEFAULT_CONFIG
# -----------------------
m4_defun([_LT_LANG_DEFAULT_CONFIG],
[AC_PROVIDE_IFELSE([AC_PROG_CXX],
  [LT_LANG(CXX)],
  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])

AC_PROVIDE_IFELSE([AC_PROG_F77],
  [LT_LANG(F77)],
  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])

AC_PROVIDE_IFELSE([AC_PROG_FC],
  [LT_LANG(FC)],
  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])

dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
dnl pulling things in needlessly.
AC_PROVIDE_IFELSE([AC_PROG_GCJ],
  [LT_LANG(GCJ)],
  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
    [LT_LANG(GCJ)],
    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
      [LT_LANG(GCJ)],
      [m4_ifdef([AC_PROG_GCJ],
	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
       m4_ifdef([A][M_PROG_GCJ],
	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
       m4_ifdef([LT_PROG_GCJ],
	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])

AC_PROVIDE_IFELSE([AC_PROG_GO],
  [LT_LANG(GO)],
  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])

AC_PROVIDE_IFELSE([LT_PROG_RC],
  [LT_LANG(RC)],
  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
])# _LT_LANG_DEFAULT_CONFIG

# Obsolete macros:
AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
dnl AC_DEFUN([AC_LIBTOOL_F77], [])
dnl AC_DEFUN([AC_LIBTOOL_FC], [])
dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
dnl AC_DEFUN([AC_LIBTOOL_RC], [])


# _LT_TAG_COMPILER
# ----------------
m4_defun([_LT_TAG_COMPILER],
[AC_REQUIRE([AC_PROG_CC])dnl

_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl

# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}

# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}

# Allow CC to be a program name with arguments.
compiler=$CC
])# _LT_TAG_COMPILER


# _LT_COMPILER_BOILERPLATE
# ------------------------
# Check for compiler boilerplate output or warnings with
# the simple compiler test code.
m4_defun([_LT_COMPILER_BOILERPLATE],
[m4_require([_LT_DECL_SED])dnl
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$RM conftest*
])# _LT_COMPILER_BOILERPLATE


# _LT_LINKER_BOILERPLATE
# ----------------------
# Check for linker boilerplate output or warnings with
# the simple link test code.
m4_defun([_LT_LINKER_BOILERPLATE],
[m4_require([_LT_DECL_SED])dnl
ac_outfile=conftest.$ac_objext
echo "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$RM -r conftest*
])# _LT_LINKER_BOILERPLATE


# _LT_REQUIRED_DARWIN_CHECKS
# -------------------------
m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
  case $host_os in
    rhapsody* | darwin*)
    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
    AC_CHECK_TOOL([LIPO], [lipo], [:])
    AC_CHECK_TOOL([OTOOL], [otool], [:])
    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
    _LT_DECL([], [DSYMUTIL], [1],
      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
    _LT_DECL([], [NMEDIT], [1],
      [Tool to change global to local symbols on Mac OS X])
    _LT_DECL([], [LIPO], [1],
      [Tool to manipulate fat objects and archives on Mac OS X])
    _LT_DECL([], [OTOOL], [1],
      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
    _LT_DECL([], [OTOOL64], [1],
      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])

    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
      [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
	# non-empty at configure time, or by adding -multi_module to the
	# link flags.
	rm -rf libconftest.dylib*
	echo "int foo(void){return 1;}" > conftest.c
	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
        _lt_result=$?
	# If there is a non-empty error log, and "single_module"
	# appears in it, assume the flag caused a linker warning
        if test -s conftest.err && $GREP single_module conftest.err; then
	  cat conftest.err >&AS_MESSAGE_LOG_FD
	# Otherwise, if the output was created with a 0 exit code from
	# the compiler, it worked.
	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
	  lt_cv_apple_cc_single_mod=yes
	else
	  cat conftest.err >&AS_MESSAGE_LOG_FD
	fi
	rm -rf libconftest.dylib*
	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
      save_LDFLAGS=$LDFLAGS
      echo "_main" > conftest.sym
      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
	[lt_cv_ld_exported_symbols_list=yes],
	[lt_cv_ld_exported_symbols_list=no])
	LDFLAGS=$save_LDFLAGS
    ])

    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
      [lt_cv_ld_force_load=no
      cat > conftest.c << _LT_EOF
int forced_loaded() { return 2;}
_LT_EOF
      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
      echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
      $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
      cat > conftest.c << _LT_EOF
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
      _lt_result=$?
      if test -s conftest.err && $GREP force_load conftest.err; then
	cat conftest.err >&AS_MESSAGE_LOG_FD
      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
	lt_cv_ld_force_load=yes
      else
	cat conftest.err >&AS_MESSAGE_LOG_FD
      fi
        rm -f conftest.err libconftest.a conftest conftest.c
        rm -rf conftest.dSYM
    ])
    case $host_os in
    rhapsody* | darwin1.[[012]])
      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
    darwin1.*)
      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
    darwin*)
      case $MACOSX_DEPLOYMENT_TARGET,$host in
        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'
          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
      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
    fi
    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
      _lt_dsymutil='~$DSYMUTIL $lib || :'
    else
      _lt_dsymutil=
    fi
    ;;
  esac
])


# _LT_DARWIN_LINKER_FEATURES([TAG])
# ---------------------------------
# Checks for linker and compiler features on darwin
m4_defun([_LT_DARWIN_LINKER_FEATURES],
[
  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
  _LT_TAGVAR(hardcode_direct, $1)=no
  _LT_TAGVAR(hardcode_automatic, $1)=yes
  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
  if test yes = "$lt_cv_ld_force_load"; then
    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
  else
    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
  fi
  _LT_TAGVAR(link_all_deplibs, $1)=yes
  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
  case $cc_basename in
     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
     *) _lt_dar_can_shared=$GCC ;;
  esac
  if test yes = "$_lt_dar_can_shared"; then
    output_verbose_link_cmd=func_echo_all
    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
    _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_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
],[])
  else
  _LT_TAGVAR(ld_shlibs, $1)=no
  fi
])

# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
# ----------------------------------
# Links a minimal program and checks the executable
# for the system default hardcoded library path. In most cases,
# this is /usr/lib:/lib, but when the MPI compilers are used
# the location of the communication and MPI libs are included too.
# If we don't find anything, use the default library path according
# to the aix ld manual.
# Store the results from the different compilers for each TAGNAME.
# Allow to override them for all tags through lt_cv_aix_libpath.
m4_defun([_LT_SYS_MODULE_PATH_AIX],
[m4_require([_LT_DECL_SED])dnl
if test set = "${lt_cv_aix_libpath+set}"; then
  aix_libpath=$lt_cv_aix_libpath
else
  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
  lt_aix_libpath_sed='[
      /Import File Strings/,/^$/ {
	  /^0/ {
	      s/^0  *\([^ ]*\) *$/\1/
	      p
	  }
      }]'
  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  # Check for a 64-bit object if we didn't find anything.
  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  fi],[])
  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
  fi
  ])
  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
fi
])# _LT_SYS_MODULE_PATH_AIX


# _LT_SHELL_INIT(ARG)
# -------------------
m4_define([_LT_SHELL_INIT],
[m4_divert_text([M4SH-INIT], [$1
])])# _LT_SHELL_INIT



# _LT_PROG_ECHO_BACKSLASH
# -----------------------
# Find how we can fake an echo command that does not interpret backslash.
# In particular, with Autoconf 2.60 or later we add some code to the start
# of the generated configure script that will find a shell with a builtin
# printf (that we can use as an echo command).
m4_defun([_LT_PROG_ECHO_BACKSLASH],
[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO

AC_MSG_CHECKING([how to print strings])
# Test print first, because it will be a builtin if present.
if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
  ECHO='print -r --'
elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
  ECHO='printf %s\n'
else
  # Use this function as a fallback that always works.
  func_fallback_echo ()
  {
    eval 'cat <<_LTECHO_EOF
$[]1
_LTECHO_EOF'
  }
  ECHO='func_fallback_echo'
fi

# func_echo_all arg...
# Invoke $ECHO with all args, space-separated.
func_echo_all ()
{
    $ECHO "$*"
}

case $ECHO in
  printf*) AC_MSG_RESULT([printf]) ;;
  print*) AC_MSG_RESULT([print -r]) ;;
  *) AC_MSG_RESULT([cat]) ;;
esac

m4_ifdef([_AS_DETECT_SUGGESTED],
[_AS_DETECT_SUGGESTED([
  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
    PATH=/empty FPATH=/empty; export PATH FPATH
    test "X`printf %s $ECHO`" = "X$ECHO" \
      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])

_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
])# _LT_PROG_ECHO_BACKSLASH


# _LT_WITH_SYSROOT
# ----------------
AC_DEFUN([_LT_WITH_SYSROOT],
[m4_require([_LT_DECL_SED])dnl
AC_MSG_CHECKING([for sysroot])
AC_ARG_WITH([sysroot],
[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
  [Search for dependent libraries within DIR (or the compiler's sysroot
   if not specified).])],
[], [with_sysroot=no])

dnl lt_sysroot will always be passed unquoted.  We quote it here
dnl in case the user passed a directory name.
lt_sysroot=
case $with_sysroot in #(
 yes)
   if test yes = "$GCC"; then
     # 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
   ;; #(
 /*)
   lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
   ;; #(
 no|'')
   ;; #(
 *)
   AC_MSG_RESULT([$with_sysroot])
   AC_MSG_ERROR([The sysroot must be an absolute path.])
   ;;
esac

 AC_MSG_RESULT([${lt_sysroot:-no}])
_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
[dependent libraries, and where our libraries should be installed.])])

# _LT_ENABLE_LOCK
# ---------------
m4_defun([_LT_ENABLE_LOCK],
[AC_ARG_ENABLE([libtool-lock],
  [AS_HELP_STRING([--disable-libtool-lock],
    [avoid locking (might break parallel builds)])])
test no = "$enable_libtool_lock" || enable_libtool_lock=yes

# Some flags need to be propagated to the compiler or linker for good
# libtool support.
case $host in
ia64-*-hpux*)
  # Find out what ABI is being produced by ac_compile, and set mode
  # options accordingly.
  echo 'int i;' > conftest.$ac_ext
  if AC_TRY_EVAL(ac_compile); then
    case `$FILECMD conftest.$ac_objext` in
      *ELF-32*)
	HPUX_IA64_MODE=32
	;;
      *ELF-64*)
	HPUX_IA64_MODE=64
	;;
    esac
  fi
  rm -rf conftest*
  ;;
*-*-irix6*)
  # Find out what ABI is being produced by ac_compile, and set linker
  # options accordingly.
  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
  if AC_TRY_EVAL(ac_compile); then
    if test yes = "$lt_cv_prog_gnu_ld"; then
      case `$FILECMD conftest.$ac_objext` in
	*32-bit*)
	  LD="${LD-ld} -melf32bsmip"
	  ;;
	*N32*)
	  LD="${LD-ld} -melf32bmipn32"
	  ;;
	*64-bit*)
	  LD="${LD-ld} -melf64bmip"
	;;
      esac
    else
      case `$FILECMD conftest.$ac_objext` in
	*32-bit*)
	  LD="${LD-ld} -32"
	  ;;
	*N32*)
	  LD="${LD-ld} -n32"
	  ;;
	*64-bit*)
	  LD="${LD-ld} -64"
	  ;;
      esac
    fi
  fi
  rm -rf conftest*
  ;;

mips64*-*linux*)
  # Find out what ABI is being produced by ac_compile, and set linker
  # options accordingly.
  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
  if AC_TRY_EVAL(ac_compile); then
    emul=elf
    case `$FILECMD conftest.$ac_objext` in
      *32-bit*)
	emul="${emul}32"
	;;
      *64-bit*)
	emul="${emul}64"
	;;
    esac
    case `$FILECMD conftest.$ac_objext` in
      *MSB*)
	emul="${emul}btsmip"
	;;
      *LSB*)
	emul="${emul}ltsmip"
	;;
    esac
    case `$FILECMD conftest.$ac_objext` in
      *N32*)
	emul="${emul}n32"
	;;
    esac
    LD="${LD-ld} -m $emul"
  fi
  rm -rf conftest*
  ;;

x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*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
  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
  # vice versa); the common cases where no linker options are needed do
  # not appear in the list.
  echo 'int i;' > conftest.$ac_ext
  if AC_TRY_EVAL(ac_compile); then
    case `$FILECMD conftest.o` in
      *32-bit*)
	case $host in
	  x86_64-*kfreebsd*-gnu)
	    LD="${LD-ld} -m elf_i386_fbsd"
	    ;;
	  x86_64-*linux*|x86_64-gnu*)
	    case `$FILECMD conftest.o` in
	      *x86-64*)
		LD="${LD-ld} -m elf32_x86_64"
		;;
	      *)
		LD="${LD-ld} -m elf_i386"
		;;
	    esac
	    ;;
	  powerpc64le-*linux*)
	    LD="${LD-ld} -m elf32lppclinux"
	    ;;
	  powerpc64-*linux*)
	    LD="${LD-ld} -m elf32ppclinux"
	    ;;
	  s390x-*linux*)
	    LD="${LD-ld} -m elf_s390"
	    ;;
	  sparc64-*linux*)
	    LD="${LD-ld} -m elf32_sparc"
	    ;;
	esac
	;;
      *64-bit*)
	case $host in
	  x86_64-*kfreebsd*-gnu)
	    LD="${LD-ld} -m elf_x86_64_fbsd"
	    ;;
	  x86_64-*linux*|x86_64-gnu*)
	    LD="${LD-ld} -m elf_x86_64"
	    ;;
	  powerpcle-*linux*)
	    LD="${LD-ld} -m elf64lppc"
	    ;;
	  powerpc-*linux*)
	    LD="${LD-ld} -m elf64ppc"
	    ;;
	  s390*-*linux*|s390*-*tpf*)
	    LD="${LD-ld} -m elf64_s390"
	    ;;
	  sparc*-*linux*)
	    LD="${LD-ld} -m elf64_sparc"
	    ;;
	esac
	;;
    esac
  fi
  rm -rf conftest*
  ;;

*-*-sco3.2v5*)
  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
  SAVE_CFLAGS=$CFLAGS
  CFLAGS="$CFLAGS -belf"
  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
    [AC_LANG_PUSH(C)
     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
     AC_LANG_POP])
  if test yes != "$lt_cv_cc_needs_belf"; then
    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
    CFLAGS=$SAVE_CFLAGS
  fi
  ;;
*-*solaris*)
  # Find out what ABI is being produced by ac_compile, and set linker
  # options accordingly.
  echo 'int i;' > conftest.$ac_ext
  if AC_TRY_EVAL(ac_compile); then
    case `$FILECMD conftest.o` in
    *64-bit*)
      case $lt_cv_prog_gnu_ld in
      yes*)
        case $host in
        i?86-*-solaris*|x86_64-*-solaris*)
          LD="${LD-ld} -m elf_x86_64"
          ;;
        sparc*-*-solaris*)
          LD="${LD-ld} -m elf64_sparc"
          ;;
        esac
        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
          LD=${LD-ld}_sol2
        fi
        ;;
      *)
	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
	  LD="${LD-ld} -64"
	fi
	;;
      esac
      ;;
    esac
  fi
  rm -rf conftest*
  ;;
esac

need_locks=$enable_libtool_lock
])# _LT_ENABLE_LOCK


# _LT_PROG_AR
# -----------
m4_defun([_LT_PROG_AR],
[AC_CHECK_TOOLS(AR, [ar], false)
: ${AR=ar}
_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 that's what people were doing historically (setting
# ARFLAGS for automake and AR_FLAGS for libtool).  FIXME: Make the AR_FLAGS
# variable obsoleted/removed.

test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
lt_ar_flags=$AR_FLAGS
_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)])

# Make AR_FLAGS overridable by 'make ARFLAGS='.  Don't try to run-time override
# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}],
         [Flags to create an archive])

AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
  [lt_cv_ar_at_file=no
   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
     [echo conftest.$ac_objext > conftest.lst
      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
      AC_TRY_EVAL([lt_ar_try])
      if test 0 -eq "$ac_status"; then
	# Ensure the archiver fails upon bogus file names.
	rm -f conftest.$ac_objext libconftest.a
	AC_TRY_EVAL([lt_ar_try])
	if test 0 -ne "$ac_status"; then
          lt_cv_ar_at_file=@
        fi
      fi
      rm -f conftest.* libconftest.a
     ])
  ])

if test no = "$lt_cv_ar_at_file"; then
  archiver_list_spec=
else
  archiver_list_spec=$lt_cv_ar_at_file
fi
_LT_DECL([], [archiver_list_spec], [1],
  [How to feed a file listing to the archiver])
])# _LT_PROG_AR


# _LT_CMD_OLD_ARCHIVE
# -------------------
m4_defun([_LT_CMD_OLD_ARCHIVE],
[_LT_PROG_AR

AC_CHECK_TOOL(STRIP, strip, :)
test -z "$STRIP" && STRIP=:
_LT_DECL([], [STRIP], [1], [A symbol stripping program])

AC_REQUIRE([AC_PROG_RANLIB])
test -z "$RANLIB" && RANLIB=:
_LT_DECL([], [RANLIB], [1],
    [Commands used to install an old-style archive])

# Determine commands to create old-style static archives.
old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
old_postinstall_cmds='chmod 644 $oldlib'
old_postuninstall_cmds=

if test -n "$RANLIB"; then
  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
  old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
fi

case $host_os in
  darwin*)
    lock_old_archive_extraction=yes ;;
  *)
    lock_old_archive_extraction=no ;;
esac
_LT_DECL([], [old_postinstall_cmds], [2])
_LT_DECL([], [old_postuninstall_cmds], [2])
_LT_TAGDECL([], [old_archive_cmds], [2],
    [Commands used to build an old-style archive])
_LT_DECL([], [lock_old_archive_extraction], [0],
    [Whether to use a lock for old archive extraction])
])# _LT_CMD_OLD_ARCHIVE


# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
# ----------------------------------------------------------------
# Check whether the given compiler option works
AC_DEFUN([_LT_COMPILER_OPTION],
[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_DECL_SED])dnl
AC_CACHE_CHECK([$1], [$2],
  [$2=no
   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   # The option is referenced via a variable to avoid confusing sed.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
   (eval "$lt_compile" 2>conftest.err)
   ac_status=$?
   cat conftest.err >&AS_MESSAGE_LOG_FD
   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
   if (exit $ac_status) && test -s "$ac_outfile"; then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings other than the usual output.
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       $2=yes
     fi
   fi
   $RM conftest*
])

if test yes = "[$]$2"; then
    m4_if([$5], , :, [$5])
else
    m4_if([$6], , :, [$6])
fi
])# _LT_COMPILER_OPTION

# Old name:
AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])


# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
#                  [ACTION-SUCCESS], [ACTION-FAILURE])
# ----------------------------------------------------
# Check whether the given linker option works
AC_DEFUN([_LT_LINKER_OPTION],
[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_DECL_SED])dnl
AC_CACHE_CHECK([$1], [$2],
  [$2=no
   save_LDFLAGS=$LDFLAGS
   LDFLAGS="$LDFLAGS $3"
   echo "$lt_simple_link_test_code" > conftest.$ac_ext
   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
     # The linker can only warn and ignore the option if not recognized
     # So say no if there are warnings
     if test -s conftest.err; then
       # Append any errors to the config.log.
       cat conftest.err 1>&AS_MESSAGE_LOG_FD
       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       if diff conftest.exp conftest.er2 >/dev/null; then
         $2=yes
       fi
     else
       $2=yes
     fi
   fi
   $RM -r conftest*
   LDFLAGS=$save_LDFLAGS
])

if test yes = "[$]$2"; then
    m4_if([$4], , :, [$4])
else
    m4_if([$5], , :, [$5])
fi
])# _LT_LINKER_OPTION

# Old name:
AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])


# LT_CMD_MAX_LEN
#---------------
AC_DEFUN([LT_CMD_MAX_LEN],
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
# find the maximum length of command line arguments
AC_MSG_CHECKING([the maximum length of command line arguments])
AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
  i=0
  teststring=ABCD

  case $build_os in
  msdosdjgpp*)
    # On DJGPP, this test can blow up pretty badly due to problems in libc
    # (any single argument exceeding 2000 bytes causes a buffer overrun
    # during glob expansion).  Even if it were fixed, the result of this
    # check would be larger than it should be.
    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
    ;;

  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* | 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,
    # you end up with a "frozen" computer, even though with patience
    # the test eventually succeeds (with a max line length of 256k).
    # Instead, let's just punt: use the minimum linelength reported by
    # all of the supported platforms: 8192 (on NT/2K/XP).
    lt_cv_sys_max_cmd_len=8192;
    ;;

  mint*)
    # On MiNT this can take a long time and run out of memory.
    lt_cv_sys_max_cmd_len=8192;
    ;;

  amigaos*)
    # On AmigaOS with pdksh, this test takes hours, literally.
    # So we just punt and use a minimum line length of 8192.
    lt_cv_sys_max_cmd_len=8192;
    ;;

  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`
    elif test -x /usr/sbin/sysctl; then
      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
    else
      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
    fi
    # And add a safety zone
    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
    ;;

  interix*)
    # We know the value 262144 and hardcode it with a safety zone (like BSD)
    lt_cv_sys_max_cmd_len=196608
    ;;

  os2*)
    # The test takes a long time on OS/2.
    lt_cv_sys_max_cmd_len=8192
    ;;

  osf*)
    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
    # nice to cause kernel panics so lets avoid the loop below.
    # First set a reasonable default.
    lt_cv_sys_max_cmd_len=16384
    #
    if test -x /sbin/sysconfig; then
      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
        *1*) lt_cv_sys_max_cmd_len=-1 ;;
      esac
    fi
    ;;
  sco3.2v5*)
    lt_cv_sys_max_cmd_len=102400
    ;;
  sysv5* | sco5v6* | sysv4.2uw2*)
    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
    if test -n "$kargmax"; then
      lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[	 ]]//'`
    else
      lt_cv_sys_max_cmd_len=32768
    fi
    ;;
  *)
    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
    if test -n "$lt_cv_sys_max_cmd_len" && \
       test undefined != "$lt_cv_sys_max_cmd_len"; then
      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
    else
      # Make teststring a little bigger before we do anything with it.
      # a 1K string should be a reasonable start.
      for i in 1 2 3 4 5 6 7 8; do
        teststring=$teststring$teststring
      done
      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
      # If test is not a shell built-in, we'll probably end up computing a
      # maximum length that is only half of the actual maximum length, but
      # we can't tell.
      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
	      test 17 != "$i" # 1/2 MB should be enough
      do
        i=`expr $i + 1`
        teststring=$teststring$teststring
      done
      # Only check the string length outside the loop.
      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
      teststring=
      # Add a significant safety factor because C++ compilers can tack on
      # massive amounts of additional arguments before passing them to the
      # linker.  It appears as though 1/2 is a usable value.
      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
    fi
    ;;
  esac
])
if test -n "$lt_cv_sys_max_cmd_len"; then
  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
else
  AC_MSG_RESULT(none)
fi
max_cmd_len=$lt_cv_sys_max_cmd_len
_LT_DECL([], [max_cmd_len], [0],
    [What is the maximum length of a command?])
])# LT_CMD_MAX_LEN

# Old name:
AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])


# _LT_HEADER_DLFCN
# ----------------
m4_defun([_LT_HEADER_DLFCN],
[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
])# _LT_HEADER_DLFCN


# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
# ----------------------------------------------------------------
m4_defun([_LT_TRY_DLOPEN_SELF],
[m4_require([_LT_HEADER_DLFCN])dnl
if test yes = "$cross_compiling"; then :
  [$4]
else
  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
  lt_status=$lt_dlunknown
  cat > conftest.$ac_ext <<_LT_EOF
[#line $LINENO "configure"
#include "confdefs.h"

#if HAVE_DLFCN_H
#include <dlfcn.h>
#endif

#include <stdio.h>

#ifdef RTLD_GLOBAL
#  define LT_DLGLOBAL		RTLD_GLOBAL
#else
#  ifdef DL_GLOBAL
#    define LT_DLGLOBAL		DL_GLOBAL
#  else
#    define LT_DLGLOBAL		0
#  endif
#endif

/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
   find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
#  ifdef RTLD_LAZY
#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
#  else
#    ifdef DL_LAZY
#      define LT_DLLAZY_OR_NOW		DL_LAZY
#    else
#      ifdef RTLD_NOW
#        define LT_DLLAZY_OR_NOW	RTLD_NOW
#      else
#        ifdef DL_NOW
#          define LT_DLLAZY_OR_NOW	DL_NOW
#        else
#          define LT_DLLAZY_OR_NOW	0
#        endif
#      endif
#    endif
#  endif
#endif

/* 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 (void) __attribute__((visibility("default")));
#endif

int fnord (void) { return 42; }
int main (void)
{
  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
  int status = $lt_dlunknown;

  if (self)
    {
      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
      else
        {
	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
          else puts (dlerror ());
	}
      /* dlclose (self); */
    }
  else
    puts (dlerror ());

  return status;
}]
_LT_EOF
  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
    lt_status=$?
    case x$lt_status in
      x$lt_dlno_uscore) $1 ;;
      x$lt_dlneed_uscore) $2 ;;
      x$lt_dlunknown|x*) $3 ;;
    esac
  else :
    # compilation failed
    $3
  fi
fi
rm -fr conftest*
])# _LT_TRY_DLOPEN_SELF


# LT_SYS_DLOPEN_SELF
# ------------------
AC_DEFUN([LT_SYS_DLOPEN_SELF],
[m4_require([_LT_HEADER_DLFCN])dnl
if test yes != "$enable_dlopen"; then
  enable_dlopen=unknown
  enable_dlopen_self=unknown
  enable_dlopen_self_static=unknown
else
  lt_cv_dlopen=no
  lt_cv_dlopen_libs=

  case $host_os in
  beos*)
    lt_cv_dlopen=load_add_on
    lt_cv_dlopen_libs=
    lt_cv_dlopen_self=yes
    ;;

  mingw* | windows* | pw32* | cegcc*)
    lt_cv_dlopen=LoadLibrary
    lt_cv_dlopen_libs=
    ;;

  cygwin*)
    lt_cv_dlopen=dlopen
    lt_cv_dlopen_libs=
    ;;

  darwin*)
    # if libdl is installed we need to link against it
    AC_CHECK_LIB([dl], [dlopen],
		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
    lt_cv_dlopen=dyld
    lt_cv_dlopen_libs=
    lt_cv_dlopen_self=yes
    ])
    ;;

  tpf*)
    # Don't try to run any link tests for TPF.  We know it's impossible
    # because TPF is a cross-compiler, and we know how we open DSOs.
    lt_cv_dlopen=dlopen
    lt_cv_dlopen_libs=
    lt_cv_dlopen_self=no
    ;;

  *)
    AC_CHECK_FUNC([shl_load],
	  [lt_cv_dlopen=shl_load],
      [AC_CHECK_LIB([dld], [shl_load],
	    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
	[AC_CHECK_FUNC([dlopen],
	      [lt_cv_dlopen=dlopen],
	  [AC_CHECK_LIB([dl], [dlopen],
		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
	    [AC_CHECK_LIB([svld], [dlopen],
		  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
	      [AC_CHECK_LIB([dld], [dld_link],
		    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
	      ])
	    ])
	  ])
	])
      ])
    ;;
  esac

  if test no = "$lt_cv_dlopen"; then
    enable_dlopen=no
  else
    enable_dlopen=yes
  fi

  case $lt_cv_dlopen in
  dlopen)
    save_CPPFLAGS=$CPPFLAGS
    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"

    save_LDFLAGS=$LDFLAGS
    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"

    save_LIBS=$LIBS
    LIBS="$lt_cv_dlopen_libs $LIBS"

    AC_CACHE_CHECK([whether a program can dlopen itself],
	  lt_cv_dlopen_self, [dnl
	  _LT_TRY_DLOPEN_SELF(
	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
    ])

    if test yes = "$lt_cv_dlopen_self"; then
      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
	  lt_cv_dlopen_self_static, [dnl
	  _LT_TRY_DLOPEN_SELF(
	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
      ])
    fi

    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS
    ;;
  esac

  case $lt_cv_dlopen_self in
  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
  *) enable_dlopen_self=unknown ;;
  esac

  case $lt_cv_dlopen_self_static in
  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
  *) enable_dlopen_self_static=unknown ;;
  esac
fi
_LT_DECL([dlopen_support], [enable_dlopen], [0],
	 [Whether dlopen is supported])
_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
	 [Whether dlopen of programs is supported])
_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
	 [Whether dlopen of statically linked programs is supported])
])# LT_SYS_DLOPEN_SELF

# Old name:
AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])


# _LT_COMPILER_C_O([TAGNAME])
# ---------------------------
# Check to see if options -c and -o are simultaneously supported by compiler.
# This macro does not hard code the compiler like AC_PROG_CC_C_O.
m4_defun([_LT_COMPILER_C_O],
[m4_require([_LT_DECL_SED])dnl
m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_TAG_COMPILER])dnl
AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
   $RM -r conftest 2>/dev/null
   mkdir conftest
   cd conftest
   mkdir out
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext

   lt_compiler_flag="-o out/conftest2.$ac_objext"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
   (eval "$lt_compile" 2>out/conftest.err)
   ac_status=$?
   cat out/conftest.err >&AS_MESSAGE_LOG_FD
   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
   if (exit $ac_status) && test -s out/conftest2.$ac_objext
   then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
     fi
   fi
   chmod u+w . 2>&AS_MESSAGE_LOG_FD
   $RM conftest*
   # SGI C++ compiler will create directory out/ii_files/ for
   # template instantiation
   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
   $RM out/* && rmdir out
   cd ..
   $RM -r conftest
   $RM conftest*
])
_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
	[Does compiler simultaneously support -c and -o options?])
])# _LT_COMPILER_C_O


# _LT_COMPILER_FILE_LOCKS([TAGNAME])
# ----------------------------------
# Check to see if we can do hard links to lock some files if needed
m4_defun([_LT_COMPILER_FILE_LOCKS],
[m4_require([_LT_ENABLE_LOCK])dnl
m4_require([_LT_FILEUTILS_DEFAULTS])dnl
_LT_COMPILER_C_O([$1])

hard_links=nottested
if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
  # do not overwrite the value of need_locks provided by the user
  AC_MSG_CHECKING([if we can lock with hard links])
  hard_links=yes
  $RM conftest*
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  touch conftest.a
  ln conftest.a conftest.b 2>&5 || hard_links=no
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  AC_MSG_RESULT([$hard_links])
  if test no = "$hard_links"; then
    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
    need_locks=warn
  fi
else
  need_locks=no
fi
_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
])# _LT_COMPILER_FILE_LOCKS


# _LT_CHECK_OBJDIR
# ----------------
m4_defun([_LT_CHECK_OBJDIR],
[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
[rm -f .libs 2>/dev/null
mkdir .libs 2>/dev/null
if test -d .libs; then
  lt_cv_objdir=.libs
else
  # MS-DOS does not allow filenames that begin with a dot.
  lt_cv_objdir=_libs
fi
rmdir .libs 2>/dev/null])
objdir=$lt_cv_objdir
_LT_DECL([], [objdir], [0],
         [The name of the directory that contains temporary libtool files])dnl
m4_pattern_allow([LT_OBJDIR])dnl
AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
  [Define to the sub-directory where libtool stores uninstalled libraries.])
])# _LT_CHECK_OBJDIR


# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
# --------------------------------------
# Check hardcoding attributes.
m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
[AC_MSG_CHECKING([how to hardcode library paths into programs])
_LT_TAGVAR(hardcode_action, $1)=
if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then

  # We can hardcode non-existent directories.
  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
     # If the only mechanism to avoid hardcoding is shlibpath_var, we
     # have to relink, otherwise we might link with an installed library
     # when we should be linking with a yet-to-be-installed one
     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
    # Linking always hardcodes the temporary library directory.
    _LT_TAGVAR(hardcode_action, $1)=relink
  else
    # We can link without hardcoding, and we can hardcode nonexisting dirs.
    _LT_TAGVAR(hardcode_action, $1)=immediate
  fi
else
  # We cannot hardcode anything, or else we can only hardcode existing
  # directories.
  _LT_TAGVAR(hardcode_action, $1)=unsupported
fi
AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])

if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
  # Fast installation is not supported
  enable_fast_install=no
elif test yes = "$shlibpath_overrides_runpath" ||
     test no = "$enable_shared"; then
  # Fast installation is not necessary
  enable_fast_install=needless
fi
_LT_TAGDECL([], [hardcode_action], [0],
    [How to hardcode a shared library path into an executable])
])# _LT_LINKER_HARDCODE_LIBPATH


# _LT_CMD_STRIPLIB
# ----------------
m4_defun([_LT_CMD_STRIPLIB],
[m4_require([_LT_DECL_EGREP])
striplib=
old_striplib=
AC_MSG_CHECKING([whether stripping libraries is possible])
if test -z "$STRIP"; then
  AC_MSG_RESULT([no])
else
  if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
    old_striplib="$STRIP --strip-debug"
    striplib="$STRIP --strip-unneeded"
    AC_MSG_RESULT([yes])
  else
    case $host_os in
    darwin*)
      # FIXME - insert some real tests, host_os isn't really good enough
      striplib="$STRIP -x"
      old_striplib="$STRIP -S"
      AC_MSG_RESULT([yes])
      ;;
    freebsd*)
      if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
        old_striplib="$STRIP --strip-debug"
        striplib="$STRIP --strip-unneeded"
        AC_MSG_RESULT([yes])
      else
        AC_MSG_RESULT([no])
      fi
      ;;
    *)
      AC_MSG_RESULT([no])
      ;;
    esac
  fi
fi
_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
_LT_DECL([], [striplib], [1])
])# _LT_CMD_STRIPLIB


# _LT_PREPARE_MUNGE_PATH_LIST
# ---------------------------
# Make sure func_munge_path_list() is defined correctly.
m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
[[# func_munge_path_list VARIABLE PATH
# -----------------------------------
# VARIABLE is name of variable containing _space_ separated list of
# directories to be munged by the contents of PATH, which is string
# having a format:
# "DIR[:DIR]:"
#       string "DIR[ DIR]" will be prepended to VARIABLE
# ":DIR[:DIR]"
#       string "DIR[ DIR]" will be appended to VARIABLE
# "DIRP[:DIRP]::[DIRA:]DIRA"
#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
#       "DIRA[ DIRA]" will be appended to VARIABLE
# "DIR[:DIR]"
#       VARIABLE will be replaced by "DIR[ DIR]"
func_munge_path_list ()
{
    case x@S|@2 in
    x)
        ;;
    *:)
        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
        ;;
    x:*)
        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
        ;;
    *::*)
        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
        ;;
    *)
        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
        ;;
    esac
}
]])# _LT_PREPARE_PATH_LIST


# _LT_SYS_DYNAMIC_LINKER([TAG])
# -----------------------------
# PORTME Fill in your ld.so characteristics
m4_defun([_LT_SYS_DYNAMIC_LINKER],
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
m4_require([_LT_DECL_EGREP])dnl
m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_DECL_OBJDUMP])dnl
m4_require([_LT_DECL_SED])dnl
m4_require([_LT_CHECK_SHELL_FEATURES])dnl
m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
AC_MSG_CHECKING([dynamic linker characteristics])
m4_if([$1],
	[], [
if test yes = "$GCC"; then
  case $host_os in
    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
    *) lt_awk_arg='/^libraries:/' ;;
  esac
  case $host_os in
    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`
  case $lt_search_path_spec in
  *\;*)
    # if the path contains ";" then we assume it to be the separator
    # otherwise default to the standard path separator (i.e. ":") - it is
    # assumed that no part of a normal pathname contains ";" but that should
    # okay in the real world where ";" in dirpaths is itself problematic.
    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
    ;;
  *)
    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
    ;;
  esac
  # Ok, now we have the path, separated by spaces, we can step through it
  # and add multilib dir if necessary...
  lt_tmp_lt_search_path_spec=
  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
  # ...but if some path component already ends with the multilib dir we assume
  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
  case "$lt_multi_os_dir; $lt_search_path_spec " in
  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
    lt_multi_os_dir=
    ;;
  esac
  for lt_sys_path in $lt_search_path_spec; do
    if test -d "$lt_sys_path$lt_multi_os_dir"; then
      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
    elif test -n "$lt_multi_os_dir"; then
      test -d "$lt_sys_path" && \
	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
    fi
  done
  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
BEGIN {RS = " "; FS = "/|\n";} {
  lt_foo = "";
  lt_count = 0;
  for (lt_i = NF; lt_i > 0; lt_i--) {
    if ($lt_i != "" && $lt_i != ".") {
      if ($lt_i == "..") {
        lt_count++;
      } else {
        if (lt_count == 0) {
          lt_foo = "/" $lt_i lt_foo;
        } else {
          lt_count--;
        }
      }
    }
  }
  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
}'`
  # AWK program above erroneously prepends '/' to C:/dos/paths
  # for these hosts.
  case $host_os in
    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`
else
  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
fi])
library_names_spec=
libname_spec='lib$name'
soname_spec=
shrext_cmds=.so
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
finish_eval=
shlibpath_var=
shlibpath_overrides_runpath=unknown
version_type=none
dynamic_linker="$host_os ld.so"
sys_lib_dlsearch_path_spec="/lib /usr/lib"
need_lib_prefix=unknown
hardcode_into_libs=no

# when you set need_version to no, make sure it does not cause -set_version
# flags to be left without arguments
need_version=unknown

AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
[User-defined run-time library search path.])

case $host_os in
aix3*)
  version_type=linux # correct to gnu/linux during the next big refactor
  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
  shlibpath_var=LIBPATH

  # AIX 3 has no versioning support, so we append a major version to the name.
  soname_spec='$libname$release$shared_ext$major'
  ;;

aix[[4-9]]*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  hardcode_into_libs=yes
  if test ia64 = "$host_cpu"; then
    # AIX 5 supports IA64
    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
    shlibpath_var=LD_LIBRARY_PATH
  else
    # With GCC up to 2.95.x, collect2 would create an import file
    # for dependence libraries.  The import file would start with
    # the line '#! .'.  This would cause the generated library to
    # depend on '.', always an invalid library.  This was fixed in
    # development snapshots of GCC prior to 3.0.
    case $host_os in
      aix4 | aix4.[[01]] | aix4.[[01]].*)
      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
	   echo ' yes '
	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
	:
      else
	can_build_shared=no
      fi
      ;;
    esac
    # Using Import Files as archive members, it is possible to support
    # filename-based versioning of shared library archives on AIX. While
    # this would work for both with and without runtime linking, it will
    # prevent static linking of such archives. So we do filename-based
    # shared library versioning with .so extension only, which is used
    # when both runtime linking and shared linking is enabled.
    # 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 --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
    #    archive as well as the shared archive member, telling the
    #    bitwidth (32 or 64) of that shared object, and providing the
    #    list of exported symbols of that shared object, eventually
    #    decorated with the 'weak' keyword
    # *) the shared object with the F_LOADONLY flag set, to really avoid
    #    it being seen by the linker.
    # At run time we better use the real file rather than another symlink,
    # but for link time we create the symlink libNAME.so -> libNAME.so.V

    case $with_aix_soname,$aix_use_runtimelinking in
    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
    # soname into executable. Probably we can add versioning support to
    # collect2, so additional links can be useful in future.
    aix,yes) # traditional libtool
      dynamic_linker='AIX unversionable lib.so'
      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
      # instead of lib<name>.a to let people know that these are not
      # typical AIX shared libraries.
      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
      ;;
    aix,no) # traditional AIX only
      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
      # We preserve .a as extension for shared libraries through AIX4.2
      # and later when we are not doing run time linking.
      library_names_spec='$libname$release.a $libname.a'
      soname_spec='$libname$release$shared_ext$major'
      ;;
    svr4,*) # full svr4 only
      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
      # We do not specify a path in Import Files, so LIBPATH fires.
      shlibpath_overrides_runpath=yes
      ;;
    *,yes) # both, prefer svr4
      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
      # unpreferred sharedlib libNAME.a needs extra handling
      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
      # We do not specify a path in Import Files, so LIBPATH fires.
      shlibpath_overrides_runpath=yes
      ;;
    *,no) # both, prefer aix
      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
      library_names_spec='$libname$release.a $libname.a'
      soname_spec='$libname$release$shared_ext$major'
      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
      ;;
    esac
    shlibpath_var=LIBPATH
  fi
  ;;

amigaos*)
  case $host_cpu in
  powerpc)
    # Since July 2007 AmigaOS4 officially supports .so libraries.
    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    ;;
  m68k)
    library_names_spec='$libname.ixlibrary $libname.a'
    # Create ${libname}_ixlibrary.a entries in /sys/libs.
    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
    ;;
  esac
  ;;

beos*)
  library_names_spec='$libname$shared_ext'
  dynamic_linker="$host_os ld.so"
  shlibpath_var=LIBRARY_PATH
  ;;

bsdi[[45]]*)
  version_type=linux # correct to gnu/linux during the next big refactor
  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'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
  # the default ld.so.conf also contains /usr/contrib/lib and
  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
  # libtool to hard-code these into programs
  ;;

cygwin* | mingw* | windows* | pw32* | cegcc*)
  version_type=windows
  shrext_cmds=.dll
  need_version=no
  need_lib_prefix=no

  case $GCC,$cc_basename in
  yes,*)
    # gcc
    library_names_spec='$libname.dll.a'
    # DLL is installed to $(libdir)/../bin by postinstall_cmds
    # 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'
    shlibpath_overrides_runpath=yes

    case $host_os in
    cygwin*)
      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
      soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
m4_if([$1], [],[
      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
      ;;
    mingw* | windows* | cegcc*)
      # MinGW DLLs use traditional 'lib' prefix
      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
      ;;
    pw32*)
      # pw32 DLLs use 'pw' prefix rather than 'lib'
    
Download .txt
gitextract_cn_k7htu/

├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── build.yml
├── .gitignore
├── .gitlab-ci.yml
├── INSTALL
├── LICENSE
├── Makefile.am
├── Makefile.in
├── README.md
├── RELNOTES.md
├── aclocal.m4
├── auth_test.sh
├── bootstrap.sh
├── config/
│   ├── ax_check_openssl.m4
│   ├── ax_pthread.m4
│   ├── compile
│   ├── config.guess
│   ├── config.sub
│   ├── depcomp
│   ├── install-sh
│   ├── iperf_config_static_bin.m4
│   ├── ltmain.sh
│   ├── missing
│   ├── mkinstalldirs
│   └── test-driver
├── configure
├── configure.ac
├── contrib/
│   ├── Dockerfile
│   ├── README.txt
│   ├── iperf3.gp
│   ├── iperf3.service
│   └── iperf3_to_gnuplot.py
├── docs/
│   ├── 2017-04-27.txt
│   ├── 2017-06-06.txt
│   ├── Makefile
│   ├── _esnet/
│   │   ├── LICENSE
│   │   ├── README.rst
│   │   ├── deploy.sh
│   │   ├── static/
│   │   │   └── esnet.css
│   │   └── templates/
│   │       ├── layout.html
│   │       ├── navbar.html
│   │       └── relations.html
│   ├── building.rst
│   ├── conf.py
│   ├── dev.rst
│   ├── faq.rst
│   ├── index.rst
│   ├── invoking.rst
│   ├── news.rst
│   └── obtaining.rst
├── examples/
│   ├── Makefile.am
│   ├── Makefile.in
│   ├── mic.c
│   └── mis.c
├── iperf3.spec.in
├── make_release
├── src/
│   ├── Makefile.am
│   ├── Makefile.in
│   ├── cjson.c
│   ├── cjson.h
│   ├── dscp.c
│   ├── flowlabel.h
│   ├── iperf.h
│   ├── iperf3.1
│   ├── iperf_api.c
│   ├── iperf_api.h
│   ├── iperf_auth.c
│   ├── iperf_auth.h
│   ├── iperf_client_api.c
│   ├── iperf_config.h.in
│   ├── iperf_error.c
│   ├── iperf_locale.c
│   ├── iperf_locale.h
│   ├── iperf_pthread.c
│   ├── iperf_pthread.h
│   ├── iperf_sctp.c
│   ├── iperf_sctp.h
│   ├── iperf_server_api.c
│   ├── iperf_tcp.c
│   ├── iperf_tcp.h
│   ├── iperf_time.c
│   ├── iperf_time.h
│   ├── iperf_udp.c
│   ├── iperf_udp.h
│   ├── iperf_util.c
│   ├── iperf_util.h
│   ├── libiperf.3
│   ├── main.c
│   ├── net.c
│   ├── net.h
│   ├── portable_endian.h
│   ├── private.pem
│   ├── public.pem
│   ├── queue.h
│   ├── t_api.c
│   ├── t_auth.c
│   ├── t_timer.c
│   ├── t_units.c
│   ├── t_uuid.c
│   ├── tcp_info.c
│   ├── timer.c
│   ├── timer.h
│   ├── units.c
│   ├── units.h
│   └── version.h.in
└── test_commands.sh
Download .txt
SYMBOL INDEX (754 symbols across 38 files)

FILE: contrib/iperf3_to_gnuplot.py
  function generate_output (line 19) | def generate_output(iperf, options):
  function summed_output (line 36) | def summed_output(iperf, options):
  function main (line 71) | def main():

FILE: examples/mic.c
  function main (line 11) | int

FILE: examples/mis.c
  function main (line 11) | int

FILE: src/cjson.c
  type error (line 92) | typedef struct {
  function cJSON_GetErrorPtr (line 105) | CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void)
  function cJSON_GetStringValue (line 110) | CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item)
  function cJSON_GetNumberValue (line 120) | CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item)
  function cJSON_Version (line 135) | CJSON_PUBLIC(const char*) cJSON_Version(void)
  function case_insensitive_strcmp (line 144) | static int case_insensitive_strcmp(const unsigned char *string1, const u...
  type internal_hooks (line 167) | typedef struct internal_hooks
  function internal_free (line 180) | static void CJSON_CDECL internal_free(void *pointer)
  function cJSON_InitHooks (line 220) | CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks)
  function cJSON (line 252) | static cJSON *cJSON_New_Item(const internal_hooks * const hooks)
  function cJSON_Delete (line 264) | CJSON_PUBLIC(void) cJSON_Delete(cJSON *item)
  function get_decimal_point (line 288) | static unsigned char get_decimal_point(void)
  type parse_buffer (line 298) | typedef struct
  function cJSON_bool (line 316) | static cJSON_bool parse_number(cJSON * const item, parse_buffer * const ...
  function cJSON_SetNumberHelper (line 393) | CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number)
  function cJSON_SetValuestring (line 411) | CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valu...
  type printbuffer (line 438) | typedef struct
  function update_offset (line 536) | static void update_offset(printbuffer * const buffer)
  function cJSON_bool (line 549) | static cJSON_bool compare_double(double a, double b)
  function cJSON_bool (line 556) | static cJSON_bool print_number(const cJSON * const item, printbuffer * c...
  function parse_hex4 (line 626) | static unsigned parse_hex4(const unsigned char * const input)
  function utf16_literal_to_utf8 (line 663) | static unsigned char utf16_literal_to_utf8(const unsigned char * const i...
  function cJSON_bool (line 784) | static cJSON_bool parse_string(cJSON * const item, parse_buffer * const ...
  function cJSON_bool (line 913) | static cJSON_bool print_string_ptr(const unsigned char * const input, pr...
  function cJSON_bool (line 1035) | static cJSON_bool print_string(const cJSON * const item, printbuffer * c...
  function parse_buffer (line 1049) | static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer)
  function parse_buffer (line 1075) | static parse_buffer *skip_utf8_bom(parse_buffer * const buffer)
  function cJSON_ParseWithOpts (line 1090) | CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char ...
  function cJSON_ParseWithLengthOpts (line 1106) | CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_...
  function cJSON_Parse (line 1186) | CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value)
  function cJSON_ParseWithLength (line 1191) | CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t bu...
  function cJSON_Print (line 1263) | CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item)
  function cJSON_PrintUnformatted (line 1268) | CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item)
  function cJSON_PrintBuffered (line 1273) | CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffe...
  function cJSON_PrintPreallocated (line 1303) | CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buff...
  function cJSON_bool (line 1323) | static cJSON_bool parse_value(cJSON * const item, parse_buffer * const i...
  function cJSON_bool (line 1378) | static cJSON_bool print_value(const cJSON * const item, printbuffer * co...
  function cJSON_bool (line 1452) | static cJSON_bool parse_array(cJSON * const item, parse_buffer * const i...
  function cJSON_bool (line 1550) | static cJSON_bool print_array(const cJSON * const item, printbuffer * co...
  function cJSON_bool (line 1612) | static cJSON_bool parse_object(cJSON * const item, parse_buffer * const ...
  function cJSON_bool (line 1725) | static cJSON_bool print_object(const cJSON * const item, printbuffer * c...
  function cJSON_GetArraySize (line 1839) | CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array)
  function cJSON (line 1862) | static cJSON* get_array_item(const cJSON *array, size_t index)
  function cJSON_GetArrayItem (line 1881) | CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index)
  function cJSON (line 1891) | static cJSON *get_object_item(const cJSON * const object, const char * c...
  function cJSON_GetObjectItem (line 1923) | CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, co...
  function cJSON_GetObjectItemCaseSensitive (line 1928) | CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * con...
  function cJSON_HasObjectItem (line 1933) | CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const ...
  function suffix_object (line 1939) | static void suffix_object(cJSON *prev, cJSON *item)
  function cJSON (line 1946) | static cJSON *create_reference(const cJSON *item, const internal_hooks *...
  function cJSON_bool (line 1967) | static cJSON_bool add_item_to_array(cJSON *array, cJSON *item)
  function cJSON_AddItemToArray (line 2001) | CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item)
  function cJSON_bool (line 2022) | static cJSON_bool add_item_to_object(cJSON * const object, const char * ...
  function cJSON_AddItemToObject (line 2059) | CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char...
  function cJSON_AddItemToObjectCS (line 2065) | CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const ch...
  function cJSON_AddItemReferenceToArray (line 2070) | CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJS...
  function cJSON_AddItemReferenceToObject (line 2080) | CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, c...
  function cJSON_AddNullToObject (line 2090) | CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const c...
  function cJSON_AddTrueToObject (line 2102) | CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const c...
  function cJSON_AddFalseToObject (line 2114) | CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const ...
  function cJSON_AddBoolToObject (line 2126) | CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const c...
  function cJSON_AddNumberToObject (line 2138) | CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const...
  function cJSON_AddStringToObject (line 2150) | CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const...
  function cJSON_AddRawToObject (line 2162) | CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const ch...
  function cJSON_AddObjectToObject (line 2174) | CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const...
  function cJSON_AddArrayToObject (line 2186) | CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const ...
  function cJSON_DetachItemViaPointer (line 2198) | CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * ...
  function cJSON_DetachItemFromArray (line 2234) | CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which)
  function cJSON_DeleteItemFromArray (line 2244) | CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which)
  function cJSON_DetachItemFromObject (line 2249) | CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const ch...
  function cJSON_DetachItemFromObjectCaseSensitive (line 2256) | CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *obj...
  function cJSON_DeleteItemFromObject (line 2263) | CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char ...
  function cJSON_DeleteItemFromObjectCaseSensitive (line 2268) | CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object...
  function cJSON_InsertItemInArray (line 2274) | CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which...
  function cJSON_ReplaceItemViaPointer (line 2303) | CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const paren...
  function cJSON_ReplaceItemInArray (line 2352) | CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int whic...
  function cJSON_bool (line 2362) | static cJSON_bool replace_item_in_object(cJSON *object, const char *stri...
  function cJSON_ReplaceItemInObject (line 2385) | CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object, const ...
  function cJSON_ReplaceItemInObjectCaseSensitive (line 2390) | CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *o...
  function cJSON_CreateNull (line 2396) | CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void)
  function cJSON_CreateTrue (line 2407) | CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void)
  function cJSON_CreateFalse (line 2418) | CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void)
  function cJSON_CreateBool (line 2429) | CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean)
  function cJSON_CreateNumber (line 2440) | CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num)
  function cJSON_CreateString (line 2466) | CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string)
  function cJSON_CreateStringReference (line 2483) | CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string)
  function cJSON_CreateObjectReference (line 2495) | CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child)
  function cJSON_CreateArrayReference (line 2506) | CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child) {
  function cJSON_CreateRaw (line 2516) | CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw)
  function cJSON_CreateArray (line 2533) | CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void)
  function cJSON_CreateObject (line 2544) | CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void)
  function cJSON_CreateIntArray (line 2556) | CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count)
  function cJSON_CreateFloatArray (line 2596) | CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int c...
  function cJSON_CreateDoubleArray (line 2636) | CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int...
  function cJSON_CreateStringArray (line 2676) | CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings...
  function cJSON_Duplicate (line 2717) | CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recu...
  function skip_oneline_comment (line 2800) | static void skip_oneline_comment(char **input)
  function skip_multiline_comment (line 2813) | static void skip_multiline_comment(char **input)
  function minify_string (line 2827) | static void minify_string(char **input, char **output) {
  function cJSON_Minify (line 2849) | CJSON_PUBLIC(void) cJSON_Minify(char *json)
  function cJSON_IsInvalid (line 2897) | CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item)
  function cJSON_IsFalse (line 2907) | CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item)
  function cJSON_IsTrue (line 2917) | CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item)
  function cJSON_IsBool (line 2928) | CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item)
  function cJSON_IsNull (line 2937) | CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item)
  function cJSON_IsNumber (line 2947) | CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item)
  function cJSON_IsString (line 2957) | CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item)
  function cJSON_IsArray (line 2967) | CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item)
  function cJSON_IsObject (line 2977) | CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item)
  function cJSON_IsRaw (line 2987) | CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item)
  function cJSON_Compare (line 2997) | CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSO...
  function cJSON_malloc (line 3122) | CJSON_PUBLIC(void *) cJSON_malloc(size_t size)
  function cJSON_free (line 3127) | CJSON_PUBLIC(void) cJSON_free(void *object)

FILE: src/cjson.h
  type cJSON (line 105) | typedef struct cJSON
  type cJSON_Hooks (line 127) | typedef struct cJSON_Hooks
  type cJSON_bool (line 134) | typedef int cJSON_bool;

FILE: src/dscp.c
  function parse_qos (line 129) | int

FILE: src/flowlabel.h
  type in6_flowlabel_req (line 44) | struct in6_flowlabel_req

FILE: src/iperf.h
  type atomic_uint_fast64_t (line 74) | typedef uint64_t atomic_uint_fast64_t;
  type uint_fast64_t (line 78) | typedef uint_fast64_t iperf_size_t;
  type atomic_uint_fast64_t (line 79) | typedef atomic_uint_fast64_t atomic_iperf_size_t;
  type uint (line 83) | typedef unsigned int uint
  type iperf_sctp_info (line 86) | struct iperf_sctp_info
  type iperf_interval_results (line 94) | struct iperf_interval_results
  type iperf_stream_result (line 134) | struct iperf_stream_result
  type iperf_settings (line 160) | struct iperf_settings
  type iperf_test (line 204) | struct iperf_test
  type iperf_stream (line 206) | struct iperf_stream
  type protocol (line 266) | struct protocol {
  type iperf_textline (line 278) | struct iperf_textline {
  type xbind_entry (line 283) | struct xbind_entry {
  type iperf_mode (line 289) | enum iperf_mode {
  type debug_level (line 295) | enum debug_level {
  type iperf_test (line 304) | struct iperf_test

FILE: src/iperf_api.c
  type iperf_test (line 98) | struct iperf_test
  type iperf_test (line 99) | struct iperf_test
  type iperf_test (line 100) | struct iperf_test
  type iperf_test (line 101) | struct iperf_test
  type iperf_stream (line 102) | struct iperf_stream
  type iperf_stream (line 103) | struct iperf_stream
  type iperf_test (line 105) | struct iperf_test
  type iperf_stream (line 105) | struct iperf_stream
  type iperf_test (line 107) | struct iperf_test
  function usage (line 112) | void
  function usage_long (line 119) | void
  function warning (line 126) | void warning(const char *str)
  function iperf_get_verbose (line 134) | int
  function iperf_get_control_socket (line 140) | int
  function iperf_get_control_socket_mss (line 146) | int
  function iperf_get_test_omit (line 152) | int
  function iperf_get_test_duration (line 158) | int
  function iperf_get_test_rate (line 164) | uint64_t
  function iperf_get_test_bitrate_limit (line 170) | uint64_t
  function iperf_get_test_bitrate_limit_interval (line 176) | double
  function iperf_get_test_bitrate_limit_stats_per_interval (line 182) | int
  function iperf_get_test_fqrate (line 188) | uint64_t
  function iperf_get_test_pacing_timer (line 194) | int
  function iperf_get_test_bytes (line 200) | uint64_t
  function iperf_get_test_blocks (line 206) | uint64_t
  function iperf_get_test_burst (line 212) | int
  function iperf_get_test_role (line 218) | char
  function iperf_get_test_reverse (line 224) | int
  function iperf_get_test_bidirectional (line 230) | int
  function iperf_get_test_blksize (line 236) | int
  function FILE (line 242) | FILE *
  function iperf_get_test_socket_bufsize (line 248) | int
  function iperf_get_test_reporter_interval (line 254) | double
  function iperf_get_test_stats_interval (line 260) | double
  function iperf_get_test_num_streams (line 266) | int
  function iperf_get_test_timestamps (line 272) | int
  type iperf_test (line 279) | struct iperf_test
  function iperf_get_test_repeating_payload (line 284) | int
  function iperf_get_test_bind_port (line 290) | int
  function iperf_get_test_server_port (line 296) | int
  type iperf_test (line 303) | struct iperf_test
  type iperf_test (line 309) | struct iperf_test
  function iperf_get_test_protocol_id (line 314) | int
  function iperf_get_test_json_output (line 320) | int
  type iperf_test (line 327) | struct iperf_test
  function iperf_get_test_json_stream (line 332) | int
  function iperf_get_test_zerocopy (line 338) | int
  function iperf_get_test_get_server_output (line 344) | int
  function iperf_get_test_unit_format (line 350) | char
  type iperf_test (line 357) | struct iperf_test
  type iperf_test (line 363) | struct iperf_test
  function iperf_get_test_udp_counters_64bit (line 368) | int
  function iperf_get_test_one_off (line 374) | int
  function iperf_get_test_tos (line 380) | int
  type iperf_test (line 387) | struct iperf_test
  function iperf_get_test_no_delay (line 399) | int
  function iperf_get_test_connect_timeout (line 405) | int
  function iperf_get_test_idle_timeout (line 411) | int
  function iperf_get_dont_fragment (line 417) | int
  type iperf_time (line 423) | struct iperf_time
  type iperf_test (line 424) | struct iperf_test
  type iperf_test (line 430) | struct iperf_test
  function iperf_get_test_mss (line 435) | int
  function iperf_get_mapped_v4 (line 441) | int
  function iperf_set_verbose (line 449) | void
  function iperf_set_control_socket (line 455) | void
  function iperf_set_test_omit (line 461) | void
  function iperf_set_test_duration (line 467) | void
  function iperf_set_test_reporter_interval (line 473) | void
  function iperf_set_test_stats_interval (line 479) | void
  function iperf_set_test_state (line 485) | void
  function iperf_set_test_blksize (line 495) | void
  function iperf_set_test_logfile (line 501) | void
  function iperf_set_test_rate (line 507) | void
  function iperf_set_test_bitrate_limit_maximum (line 513) | void
  function iperf_set_test_bitrate_limit_interval (line 519) | void
  function iperf_set_test_bitrate_limit_stats_per_interval (line 525) | void
  function iperf_set_test_fqrate (line 531) | void
  function iperf_set_test_pacing_timer (line 537) | void
  function iperf_set_test_bytes (line 543) | void
  function iperf_set_test_blocks (line 549) | void
  function iperf_set_test_burst (line 555) | void
  function iperf_set_test_bind_port (line 561) | void
  function iperf_set_test_server_port (line 567) | void
  function iperf_set_test_socket_bufsize (line 573) | void
  function iperf_set_test_num_streams (line 579) | void
  function iperf_set_test_repeating_payload (line 585) | void
  function iperf_set_test_timestamps (line 591) | void
  function iperf_set_test_timestamp_format (line 597) | void
  function iperf_set_mapped_v4 (line 603) | void
  function iperf_set_on_new_stream_callback (line 609) | void
  function iperf_set_on_test_start_callback (line 615) | void
  function iperf_set_on_test_connect_callback (line 621) | void
  function iperf_set_on_test_finish_callback (line 627) | void
  function check_sender_has_retransmits (line 633) | static void
  function iperf_set_test_role (line 642) | void
  function iperf_set_test_server_hostname (line 662) | void
  function iperf_set_test_template (line 668) | void
  function iperf_set_test_reverse (line 674) | void
  function iperf_set_test_json_output (line 692) | void
  function iperf_set_test_json_stream (line 698) | void
  function iperf_set_test_json_stream_full_output (line 704) | void
  function iperf_set_test_json_callback (line 710) | void
  function iperf_has_zerocopy (line 716) | int
  function iperf_set_test_zerocopy (line 722) | void
  function iperf_set_test_get_server_output (line 728) | void
  function iperf_set_test_unit_format (line 734) | void
  function iperf_set_test_client_username (line 741) | void
  function iperf_set_test_client_password (line 747) | void
  function iperf_set_test_client_rsa_pubkey (line 753) | void
  function iperf_set_test_client_rsa_pubkey_from_file (line 759) | void
  function iperf_set_test_server_authorized_users (line 765) | void
  function iperf_set_test_server_skew_threshold (line 771) | void
  function iperf_set_test_server_rsa_privkey (line 777) | void
  function iperf_set_test_server_rsa_privkey_from_file (line 783) | void
  function iperf_set_test_bind_address (line 790) | void
  function iperf_set_test_bind_dev (line 796) | void
  function iperf_set_test_udp_counters_64bit (line 802) | void
  function iperf_set_test_one_off (line 808) | void
  function iperf_set_test_tos (line 814) | void
  function iperf_set_test_extra_data (line 820) | void
  function iperf_set_test_bidirectional (line 826) | void
  function iperf_set_test_no_delay (line 836) | void
  function iperf_set_test_connect_timeout (line 842) | void
  function iperf_set_test_idle_timeout (line 848) | void
  function iperf_set_dont_fragment (line 854) | void
  function iperf_set_test_rcv_timeout (line 860) | void
  function iperf_set_test_congestion_control (line 867) | void
  function iperf_set_test_mss (line 873) | void
  type protocol (line 881) | struct protocol
  type iperf_test (line 882) | struct iperf_test
  type protocol (line 884) | struct protocol
  function set_protocol (line 897) | int
  function iperf_on_new_stream (line 917) | void
  function iperf_on_test_start (line 923) | void
  function mapped_v4_to_regular_v4 (line 951) | static int
  function iperf_on_connect (line 966) | void
  function iperf_on_test_finish (line 1045) | void
  function iperf_parse_hostname (line 1063) | int
  function iperf_parse_arguments (line 1101) | int
  function iperf_open_logfile (line 2034) | int iperf_open_logfile(struct iperf_test *test)
  function iperf_close_logfile (line 2045) | void iperf_close_logfile(struct iperf_test *test)
  function iperf_set_send_state (line 2053) | int
  function iperf_check_throttle (line 2066) | void
  function iperf_check_total_rate (line 2142) | void
  type iperf_stream (line 2182) | struct iperf_stream
  type iperf_test (line 2185) | struct iperf_test
  type iperf_time (line 2186) | struct iperf_time
  function iperf_recv_mt (line 2251) | int
  function iperf_init_test (line 2273) | int
  function iperf_create_send_timers (line 2300) | int
  function test_is_authorized (line 2313) | int test_is_authorized(struct iperf_test *test){
  function iperf_exchange_parameters (line 2351) | int
  function iperf_exchange_results (line 2392) | int
  function send_parameters (line 2415) | static int
  function get_parameters (line 2532) | static int
  function send_results (line 2691) | static int
  function get_results (line 2800) | static int
  function JSON_write (line 2994) | static int
  function cJSON (line 3020) | static cJSON *
  function JSONStream_Output (line 3085) | static int
  function add_to_interval_list (line 3118) | void
  function connect_msg (line 3145) | void
  type iperf_test (line 3176) | struct iperf_test
  type iperf_test (line 3179) | struct iperf_test
  type iperf_test (line 3182) | struct iperf_test
  type iperf_test (line 3182) | struct iperf_test
  type iperf_test (line 3188) | struct iperf_test
  type iperf_settings (line 3205) | struct iperf_settings
  type iperf_settings (line 3205) | struct iperf_settings
  type iperf_settings (line 3211) | struct iperf_settings
  type protocol (line 3230) | struct protocol
  type protocol (line 3233) | struct protocol
  type protocol (line 3235) | struct protocol
  type protocol (line 3239) | struct protocol
  function protocol_free (line 3244) | void
  function iperf_defaults (line 3251) | int
  function iperf_free_test (line 3390) | void
  function iperf_reset_test (line 3529) | void
  function iperf_reset_stats (line 3668) | void
  function iperf_stats_callback (line 3704) | void
  function iperf_print_intermediate (line 3835) | static void
  function iperf_print_results (line 4068) | static void
  function iperf_reporter_callback (line 4621) | void
  function print_interval_results (line 4644) | static void
  function iperf_free_stream (line 4761) | void
  type iperf_stream (line 4782) | struct iperf_stream
  type iperf_test (line 4783) | struct iperf_test
  type iperf_stream (line 4785) | struct iperf_stream
  type iperf_stream (line 4811) | struct iperf_stream
  type iperf_stream (line 4811) | struct iperf_stream
  type iperf_stream (line 4817) | struct iperf_stream
  type iperf_stream_result (line 4822) | struct iperf_stream_result
  type iperf_stream_result (line 4822) | struct iperf_stream_result
  type iperf_stream_result (line 4829) | struct iperf_stream_result
  function iperf_common_sockopts (line 4909) | int
  function iperf_init_stream (line 4945) | int
  function iperf_add_stream (line 5006) | void
  function diskfile_send (line 5042) | static int
  function diskfile_recv (line 5109) | static int
  function iperf_catch_sigend (line 5123) | void
  function iperf_got_sigend (line 5143) | void
  type iperf_test (line 5192) | struct iperf_test
  function iperf_delete_pidfile (line 5253) | int
  function iperf_json_start (line 5264) | int
  function iperf_json_finish (line 5289) | int
  function iperf_setaffinity (line 5366) | int
  function iperf_clearaffinity (line 5412) | int
  function iperf_printf (line 5454) | int
  function iflush (line 5550) | int
  function iperf_set_control_keepalive (line 5575) | int

FILE: src/iperf_api.h
  type u_int64_t (line 48) | typedef u_int64_t atomic_uint_fast64_t;
  type iperf_test (line 51) | struct iperf_test
  type iperf_stream_result (line 52) | struct iperf_stream_result
  type iperf_interval_results (line 53) | struct iperf_interval_results
  type iperf_stream (line 54) | struct iperf_stream
  type iperf_time (line 55) | struct iperf_time
  type uint_fast64_t (line 58) | typedef uint_fast64_t iperf_size_t;
  type atomic_uint_fast64_t (line 59) | typedef atomic_uint_fast64_t atomic_iperf_size_t;
  type iperf_test (line 132) | struct iperf_test
  type iperf_test (line 133) | struct iperf_test
  type iperf_test (line 134) | struct iperf_test
  type iperf_test (line 135) | struct iperf_test
  type iperf_test (line 136) | struct iperf_test
  type iperf_test (line 137) | struct iperf_test
  type iperf_test (line 138) | struct iperf_test
  type iperf_test (line 139) | struct iperf_test
  type iperf_test (line 140) | struct iperf_test
  type iperf_test (line 141) | struct iperf_test
  type iperf_test (line 142) | struct iperf_test
  type iperf_test (line 143) | struct iperf_test
  type iperf_test (line 144) | struct iperf_test
  type iperf_test (line 145) | struct iperf_test
  type iperf_test (line 146) | struct iperf_test
  type iperf_test (line 147) | struct iperf_test
  type iperf_test (line 148) | struct iperf_test
  type iperf_test (line 149) | struct iperf_test
  type iperf_test (line 150) | struct iperf_test
  type iperf_test (line 151) | struct iperf_test
  type iperf_test (line 152) | struct iperf_test
  type iperf_test (line 153) | struct iperf_test
  type iperf_test (line 154) | struct iperf_test
  type iperf_test (line 155) | struct iperf_test
  type iperf_test (line 156) | struct iperf_test
  type iperf_test (line 157) | struct iperf_test
  type iperf_test (line 158) | struct iperf_test
  type iperf_test (line 159) | struct iperf_test
  type iperf_test (line 160) | struct iperf_test
  type iperf_test (line 161) | struct iperf_test
  type iperf_test (line 162) | struct iperf_test
  type iperf_test (line 163) | struct iperf_test
  type iperf_test (line 164) | struct iperf_test
  type iperf_test (line 165) | struct iperf_test
  type iperf_test (line 166) | struct iperf_test
  type iperf_test (line 167) | struct iperf_test
  type iperf_test (line 168) | struct iperf_test
  type iperf_test (line 169) | struct iperf_test
  type iperf_test (line 170) | struct iperf_test
  type iperf_test (line 172) | struct iperf_test
  type iperf_test (line 173) | struct iperf_test
  type iperf_test (line 174) | struct iperf_test
  type iperf_test (line 175) | struct iperf_test
  type iperf_test (line 176) | struct iperf_test
  type iperf_test (line 177) | struct iperf_test
  type iperf_test (line 180) | struct iperf_test
  type iperf_test (line 181) | struct iperf_test
  type iperf_test (line 182) | struct iperf_test
  type iperf_test (line 183) | struct iperf_test
  type iperf_test (line 184) | struct iperf_test
  type iperf_test (line 185) | struct iperf_test
  type iperf_test (line 186) | struct iperf_test
  type iperf_test (line 187) | struct iperf_test
  type iperf_test (line 188) | struct iperf_test
  type iperf_test (line 189) | struct iperf_test
  type iperf_test (line 190) | struct iperf_test
  type iperf_test (line 191) | struct iperf_test
  type iperf_test (line 192) | struct iperf_test
  type iperf_test (line 193) | struct iperf_test
  type iperf_test (line 194) | struct iperf_test
  type iperf_test (line 195) | struct iperf_test
  type iperf_test (line 196) | struct iperf_test
  type iperf_test (line 197) | struct iperf_test
  type iperf_test (line 198) | struct iperf_test
  type iperf_test (line 199) | struct iperf_test
  type iperf_test (line 200) | struct iperf_test
  type iperf_test (line 201) | struct iperf_test
  type iperf_test (line 202) | struct iperf_test
  type iperf_test (line 203) | struct iperf_test
  type iperf_test (line 204) | struct iperf_test
  type iperf_test (line 205) | struct iperf_test
  type iperf_test (line 206) | struct iperf_test
  type iperf_test (line 207) | struct iperf_test
  type iperf_test (line 208) | struct iperf_test
  type iperf_test (line 208) | struct iperf_test
  type iperf_test (line 210) | struct iperf_test
  type iperf_test (line 211) | struct iperf_test
  type iperf_test (line 212) | struct iperf_test
  type iperf_test (line 213) | struct iperf_test
  type iperf_test (line 214) | struct iperf_test
  type iperf_test (line 215) | struct iperf_test
  type iperf_test (line 216) | struct iperf_test
  type iperf_test (line 217) | struct iperf_test
  type iperf_test (line 218) | struct iperf_test
  type iperf_test (line 219) | struct iperf_test
  type iperf_test (line 220) | struct iperf_test
  type iperf_test (line 221) | struct iperf_test
  type iperf_test (line 222) | struct iperf_test
  type iperf_test (line 223) | struct iperf_test
  type iperf_test (line 224) | struct iperf_test
  type iperf_test (line 225) | struct iperf_test
  type iperf_stream (line 225) | struct iperf_stream
  type iperf_test (line 226) | struct iperf_test
  type iperf_test (line 226) | struct iperf_test
  type iperf_test (line 227) | struct iperf_test
  type iperf_test (line 227) | struct iperf_test
  type iperf_test (line 228) | struct iperf_test
  type iperf_test (line 228) | struct iperf_test
  type iperf_test (line 231) | struct iperf_test
  type iperf_test (line 232) | struct iperf_test
  type iperf_test (line 233) | struct iperf_test
  type iperf_test (line 234) | struct iperf_test
  type iperf_test (line 235) | struct iperf_test
  type iperf_test (line 236) | struct iperf_test
  type iperf_test (line 237) | struct iperf_test
  type iperf_test (line 238) | struct iperf_test
  type iperf_test (line 241) | struct iperf_test
  type iperf_test (line 247) | struct iperf_test
  type iperf_stream_result (line 253) | struct iperf_stream_result
  type iperf_interval_results (line 253) | struct iperf_interval_results
  type iperf_stream (line 260) | struct iperf_stream
  type iperf_test (line 266) | struct iperf_test
  type iperf_test (line 272) | struct iperf_test
  type iperf_test (line 280) | struct iperf_test
  type iperf_test (line 282) | struct iperf_test
  type iperf_test (line 289) | struct iperf_test
  type iperf_stream (line 297) | struct iperf_stream
  type iperf_test (line 297) | struct iperf_test
  type iperf_test (line 303) | struct iperf_test
  type iperf_stream (line 303) | struct iperf_stream
  type iperf_stream (line 309) | struct iperf_stream
  type iperf_test (line 309) | struct iperf_test
  type iperf_stream (line 315) | struct iperf_stream
  type iperf_test (line 321) | struct iperf_test
  type iperf_test (line 328) | struct iperf_test
  type iperf_stream (line 333) | struct iperf_stream
  type iperf_interval_results (line 333) | struct iperf_interval_results
  type iperf_interval_results (line 334) | struct iperf_interval_results
  type iperf_interval_results (line 335) | struct iperf_interval_results
  type iperf_interval_results (line 336) | struct iperf_interval_results
  type iperf_interval_results (line 337) | struct iperf_interval_results
  type iperf_interval_results (line 338) | struct iperf_interval_results
  type iperf_interval_results (line 339) | struct iperf_interval_results
  type iperf_interval_results (line 340) | struct iperf_interval_results
  type iperf_test (line 341) | struct iperf_test
  type iperf_test (line 343) | struct iperf_test
  type iperf_stream (line 344) | struct iperf_stream
  type iperf_time (line 344) | struct iperf_time
  type iperf_stream (line 345) | struct iperf_stream
  type iperf_stream (line 346) | struct iperf_stream
  type iperf_test (line 348) | struct iperf_test
  type iperf_test (line 352) | struct iperf_test
  type iperf_test (line 353) | struct iperf_test
  type iperf_test (line 354) | struct iperf_test
  type iperf_test (line 355) | struct iperf_test
  type iperf_test (line 356) | struct iperf_test
  type iperf_test (line 357) | struct iperf_test
  type iperf_test (line 358) | struct iperf_test
  type iperf_test (line 359) | struct iperf_test
  type protocol (line 361) | struct protocol
  type iperf_test (line 361) | struct iperf_test
  type iperf_test (line 362) | struct iperf_test
  type iperf_stream (line 364) | struct iperf_stream
  type iperf_test (line 365) | struct iperf_test
  type iperf_test (line 366) | struct iperf_test
  type iperf_test (line 367) | struct iperf_test
  type iperf_test (line 372) | struct iperf_test
  type iperf_test (line 373) | struct iperf_test
  type iperf_test (line 374) | struct iperf_test
  type iperf_test (line 375) | struct iperf_test
  type iperf_test (line 376) | struct iperf_test
  type iperf_test (line 379) | struct iperf_test
  type iperf_test (line 380) | struct iperf_test
  type iperf_test (line 381) | struct iperf_test
  type iperf_test (line 382) | struct iperf_test
  type iperf_test (line 383) | struct iperf_test
  type iperf_test (line 384) | struct iperf_test
  type iperf_test (line 385) | struct iperf_test
  type iperf_test (line 388) | struct iperf_test
  type iperf_test (line 389) | struct iperf_test
  type iperf_test (line 392) | struct iperf_test
  type iperf_test (line 393) | struct iperf_test
  type iperf_test (line 396) | struct iperf_test
  type iperf_test (line 397) | struct iperf_test
  type iperf_test (line 400) | struct iperf_test
  type iperf_test (line 401) | struct iperf_test
  type iperf_test (line 402) | struct iperf_test
  type iperf_test (line 403) | struct iperf_test

FILE: src/iperf_auth.c
  function sha256 (line 55) | void sha256(const char *string, char outputBuffer[65])
  function check_authentication (line 68) | int check_authentication(const char *username, const char *password, con...
  function Base64Encode (line 113) | int Base64Encode(const unsigned char* buffer, const size_t length, char*...
  function calcDecodeLength (line 131) | size_t calcDecodeLength(const char* b64input) { //Calculates the length ...
  function Base64Decode (line 141) | int Base64Decode(const char* b64message, unsigned char** buffer, size_t*...
  function EVP_PKEY (line 159) | EVP_PKEY *load_pubkey_from_file(const char *file) {
  function EVP_PKEY (line 173) | EVP_PKEY *load_pubkey_from_base64(const char *buffer) {
  function EVP_PKEY (line 186) | EVP_PKEY *load_privkey_from_file(const char *file) {
  function EVP_PKEY (line 200) | EVP_PKEY *load_privkey_from_base64(const char *buffer) {
  function test_load_pubkey_from_file (line 213) | int test_load_pubkey_from_file(const char *file){
  function test_load_private_key_from_file (line 222) | int test_load_private_key_from_file(const char *file){
  function encrypt_rsa_message (line 231) | int encrypt_rsa_message(const char *plaintext, EVP_PKEY *public_key, uns...
  function decrypt_rsa_message (line 293) | int decrypt_rsa_message(const unsigned char *encryptedtext, const int en...
  function encode_auth_setting (line 362) | int encode_auth_setting(const char *username, const char *password, EVP_...
  function decode_auth_setting (line 390) | int decode_auth_setting(int enable_debug, const char *authtoken, EVP_PKE...
  function iperf_getpass (line 440) | ssize_t iperf_getpass (char **lineptr, size_t *n, FILE *stream) {

FILE: src/iperf_client_api.c
  type iperf_stream (line 57) | struct iperf_stream
  type iperf_stream (line 57) | struct iperf_stream
  type iperf_test (line 58) | struct iperf_test
  function iperf_create_streams (line 99) | int
  function test_timer_proc (line 180) | static void
  function client_stats_timer_proc (line 189) | static void
  function client_reporter_timer_proc (line 200) | static void
  function create_client_timers (line 211) | static int
  function client_omit_timer_proc (line 254) | static void
  function create_client_omit_timer (line 272) | static int
  function iperf_handle_message_client (line 302) | int
  function iperf_connect (line 420) | int
  function iperf_client_end (line 553) | int
  function iperf_run_client (line 587) | int

FILE: src/iperf_error.c
  function iperf_err (line 41) | void
  function iperf_signormalexit (line 89) | void
  function iperf_errexit (line 99) | void
  function iperf_exit (line 109) | void

FILE: src/iperf_pthread.c
  function iperf_thread_exit_handler (line 13) | void iperf_thread_exit_handler(int sig)
  function iperf_set_thread_exit_handler (line 18) | int iperf_set_thread_exit_handler() {
  function pthread_setcanceltype (line 31) | int pthread_setcanceltype(int type, int *oldtype) { return 0; }
  function pthread_setcancelstate (line 32) | int pthread_setcancelstate(int state, int *oldstate) { return 0; }
  function pthread_cancel (line 33) | int pthread_cancel(pthread_t thread_id) {

FILE: src/iperf_sctp.c
  function iperf_sctp_recv (line 53) | int
  function iperf_sctp_send (line 85) | int
  function iperf_sctp_accept (line 111) | int
  function iperf_sctp_listen (line 155) | int
  function iperf_sctp_connect (line 289) | int
  function iperf_sctp_init (line 554) | int
  function iperf_sctp_bindx (line 571) | int
  function iperf_sctp_get_info (line 736) | int

FILE: src/iperf_sctp.h
  type iperf_test (line 41) | struct iperf_test
  type iperf_stream (line 49) | struct iperf_stream
  type iperf_stream (line 58) | struct iperf_stream
  type iperf_test (line 61) | struct iperf_test
  type iperf_test (line 63) | struct iperf_test
  type iperf_test (line 65) | struct iperf_test
  type iperf_test (line 70) | struct iperf_test
  type iperf_stream (line 72) | struct iperf_stream
  type iperf_sctp_info (line 72) | struct iperf_sctp_info

FILE: src/iperf_server_api.c
  type iperf_stream (line 70) | struct iperf_stream
  type iperf_stream (line 70) | struct iperf_stream
  type iperf_test (line 71) | struct iperf_test
  function iperf_server_listen (line 112) | int
  function iperf_accept (line 152) | int
  function iperf_handle_message_server (line 238) | int
  function server_timer_proc (line 317) | static void
  function server_stats_timer_proc (line 330) | static void
  function server_reporter_timer_proc (line 341) | static void
  function create_server_timers (line 352) | static int
  function server_omit_timer_proc (line 394) | static void
  function create_server_omit_timer (line 412) | static int
  function cleanup_server (line 438) | static void
  function iperf_run_server (line 534) | int

FILE: src/iperf_tcp.c
  function iperf_tcp_recv (line 56) | int
  function iperf_tcp_send (line 92) | int
  function iperf_tcp_accept (line 124) | int
  function iperf_tcp_listen (line 176) | int
  function iperf_tcp_connect (line 389) | int

FILE: src/iperf_tcp.h
  type iperf_test (line 38) | struct iperf_test
  type iperf_stream (line 46) | struct iperf_stream
  type iperf_stream (line 55) | struct iperf_stream
  type iperf_test (line 58) | struct iperf_test
  type iperf_test (line 60) | struct iperf_test

FILE: src/iperf_time.c
  function clock_gettime_helper (line 38) | int
  function iperf_time_now (line 51) | int
  function iperf_time_now_wallclock (line 57) | int
  function iperf_time_now_wallclock (line 67) | int
  function iperf_time_now (line 79) | int
  function iperf_time_add_usecs (line 91) | void
  function iperf_time_in_usecs (line 101) | uint64_t
  function iperf_time_in_secs (line 107) | double
  function iperf_time_compare (line 120) | int
  function iperf_time_diff (line 142) | int

FILE: src/iperf_time.h
  type iperf_time (line 32) | struct iperf_time {
  type iperf_time (line 43) | struct iperf_time
  type iperf_time (line 55) | struct iperf_time
  type iperf_time (line 57) | struct iperf_time
  type iperf_time (line 59) | struct iperf_time
  type iperf_time (line 59) | struct iperf_time
  type iperf_time (line 61) | struct iperf_time
  type iperf_time (line 61) | struct iperf_time
  type iperf_time (line 61) | struct iperf_time
  type iperf_time (line 63) | struct iperf_time
  type iperf_time (line 68) | struct iperf_time

FILE: src/iperf_udp.c
  function iperf_udp_recv (line 59) | int
  function iperf_udp_send (line 247) | int
  function iperf_udp_buffercheck (line 371) | int
  function iperf_udp_gso (line 460) | int
  function iperf_udp_gso (line 479) | int
  function iperf_udp_gro (line 489) | int
  function iperf_udp_gro (line 508) | int
  function iperf_udp_accept (line 522) | int
  function iperf_udp_listen (line 636) | int
  function iperf_udp_connect (line 658) | int
  function iperf_udp_init (line 783) | int

FILE: src/iperf_udp.h
  type iperf_stream (line 37) | struct iperf_stream
  type iperf_stream (line 45) | struct iperf_stream
  type iperf_test (line 54) | struct iperf_test
  type iperf_test (line 57) | struct iperf_test
  type iperf_test (line 59) | struct iperf_test
  type iperf_test (line 61) | struct iperf_test

FILE: src/iperf_util.c
  function readentropy (line 58) | int readentropy(void *out, size_t outsize)
  function fill_with_repeating_pattern (line 85) | void fill_with_repeating_pattern(void *out, size_t outsize)
  function make_cookie (line 113) | void
  function is_closed (line 137) | int
  function timeval_to_double (line 156) | double
  function timeval_equals (line 166) | int
  function timeval_diff (line 175) | double
  function cpu_util (line 189) | void
  type utsname (line 230) | struct utsname
  function cJSON (line 386) | cJSON*
  function cJSON (line 444) | cJSON * iperf_cJSON_GetObjectItemType(cJSON * j, char * item_string, int...
  function iperf_dump_fdset (line 480) | void
  function daemon (line 504) | int daemon(int nochdir, int noclose)
  function getdelim (line 594) | ssize_t
  function getline (line 637) | ssize_t

FILE: src/iperf_util.h
  type timeval (line 43) | struct timeval
  type timeval (line 45) | struct timeval
  type timeval (line 45) | struct timeval
  type timeval (line 47) | struct timeval
  type timeval (line 47) | struct timeval

FILE: src/main.c
  type iperf_test (line 51) | struct iperf_test
  type iperf_test (line 58) | struct iperf_test
  function sigend_handler (line 136) | static void __attribute__ ((noreturn))
  function run (line 144) | static int

FILE: src/net.c
  function timeout_connect (line 89) | int
  function bind_to_device (line 132) | int
  function create_socket (line 162) | int
  function netdial (line 267) | int
  function netannounce (line 292) | int
  function Nread (line 404) | int
  function Nrecv (line 414) | int
  function Nread_no_select (line 510) | int
  function Nrecv_no_select (line 519) | int
  function recv_msg_gro (line 556) | static int recv_msg_gro(int fd, char *buf, int len, int *gso_size)
  function Nread_gro (line 602) | int
  function Nread_gro (line 636) | int
  function Nwrite (line 648) | int
  function udp_msg_gso (line 683) | static void udp_msg_gso(struct cmsghdr *cm, uint16_t gso_size)
  function udp_sendmsg_gso (line 694) | static int udp_sendmsg_gso(int fd, const char *buf, size_t count, uint16...
  function Nwrite_gso (line 723) | int
  function Nwrite_gso (line 749) | int
  function has_sendfile (line 757) | int
  function Nsendfile (line 773) | int
  function setnonblocking (line 837) | int
  function getsockdomain (line 861) | int
  function iperf_sync_close_socket (line 876) | void

FILE: src/net.h
  type sockaddr (line 30) | struct sockaddr
  type addrinfo (line 31) | struct addrinfo

FILE: src/queue.h
  type type (line 178) | struct type
  type type (line 248) | struct type
  type type (line 309) | struct type
  type type (line 318) | struct type
  type type (line 416) | struct type
  type type (line 425) | struct type

FILE: src/t_api.c
  function test_iperf_set_test_bind_port (line 41) | int test_iperf_set_test_bind_port(struct iperf_test *test)
  function test_iperf_set_mss (line 51) | int test_iperf_set_mss(struct iperf_test *test)
  function main (line 60) | int

FILE: src/t_auth.c
  function main (line 48) | int
  function test_authtoken (line 115) | int
  function main (line 150) | int

FILE: src/t_timer.c
  function timer_proc (line 42) | static void
  function main (line 49) | int

FILE: src/t_units.c
  function main (line 35) | int

FILE: src/t_uuid.c
  function main (line 34) | int

FILE: src/tcp_info.c
  function has_tcpinfo (line 60) | int
  function has_tcpinfo_retransmits (line 74) | int
  function save_tcpinfo (line 98) | void
  function get_total_retransmits (line 131) | long
  function get_snd_cwnd (line 151) | long
  function get_snd_wnd (line 173) | long
  function get_rtt (line 197) | long
  function get_rttvar (line 220) | long
  function get_pmtu (line 240) | long
  function get_reorder (line 254) | long

FILE: src/timer.c
  function getnow (line 50) | static void
  function list_add (line 60) | static void
  function list_remove (line 99) | static void
  function list_resort (line 111) | static void
  function Timer (line 121) | Timer*
  type timeval (line 153) | struct timeval
  type iperf_time (line 154) | struct iperf_time
  type iperf_time (line 156) | struct iperf_time
  type timeval (line 159) | struct timeval
  function tmr_run (line 176) | void
  function tmr_reset (line 202) | void
  function tmr_cancel (line 214) | void
  function tmr_cleanup (line 226) | void
  function tmr_destroy (line 239) | void

FILE: src/timer.h
  type TimerClientData (line 42) | typedef union
  type iperf_time (line 55) | struct iperf_time
  type Timer (line 58) | typedef struct TimerStruct
  type iperf_time (line 72) | struct iperf_time
  type timeval (line 79) | struct timeval
  type iperf_time (line 79) | struct iperf_time
  type iperf_time (line 84) | struct iperf_time
  type iperf_time (line 87) | struct iperf_time

FILE: src/units.c
  function unit_atof (line 89) | double    unit_atof(const char *s)
  function unit_atof_rate (line 136) | double    unit_atof_rate(const char *s)
  function iperf_size_t (line 185) | iperf_size_t unit_atoi(const char *s)
  function unit_snprintf (line 291) | void      unit_snprintf(char *s, int inLen,
Condensed preview — 108 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,748K chars).
[
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 3491,
    "preview": "# iperf3 Contribution Guidelines\n\nThanks for contributing to iperf3!\n\nThis page contains some guidelines for filing issu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 1305,
    "preview": "_NOTE: The iperf3 issue tracker is for registering bugs, enhancement\nrequests, or submissions of code.  It is not a mean"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1190,
    "preview": "_PLEASE NOTE the following text from the iperf3 license.  Submitting a\npull request to the iperf3 repository constitutes"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 1843,
    "preview": "name: GitHub Actions Build Test\npermissions:\n  contents: read\non:\n  push:\n    branches:\n        - master\n  pull_request:"
  },
  {
    "path": ".gitignore",
    "chars": 366,
    "preview": "*~\n*.a\n*.la\n*.lo\n*.o\n*.orig\n*.Po\n/Makefile\n/autom4te.cache\n/config.log\n/config.status\n/iperf3.spec\ndocs/_build\ndocs/_sta"
  },
  {
    "path": ".gitlab-ci.yml",
    "chars": 1335,
    "preview": "# To contribute improvements to CI/CD templates, please follow the Development guide at:\n# https://docs.gitlab.com/devel"
  },
  {
    "path": "INSTALL",
    "chars": 9498,
    "preview": "Installation Instructions\n*************************\n\nCopyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 "
  },
  {
    "path": "LICENSE",
    "chars": 11828,
    "preview": "\"iperf, Copyright (c) 2014-2026, The Regents of the University of California,\nthrough Lawrence Berkeley National Laborat"
  },
  {
    "path": "Makefile.am",
    "chars": 23,
    "preview": "SUBDIRS = src examples\n"
  },
  {
    "path": "Makefile.in",
    "chars": 26534,
    "preview": "# Makefile.in generated by automake 1.18.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2025 Free Softwar"
  },
  {
    "path": "README.md",
    "chars": 5920,
    "preview": "iperf3:  A TCP, UDP, and SCTP network bandwidth measurement tool\n======================================================="
  },
  {
    "path": "RELNOTES.md",
    "chars": 47350,
    "preview": "iperf3 Release Notes\n====================\n\niperf-3.20 2025-11-14\n---------------------\n\nNOTE: iperf-3.20 incorporates al"
  },
  {
    "path": "aclocal.m4",
    "chars": 387432,
    "preview": "# generated automatically by aclocal 1.18.1 -*- Autoconf -*-\n\n# Copyright (C) 1996-2025 Free Software Foundation, Inc.\n\n"
  },
  {
    "path": "auth_test.sh",
    "chars": 1423,
    "preview": "#!/bin/bash\n#\n# This is a set of commands to run and verify they work before doing a new release.\n# Eventually they shou"
  },
  {
    "path": "bootstrap.sh",
    "chars": 1512,
    "preview": "#! /bin/sh\n#\n# iperf, Copyright (c) 2014, The Regents of the University of\n# California, through Lawrence Berkeley Natio"
  },
  {
    "path": "config/ax_check_openssl.m4",
    "chars": 4197,
    "preview": "# ===========================================================================\n#     https://www.gnu.org/software/autocon"
  },
  {
    "path": "config/ax_pthread.m4",
    "chars": 22556,
    "preview": "# ===========================================================================\n#        https://www.gnu.org/software/auto"
  },
  {
    "path": "config/compile",
    "chars": 8064,
    "preview": "#! /bin/sh\n# Wrapper for compilers which do not understand '-c -o'.\n\nscriptversion=2025-06-18.21; # UTC\n\n# Copyright (C)"
  },
  {
    "path": "config/config.guess",
    "chars": 50743,
    "preview": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright 1992-2024 Free Software Foundation, Inc.\n\n# shellch"
  },
  {
    "path": "config/config.sub",
    "chars": 39713,
    "preview": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright 1992-2024 Free Software Foundation, Inc.\n\n# shell"
  },
  {
    "path": "config/depcomp",
    "chars": 23700,
    "preview": "#! /bin/sh\n# depcomp - compile a program generating dependencies as side-effects\n\nscriptversion=2025-06-18.21; # UTC\n\n# "
  },
  {
    "path": "config/install-sh",
    "chars": 15442,
    "preview": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2025-06-18.21; # UTC\n\n# This originates from"
  },
  {
    "path": "config/iperf_config_static_bin.m4",
    "chars": 368,
    "preview": "# Also link binaries as static\nAC_ARG_ENABLE([static-bin],\n    AS_HELP_STRING([--enable-static-bin], [link iperf3 binary"
  },
  {
    "path": "config/ltmain.sh",
    "chars": 337554,
    "preview": "#! /usr/bin/env sh\n## DO NOT EDIT - This file generated from ./build-aux/ltmain.in\n##               by inline-source v20"
  },
  {
    "path": "config/missing",
    "chars": 7733,
    "preview": "#! /bin/sh\n# Common wrapper for a few potentially missing GNU and other programs.\n\nscriptversion=2025-06-18.21; # UTC\n\n#"
  },
  {
    "path": "config/mkinstalldirs",
    "chars": 3665,
    "preview": "#! /bin/sh\n# mkinstalldirs --- make directory hierarchy\n\nscriptversion=2025-06-18.21; # UTC\n\n# Original author: Noah Fri"
  },
  {
    "path": "config/test-driver",
    "chars": 5220,
    "preview": "#! /bin/sh\n# test-driver - basic testsuite driver script.\n\nscriptversion=2025-06-18.21; # UTC\n\n# Copyright (C) 2011-2025"
  },
  {
    "path": "configure",
    "chars": 597069,
    "preview": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.72 for iper"
  },
  {
    "path": "configure.ac",
    "chars": 15967,
    "preview": "# iperf, Copyright (c) 2014-2026, The Regents of the University of\n# California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "contrib/Dockerfile",
    "chars": 570,
    "preview": "# Instructions:\n# - Configure for a static binary: ./configure --enable-static \"LDFLAGS=--static\" --disable-shared --wit"
  },
  {
    "path": "contrib/README.txt",
    "chars": 336,
    "preview": "\nThis directory contains files that might be useful to analyze iperf3 results\n\niperf3_to_gnuplot.py: converts iperf3 JSO"
  },
  {
    "path": "contrib/iperf3.gp",
    "chars": 997,
    "preview": "#\n# sample Gnuplot command file for iperf3 results\nset term x11\n#set term png\n#set term postscript landscape color\nset k"
  },
  {
    "path": "contrib/iperf3.service",
    "chars": 147,
    "preview": "[Unit]\nDescription=iperf3\nRequires=network.target\n\n[Service]\nExecStart=/usr/bin/iperf3 -s\nRestart=on-failure\n\n[Install]\n"
  },
  {
    "path": "contrib/iperf3_to_gnuplot.py",
    "chars": 3787,
    "preview": "#!/usr/bin/env python\n\n\"\"\"\nExtract iperf data from json blob and format for gnuplot.\n\"\"\"\n\nimport json\nimport os\nimport s"
  },
  {
    "path": "docs/2017-04-27.txt",
    "chars": 4238,
    "preview": "Subject:  iperf3 status, April 2017\n\nThis is the first of a series of (maybe periodic?) updates about\niperf3 development"
  },
  {
    "path": "docs/2017-06-06.txt",
    "chars": 1753,
    "preview": "Subject:  iperf3 status, June 2017\n\niperf 3.2 Release Plans\n-----------------------\n\nWe've done quite a bit of work the "
  },
  {
    "path": "docs/Makefile",
    "chars": 6758,
    "preview": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD "
  },
  {
    "path": "docs/_esnet/LICENSE",
    "chars": 1480,
    "preview": "Copyright (c) 2014, ESnet\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodif"
  },
  {
    "path": "docs/_esnet/README.rst",
    "chars": 3274,
    "preview": "esnet-gh-pages-base\n===================\n\nBase templates for ESnet's GitHub pages. These pages are created using the\nSphi"
  },
  {
    "path": "docs/_esnet/deploy.sh",
    "chars": 407,
    "preview": "#!/bin/sh\n\nGIT_URL=`git remote show origin | awk '/Push  URL/ { print $NF }'`\nDEPLOY_DIR=/tmp/deploy.$$\nmkdir ${DEPLOY_D"
  },
  {
    "path": "docs/_esnet/static/esnet.css",
    "chars": 2198,
    "preview": "body {\n\tpadding-top: 70px; // bootstrap default\n}\n\n.navbar-default {\n\tbackground-color: #006495;\n\tborder-color: #004e74;"
  },
  {
    "path": "docs/_esnet/templates/layout.html",
    "chars": 4393,
    "preview": "{% extends \"basic/layout.html\" %}\n\n{% set theme_css_files = [] %}\n{% if theme_bootstrap_version == \"3\" %}\n  {% set boots"
  },
  {
    "path": "docs/_esnet/templates/navbar.html",
    "chars": 2130,
    "preview": "  <div id=\"navbar\" class=\"{{ theme_navbar_class }} navbar-default {% if theme_navbar_fixed_top == 'true' -%} navbar-fixe"
  },
  {
    "path": "docs/_esnet/templates/relations.html",
    "chars": 712,
    "preview": "{# Switch to icon instead of text in `sm` view size for BS3 only. #}\n{%- if prev %}\n  <li>\n    <a href=\"{{ prev.link|e }"
  },
  {
    "path": "docs/building.rst",
    "chars": 814,
    "preview": "Building iperf3\n===============\n\nBuilding iperf3, as with most tools of this type, is a fairly\nstraightforward operation"
  },
  {
    "path": "docs/conf.py",
    "chars": 8682,
    "preview": "# -*- coding: utf-8 -*-\n#\n# iperf documentation build configuration file, created by\n# sphinx-quickstart on Fri Mar 28 1"
  },
  {
    "path": "docs/dev.rst",
    "chars": 11767,
    "preview": "iperf3 Development\n==================\n\nThe iperf3 project is hosted on GitHub at:\n\nhttp://github.com/esnet/iperf\n\nThis s"
  },
  {
    "path": "docs/faq.rst",
    "chars": 13382,
    "preview": ".. _faq:\n\niperf3 FAQ\n==========\n\nWhat is the history of iperf3, and what is the difference between iperf2 and iperf3?\n  "
  },
  {
    "path": "docs/index.rst",
    "chars": 2348,
    "preview": ".. iperf documentation master file, created by\n   sphinx-quickstart on Fri Mar 28 14:58:40 2014.\n   You can adapt this f"
  },
  {
    "path": "docs/invoking.rst",
    "chars": 28390,
    "preview": "Invoking iperf3\n===============\n\niperf3 includes a manual page listing all of the command-line options.\nThe manual page "
  },
  {
    "path": "docs/news.rst",
    "chars": 20421,
    "preview": "iperf3 Project News\n===================\n\n2025-11-14:  iperf-3.20 released\n--------------------------------\n\n| URL:  http"
  },
  {
    "path": "docs/obtaining.rst",
    "chars": 3376,
    "preview": ".. _obtaining:\n\nObtaining iperf3\n================\n\nBinary Distributions\n--------------------\n\nNote that ESnet does not d"
  },
  {
    "path": "examples/Makefile.am",
    "chars": 269,
    "preview": "noinst_PROGRAMS\t\t= mic mis\t\t# Build, but don't install\n\nAM_CPPFLAGS\t\t= -I$(top_srcdir)/src\n\nmic_SOURCES\t\t= mic.c\nmic_CFL"
  },
  {
    "path": "examples/Makefile.in",
    "chars": 22236,
    "preview": "# Makefile.in generated by automake 1.18.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2025 Free Softwar"
  },
  {
    "path": "examples/mic.c",
    "chars": 1514,
    "preview": "#include \"iperf_config.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <string.h>\n#include <stdi"
  },
  {
    "path": "examples/mis.c",
    "chars": 1236,
    "preview": "#include \"iperf_config.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <string.h>\n#include <stdi"
  },
  {
    "path": "iperf3.spec.in",
    "chars": 1463,
    "preview": "Name:\tiperf3\nVersion: @VERSION@\nRelease:\t1%{?dist}\nSummary: Measurement tool for TCP/UDP bandwidth performance\n\nGroup:\t "
  },
  {
    "path": "make_release",
    "chars": 1158,
    "preview": "#!/bin/sh\n\nproj=\"iperf\"\n\nif [ \"x$2\" != \"x\" ]; then\ntag=$2\nelse\ntag=`awk '/IPERF_VERSION / {\n  gsub(/\"/, \"\", $3);\n  print"
  },
  {
    "path": "src/Makefile.am",
    "chars": 3744,
    "preview": "lib_LTLIBRARIES         = libiperf.la                                   # Build and install an iperf library\nbin_PROGRAM"
  },
  {
    "path": "src/Makefile.in",
    "chars": 108978,
    "preview": "# Makefile.in generated by automake 1.18.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2025 Free Softwar"
  },
  {
    "path": "src/cjson.c",
    "chars": 78257,
    "preview": "/*\n  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors\n\n  Permission is hereby granted, free of charge, to any "
  },
  {
    "path": "src/cjson.h",
    "chars": 16217,
    "preview": "/*\n  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors\n\n  Permission is hereby granted, free of charge, to any "
  },
  {
    "path": "src/dscp.c",
    "chars": 4634,
    "preview": "/* dscp lookup routines lifted wholesale from openssh */\n\n/*\n * Copyright (c) 2000 Markus Friedl.  All rights reserved.\n"
  },
  {
    "path": "src/flowlabel.h",
    "chars": 2612,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/iperf.h",
    "chars": 18470,
    "preview": "/*\n * iperf, Copyright (c) 2014-2020, 2023, The Regents of the University of\n * California, through Lawrence Berkeley Na"
  },
  {
    "path": "src/iperf3.1",
    "chars": 22354,
    "preview": ".TH IPERF3 1 \"November 2025\" ESnet \"User Manuals\"\n.SH NAME\niperf3 \\- perform network throughput tests\n.SH SYNOPSIS\n.B ip"
  },
  {
    "path": "src/iperf_api.c",
    "chars": 197024,
    "preview": "/*\n * iperf, Copyright (c) 2014-2026, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_api.h",
    "chars": 25502,
    "preview": "/*\n * iperf, Copyright (c) 2014-2025, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_auth.c",
    "chars": 14221,
    "preview": "/*\n * iperf, Copyright (c) 2014-2023, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_auth.h",
    "chars": 2219,
    "preview": "/*\n * iperf, Copyright (c) 2014-2017, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_client_api.c",
    "chars": 28032,
    "preview": "/*\n * iperf, Copyright (c) 2014-2023, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_config.h.in",
    "chars": 4931,
    "preview": "/* src/iperf_config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Can bind to device via SO_BINDTODEVICE or "
  },
  {
    "path": "src/iperf_error.c",
    "chars": 20706,
    "preview": "/*\n * iperf, Copyright (c) 2014-2022, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_locale.c",
    "chars": 26417,
    "preview": "/*---------------------------------------------------------------\n * iperf, Copyright (c) 2014-2022, The Regents of the "
  },
  {
    "path": "src/iperf_locale.h",
    "chars": 5468,
    "preview": "/*\n * iperf, Copyright (c) 2014-2020, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_pthread.c",
    "chars": 1036,
    "preview": "#include \"iperf_config.h\"\n\n#if defined(HAVE_PTHREAD) && defined(__ANDROID__)\n\n/* Workaround for `pthread_cancel()` in An"
  },
  {
    "path": "src/iperf_pthread.h",
    "chars": 749,
    "preview": "#include \"iperf_config.h\"\n\n#if defined(HAVE_PTHREAD)\n\n#include <pthread.h>\n\n#if defined(__ANDROID__)\n\n/* Adding missing "
  },
  {
    "path": "src/iperf_sctp.c",
    "chars": 20794,
    "preview": "/*\n * iperf, Copyright (c) 2014-2019, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_sctp.h",
    "chars": 2393,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/iperf_server_api.c",
    "chars": 33210,
    "preview": "/*\n * iperf, Copyright (c) 2014-2023 The Regents of the University of\n * California, through Lawrence Berkeley National "
  },
  {
    "path": "src/iperf_tcp.c",
    "chars": 17591,
    "preview": "/*\n * iperf, Copyright (c) 2014-2022, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_tcp.h",
    "chars": 2060,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/iperf_time.c",
    "chars": 4513,
    "preview": "/*\n * iperf, Copyright (c) 2014-2018, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_time.h",
    "chars": 2553,
    "preview": "/*\n * iperf, Copyright (c) 2014-2018, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_udp.c",
    "chars": 23959,
    "preview": "/*\n * iperf, Copyright (c) 2014-2026, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_udp.h",
    "chars": 1971,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/iperf_util.c",
    "chars": 17645,
    "preview": "/*\n * iperf, Copyright (c) 2014-2026, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/iperf_util.h",
    "chars": 2363,
    "preview": "/*\n * iperf, Copyright (c) 2014-2017, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/libiperf.3",
    "chars": 3862,
    "preview": ".TH LIBIPERF 3 \"January 2022\" ESnet \"User Manuals\"\n.SH NAME\nlibiperf \\- API for iperf3 network throughput tester\n\n.SH SY"
  },
  {
    "path": "src/main.c",
    "chars": 6261,
    "preview": "/*\n * iperf, Copyright (c) 2014-2023, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/net.c",
    "chars": 22674,
    "preview": "/*\n * iperf, Copyright (c) 2014-2023, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/net.h",
    "chars": 2758,
    "preview": "/*\n * iperf, Copyright (c) 2014, 2017, The Regents of the University of\n * California, through Lawrence Berkeley Nationa"
  },
  {
    "path": "src/portable_endian.h",
    "chars": 4637,
    "preview": "// \"License\": Public Domain\n// I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own "
  },
  {
    "path": "src/private.pem",
    "chars": 1679,
    "preview": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAwVbvPf/eDIZKmEVth9+VPgSx1RkXOAPCJ5tl51bcYoy9P10N\nnoutsTK/64VclIuyUDUdAw8"
  },
  {
    "path": "src/public.pem",
    "chars": 451,
    "preview": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwVbvPf/eDIZKmEVth9+V\nPgSx1RkXOAPCJ5tl51bcYoy9P10N"
  },
  {
    "path": "src/queue.h",
    "chars": 18109,
    "preview": "/*\t$OpenBSD: queue.h,v 1.32 2007/04/30 18:42:34 pedro Exp $\t*/\n/*\t$NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Ex"
  },
  {
    "path": "src/t_api.c",
    "chars": 2515,
    "preview": "/*\n * iperf, Copyright (c) 2017-2020, The Regents of the University of\n * California, through Lawrence Berkeley National"
  },
  {
    "path": "src/t_auth.c",
    "chars": 5478,
    "preview": "/*\n * iperf, Copyright (c) 2020, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/t_timer.c",
    "chars": 2081,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/t_units.c",
    "chars": 3735,
    "preview": "/*\n * iperf, Copyright (c) 2014, 2017, The Regents of the University of\n * California, through Lawrence Berkeley Nationa"
  },
  {
    "path": "src/t_uuid.c",
    "chars": 1657,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/tcp_info.c",
    "chars": 8627,
    "preview": "/*\n * iperf, Copyright (c) 2014, 2017, The Regents of the University of\n * California, through Lawrence Berkeley Nationa"
  },
  {
    "path": "src/timer.c",
    "chars": 5716,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/timer.h",
    "chars": 3613,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/units.c",
    "chars": 9448,
    "preview": "/*---------------------------------------------------------------\n * Copyright (c) 1999,2000,2001,2002,2003\n * The Board"
  },
  {
    "path": "src/units.h",
    "chars": 1538,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "src/version.h.in",
    "chars": 1364,
    "preview": "/*\n * iperf, Copyright (c) 2014, The Regents of the University of\n * California, through Lawrence Berkeley National Labo"
  },
  {
    "path": "test_commands.sh",
    "chars": 1972,
    "preview": "#!/bin/sh\n#\n# This is a set of commands to run and verify they work before doing a new release.\n# Eventually they should"
  }
]

About this extraction

This page contains the full source code of the esnet/iperf GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 108 files (2.5 MB), approximately 654.9k tokens, and a symbol index with 754 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!