[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnurl] 407/411: Merge tag 'curl-7_74_0'
From: |
gnunet |
Subject: |
[gnurl] 407/411: Merge tag 'curl-7_74_0' |
Date: |
Wed, 13 Jan 2021 01:23:42 +0100 |
This is an automated email from the git hooks/post-receive script.
nikita pushed a commit to branch master
in repository gnurl.
commit 5b9f8acdda96cbaf7ec070db3ae9bdbe2a42f8eb
Merge: 7bd28f373 e05285975
Author: nikita <nikita@NetBSD.org>
AuthorDate: Wed Jan 13 00:53:52 2021 +0100
Merge tag 'curl-7_74_0'
7.74.0
.azure-pipelines.yml | 31 +-
.cirrus.yml | 16 +-
.dir-locals.el | 2 +-
.github/ISSUE_TEMPLATE/config.yml | 11 +
.lgtm.yml | 2 +-
.mailmap | 10 +-
.travis.yml | 317 +++-----
CHANGES | 2 +-
CMake/CMakeConfigurableFile.in | 2 +-
CMake/CurlSymbolHiding.cmake | 4 +-
CMake/CurlTests.c | 4 +-
CMake/FindBearSSL.cmake | 2 +-
CMake/FindGSS.cmake | 2 +-
CMake/FindNGHTTP3.cmake | 2 +-
CMake/FindNGTCP2.cmake | 2 +-
CMake/FindNSS.cmake | 2 +-
CMake/FindQUICHE.cmake | 2 +-
CMake/FindWolfSSL.cmake | 2 +-
CMake/FindZstd.cmake | 2 +-
CMake/Macros.cmake | 13 +-
CMake/OtherTests.cmake | 2 +-
CMake/Platforms/WindowsCache.cmake | 2 +-
CMake/Utilities.cmake | 2 +-
CMake/cmake_uninstall.cmake.in | 2 +-
CMake/gnurl-config.cmake.in | 2 +-
CMakeLists.txt | 104 ++-
MacOSX-Framework | 2 +-
Makefile.am | 3 +-
Makefile.dist | 16 +-
README | 10 +-
README.md | 29 +-
RELEASE-NOTES | 452 +++++------
acinclude.m4 | 38 +-
appveyor.yml | 34 +-
buildconf | 432 +----------
buildconf.bat | 2 +-
configure.ac | 181 +++--
docs/ALTSVC.md | 4 +-
docs/BUGS | 302 --------
docs/BUGS.md | 266 +++++++
docs/CHECKSRC.md | 6 +-
docs/CIPHERS.md | 8 +-
docs/CMakeLists.txt | 2 +-
docs/CONTRIBUTE.md | 45 +-
docs/CURL-DISABLE.md | 18 +
docs/DYNBUF.md | 6 +
docs/{ESNI.md => ECH.md} | 76 +-
docs/EXPERIMENTAL.md | 4 +-
docs/FAQ | 267 +++----
docs/{FEATURES => FEATURES.md} | 182 +++--
docs/HELP-US.md | 8 +-
docs/HISTORY.md | 40 +-
docs/HSTS.md | 44 ++
docs/HTTP-COOKIES.md | 2 +-
docs/HTTP3.md | 16 +-
docs/INTERNALS.md | 49 +-
docs/KNOWN_BUGS | 200 +++--
docs/LICENSE-MIXING.md | 128 ----
docs/MAIL-ETIQUETTE | 2 +-
docs/MANUAL.md | 28 +-
docs/MQTT.md | 32 -
docs/Makefile.am | 14 +-
docs/NEW-PROTOCOL.md | 110 +++
docs/README.md | 6 +-
docs/RESOURCES | 85 ---
docs/ROADMAP.md | 32 +-
docs/SECURITY-PROCESS.md | 12 +-
docs/SSL-PROBLEMS.md | 2 +-
docs/SSLCERTS.md | 6 +-
docs/THANKS | 53 ++
docs/THANKS-filter | 3 +-
docs/TODO | 58 +-
docs/TheArtOfHttpScripting | 758 ------------------
docs/TheArtOfHttpScripting.md | 692 +++++++++++++++++
docs/VERSIONS.md | 13 +-
docs/cmdline-opts/CMakeLists.txt | 2 +-
docs/cmdline-opts/Makefile.am | 2 +-
docs/cmdline-opts/Makefile.inc | 5 +-
docs/cmdline-opts/abstract-unix-socket.d | 1 +
docs/cmdline-opts/alt-svc.d | 1 +
docs/cmdline-opts/anyauth.d | 1 +
docs/cmdline-opts/append.d | 1 +
docs/cmdline-opts/basic.d | 1 +
docs/cmdline-opts/cacert.d | 1 +
docs/cmdline-opts/capath.d | 1 +
docs/cmdline-opts/cert-status.d | 1 +
docs/cmdline-opts/cert-type.d | 1 +
docs/cmdline-opts/cert.d | 1 +
docs/cmdline-opts/ciphers.d | 3 +-
docs/cmdline-opts/compressed-ssh.d | 1 +
docs/cmdline-opts/compressed.d | 1 +
docs/cmdline-opts/config.d | 21 +-
docs/cmdline-opts/connect-timeout.d | 1 +
docs/cmdline-opts/connect-to.d | 1 +
docs/cmdline-opts/continue-at.d | 1 +
docs/cmdline-opts/cookie-jar.d | 1 +
docs/cmdline-opts/cookie.d | 1 +
docs/cmdline-opts/create-dirs.d | 1 +
docs/cmdline-opts/crlf.d | 1 +
docs/cmdline-opts/crlfile.d | 1 +
docs/cmdline-opts/curves.d | 18 +
docs/cmdline-opts/data-ascii.d | 1 +
docs/cmdline-opts/data-binary.d | 1 +
docs/cmdline-opts/data-raw.d | 1 +
docs/cmdline-opts/data-urlencode.d | 1 +
docs/cmdline-opts/data.d | 1 +
docs/cmdline-opts/delegation.d | 1 +
docs/cmdline-opts/digest.d | 1 +
docs/cmdline-opts/disable-eprt.d | 1 +
docs/cmdline-opts/disable-epsv.d | 1 +
docs/cmdline-opts/disable.d | 1 +
docs/cmdline-opts/disallow-username-in-url.d | 1 +
docs/cmdline-opts/dns-interface.d | 1 +
docs/cmdline-opts/dns-ipv4-addr.d | 1 +
docs/cmdline-opts/dns-ipv6-addr.d | 1 +
docs/cmdline-opts/dns-servers.d | 1 +
docs/cmdline-opts/doh-url.d | 1 +
docs/cmdline-opts/dump-header.d | 1 +
docs/cmdline-opts/egd-file.d | 1 +
docs/cmdline-opts/engine.d | 1 +
docs/cmdline-opts/etag-compare.d | 3 +-
docs/cmdline-opts/etag-save.d | 5 +-
docs/cmdline-opts/expect100-timeout.d | 1 +
docs/cmdline-opts/fail-early.d | 1 +
docs/cmdline-opts/fail.d | 1 +
docs/cmdline-opts/false-start.d | 1 +
docs/cmdline-opts/form-string.d | 1 +
docs/cmdline-opts/form.d | 1 +
docs/cmdline-opts/ftp-account.d | 1 +
docs/cmdline-opts/ftp-alternative-to-user.d | 1 +
docs/cmdline-opts/ftp-create-dirs.d | 1 +
docs/cmdline-opts/ftp-method.d | 1 +
docs/cmdline-opts/ftp-pasv.d | 1 +
docs/cmdline-opts/ftp-port.d | 1 +
docs/cmdline-opts/ftp-pret.d | 1 +
docs/cmdline-opts/ftp-skip-pasv-ip.d | 3 +
docs/cmdline-opts/ftp-ssl-ccc-mode.d | 1 +
docs/cmdline-opts/ftp-ssl-ccc.d | 1 +
docs/cmdline-opts/ftp-ssl-control.d | 1 +
docs/cmdline-opts/gen.pl | 66 +-
docs/cmdline-opts/get.d | 1 +
docs/cmdline-opts/globoff.d | 1 +
docs/cmdline-opts/happy-eyeballs-timeout-ms.d | 1 +
docs/cmdline-opts/haproxy-protocol.d | 1 +
docs/cmdline-opts/head.d | 1 +
docs/cmdline-opts/header.d | 19 +-
docs/cmdline-opts/help.d | 12 +-
docs/cmdline-opts/hostpubmd5.d | 1 +
docs/cmdline-opts/hsts.d | 18 +
docs/cmdline-opts/http0.9.d | 1 +
docs/cmdline-opts/http1.0.d | 1 +
docs/cmdline-opts/http1.1.d | 1 +
docs/cmdline-opts/http2-prior-knowledge.d | 1 +
docs/cmdline-opts/http2.d | 1 +
docs/cmdline-opts/http3.d | 1 +
docs/cmdline-opts/ignore-content-length.d | 1 +
docs/cmdline-opts/include.d | 1 +
docs/cmdline-opts/insecure.d | 3 +-
docs/cmdline-opts/interface.d | 1 +
docs/cmdline-opts/ipv4.d | 1 +
docs/cmdline-opts/ipv6.d | 1 +
docs/cmdline-opts/junk-session-cookies.d | 1 +
docs/cmdline-opts/keepalive-time.d | 1 +
docs/cmdline-opts/key-type.d | 1 +
docs/cmdline-opts/key.d | 1 +
docs/cmdline-opts/krb.d | 1 +
docs/cmdline-opts/libcurl.d | 1 +
docs/cmdline-opts/limit-rate.d | 1 +
docs/cmdline-opts/list-only.d | 1 +
docs/cmdline-opts/local-port.d | 1 +
docs/cmdline-opts/location-trusted.d | 1 +
docs/cmdline-opts/location.d | 1 +
docs/cmdline-opts/login-options.d | 1 +
docs/cmdline-opts/mail-auth.d | 1 +
docs/cmdline-opts/mail-from.d | 1 +
docs/cmdline-opts/mail-rcpt-allowfails.d | 1 +
docs/cmdline-opts/mail-rcpt.d | 1 +
docs/cmdline-opts/manual.d | 1 +
docs/cmdline-opts/max-filesize.d | 1 +
docs/cmdline-opts/max-redirs.d | 1 +
docs/cmdline-opts/max-time.d | 1 +
docs/cmdline-opts/metalink.d | 1 +
docs/cmdline-opts/negotiate.d | 1 +
docs/cmdline-opts/netrc-file.d | 1 +
docs/cmdline-opts/netrc-optional.d | 1 +
docs/cmdline-opts/netrc.d | 1 +
docs/cmdline-opts/next.d | 1 +
docs/cmdline-opts/no-alpn.d | 1 +
docs/cmdline-opts/no-buffer.d | 1 +
docs/cmdline-opts/no-keepalive.d | 1 +
docs/cmdline-opts/no-npn.d | 1 +
docs/cmdline-opts/no-progress-meter.d | 1 +
docs/cmdline-opts/no-sessionid.d | 1 +
docs/cmdline-opts/noproxy.d | 1 +
docs/cmdline-opts/ntlm-wb.d | 1 +
docs/cmdline-opts/ntlm.d | 1 +
docs/cmdline-opts/oauth2-bearer.d | 1 +
docs/cmdline-opts/output-dir.d | 19 +
docs/cmdline-opts/output.d | 1 +
docs/cmdline-opts/page-footer | 8 +-
docs/cmdline-opts/page-header | 11 +-
docs/cmdline-opts/parallel-immediate.d | 1 +
docs/cmdline-opts/parallel-max.d | 1 +
docs/cmdline-opts/parallel.d | 1 +
docs/cmdline-opts/pass.d | 1 +
docs/cmdline-opts/path-as-is.d | 1 +
docs/cmdline-opts/pinnedpubkey.d | 1 +
docs/cmdline-opts/post301.d | 1 +
docs/cmdline-opts/post302.d | 1 +
docs/cmdline-opts/post303.d | 1 +
docs/cmdline-opts/preproxy.d | 1 +
docs/cmdline-opts/progress-bar.d | 1 +
docs/cmdline-opts/proto-default.d | 1 +
docs/cmdline-opts/proto-redir.d | 1 +
docs/cmdline-opts/proto.d | 1 +
docs/cmdline-opts/proxy-anyauth.d | 1 +
docs/cmdline-opts/proxy-basic.d | 1 +
docs/cmdline-opts/proxy-cacert.d | 1 +
docs/cmdline-opts/proxy-capath.d | 1 +
docs/cmdline-opts/proxy-cert-type.d | 1 +
docs/cmdline-opts/proxy-cert.d | 1 +
docs/cmdline-opts/proxy-ciphers.d | 1 +
docs/cmdline-opts/proxy-crlfile.d | 1 +
docs/cmdline-opts/proxy-digest.d | 1 +
docs/cmdline-opts/proxy-header.d | 1 +
docs/cmdline-opts/proxy-insecure.d | 1 +
docs/cmdline-opts/proxy-key-type.d | 1 +
docs/cmdline-opts/proxy-key.d | 1 +
docs/cmdline-opts/proxy-negotiate.d | 1 +
docs/cmdline-opts/proxy-ntlm.d | 1 +
docs/cmdline-opts/proxy-pass.d | 1 +
docs/cmdline-opts/proxy-pinnedpubkey.d | 1 +
docs/cmdline-opts/proxy-service-name.d | 1 +
docs/cmdline-opts/proxy-ssl-allow-beast.d | 1 +
docs/cmdline-opts/proxy-tls13-ciphers.d | 3 +-
docs/cmdline-opts/proxy-tlsauthtype.d | 1 +
docs/cmdline-opts/proxy-tlspassword.d | 1 +
docs/cmdline-opts/proxy-tlsuser.d | 1 +
docs/cmdline-opts/proxy-tlsv1.d | 1 +
docs/cmdline-opts/proxy-user.d | 1 +
docs/cmdline-opts/proxy.d | 1 +
docs/cmdline-opts/proxy1.0.d | 1 +
docs/cmdline-opts/proxytunnel.d | 1 +
docs/cmdline-opts/pubkey.d | 1 +
docs/cmdline-opts/quote.d | 9 +
docs/cmdline-opts/random-file.d | 1 +
docs/cmdline-opts/range.d | 4 +-
docs/cmdline-opts/raw.d | 1 +
docs/cmdline-opts/referer.d | 1 +
docs/cmdline-opts/remote-header-name.d | 1 +
docs/cmdline-opts/remote-name-all.d | 1 +
docs/cmdline-opts/remote-name.d | 1 +
docs/cmdline-opts/remote-time.d | 1 +
docs/cmdline-opts/request-target.d | 1 +
docs/cmdline-opts/request.d | 1 +
docs/cmdline-opts/resolve.d | 1 +
docs/cmdline-opts/retry-all-errors.d | 1 +
docs/cmdline-opts/retry-connrefused.d | 1 +
docs/cmdline-opts/retry-delay.d | 1 +
docs/cmdline-opts/retry-max-time.d | 1 +
docs/cmdline-opts/retry.d | 1 +
docs/cmdline-opts/sasl-authzid.d | 1 +
docs/cmdline-opts/sasl-ir.d | 1 +
docs/cmdline-opts/service-name.d | 1 +
docs/cmdline-opts/show-error.d | 2 +
docs/cmdline-opts/silent.d | 3 +-
docs/cmdline-opts/socks4.d | 1 +
docs/cmdline-opts/socks4a.d | 1 +
docs/cmdline-opts/socks5-basic.d | 1 +
docs/cmdline-opts/socks5-gssapi-nec.d | 1 +
docs/cmdline-opts/socks5-gssapi-service.d | 1 +
docs/cmdline-opts/socks5-gssapi.d | 1 +
docs/cmdline-opts/socks5-hostname.d | 1 +
docs/cmdline-opts/socks5.d | 1 +
docs/cmdline-opts/speed-limit.d | 1 +
docs/cmdline-opts/speed-time.d | 1 +
docs/cmdline-opts/ssl-allow-beast.d | 1 +
docs/cmdline-opts/ssl-no-revoke.d | 1 +
docs/cmdline-opts/ssl-reqd.d | 1 +
docs/cmdline-opts/ssl-revoke-best-effort.d | 1 +
docs/cmdline-opts/ssl.d | 1 +
docs/cmdline-opts/sslv2.d | 1 +
docs/cmdline-opts/sslv3.d | 1 +
docs/cmdline-opts/stderr.d | 1 +
docs/cmdline-opts/styled-output.d | 1 +
docs/cmdline-opts/suppress-connect-headers.d | 1 +
docs/cmdline-opts/tcp-fastopen.d | 1 +
docs/cmdline-opts/tcp-nodelay.d | 1 +
docs/cmdline-opts/telnet-option.d | 1 +
docs/cmdline-opts/tftp-blksize.d | 1 +
docs/cmdline-opts/tftp-no-options.d | 1 +
docs/cmdline-opts/time-cond.d | 1 +
docs/cmdline-opts/tls-max.d | 1 +
docs/cmdline-opts/tls13-ciphers.d | 3 +-
docs/cmdline-opts/tlsauthtype.d | 1 +
docs/cmdline-opts/tlspassword.d | 1 +
docs/cmdline-opts/tlsuser.d | 1 +
docs/cmdline-opts/tlsv1.0.d | 1 +
docs/cmdline-opts/tlsv1.1.d | 1 +
docs/cmdline-opts/tlsv1.2.d | 1 +
docs/cmdline-opts/tlsv1.3.d | 1 +
docs/cmdline-opts/tlsv1.d | 1 +
docs/cmdline-opts/tr-encoding.d | 1 +
docs/cmdline-opts/trace-ascii.d | 1 +
docs/cmdline-opts/trace-time.d | 1 +
docs/cmdline-opts/trace.d | 1 +
docs/cmdline-opts/unix-socket.d | 1 +
docs/cmdline-opts/upload-file.d | 1 +
docs/cmdline-opts/url.d | 1 +
docs/cmdline-opts/use-ascii.d | 1 +
docs/cmdline-opts/user-agent.d | 1 +
docs/cmdline-opts/user.d | 1 +
docs/cmdline-opts/verbose.d | 1 +
docs/cmdline-opts/version.d | 3 +
docs/cmdline-opts/write-out.d | 5 +
docs/cmdline-opts/xattr.d | 1 +
docs/examples/.gitignore | 12 +-
docs/examples/10-at-a-time.c | 4 +-
docs/examples/Makefile.am | 4 +-
docs/examples/Makefile.example | 2 +-
docs/examples/Makefile.inc | 4 +-
docs/examples/Makefile.m32 | 32 +-
docs/examples/Makefile.netware | 2 +-
docs/examples/{README => README.md} | 22 +-
docs/examples/adddocsref.pl | 4 +-
docs/examples/altsvc.c | 4 +-
docs/examples/anyauthput.c | 2 +-
docs/examples/cacertinmem.c | 4 +-
docs/examples/certinfo.c | 4 +-
docs/examples/chkspeed.c | 4 +-
docs/examples/cookie_interface.c | 4 +-
docs/examples/debug.c | 4 +-
docs/examples/ephiperfifo.c | 2 +-
docs/examples/evhiperfifo.c | 4 +-
docs/examples/externalsocket.c | 4 +-
docs/examples/fileupload.c | 4 +-
docs/examples/ftp-wildcard.c | 4 +-
docs/examples/ftpget.c | 4 +-
docs/examples/ftpgetinfo.c | 6 +-
docs/examples/ftpgetresp.c | 4 +-
docs/examples/ftpsget.c | 4 +-
docs/examples/ftpupload.c | 4 +-
docs/examples/ftpuploadfrommem.c | 4 +-
docs/examples/ftpuploadresume.c | 4 +-
docs/examples/getinfo.c | 4 +-
docs/examples/getinmemory.c | 4 +-
docs/examples/getredirect.c | 4 +-
docs/examples/ghiper.c | 4 +-
docs/examples/hiperfifo.c | 4 +-
docs/examples/href_extractor.c | 4 +-
docs/examples/htmltidy.c | 4 +-
docs/examples/htmltitle.cpp | 4 +-
docs/examples/http-post.c | 4 +-
docs/examples/http2-download.c | 2 +-
docs/examples/http2-pushinmemory.c | 4 +-
docs/examples/http2-serverpush.c | 4 +-
docs/examples/http2-upload.c | 2 +-
docs/examples/http3-present.c | 4 +-
docs/examples/http3.c | 4 +-
docs/examples/httpcustomheader.c | 4 +-
docs/examples/httpput-postfields.c | 101 +++
docs/examples/httpput.c | 9 +-
docs/examples/https.c | 4 +-
docs/examples/imap-append.c | 4 +-
docs/examples/imap-authzid.c | 4 +-
docs/examples/imap-copy.c | 4 +-
docs/examples/imap-create.c | 4 +-
docs/examples/imap-delete.c | 4 +-
docs/examples/imap-examine.c | 4 +-
docs/examples/imap-fetch.c | 4 +-
docs/examples/imap-list.c | 4 +-
docs/examples/imap-lsub.c | 4 +-
docs/examples/imap-multi.c | 4 +-
docs/examples/imap-noop.c | 4 +-
docs/examples/imap-search.c | 4 +-
docs/examples/imap-ssl.c | 4 +-
docs/examples/imap-store.c | 4 +-
docs/examples/imap-tls.c | 4 +-
docs/examples/makefile.dj | 2 +-
docs/examples/multi-app.c | 4 +-
docs/examples/multi-debugcallback.c | 4 +-
docs/examples/multi-double.c | 4 +-
docs/examples/multi-event.c | 2 +-
docs/examples/multi-formadd.c | 4 +-
docs/examples/multi-poll.c | 4 +-
docs/examples/multi-post.c | 4 +-
docs/examples/multi-single.c | 4 +-
docs/examples/multi-uv.c | 2 +-
docs/examples/multithread.c | 6 +-
docs/examples/opensslthreadlock.c | 4 +-
docs/examples/parseurl.c | 4 +-
docs/examples/persistent.c | 4 +-
docs/examples/pop3-authzid.c | 4 +-
docs/examples/pop3-dele.c | 4 +-
docs/examples/pop3-list.c | 4 +-
docs/examples/pop3-multi.c | 4 +-
docs/examples/pop3-noop.c | 4 +-
docs/examples/pop3-retr.c | 4 +-
docs/examples/pop3-ssl.c | 4 +-
docs/examples/pop3-stat.c | 4 +-
docs/examples/pop3-tls.c | 4 +-
docs/examples/pop3-top.c | 4 +-
docs/examples/pop3-uidl.c | 4 +-
docs/examples/post-callback.c | 4 +-
docs/examples/postinmemory.c | 4 +-
docs/examples/postit2-formadd.c | 4 +-
docs/examples/postit2.c | 4 +-
docs/examples/progressfunc.c | 4 +-
docs/examples/resolve.c | 4 +-
docs/examples/sampleconv.c | 4 +-
docs/examples/sendrecv.c | 4 +-
docs/examples/sepheaders.c | 4 +-
docs/examples/sessioninfo.c | 2 +-
docs/examples/sftpget.c | 4 +-
docs/examples/sftpuploadresume.c | 4 +-
docs/examples/shared-connection-cache.c | 6 +-
docs/examples/simple.c | 4 +-
docs/examples/simplepost.c | 4 +-
docs/examples/simplessl.c | 4 +-
docs/examples/smooth-gtk-thread.c | 4 +-
docs/examples/smtp-authzid.c | 4 +-
docs/examples/smtp-expn.c | 4 +-
docs/examples/smtp-mail.c | 4 +-
docs/examples/smtp-mime.c | 4 +-
docs/examples/smtp-multi.c | 4 +-
docs/examples/smtp-ssl.c | 4 +-
docs/examples/smtp-tls.c | 4 +-
docs/examples/smtp-vrfy.c | 4 +-
docs/examples/sslbackend.c | 8 +-
docs/examples/synctime.c | 4 +-
docs/examples/threaded-shared-conn.c | 4 +-
docs/examples/threaded-ssl.c | 4 +-
docs/examples/url2file.c | 4 +-
docs/examples/urlapi.c | 4 +-
docs/examples/usercertinmem.c | 4 +-
docs/examples/version-check.pl | 2 +-
docs/examples/xmlstream.c | 4 +-
docs/gnurl-config.1 | 2 +-
docs/libcurl/CMakeLists.txt | 2 +-
docs/libcurl/Makefile.am | 2 +-
docs/libcurl/Makefile.inc | 169 ++--
.../GNURLOPT_STDERR.3 => curl_easy_option_by_id.3} | 44 +-
...NURLOPT_STDERR.3 => curl_easy_option_by_name.3} | 42 +-
docs/libcurl/curl_easy_option_next.3 | 74 ++
docs/libcurl/gnurl_easy_cleanup.3 | 6 +-
docs/libcurl/gnurl_easy_duphandle.3 | 4 +-
docs/libcurl/gnurl_easy_escape.3 | 5 +-
docs/libcurl/gnurl_easy_getinfo.3 | 5 +-
docs/libcurl/gnurl_easy_init.3 | 4 +-
docs/libcurl/gnurl_easy_pause.3 | 4 +-
docs/libcurl/gnurl_easy_perform.3 | 4 +-
docs/libcurl/gnurl_easy_recv.3 | 4 +-
docs/libcurl/gnurl_easy_reset.3 | 2 +-
docs/libcurl/gnurl_easy_send.3 | 4 +-
docs/libcurl/gnurl_easy_setopt.3 | 24 +-
docs/libcurl/gnurl_easy_strerror.3 | 2 +-
docs/libcurl/gnurl_easy_unescape.3 | 2 +-
docs/libcurl/gnurl_easy_upkeep.3 | 4 +-
docs/libcurl/gnurl_escape.3 | 2 +-
docs/libcurl/gnurl_formadd.3 | 2 +-
docs/libcurl/gnurl_formfree.3 | 4 +-
docs/libcurl/gnurl_formget.3 | 4 +-
docs/libcurl/gnurl_free.3 | 4 +-
docs/libcurl/gnurl_getdate.3 | 4 +-
docs/libcurl/gnurl_getenv.3 | 2 +-
docs/libcurl/gnurl_global_cleanup.3 | 4 +-
docs/libcurl/gnurl_global_init.3 | 2 +-
docs/libcurl/gnurl_global_init_mem.3 | 4 +-
docs/libcurl/gnurl_global_sslset.3 | 2 +-
docs/libcurl/gnurl_mime_addpart.3 | 4 +-
docs/libcurl/gnurl_mime_data.3 | 2 +-
docs/libcurl/gnurl_mime_data_cb.3 | 4 +-
docs/libcurl/gnurl_mime_encoder.3 | 2 +-
docs/libcurl/gnurl_mime_filedata.3 | 2 +-
docs/libcurl/gnurl_mime_filename.3 | 2 +-
docs/libcurl/gnurl_mime_free.3 | 4 +-
docs/libcurl/gnurl_mime_headers.3 | 6 +-
docs/libcurl/gnurl_mime_init.3 | 6 +-
docs/libcurl/gnurl_mime_name.3 | 2 +-
docs/libcurl/gnurl_mime_subparts.3 | 4 +-
docs/libcurl/gnurl_mime_type.3 | 2 +-
docs/libcurl/gnurl_mprintf.3 | 4 +-
docs/libcurl/gnurl_multi_add_handle.3 | 4 +-
docs/libcurl/gnurl_multi_assign.3 | 2 +-
docs/libcurl/gnurl_multi_cleanup.3 | 4 +-
docs/libcurl/gnurl_multi_fdset.3 | 4 +-
docs/libcurl/gnurl_multi_info_read.3 | 2 +-
docs/libcurl/gnurl_multi_init.3 | 2 +-
docs/libcurl/gnurl_multi_perform.3 | 2 +-
docs/libcurl/gnurl_multi_poll.3 | 4 +-
docs/libcurl/gnurl_multi_remove_handle.3 | 4 +-
docs/libcurl/gnurl_multi_setopt.3 | 4 +-
docs/libcurl/gnurl_multi_socket.3 | 4 +-
docs/libcurl/gnurl_multi_socket_action.3 | 4 +-
docs/libcurl/gnurl_multi_strerror.3 | 2 +-
docs/libcurl/gnurl_multi_timeout.3 | 2 +-
docs/libcurl/gnurl_multi_wait.3 | 4 +-
docs/libcurl/gnurl_multi_wakeup.3 | 4 +-
docs/libcurl/gnurl_share_cleanup.3 | 4 +-
docs/libcurl/gnurl_share_init.3 | 2 +-
docs/libcurl/gnurl_share_setopt.3 | 2 +-
docs/libcurl/gnurl_share_strerror.3 | 2 +-
docs/libcurl/gnurl_slist_append.3 | 4 +-
docs/libcurl/gnurl_slist_free_all.3 | 4 +-
docs/libcurl/gnurl_strequal.3 | 4 +-
docs/libcurl/gnurl_unescape.3 | 2 +-
docs/libcurl/gnurl_url.3 | 4 +-
docs/libcurl/gnurl_url_cleanup.3 | 4 +-
docs/libcurl/gnurl_url_dup.3 | 4 +-
docs/libcurl/gnurl_url_get.3 | 4 +-
docs/libcurl/gnurl_url_set.3 | 4 +-
docs/libcurl/gnurl_version.3 | 2 +-
docs/libcurl/gnurl_version_info.3 | 8 +-
docs/libcurl/libgnurl-easy.3 | 2 +-
docs/libcurl/libgnurl-env.3 | 6 +-
docs/libcurl/libgnurl-errors.3 | 2 +-
docs/libcurl/libgnurl-multi.3 | 2 +-
docs/libcurl/libgnurl-security.3 | 6 +-
docs/libcurl/libgnurl-share.3 | 4 +-
docs/libcurl/libgnurl-thread.3 | 4 +-
docs/libcurl/libgnurl-tutorial.3 | 4 +-
docs/libcurl/libgnurl-url.3 | 4 +-
docs/libcurl/libgnurl.3 | 2 +-
docs/libcurl/libgnurl.m4 | 2 +-
docs/libcurl/mksymbolsmanpage.pl | 4 +-
docs/libcurl/opts/CMakeLists.txt | 2 +-
docs/libcurl/opts/CURLINFO_PROXY_ERROR.3 | 104 +++
docs/libcurl/opts/CURLOPT_HSTS.3 | 81 ++
...{GNURLOPT_READDATA.3 => CURLOPT_HSTSREADDATA.3} | 43 +-
docs/libcurl/opts/CURLOPT_HSTSREADFUNCTION.3 | 81 ++
...GNURLOPT_READDATA.3 => CURLOPT_HSTSWRITEDATA.3} | 41 +-
docs/libcurl/opts/CURLOPT_HSTSWRITEFUNCTION.3 | 79 ++
docs/libcurl/opts/CURLOPT_HSTS_CTRL.3 | 73 ++
...PT_SSL_ENABLE_NPN.3 => CURLOPT_SSL_EC_CURVES.3} | 27 +-
docs/libcurl/opts/GNURLINFO_ACTIVESOCKET.3 | 4 +-
docs/libcurl/opts/GNURLINFO_APPCONNECT_TIME.3 | 2 +-
docs/libcurl/opts/GNURLINFO_APPCONNECT_TIME_T.3 | 2 +-
docs/libcurl/opts/GNURLINFO_CERTINFO.3 | 2 +-
docs/libcurl/opts/GNURLINFO_CONDITION_UNMET.3 | 4 +-
docs/libcurl/opts/GNURLINFO_CONNECT_TIME.3 | 2 +-
docs/libcurl/opts/GNURLINFO_CONNECT_TIME_T.3 | 2 +-
.../opts/GNURLINFO_CONTENT_LENGTH_DOWNLOAD.3 | 4 +-
.../opts/GNURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3 | 4 +-
.../libcurl/opts/GNURLINFO_CONTENT_LENGTH_UPLOAD.3 | 4 +-
.../opts/GNURLINFO_CONTENT_LENGTH_UPLOAD_T.3 | 4 +-
docs/libcurl/opts/GNURLINFO_CONTENT_TYPE.3 | 4 +-
docs/libcurl/opts/GNURLINFO_COOKIELIST.3 | 4 +-
docs/libcurl/opts/GNURLINFO_EFFECTIVE_METHOD.3 | 4 +-
docs/libcurl/opts/GNURLINFO_EFFECTIVE_URL.3 | 4 +-
docs/libcurl/opts/GNURLINFO_FILETIME.3 | 2 +-
docs/libcurl/opts/GNURLINFO_FILETIME_T.3 | 2 +-
docs/libcurl/opts/GNURLINFO_FTP_ENTRY_PATH.3 | 2 +-
docs/libcurl/opts/GNURLINFO_HEADER_SIZE.3 | 4 +-
docs/libcurl/opts/GNURLINFO_HTTPAUTH_AVAIL.3 | 4 +-
docs/libcurl/opts/GNURLINFO_HTTP_CONNECTCODE.3 | 2 +-
docs/libcurl/opts/GNURLINFO_HTTP_VERSION.3 | 4 +-
docs/libcurl/opts/GNURLINFO_LASTSOCKET.3 | 4 +-
docs/libcurl/opts/GNURLINFO_LOCAL_IP.3 | 4 +-
docs/libcurl/opts/GNURLINFO_LOCAL_PORT.3 | 4 +-
docs/libcurl/opts/GNURLINFO_NAMELOOKUP_TIME.3 | 2 +-
docs/libcurl/opts/GNURLINFO_NAMELOOKUP_TIME_T.3 | 2 +-
docs/libcurl/opts/GNURLINFO_NUM_CONNECTS.3 | 4 +-
docs/libcurl/opts/GNURLINFO_OS_ERRNO.3 | 4 +-
docs/libcurl/opts/GNURLINFO_PRETRANSFER_TIME.3 | 2 +-
docs/libcurl/opts/GNURLINFO_PRETRANSFER_TIME_T.3 | 2 +-
docs/libcurl/opts/GNURLINFO_PRIMARY_IP.3 | 4 +-
docs/libcurl/opts/GNURLINFO_PRIMARY_PORT.3 | 4 +-
docs/libcurl/opts/GNURLINFO_PRIVATE.3 | 4 +-
docs/libcurl/opts/GNURLINFO_PROTOCOL.3 | 4 +-
docs/libcurl/opts/GNURLINFO_PROXYAUTH_AVAIL.3 | 4 +-
.../opts/GNURLINFO_PROXY_SSL_VERIFYRESULT.3 | 2 +-
docs/libcurl/opts/GNURLINFO_REDIRECT_COUNT.3 | 4 +-
docs/libcurl/opts/GNURLINFO_REDIRECT_TIME.3 | 2 +-
docs/libcurl/opts/GNURLINFO_REDIRECT_TIME_T.3 | 2 +-
docs/libcurl/opts/GNURLINFO_REDIRECT_URL.3 | 4 +-
docs/libcurl/opts/GNURLINFO_REQUEST_SIZE.3 | 4 +-
docs/libcurl/opts/GNURLINFO_RESPONSE_CODE.3 | 4 +-
docs/libcurl/opts/GNURLINFO_RETRY_AFTER.3 | 6 +-
docs/libcurl/opts/GNURLINFO_RTSP_CLIENT_CSEQ.3 | 2 +-
docs/libcurl/opts/GNURLINFO_RTSP_CSEQ_RECV.3 | 2 +-
docs/libcurl/opts/GNURLINFO_RTSP_SERVER_CSEQ.3 | 2 +-
docs/libcurl/opts/GNURLINFO_RTSP_SESSION_ID.3 | 2 +-
docs/libcurl/opts/GNURLINFO_SCHEME.3 | 4 +-
docs/libcurl/opts/GNURLINFO_SIZE_DOWNLOAD.3 | 4 +-
docs/libcurl/opts/GNURLINFO_SIZE_DOWNLOAD_T.3 | 4 +-
docs/libcurl/opts/GNURLINFO_SIZE_UPLOAD.3 | 4 +-
docs/libcurl/opts/GNURLINFO_SIZE_UPLOAD_T.3 | 4 +-
docs/libcurl/opts/GNURLINFO_SPEED_DOWNLOAD.3 | 4 +-
docs/libcurl/opts/GNURLINFO_SPEED_DOWNLOAD_T.3 | 4 +-
docs/libcurl/opts/GNURLINFO_SPEED_UPLOAD.3 | 4 +-
docs/libcurl/opts/GNURLINFO_SPEED_UPLOAD_T.3 | 4 +-
docs/libcurl/opts/GNURLINFO_SSL_ENGINES.3 | 2 +-
docs/libcurl/opts/GNURLINFO_SSL_VERIFYRESULT.3 | 2 +-
docs/libcurl/opts/GNURLINFO_STARTTRANSFER_TIME.3 | 2 +-
docs/libcurl/opts/GNURLINFO_STARTTRANSFER_TIME_T.3 | 2 +-
docs/libcurl/opts/GNURLINFO_TLS_SESSION.3 | 2 +-
docs/libcurl/opts/GNURLINFO_TLS_SSL_PTR.3 | 2 +-
docs/libcurl/opts/GNURLINFO_TOTAL_TIME.3 | 2 +-
docs/libcurl/opts/GNURLINFO_TOTAL_TIME_T.3 | 2 +-
.../opts/GNURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 | 2 +-
.../opts/GNURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_MAXCONNECTS.3 | 2 +-
.../opts/GNURLMOPT_MAX_CONCURRENT_STREAMS.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_MAX_HOST_CONNECTIONS.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_MAX_PIPELINE_LENGTH.3 | 2 +-
.../libcurl/opts/GNURLMOPT_MAX_TOTAL_CONNECTIONS.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_PIPELINING.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_PIPELINING_SERVER_BL.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_PIPELINING_SITE_BL.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_PUSHDATA.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_PUSHFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_SOCKETDATA.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_SOCKETFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_TIMERDATA.3 | 2 +-
docs/libcurl/opts/GNURLMOPT_TIMERFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_ABSTRACT_UNIX_SOCKET.3 | 2 +-
docs/libcurl/opts/GNURLOPT_ACCEPTTIMEOUT_MS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_ACCEPT_ENCODING.3 | 4 +-
docs/libcurl/opts/GNURLOPT_ADDRESS_SCOPE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_ALTSVC.3 | 9 +-
docs/libcurl/opts/GNURLOPT_ALTSVC_CTRL.3 | 12 +-
docs/libcurl/opts/GNURLOPT_APPEND.3 | 2 +-
docs/libcurl/opts/GNURLOPT_AUTOREFERER.3 | 4 +-
docs/libcurl/opts/GNURLOPT_BUFFERSIZE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CAINFO.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CAPATH.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CERTINFO.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CHUNK_BGN_FUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CHUNK_DATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CHUNK_END_FUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CLOSESOCKETDATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CLOSESOCKETFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CONNECTTIMEOUT.3 | 4 +-
docs/libcurl/opts/GNURLOPT_CONNECTTIMEOUT_MS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_CONNECT_ONLY.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CONNECT_TO.3 | 4 +-
.../opts/GNURLOPT_CONV_FROM_NETWORK_FUNCTION.3 | 2 +-
.../opts/GNURLOPT_CONV_FROM_UTF8_FUNCTION.3 | 2 +-
.../opts/GNURLOPT_CONV_TO_NETWORK_FUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_COOKIE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_COOKIEFILE.3 | 6 +-
docs/libcurl/opts/GNURLOPT_COOKIEJAR.3 | 4 +-
docs/libcurl/opts/GNURLOPT_COOKIELIST.3 | 4 +-
docs/libcurl/opts/GNURLOPT_COOKIESESSION.3 | 4 +-
docs/libcurl/opts/GNURLOPT_COPYPOSTFIELDS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_CRLF.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CRLFILE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_CURLU.3 | 4 +-
docs/libcurl/opts/GNURLOPT_CUSTOMREQUEST.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DEBUGDATA.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DEBUGFUNCTION.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DEFAULT_PROTOCOL.3 | 2 +-
docs/libcurl/opts/GNURLOPT_DIRLISTONLY.3 | 2 +-
.../opts/GNURLOPT_DISALLOW_USERNAME_IN_URL.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DNS_CACHE_TIMEOUT.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DNS_INTERFACE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DNS_LOCAL_IP4.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DNS_LOCAL_IP6.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DNS_SERVERS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DNS_SHUFFLE_ADDRESSES.3 | 2 +-
docs/libcurl/opts/GNURLOPT_DNS_USE_GLOBAL_CACHE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_DOH_URL.3 | 4 +-
docs/libcurl/opts/GNURLOPT_EGDSOCKET.3 | 2 +-
docs/libcurl/opts/GNURLOPT_ERRORBUFFER.3 | 4 +-
docs/libcurl/opts/GNURLOPT_EXPECT_100_TIMEOUT_MS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_FAILONERROR.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FILETIME.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FNMATCH_DATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FNMATCH_FUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FOLLOWLOCATION.3 | 4 +-
docs/libcurl/opts/GNURLOPT_FORBID_REUSE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FRESH_CONNECT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FTPPORT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FTPSSLAUTH.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FTP_ACCOUNT.3 | 2 +-
.../opts/GNURLOPT_FTP_ALTERNATIVE_TO_USER.3 | 2 +-
.../opts/GNURLOPT_FTP_CREATE_MISSING_DIRS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FTP_FILEMETHOD.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FTP_RESPONSE_TIMEOUT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FTP_SKIP_PASV_IP.3 | 10 +-
docs/libcurl/opts/GNURLOPT_FTP_SSL_CCC.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FTP_USE_EPRT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FTP_USE_EPSV.3 | 2 +-
docs/libcurl/opts/GNURLOPT_FTP_USE_PRET.3 | 2 +-
docs/libcurl/opts/GNURLOPT_GSSAPI_DELEGATION.3 | 2 +-
.../opts/GNURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_HAPROXYPROTOCOL.3 | 2 +-
docs/libcurl/opts/GNURLOPT_HEADER.3 | 4 +-
docs/libcurl/opts/GNURLOPT_HEADERDATA.3 | 4 +-
docs/libcurl/opts/GNURLOPT_HEADERFUNCTION.3 | 4 +-
docs/libcurl/opts/GNURLOPT_HEADEROPT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_HTTP09_ALLOWED.3 | 2 +-
docs/libcurl/opts/GNURLOPT_HTTP200ALIASES.3 | 4 +-
docs/libcurl/opts/GNURLOPT_HTTPAUTH.3 | 2 +-
docs/libcurl/opts/GNURLOPT_HTTPGET.3 | 4 +-
docs/libcurl/opts/GNURLOPT_HTTPHEADER.3 | 4 +-
docs/libcurl/opts/GNURLOPT_HTTPPOST.3 | 2 +-
docs/libcurl/opts/GNURLOPT_HTTPPROXYTUNNEL.3 | 2 +-
docs/libcurl/opts/GNURLOPT_HTTP_CONTENT_DECODING.3 | 2 +-
.../libcurl/opts/GNURLOPT_HTTP_TRANSFER_DECODING.3 | 2 +-
docs/libcurl/opts/GNURLOPT_HTTP_VERSION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_IGNORE_CONTENT_LENGTH.3 | 4 +-
docs/libcurl/opts/GNURLOPT_INFILESIZE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_INFILESIZE_LARGE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_INTERFACE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_INTERLEAVEDATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_INTERLEAVEFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_IOCTLDATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_IOCTLFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_IPRESOLVE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_ISSUERCERT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_ISSUERCERT_BLOB.3 | 2 +-
docs/libcurl/opts/GNURLOPT_KEEP_SENDING_ON_ERROR.3 | 2 +-
docs/libcurl/opts/GNURLOPT_KEYPASSWD.3 | 4 +-
docs/libcurl/opts/GNURLOPT_KRBLEVEL.3 | 2 +-
docs/libcurl/opts/GNURLOPT_LOCALPORT.3 | 4 +-
docs/libcurl/opts/GNURLOPT_LOCALPORTRANGE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_LOGIN_OPTIONS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_LOW_SPEED_LIMIT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_LOW_SPEED_TIME.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MAIL_AUTH.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MAIL_FROM.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MAIL_RCPT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MAIL_RCPT_ALLLOWFAILS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MAXAGE_CONN.3 | 4 +-
docs/libcurl/opts/GNURLOPT_MAXCONNECTS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MAXFILESIZE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MAXFILESIZE_LARGE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MAXREDIRS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_MAX_RECV_SPEED_LARGE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MAX_SEND_SPEED_LARGE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_MIMEPOST.3 | 4 +-
docs/libcurl/opts/GNURLOPT_NETRC.3 | 2 +-
docs/libcurl/opts/GNURLOPT_NETRC_FILE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_NEW_DIRECTORY_PERMS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_NEW_FILE_PERMS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_NOBODY.3 | 4 +-
docs/libcurl/opts/GNURLOPT_NOPROGRESS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_NOPROXY.3 | 8 +-
docs/libcurl/opts/GNURLOPT_NOSIGNAL.3 | 2 +-
docs/libcurl/opts/GNURLOPT_OPENSOCKETDATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_OPENSOCKETFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PASSWORD.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PATH_AS_IS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PINNEDPUBLICKEY.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PIPEWAIT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PORT.3 | 4 +-
docs/libcurl/opts/GNURLOPT_POST.3 | 4 +-
docs/libcurl/opts/GNURLOPT_POSTFIELDS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_POSTFIELDSIZE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_POSTFIELDSIZE_LARGE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_POSTQUOTE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_POSTREDIR.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PREQUOTE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PRE_PROXY.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PRIVATE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROGRESSDATA.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROGRESSFUNCTION.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROTOCOLS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROXYAUTH.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXYHEADER.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXYPASSWORD.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROXYPORT.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROXYTYPE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXYUSERNAME.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROXYUSERPWD.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROXY_CAINFO.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROXY_CAPATH.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROXY_CRLFILE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_ISSUERCERT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_ISSUERCERT_BLOB.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_KEYPASSWD.3 | 4 +-
docs/libcurl/opts/GNURLOPT_PROXY_PINNEDPUBLICKEY.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SERVICE_NAME.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSLCERT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSLCERTTYPE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSLCERT_BLOB.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSLKEY.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSLKEYTYPE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSLKEY_BLOB.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSLVERSION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSL_CIPHER_LIST.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSL_OPTIONS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSL_VERIFYHOST.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_SSL_VERIFYPEER.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_TLS13_CIPHERS.3 | 4 +-
.../libcurl/opts/GNURLOPT_PROXY_TLSAUTH_PASSWORD.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_TYPE.3 | 2 +-
.../libcurl/opts/GNURLOPT_PROXY_TLSAUTH_USERNAME.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PROXY_TRANSFER_MODE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_PUT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_QUOTE.3 | 10 +-
docs/libcurl/opts/GNURLOPT_RANDOM_FILE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_RANGE.3 | 6 +-
docs/libcurl/opts/GNURLOPT_READDATA.3 | 4 +-
docs/libcurl/opts/GNURLOPT_READFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_REDIR_PROTOCOLS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_REFERER.3 | 6 +-
docs/libcurl/opts/GNURLOPT_REQUEST_TARGET.3 | 4 +-
docs/libcurl/opts/GNURLOPT_RESOLVE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_RESOLVER_START_DATA.3 | 4 +-
.../opts/GNURLOPT_RESOLVER_START_FUNCTION.3 | 4 +-
docs/libcurl/opts/GNURLOPT_RESUME_FROM.3 | 2 +-
docs/libcurl/opts/GNURLOPT_RESUME_FROM_LARGE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_RTSP_CLIENT_CSEQ.3 | 2 +-
docs/libcurl/opts/GNURLOPT_RTSP_REQUEST.3 | 2 +-
docs/libcurl/opts/GNURLOPT_RTSP_SERVER_CSEQ.3 | 2 +-
docs/libcurl/opts/GNURLOPT_RTSP_SESSION_ID.3 | 2 +-
docs/libcurl/opts/GNURLOPT_RTSP_STREAM_URI.3 | 2 +-
docs/libcurl/opts/GNURLOPT_RTSP_TRANSPORT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SASL_AUTHZID.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SASL_IR.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SEEKDATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SEEKFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SERVICE_NAME.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SHARE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SOCKOPTDATA.3 | 4 +-
docs/libcurl/opts/GNURLOPT_SOCKOPTFUNCTION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SOCKS5_AUTH.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SOCKS5_GSSAPI_NEC.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SOCKS5_GSSAPI_SERVICE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSH_AUTH_TYPES.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSH_COMPRESSION.3 | 2 +-
.../opts/GNURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSH_KEYDATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSH_KEYFUNCTION.3 | 13 +-
docs/libcurl/opts/GNURLOPT_SSH_KNOWNHOSTS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSH_PRIVATE_KEYFILE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSH_PUBLIC_KEYFILE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSLCERT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSLCERTTYPE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSLCERT_BLOB.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSLENGINE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSLENGINE_DEFAULT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSLKEY.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSLKEYTYPE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSLKEY_BLOB.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSLVERSION.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSL_CIPHER_LIST.3 | 4 +-
docs/libcurl/opts/GNURLOPT_SSL_CTX_DATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSL_CTX_FUNCTION.3 | 4 +-
docs/libcurl/opts/GNURLOPT_SSL_ENABLE_ALPN.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSL_ENABLE_NPN.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSL_FALSESTART.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSL_OPTIONS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSL_SESSIONID_CACHE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSL_VERIFYHOST.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSL_VERIFYPEER.3 | 2 +-
docs/libcurl/opts/GNURLOPT_SSL_VERIFYSTATUS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_STDERR.3 | 4 +-
docs/libcurl/opts/GNURLOPT_STREAM_DEPENDS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_STREAM_DEPENDS_E.3 | 2 +-
docs/libcurl/opts/GNURLOPT_STREAM_WEIGHT.3 | 2 +-
.../opts/GNURLOPT_SUPPRESS_CONNECT_HEADERS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_TCP_FASTOPEN.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TCP_KEEPALIVE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TCP_KEEPIDLE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TCP_KEEPINTVL.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TCP_NODELAY.3 | 6 +-
docs/libcurl/opts/GNURLOPT_TELNETOPTIONS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_TFTP_BLKSIZE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_TFTP_NO_OPTIONS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_TIMECONDITION.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TIMEOUT.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TIMEOUT_MS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TIMEVALUE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TIMEVALUE_LARGE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TLS13_CIPHERS.3 | 4 +-
docs/libcurl/opts/GNURLOPT_TLSAUTH_PASSWORD.3 | 2 +-
docs/libcurl/opts/GNURLOPT_TLSAUTH_TYPE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_TLSAUTH_USERNAME.3 | 2 +-
docs/libcurl/opts/GNURLOPT_TRAILERDATA.3 | 2 +-
docs/libcurl/opts/GNURLOPT_TRAILERFUNCTION.3 | 6 +-
docs/libcurl/opts/GNURLOPT_TRANSFERTEXT.3 | 2 +-
docs/libcurl/opts/GNURLOPT_TRANSFER_ENCODING.3 | 4 +-
docs/libcurl/opts/GNURLOPT_UNIX_SOCKET_PATH.3 | 2 +-
docs/libcurl/opts/GNURLOPT_UNRESTRICTED_AUTH.3 | 4 +-
docs/libcurl/opts/GNURLOPT_UPKEEP_INTERVAL_MS.3 | 2 +-
docs/libcurl/opts/GNURLOPT_UPLOAD.3 | 2 +-
docs/libcurl/opts/GNURLOPT_UPLOAD_BUFFERSIZE.3 | 2 +-
docs/libcurl/opts/GNURLOPT_URL.3 | 21 +-
docs/libcurl/opts/GNURLOPT_USERAGENT.3 | 4 +-
docs/libcurl/opts/GNURLOPT_USERNAME.3 | 4 +-
docs/libcurl/opts/GNURLOPT_USERPWD.3 | 4 +-
docs/libcurl/opts/GNURLOPT_USE_SSL.3 | 2 +-
docs/libcurl/opts/GNURLOPT_VERBOSE.3 | 4 +-
docs/libcurl/opts/GNURLOPT_WILDCARDMATCH.3 | 4 +-
docs/libcurl/opts/GNURLOPT_WRITEDATA.3 | 4 +-
docs/libcurl/opts/GNURLOPT_WRITEFUNCTION.3 | 9 +-
docs/libcurl/opts/GNURLOPT_XFERINFODATA.3 | 4 +-
docs/libcurl/opts/GNURLOPT_XFERINFOFUNCTION.3 | 4 +-
docs/libcurl/opts/GNURLOPT_XOAUTH2_BEARER.3 | 2 +-
docs/libcurl/opts/Makefile.am | 4 +-
docs/libcurl/opts/Makefile.inc | 728 +++++++++---------
docs/libcurl/opts/template.3 | 2 +-
docs/libcurl/symbols-in-versions | 78 +-
docs/libcurl/symbols.pl | 2 +-
docs/mk-ca-bundle.1 | 6 +-
docs/options-in-versions | 3 +
gnurl-config.in | 2 +-
include/Makefile.am | 4 +-
include/README | 18 -
include/README.md | 14 +
include/gnurl/Makefile.am | 6 +-
include/gnurl/curl.h | 193 +++--
include/gnurl/curlver.h | 8 +-
include/gnurl/easy.h | 2 +-
include/gnurl/mprintf.h | 4 +-
include/gnurl/multi.h | 2 +-
include/gnurl/options.h | 68 ++
include/gnurl/stdcheaders.h | 4 +-
include/gnurl/system.h | 4 +-
include/gnurl/typecheck-gcc.h | 8 +-
include/gnurl/urlapi.h | 4 +-
lib/.gitattributes | 2 +-
lib/CMakeLists.txt | 17 +-
lib/Makefile.Watcom | 274 -------
lib/Makefile.am | 9 +-
lib/Makefile.inc | 10 +-
lib/Makefile.m32 | 40 +-
lib/Makefile.netware | 6 +-
lib/Makefile.vxworks | 2 +-
lib/altsvc.c | 36 +-
lib/altsvc.h | 13 +-
lib/amigaos.c | 4 +-
lib/amigaos.h | 4 +-
lib/arpa_telnet.h | 4 +-
lib/asyn-ares.c | 29 +-
lib/asyn-thread.c | 26 +-
lib/asyn.h | 2 +-
lib/base64.c | 7 +-
lib/checksrc.pl | 31 +-
lib/config-amigaos.h | 6 +-
lib/config-dos.h | 2 +-
lib/config-mac.h | 4 +-
lib/config-os400.h | 5 +-
lib/config-plan9.h | 4 +-
lib/config-riscos.h | 2 +-
lib/config-symbian.h | 793 -------------------
lib/config-tpf.h | 4 +-
lib/config-vxworks.h | 2 +-
lib/config-win32.h | 2 +-
lib/config-win32ce.h | 4 +-
lib/conncache.c | 36 +-
lib/conncache.h | 6 +-
lib/connect.c | 133 ++--
lib/connect.h | 4 +-
lib/content_encoding.c | 6 +-
lib/content_encoding.h | 2 +-
lib/cookie.c | 4 +-
lib/cookie.h | 4 +-
lib/curl_addrinfo.c | 2 +-
lib/curl_addrinfo.h | 2 +-
lib/curl_base64.h | 4 +-
lib/curl_config.h.cmake | 20 +-
lib/curl_ctype.c | 4 +-
lib/curl_ctype.h | 4 +-
lib/curl_des.c | 4 +-
lib/curl_des.h | 4 +-
lib/curl_endian.c | 4 +-
lib/curl_endian.h | 4 +-
lib/curl_fnmatch.c | 4 +-
lib/curl_fnmatch.h | 4 +-
lib/curl_get_line.c | 9 +-
lib/curl_get_line.h | 4 +-
lib/curl_gethostname.c | 6 +-
lib/curl_gethostname.h | 6 +-
lib/curl_gssapi.c | 4 +-
lib/curl_gssapi.h | 4 +-
lib/curl_hmac.h | 2 +-
lib/{curl_sec.h => curl_krb5.h} | 14 +-
lib/curl_ldap.h | 4 +-
lib/curl_md4.h | 2 +-
lib/curl_md5.h | 2 +-
lib/curl_memory.h | 4 +-
lib/curl_memrchr.c | 4 +-
lib/curl_memrchr.h | 4 +-
lib/curl_multibyte.c | 2 +-
lib/curl_multibyte.h | 2 +-
lib/curl_ntlm_core.c | 18 +-
lib/curl_ntlm_core.h | 10 +-
lib/curl_ntlm_wb.c | 2 +-
lib/curl_ntlm_wb.h | 4 +-
lib/curl_path.c | 6 +-
lib/curl_path.h | 4 +-
lib/curl_printf.h | 4 +-
lib/curl_range.c | 4 +-
lib/curl_range.h | 4 +-
lib/curl_rtmp.c | 10 +-
lib/curl_rtmp.h | 4 +-
lib/curl_sasl.c | 2 +-
lib/curl_sasl.h | 4 +-
lib/curl_setup.h | 36 +-
lib/curl_setup_once.h | 2 +-
lib/curl_sha256.h | 2 +-
lib/curl_sspi.c | 2 +-
lib/curl_sspi.h | 4 +-
lib/curl_threads.c | 8 +-
lib/curl_threads.h | 4 +-
lib/curlx.h | 2 +-
lib/dict.c | 97 ++-
lib/dict.h | 4 +-
lib/doh.c | 11 +-
lib/doh.h | 2 +-
lib/dotdot.c | 2 +-
lib/dotdot.h | 4 +-
lib/dynbuf.c | 50 +-
lib/dynbuf.h | 27 +-
lib/easy.c | 46 +-
lib/easygetopt.c | 96 +++
lib/easyif.h | 2 +-
lib/easyoptions.c | 353 +++++++++
src/tool_strdup.c => lib/easyoptions.h | 27 +-
lib/escape.c | 4 +-
lib/escape.h | 2 +-
lib/file.c | 30 +-
lib/file.h | 4 +-
lib/fileinfo.c | 4 +-
lib/fileinfo.h | 6 +-
lib/firefox-db2pem.sh | 2 +-
lib/formdata.c | 2 +-
lib/formdata.h | 2 +-
lib/ftp.c | 670 ++++++++--------
lib/ftp.h | 3 +-
lib/ftplistparser.c | 10 +-
lib/ftplistparser.h | 4 +-
lib/getenv.c | 2 +-
lib/getinfo.c | 5 +-
lib/getinfo.h | 4 +-
lib/gopher.c | 9 +-
lib/gopher.h | 4 +-
lib/hash.c | 84 +-
lib/hash.h | 50 +-
lib/hmac.c | 2 +-
lib/hostasyn.c | 2 +-
lib/hostcheck.c | 4 +-
lib/hostcheck.h | 4 +-
lib/hostip.c | 8 +-
lib/hostip.h | 10 +-
lib/hostip4.c | 2 +-
lib/hostip6.c | 2 +-
lib/hostsyn.c | 4 +-
lib/hsts.c | 522 +++++++++++++
lib/hsts.h | 65 ++
lib/http.c | 83 +-
lib/http.h | 2 +-
lib/http2.c | 178 ++---
lib/http2.h | 2 +-
lib/http_chunks.c | 2 +-
lib/http_chunks.h | 4 +-
lib/http_digest.c | 2 +-
lib/http_digest.h | 2 +-
lib/http_negotiate.c | 2 +-
lib/http_negotiate.h | 2 +-
lib/http_ntlm.c | 2 +-
lib/http_ntlm.h | 2 +-
lib/http_proxy.c | 32 +-
lib/http_proxy.h | 2 +-
lib/idn_win32.c | 2 +-
lib/if2ip.c | 2 +-
lib/if2ip.h | 4 +-
lib/imap.c | 65 +-
lib/imap.h | 7 +-
lib/inet_ntop.h | 4 +-
lib/inet_pton.c | 4 +-
lib/inet_pton.h | 4 +-
lib/krb5.c | 595 ++++++++++++++-
lib/ldap.c | 72 +-
lib/libcurl.rc | 8 +-
lib/libgnurl.plist | 2 +-
lib/llist.c | 14 +-
lib/llist.h | 30 +-
lib/makefile.amiga | 2 +-
lib/makefile.dj | 2 +-
lib/md4.c | 2 +-
lib/md5.c | 2 +-
lib/memdebug.c | 53 +-
lib/memdebug.h | 2 +-
lib/mime.c | 2 +-
lib/mime.h | 2 +-
lib/mk-ca-bundle.pl | 2 +-
lib/mk-ca-bundle.vbs | 2 +-
lib/mprintf.c | 57 +-
lib/mqtt.c | 40 +-
lib/mqtt.h | 4 +-
lib/multi.c | 94 ++-
lib/multihandle.h | 16 +-
lib/multiif.h | 2 +-
lib/netrc.c | 4 +-
lib/netrc.h | 4 +-
lib/non-ascii.c | 4 +-
lib/non-ascii.h | 4 +-
lib/nonblock.c | 4 +-
lib/nonblock.h | 4 +-
lib/nwlib.c | 2 +-
lib/nwos.c | 4 +-
lib/openldap.c | 14 +-
lib/optiontable.pl | 118 +++
lib/parsedate.c | 59 +-
lib/parsedate.h | 4 +-
lib/pingpong.c | 61 +-
lib/pingpong.h | 6 +-
lib/pop3.c | 19 +-
lib/pop3.h | 4 +-
lib/progress.c | 17 +-
lib/progress.h | 6 +-
lib/psl.c | 4 +-
lib/psl.h | 4 +-
lib/quic.h | 4 +-
lib/rand.c | 4 +-
lib/rand.h | 4 +-
lib/rename.c | 6 +-
lib/rename.h | 2 +-
lib/rtsp.c | 46 +-
lib/rtsp.h | 4 +-
lib/security.c | 579 --------------
lib/select.c | 177 ++---
lib/select.h | 17 +-
lib/sendf.c | 179 ++---
lib/sendf.h | 6 +-
lib/setopt.c | 294 ++++---
lib/setopt.h | 2 +-
lib/setup-os400.h | 2 +-
lib/setup-vms.h | 2 +-
lib/setup-win32.h | 5 +-
lib/sha256.c | 2 +-
lib/share.c | 4 +-
lib/share.h | 8 +-
lib/sigpipe.h | 4 +-
lib/slist.c | 4 +-
lib/slist.h | 4 +-
lib/smb.c | 33 +-
lib/smb.h | 11 +-
lib/smtp.c | 27 +-
lib/smtp.h | 2 +-
lib/sockaddr.h | 4 +-
lib/socketpair.c | 6 +-
lib/socketpair.h | 4 +-
lib/socks.c | 169 ++--
lib/socks.h | 28 +-
lib/socks_gssapi.c | 6 +-
lib/socks_sspi.c | 2 +-
lib/speedcheck.c | 4 +-
lib/speedcheck.h | 4 +-
lib/splay.c | 10 +-
lib/splay.h | 16 +-
lib/strcase.c | 2 +-
lib/strcase.h | 2 +-
lib/strdup.c | 2 +-
lib/strdup.h | 4 +-
lib/strerror.c | 44 +-
lib/strerror.h | 2 +-
lib/strtok.c | 2 +-
lib/strtok.h | 4 +-
lib/strtoofft.c | 4 +-
lib/strtoofft.h | 4 +-
lib/system_win32.c | 13 +-
lib/system_win32.h | 2 +-
lib/telnet.c | 164 +---
lib/telnet.h | 4 +-
lib/tftp.c | 3 +-
lib/tftp.h | 4 +-
lib/timeval.c | 2 +-
lib/timeval.h | 4 +-
lib/transfer.c | 19 +-
lib/transfer.h | 4 +-
lib/url.c | 223 ++----
lib/url.h | 2 +-
lib/urlapi-int.h | 6 +-
lib/urlapi.c | 48 +-
lib/urldata.h | 91 ++-
lib/vauth/cleartext.c | 2 +-
lib/vauth/cram.c | 2 +-
lib/vauth/digest.c | 2 +-
lib/vauth/digest.h | 4 +-
lib/vauth/digest_sspi.c | 2 +-
lib/vauth/krb5_gssapi.c | 4 +-
lib/vauth/krb5_sspi.c | 2 +-
lib/vauth/ntlm.c | 3 +-
lib/vauth/ntlm.h | 4 +-
lib/vauth/ntlm_sspi.c | 2 +-
lib/vauth/oauth2.c | 4 +-
lib/vauth/spnego_gssapi.c | 4 +-
lib/vauth/spnego_sspi.c | 2 +-
lib/vauth/vauth.c | 2 +-
lib/vauth/vauth.h | 4 +-
lib/version.c | 24 +-
lib/version_win32.c | 2 +-
lib/version_win32.h | 2 +-
lib/vquic/ngtcp2.c | 96 ++-
lib/vquic/ngtcp2.h | 4 +-
lib/vquic/quiche.c | 43 +-
lib/vquic/quiche.h | 5 +-
lib/vquic/vquic.c | 2 +-
lib/vquic/vquic.h | 2 +-
lib/vssh/libssh.c | 69 +-
lib/vssh/libssh2.c | 217 ++++--
lib/vssh/ssh.h | 8 +-
lib/vssh/wolfssh.c | 10 +-
lib/vssh/wolfssh.h | 2 +-
lib/vtls/bearssl.c | 2 +-
lib/vtls/bearssl.h | 4 +-
lib/vtls/gskit.c | 4 +-
lib/vtls/gskit.h | 4 +-
lib/vtls/gtls.c | 72 +-
lib/vtls/gtls.h | 4 +-
lib/vtls/keylog.c | 2 +-
lib/vtls/keylog.h | 2 +-
lib/vtls/mbedtls.c | 16 +-
lib/vtls/mbedtls.h | 4 +-
lib/vtls/mbedtls_threadlock.c | 2 +-
lib/vtls/mbedtls_threadlock.h | 2 +-
lib/vtls/mesalink.c | 24 +-
lib/vtls/mesalink.h | 6 +-
lib/vtls/nss.c | 67 +-
lib/vtls/nssg.h | 4 +-
lib/vtls/openssl.c | 253 +++---
lib/vtls/openssl.h | 4 +-
lib/vtls/schannel.c | 57 +-
lib/vtls/schannel.h | 12 +-
lib/vtls/schannel_verify.c | 2 +-
lib/vtls/sectransp.c | 26 +-
lib/vtls/sectransp.h | 4 +-
lib/vtls/vtls.c | 17 +-
lib/vtls/vtls.h | 18 +-
lib/vtls/wolfssl.c | 24 +-
lib/vtls/wolfssl.h | 4 +-
lib/warnless.c | 4 +-
lib/warnless.h | 2 +-
lib/wildcard.c | 4 +-
lib/wildcard.h | 14 +-
lib/x509asn1.c | 2 +-
lib/x509asn1.h | 2 +-
libgnurl.pc.in | 4 +-
m4/curl-compilers.m4 | 10 +-
m4/curl-confopts.m4 | 44 +-
m4/curl-functions.m4 | 2 +-
m4/curl-openssl.m4 | 2 +-
m4/curl-override.m4 | 2 +-
m4/curl-reentrant.m4 | 2 +-
maketgz | 4 +-
packages/Android/Android.mk | 2 +-
packages/DOS/common.dj | 2 +-
packages/Makefile.am | 20 +-
packages/OS400/ccsidcurl.c | 69 +-
packages/OS400/ccsidcurl.h | 56 +-
packages/OS400/chkstrings.c | 34 +-
packages/OS400/curl.inc.in | 30 +-
packages/OS400/initscript.sh | 2 +-
packages/OS400/make-include.sh | 2 +-
packages/OS400/make-lib.sh | 2 +-
packages/OS400/make-src.sh | 2 +-
packages/OS400/make-tests.sh | 2 +-
packages/OS400/makefile.sh | 2 +-
packages/OS400/os400sys.c | 412 ++++------
packages/OS400/os400sys.h | 2 +-
packages/Symbian/bwins/libcurlu.def | 60 --
packages/Symbian/eabi/libcurlu.def | 60 --
packages/Symbian/group/bld.inf | 10 -
packages/Symbian/group/curl.iby | 15 -
packages/Symbian/group/curl.mmp | 64 --
packages/Symbian/group/curl.pkg | 26 -
packages/Symbian/group/libcurl.iby | 14 -
packages/Symbian/group/libcurl.mmp | 67 --
packages/Symbian/group/libcurl.pkg | 22 -
packages/Symbian/readme.txt | 93 ---
packages/TPF/curl.mak | 2 +-
packages/TPF/maketpf.env_curl | 2 +-
packages/TPF/maketpf.env_curllib | 2 +-
packages/vms/Makefile.am | 2 +-
packages/vms/curl_crtl_init.c | 2 +-
packages/vms/curl_gnv_build_steps.txt | 2 +-
packages/vms/curlmsg.h | 2 +-
packages/vms/curlmsg.msg | 2 +-
packages/vms/curlmsg_vms.h | 2 +-
plan9/include/mkfile | 4 +-
plan9/lib/mkfile | 4 +-
plan9/lib/mkfile.inc | 4 +-
plan9/mkfile | 4 +-
plan9/mkfile.proto | 4 +-
plan9/src/mkfile | 4 +-
plan9/src/mkfile.inc | 4 +-
scripts/Makefile.am | 2 +-
scripts/completion.pl | 4 +-
scripts/contributors.sh | 4 +-
scripts/contrithanks.sh | 6 +-
scripts/copyright.pl | 15 +-
scripts/coverage.sh | 2 +-
scripts/delta | 39 +-
scripts/installcheck.sh | 2 +-
scripts/log2changes.pl | 2 +-
scripts/release-notes.pl | 11 +-
scripts/singleuse.pl | 2 +-
scripts/travis/before_script.sh | 2 +-
scripts/travis/iconv-env.sh | 2 +-
scripts/travis/script.sh | 5 +-
scripts/updatemanpages.pl | 2 +-
src/CMakeLists.txt | 8 +-
src/Makefile.Watcom | 234 ------
src/Makefile.am | 6 +-
src/Makefile.inc | 8 +-
src/Makefile.m32 | 41 +-
src/Makefile.netware | 6 +-
src/curl.rc | 8 +-
src/makefile.amiga | 2 +-
src/makefile.dj | 2 +-
src/mkhelp.pl.in | 4 +-
src/slist_wc.c | 4 +-
src/slist_wc.h | 4 +-
src/tool_binmode.c | 4 +-
src/tool_binmode.h | 4 +-
src/tool_bname.c | 4 +-
src/tool_bname.h | 4 +-
src/tool_cb_dbg.c | 4 +-
src/tool_cb_dbg.h | 4 +-
src/tool_cb_hdr.c | 70 +-
src/tool_cb_hdr.h | 4 +-
src/tool_cb_prg.c | 2 +-
src/tool_cb_prg.h | 4 +-
src/tool_cb_rea.c | 2 +-
src/tool_cb_rea.h | 4 +-
src/tool_cb_see.c | 2 +-
src/tool_cb_see.h | 2 +-
src/tool_cb_wrt.c | 34 +-
src/tool_cb_wrt.h | 2 +-
src/tool_cfgable.c | 5 +-
src/tool_cfgable.h | 6 +-
src/tool_convert.c | 4 +-
src/tool_convert.h | 4 +-
src/tool_dirhie.c | 2 +-
src/tool_dirhie.h | 4 +-
src/tool_doswin.c | 2 +-
src/tool_doswin.h | 2 +-
src/tool_easysrc.c | 8 +-
src/tool_easysrc.h | 4 +-
src/tool_filetime.c | 7 +-
src/tool_filetime.h | 4 +-
src/tool_formparse.c | 2 +-
src/tool_formparse.h | 2 +-
src/tool_getparam.c | 28 +-
src/tool_getparam.h | 4 +-
src/tool_getpass.c | 12 +-
src/tool_getpass.h | 4 +-
src/tool_help.c | 848 +++++++++++++++------
src/tool_help.h | 6 +-
src/tool_helpers.c | 4 +-
src/tool_helpers.h | 4 +-
src/tool_homedir.c | 48 +-
src/tool_homedir.h | 6 +-
src/tool_hugehelp.c.cvs | 2 +-
src/tool_hugehelp.h | 4 +-
src/tool_libinfo.c | 4 +-
src/tool_libinfo.h | 4 +-
src/tool_main.c | 7 +-
src/tool_main.h | 4 +-
src/tool_metalink.c | 2 +-
src/tool_metalink.h | 2 +-
src/tool_msgs.c | 4 +-
src/tool_msgs.h | 4 +-
src/tool_operate.c | 140 ++--
src/tool_operate.h | 7 +-
src/tool_operhlp.c | 2 +-
src/tool_operhlp.h | 4 +-
src/tool_panykey.c | 12 +-
src/tool_panykey.h | 10 +-
src/tool_paramhlp.c | 118 +--
src/tool_paramhlp.h | 4 +-
src/tool_parsecfg.c | 73 +-
src/tool_parsecfg.h | 4 +-
src/tool_progress.c | 6 +-
src/tool_progress.h | 4 +-
src/tool_sdecls.h | 2 +-
src/tool_setopt.c | 63 +-
src/tool_setopt.h | 15 +-
src/tool_setup.h | 4 +-
src/tool_sleep.c | 2 +-
src/tool_sleep.h | 4 +-
src/tool_strdup.c | 2 +-
src/tool_strdup.h | 4 +-
src/tool_urlglob.c | 52 +-
src/tool_urlglob.h | 2 +-
src/tool_util.c | 2 +-
src/tool_util.h | 4 +-
src/tool_version.h | 4 +-
src/tool_vms.c | 2 +-
src/tool_vms.h | 4 +-
src/tool_writeout.c | 95 +--
src/tool_writeout.h | 6 +-
src/tool_writeout_json.c | 24 +-
src/tool_writeout_json.h | 6 +-
src/tool_xattr.c | 4 +-
src/tool_xattr.h | 4 +-
tests/CMakeLists.txt | 7 +-
tests/FILEFORMAT.md | 42 +-
tests/Makefile.am | 21 +-
tests/{README => README.md} | 214 ++----
tests/appveyor.pm | 12 +-
tests/azure.pm | 21 +-
tests/badsymbols.pl.in | 2 +-
tests/certs/Makefile.am | 2 +-
tests/certs/scripts/Makefile.am | 2 +-
tests/convsrctest.pl.in | 2 +-
tests/data/CMakeLists.txt | 2 +-
tests/data/DISABLED | 30 +-
tests/data/Makefile.am | 2 +-
tests/data/Makefile.inc | 91 ++-
tests/data/test1 | 4 +-
tests/data/test10 | 4 +-
tests/data/test1001 | 6 +-
tests/data/test1002 | 10 +-
tests/data/test1004 | 4 +-
tests/data/test1008 | 7 +-
tests/data/test1011 | 6 +-
tests/data/test1012 | 6 +-
tests/data/test1015 | 5 +-
tests/data/test1021 | 8 +-
tests/data/test1024 | 6 +-
tests/data/test1025 | 6 +-
tests/data/test1028 | 4 +-
tests/data/test1029 | 4 +-
tests/data/test1030 | 6 +-
tests/data/test1031 | 5 +-
tests/data/test1032 | 4 +-
tests/data/test1033 | 4 +-
tests/data/test1035 | 3 -
tests/data/test1040 | 4 +-
tests/data/test1041 | 4 +-
tests/data/test1042 | 4 +-
tests/data/test1043 | 4 +-
tests/data/test1045 | 4 +-
tests/data/test1046 | 4 +-
tests/data/test1051 | 5 +-
tests/data/test1052 | 5 +-
tests/data/test1053 | 6 +-
tests/data/test1054 | 5 +-
tests/data/test1055 | 4 +-
tests/data/test1056 | 5 +-
tests/data/test1058 | 4 +-
tests/data/test1059 | 4 +-
tests/data/test1060 | 10 +-
tests/data/test1061 | 10 +-
tests/data/test1064 | 5 +-
tests/data/test1065 | 5 +-
tests/data/test1066 | 5 +-
tests/data/test1067 | 5 +-
tests/data/test1068 | 4 +-
tests/data/test1070 | 4 +-
tests/data/test1071 | 5 +-
tests/data/test1072 | 4 +-
tests/data/test1073 | 4 +-
tests/data/test1074 | 5 +-
tests/data/test1075 | 5 +-
tests/data/test1076 | 6 +-
tests/data/test1077 | 5 +-
tests/data/test1078 | 6 +-
tests/data/test1079 | 5 +-
tests/data/test1080 | 5 +-
tests/data/test1081 | 5 +-
tests/data/test1082 | 4 +-
tests/data/test1083 | 4 +-
tests/data/test1087 | 6 +-
tests/data/test1088 | 6 +-
tests/data/test1089 | 5 +-
tests/data/test1090 | 5 +-
tests/data/test1092 | 4 +-
tests/data/test1095 | 6 +-
tests/data/test1096 | 1 +
tests/data/test1097 | 7 +-
tests/data/test1098 | 5 +-
tests/data/test11 | 5 +-
tests/data/test1100 | 10 +-
tests/data/test1101 | 4 +-
tests/data/test1104 | 5 +-
tests/data/test1105 | 6 +-
tests/data/test1106 | 4 +-
tests/data/test1109 | 4 +-
tests/data/test1110 | 4 +-
tests/data/test1111 | 4 +-
tests/data/test1115 | 4 +-
tests/data/test1116 | 4 +-
tests/data/test1117 | 5 +-
tests/data/test1118 | 4 +-
tests/data/test1119 | 1 -
tests/data/test1121 | 4 +-
tests/data/test1122 | 4 +-
tests/data/test1123 | 4 +-
tests/data/test1124 | 4 +-
tests/data/test1125 | 4 +-
tests/data/test1126 | 4 +-
tests/data/test1127 | 4 +-
tests/data/test1128 | 5 +-
tests/data/test1129 | 7 +-
tests/data/test1130 | 5 +-
tests/data/test1131 | 5 +-
tests/data/test1133 | 4 +-
tests/data/test1134 | 5 +-
tests/data/test1136 | 2 +-
tests/data/test1138 | 6 +-
tests/data/test1141 | 5 +-
tests/data/test1142 | 4 +-
tests/data/test1143 | 4 +-
tests/data/test1144 | 4 +-
tests/data/test1148 | 4 +-
tests/data/test1150 | 5 +-
tests/data/test1151 | 6 +-
tests/data/test1154 | 6 +-
tests/data/test1155 | 6 +-
tests/data/test1157 | 4 +-
tests/data/test1158 | 4 +-
tests/data/test1159 | 4 +-
tests/data/test1160 | 6 +-
tests/data/test1161 | 6 +-
tests/data/test1164 | 4 +-
tests/data/test1166 | 5 +-
tests/data/test1168 | 5 +-
tests/data/test1170 | 4 +-
tests/data/test1171 | 4 +-
tests/data/test1172 | 4 +-
tests/data/test1174 | 4 +-
tests/data/test1176 | 4 +-
tests/data/test1178 | 4 +-
tests/data/test118 | 1 +
tests/data/test119 | 1 +
tests/data/test1197 | 5 +-
tests/data/test12 | 4 +-
tests/data/test1204 | 5 +-
tests/data/test1205 | 4 +-
tests/data/test1210 | 4 +-
tests/data/test1212 | 4 +-
tests/data/test1213 | 4 +-
tests/data/test1214 | 4 +-
tests/data/test1215 | 7 +-
tests/data/test1216 | 5 +-
tests/data/test1218 | 6 +-
tests/data/test1221 | 53 --
tests/data/test1222 | 53 --
tests/data/test1223 | 4 +-
tests/data/test1228 | 5 +-
tests/data/test1229 | 5 +-
tests/data/test1230 | 5 +-
tests/data/test1231 | 5 +-
tests/data/test1232 | 5 +-
tests/data/test1235 | 11 +-
tests/data/test1237 | 4 +-
tests/data/test1239 | 4 +-
tests/data/test1240 | 5 +-
tests/data/test1241 | 5 +-
tests/data/test1244 | 4 +-
tests/data/test1245 | 4 +-
tests/data/test1246 | 5 +-
tests/data/test1248 | 4 +-
tests/data/test1249 | 4 +-
tests/data/test1250 | 4 +-
tests/data/test1251 | 4 +-
tests/data/test1252 | 4 +-
tests/data/test1253 | 4 +-
tests/data/test1254 | 4 +-
tests/data/test1255 | 4 +-
tests/data/test1256 | 4 +-
tests/data/test1257 | 4 +-
tests/data/test1258 | 5 +-
tests/data/test1259 | 4 +-
tests/data/test1261 | 4 +-
tests/data/test1265 | 4 +-
tests/data/test1266 | 4 +-
tests/data/test1267 | 4 +-
tests/data/test1270 | 4 +-
tests/data/test1271 | 4 +-
tests/data/test1280 | 7 +-
tests/data/test1283 | 4 +-
tests/data/test1284 | 5 +-
tests/data/test1285 | 5 +-
tests/data/test1286 | 7 +-
tests/data/test1287 | 5 +-
tests/data/test1288 | 5 +-
tests/data/test1290 | 4 +-
tests/data/test1292 | 4 +-
tests/data/test1293 | 4 +-
tests/data/test1294 | 4 +-
tests/data/test1295 | 4 +-
tests/data/test1296 | 4 +-
tests/data/test1297 | 65 ++
tests/data/test1298 | 4 +-
tests/data/test1299 | 4 +-
tests/data/test13 | 4 +-
tests/data/test1310 | 7 +-
tests/data/test1311 | 4 +-
tests/data/test1312 | 4 +-
tests/data/test1313 | 4 +-
tests/data/test1314 | 5 +-
tests/data/test1315 | 4 +-
tests/data/test1317 | 4 +-
tests/data/test1318 | 5 +-
tests/data/test1319 | 5 +-
tests/data/test1320 | 5 +-
tests/data/test1321 | 5 +-
tests/data/test1322 | 4 +-
tests/data/test1324 | 4 +-
tests/data/test1325 | 5 +-
tests/data/test1328 | 5 +-
tests/data/test1331 | 5 +-
tests/data/test1332 | 6 +-
tests/data/test1333 | 4 +-
tests/data/test1334 | 4 +-
tests/data/test1335 | 4 +-
tests/data/test1336 | 4 +-
tests/data/test1337 | 4 +-
tests/data/test1338 | 4 +-
tests/data/test1339 | 4 +-
tests/data/test1340 | 4 +-
tests/data/test1341 | 4 +-
tests/data/test1342 | 4 +-
tests/data/test1343 | 4 +-
tests/data/test1344 | 4 +-
tests/data/test1345 | 4 +-
tests/data/test1346 | 4 +-
tests/data/test1347 | 4 +-
tests/data/test1364 | 4 +-
tests/data/test1365 | 4 +-
tests/data/test1366 | 4 +-
tests/data/test1367 | 4 +-
tests/data/test1368 | 4 +-
tests/data/test1369 | 4 +-
tests/data/test1370 | 4 +-
tests/data/test1371 | 4 +-
tests/data/test1372 | 4 +-
tests/data/test1373 | 4 +-
tests/data/test1374 | 4 +-
tests/data/test1375 | 4 +-
tests/data/test1376 | 4 +-
tests/data/test1377 | 4 +-
tests/data/test138 | 1 +
tests/data/test14 | 5 +-
tests/data/test1400 | 8 +-
tests/data/test1401 | 8 +-
tests/data/test1402 | 8 +-
tests/data/test1403 | 8 +-
tests/data/test1404 | 7 +-
tests/data/test1405 | 3 +-
tests/data/test1406 | 3 +-
tests/data/test1407 | 3 +-
tests/data/test1408 | 5 +-
tests/data/test1411 | 4 +-
tests/data/test1412 | 10 +-
tests/data/test1413 | 5 +-
tests/data/test1415 | 6 +-
tests/data/test1416 | 4 +-
tests/data/test1417 | 4 +-
tests/data/test1418 | 7 +-
tests/data/test1419 | 5 +-
tests/data/test1420 | 3 +-
tests/data/test1421 | 5 +-
tests/data/test1422 | 4 +-
tests/data/test1423 | 4 +-
tests/data/test1424 | 4 +-
tests/data/test1425 | Bin 1726 -> 1721 bytes
tests/data/test1426 | Bin 1663 -> 1658 bytes
tests/data/test1428 | 7 +-
tests/data/test1429 | 4 +-
tests/data/test1430 | 4 +-
tests/data/test1431 | 4 +-
tests/data/test1432 | 4 +-
tests/data/test1433 | 4 +-
tests/data/test1434 | 4 +-
tests/data/test1435 | 4 +-
tests/data/test1436 | 6 +-
tests/data/test1437 | 6 +-
tests/data/test1438 | 4 +-
tests/data/test1439 | 6 +-
tests/data/test1443 | 4 +-
tests/data/test1448 | 5 +-
tests/data/test1455 | 4 +-
tests/data/test1456 | 5 +-
tests/data/test1457 | 4 +-
tests/data/test1458 | 4 +-
tests/data/test1460 | 3 -
tests/data/test1461 | 53 ++
tests/data/test1462 | 61 ++
tests/data/{test76 => test1463} | 23 +-
tests/data/{test702 => test1464} | 34 +-
tests/data/{test1402 => test1465} | Bin 3016 -> 2964 bytes
tests/data/test15 | 4 +-
tests/data/test150 | 7 +-
tests/data/test1502 | 3 -
tests/data/test1503 | 3 -
tests/data/test1504 | 3 -
tests/data/test1505 | 3 -
tests/data/test151 | 5 +-
tests/data/test152 | 5 +-
tests/data/test1524 | 6 +-
tests/data/test153 | 10 +-
tests/data/test1538 | 3 +-
tests/data/test154 | 6 +-
tests/data/test155 | 7 +-
tests/data/test1551 | 3 -
tests/data/test1556 | 5 +-
tests/data/test156 | 5 +-
tests/data/test1561 | 9 +-
tests/data/test1562 | 6 +-
tests/data/test1563 | 4 +-
tests/data/test1566 | 6 +-
tests/data/test1567 | 3 -
tests/data/test157 | 4 +-
tests/data/test158 | 3 +-
tests/data/test159 | 5 +-
tests/data/test1591 | 3 -
tests/data/test1593 | 3 -
tests/data/test1594 | 3 -
tests/data/test1595 | 3 -
tests/data/test1596 | 3 -
tests/data/test16 | 4 +-
tests/data/test160 | 5 +-
tests/data/test162 | 5 +-
tests/data/test163 | 4 +-
tests/data/test1630 | 4 +-
tests/data/test1631 | 3 +-
tests/data/test1632 | 3 +-
tests/data/test1633 | 7 +-
tests/data/test164 | 4 +-
tests/data/test165 | 5 +-
tests/data/test1653 | 2 +-
tests/data/test1654 | 2 +-
tests/data/test166 | 4 +-
tests/data/test1660 | 81 ++
tests/data/test167 | 7 +-
tests/data/test168 | 9 +-
tests/data/test169 | 9 +-
tests/data/test170 | 5 +-
tests/data/test1700 | 7 +-
tests/data/test1701 | 5 +-
tests/data/test1702 | 5 +-
tests/data/test171 | 6 +-
tests/data/test172 | 6 +-
tests/data/test173 | 4 +-
tests/data/test174 | 5 +-
tests/data/test175 | 7 +-
tests/data/test176 | 7 +-
tests/data/test177 | 5 +-
tests/data/test178 | 4 +-
tests/data/test179 | 4 +-
tests/data/test18 | 9 +-
tests/data/test180 | 4 +-
tests/data/test1800 | 4 +-
tests/data/test1801 | 4 +-
tests/data/test181 | 4 +-
tests/data/test183 | 7 +-
tests/data/test184 | 6 +-
tests/data/test185 | 6 +-
tests/data/test186 | 4 +-
tests/data/test187 | 5 +-
tests/data/test188 | 7 +-
tests/data/test189 | 7 +-
tests/data/test1900 | 61 --
tests/data/test1901 | 63 --
tests/data/test1902 | 62 --
tests/data/test1903 | 62 --
tests/data/test1904 | 7 +-
tests/data/test1905 | 5 +-
tests/data/test1906 | 3 -
tests/data/test1907 | 3 -
tests/data/test1908 | 20 +-
tests/data/test1909 | 5 +-
tests/data/test1910 | 5 +-
tests/data/{test1541 => test1911} | 19 +-
tests/data/{test1541 => test1912} | 20 +-
tests/data/{test118 => test1913} | 37 +-
tests/data/{test118 => test1914} | 38 +-
tests/data/test1915 | 50 ++
tests/data/test192 | 4 +-
tests/data/test193 | 5 +-
tests/data/test194 | 4 +-
tests/data/test197 | 5 +-
tests/data/test198 | 5 +-
tests/data/test199 | 5 +-
tests/data/test2 | 4 +-
tests/data/test2001 | 4 +-
tests/data/test2002 | 4 +-
tests/data/test2003 | 5 +-
tests/data/test2005 | 4 +-
tests/data/test2006 | 4 +-
tests/data/test2007 | 4 +-
tests/data/test2008 | 4 +-
tests/data/test2009 | 4 +-
tests/data/test2010 | 4 +-
tests/data/test2011 | 4 +-
tests/data/test2012 | 4 +-
tests/data/test2023 | 3 -
tests/data/test2024 | 3 -
tests/data/test2025 | 3 -
tests/data/test2026 | 3 -
tests/data/test2027 | 3 -
tests/data/test2028 | 3 -
tests/data/test2029 | 3 -
tests/data/test2030 | 3 -
tests/data/test2031 | 3 -
tests/data/test2032 | 3 -
tests/data/test2033 | 125 ---
tests/data/test2034 | 4 +-
tests/data/test2036 | 3 -
tests/data/test2037 | 3 +-
tests/data/test2040 | 5 +-
tests/data/test2041 | 4 +-
tests/data/test2046 | 5 +-
tests/data/test2047 | 5 +-
tests/data/test2049 | 7 +-
tests/data/test2050 | 5 +-
tests/data/test2051 | 6 +-
tests/data/test2052 | 5 +-
tests/data/test2053 | 5 +-
tests/data/test2054 | 7 +-
tests/data/test2055 | 5 +-
tests/data/test2056 | 4 +-
tests/data/test2057 | 5 +-
tests/data/test2058 | 6 +-
tests/data/test2059 | 6 +-
tests/data/test206 | 7 +-
tests/data/test2060 | 6 +-
tests/data/test2061 | 6 +-
tests/data/test2062 | 6 +-
tests/data/test2063 | 6 +-
tests/data/test2064 | 6 +-
tests/data/test2065 | 6 +-
tests/data/test2066 | 6 +-
tests/data/test2067 | 5 +-
tests/data/test2068 | 5 +-
tests/data/test2069 | 5 +-
tests/data/test207 | 4 +-
tests/data/test2070 | 4 +-
tests/data/test2073 | 4 +-
tests/data/test2074 | 4 +-
tests/data/test2076 | 5 +-
tests/data/test2078 | 4 +-
tests/data/test208 | 4 +-
tests/data/test209 | 7 +-
tests/data/test2100 | Bin 1647 -> 1642 bytes
tests/data/test213 | 7 +-
tests/data/test214 | 4 +-
tests/data/test217 | 4 +-
tests/data/test218 | 4 +-
tests/data/test22 | 5 +-
tests/data/test220 | 4 +-
tests/data/test221 | 4 +-
tests/data/test222 | 4 +-
tests/data/test223 | 4 +-
tests/data/test224 | 4 +-
tests/data/test230 | 4 +-
tests/data/test232 | 4 +-
tests/data/test233 | 5 +-
tests/data/test234 | 5 +-
tests/data/test235 | 3 +
tests/data/test236 | 1 +
tests/data/test239 | 7 +-
tests/data/test24 | 5 +-
tests/data/test240 | 4 +-
tests/data/test241 | 4 +-
tests/data/test242 | 4 +-
tests/data/test243 | 9 +-
tests/data/test245 | 7 +-
tests/data/test246 | 7 +-
tests/data/test249 | 4 +-
tests/data/test25 | 15 +-
tests/data/test256 | 4 +-
tests/data/test257 | 9 +-
tests/data/test258 | 6 +-
tests/data/test259 | 6 +-
tests/data/test26 | 5 +-
tests/data/test260 | 4 +-
tests/data/test262 | Bin 1137 -> 1132 bytes
tests/data/test263 | 4 +-
tests/data/test264 | 4 +-
tests/data/test265 | 7 +-
tests/data/test266 | 4 +-
tests/data/test267 | 7 +-
tests/data/test268 | 4 +-
tests/data/test269 | 4 +-
tests/data/test27 | 6 +-
tests/data/test273 | 6 +-
tests/data/test274 | 5 +-
tests/data/test275 | 7 +-
tests/data/test276 | 5 +-
tests/data/test277 | 5 +-
tests/data/test278 | 4 +-
tests/data/test279 | 4 +-
tests/data/test28 | 5 +-
tests/data/test281 | 4 +-
tests/data/test282 | 4 +-
tests/data/test29 | 4 +-
tests/data/test292 | 4 +-
tests/data/test293 | 4 +-
tests/data/test299 | 4 +-
tests/data/test3 | 4 +-
tests/data/test30 | 4 +-
tests/data/test300 | 4 +-
tests/data/test3000 | 4 +-
tests/data/test3001 | 4 +-
tests/data/{test293 => test3008} | 31 +-
tests/data/{test293 => test3009} | 31 +-
tests/data/test301 | 4 +-
tests/data/{test293 => test3011} | 31 +-
tests/data/{test293 => test3012} | 34 +-
tests/data/{test74 => test3013} | 51 +-
tests/data/{test1439 => test3014} | 10 +-
tests/data/{test193 => test3015} | 60 +-
tests/data/test302 | 3 -
tests/data/test303 | 4 +-
tests/data/test304 | 4 +-
tests/data/test305 | 3 -
tests/data/test306 | 4 +-
tests/data/test307 | 4 +-
tests/data/test309 | 5 +-
tests/data/test31 | 6 +-
tests/data/test310 | 4 +-
tests/data/test314 | 4 +-
tests/data/test315 | 4 +-
tests/data/test316 | 4 +-
tests/data/test317 | 5 +-
tests/data/test318 | 5 +-
tests/data/test319 | 4 +-
tests/data/test32 | 5 +-
tests/data/test325 | 4 +-
tests/data/test326 | 4 +-
tests/data/test327 | 7 +-
tests/data/test328 | 2 +-
tests/data/test329 | 5 +-
tests/data/test33 | 5 +-
tests/data/test330 | 5 +-
tests/data/test331 | 5 +-
tests/data/test334 | 4 +-
tests/data/test335 | 9 +-
tests/data/test338 | 5 +-
tests/data/test339 | 8 +-
tests/data/test34 | 4 +-
tests/data/test341 | 3 -
tests/data/test342 | 6 +-
tests/data/test343 | 8 +-
tests/data/test344 | 6 +-
tests/data/test345 | 8 +-
tests/data/test346 | 4 +-
tests/data/{test339 => test347} | 15 +-
tests/data/{test1096 => test348} | 43 +-
tests/data/test35 | Bin 810 -> 805 bytes
tests/data/test355 | 4 +-
tests/data/test356 | 6 +-
tests/data/test357 | 5 +-
tests/data/test358 | 5 +-
tests/data/test359 | 5 +-
tests/data/test36 | 4 +-
tests/data/test37 | 4 +-
tests/data/test38 | 4 +-
tests/data/test39 | 4 +-
tests/data/test393 | 4 +-
tests/data/test394 | 4 +-
tests/data/test395 | 4 +-
tests/data/test396 | 4 +-
tests/data/test397 | 4 +-
tests/data/test4 | 5 +-
tests/data/test40 | 6 +-
tests/data/test42 | 6 +-
tests/data/test43 | 5 +-
tests/data/test430 | 6 +-
tests/data/test431 | 6 +-
tests/data/test432 | 6 +-
tests/data/{test2078 => test433} | 45 +-
tests/data/{test1290 => test434} | 26 +-
tests/data/test44 | 4 +-
tests/data/test45 | 5 +-
tests/data/test46 | 8 +-
tests/data/test47 | 4 +-
tests/data/test48 | 5 +-
tests/data/test49 | 6 +-
tests/data/test490 | 5 +-
tests/data/test491 | 4 +-
tests/data/test492 | 7 +-
tests/data/test493 | 61 ++
tests/data/test5 | 4 +-
tests/data/test50 | 6 +-
tests/data/test506 | 7 +-
tests/data/test51 | 6 +-
tests/data/test511 | 4 +-
tests/data/test512 | 3 -
tests/data/test514 | 3 -
tests/data/test515 | 3 -
tests/data/test516 | 3 -
tests/data/test52 | 6 +-
tests/data/test522 | 3 -
tests/data/test523 | 3 -
tests/data/test53 | 4 +-
tests/data/test530 | 83 --
tests/data/test533 | 2 +-
tests/data/test534 | 2 +-
tests/data/test54 | 4 +-
tests/data/test540 | 3 -
tests/data/test544 | 3 -
tests/data/test546 | 2 +-
tests/data/test547 | 6 -
tests/data/test548 | 6 -
tests/data/test549 | 3 -
tests/data/test55 | 6 +-
tests/data/test550 | 3 -
tests/data/test551 | 3 -
tests/data/test552 | Bin 142947 -> 2967 bytes
tests/data/test553 | 21 +-
tests/data/test555 | 6 -
tests/data/test556 | 3 -
tests/data/test558 | 4 +-
tests/data/test56 | 4 +-
tests/data/test560 | 3 -
tests/data/test561 | 3 -
tests/data/test57 | 4 +-
tests/data/test573 | 3 -
tests/data/test58 | 4 +-
tests/data/test580 | 3 -
tests/data/test581 | 3 -
tests/data/test584 | 102 ---
tests/data/test585 | 3 -
tests/data/test589 | 3 -
tests/data/test59 | 4 +-
tests/data/test590 | 7 +-
tests/data/test6 | 4 +-
tests/data/test60 | 4 +-
tests/data/test61 | 6 +-
tests/data/test62 | 7 +-
tests/data/test63 | 4 +-
tests/data/test64 | 6 +-
tests/data/test65 | 6 +-
tests/data/test658 | 3 -
tests/data/test659 | 3 -
tests/data/test66 | 4 +-
tests/data/test662 | 5 +-
tests/data/test663 | 5 +-
tests/data/test669 | 6 +-
tests/data/test67 | 7 +-
tests/data/test674 | 3 -
tests/data/test68 | 7 +-
tests/data/test69 | 9 +-
tests/data/test7 | 4 +-
tests/data/test70 | 7 +-
tests/data/test700 | 4 +-
tests/data/test701 | 4 +-
tests/data/test702 | 2 +-
tests/data/test703 | 2 +-
tests/data/test708 | 4 +-
tests/data/test709 | 4 +-
tests/data/test710 | 4 +-
tests/data/test716 | 2 +-
tests/data/test717 | 4 +-
tests/data/test72 | 7 +-
tests/data/test73 | 6 +-
tests/data/test74 | 5 +-
tests/data/test75 | 3 -
tests/data/test76 | 3 -
tests/data/test77 | 4 +-
tests/data/test78 | 4 +-
tests/data/test79 | 4 +-
tests/data/test8 | 4 +-
tests/data/test80 | 7 +-
tests/data/test81 | 7 +-
tests/data/test82 | 5 +-
tests/data/test83 | 7 +-
tests/data/test84 | 5 +-
tests/data/test85 | 5 +-
tests/data/test86 | 9 +-
tests/data/test88 | 6 +-
tests/data/test89 | 11 +-
tests/data/test9 | 4 +-
tests/data/test90 | 13 +-
tests/data/test91 | 9 +-
tests/data/test92 | 4 +-
tests/data/test93 | 4 +-
tests/data/test94 | 5 +-
tests/data/test95 | 7 +-
tests/data/test97 | 4 +-
tests/data/test970 | 6 +-
tests/data/test971 | 5 +
tests/data/test98 | 4 +-
tests/data/test99 | 4 +-
tests/dictserver.py.in | 11 +-
tests/directories.pm | 2 +-
tests/disable-scan.pl.in | 4 +-
tests/error-codes.pl.in | 4 +-
tests/extern-scan.pl.in | 2 +-
tests/ftp.pm | 2 +-
tests/ftpserver.pl.in | 19 +-
tests/fuzz/download_fuzzer.sh | 2 +-
tests/getpart.pm | 9 +-
tests/http2-server.pl.in | 2 +-
tests/httpserver.pl.in | 2 +-
tests/keywords.pl.in | 2 +-
tests/libtest/.gitignore | 2 +-
tests/libtest/CMakeLists.txt | 2 +-
tests/libtest/Makefile.am | 2 +-
tests/libtest/Makefile.inc | 43 +-
tests/libtest/chkdecimalpoint.c | 4 +-
tests/libtest/chkhostname.c | 4 +-
tests/libtest/first.c | 4 +-
tests/libtest/lib1156.c | 2 +-
tests/libtest/lib1500.c | 4 +-
tests/libtest/lib1501.c | 4 +-
tests/libtest/lib1502.c | 4 +-
tests/libtest/lib1506.c | 4 +-
tests/libtest/lib1507.c | 2 +-
tests/libtest/lib1508.c | 2 +-
tests/libtest/lib1509.c | 2 +-
tests/libtest/lib1510.c | 4 +-
tests/libtest/lib1511.c | 4 +-
tests/libtest/lib1512.c | 4 +-
tests/libtest/lib1513.c | 4 +-
tests/libtest/lib1514.c | 2 +-
tests/libtest/lib1515.c | 2 +-
tests/libtest/lib1517.c | 4 +-
tests/libtest/lib1518.c | 4 +-
tests/libtest/lib1520.c | 2 +-
tests/libtest/lib1522.c | 4 +-
tests/libtest/lib1523.c | 9 +-
tests/libtest/lib1525.c | 2 +-
tests/libtest/lib1526.c | 2 +-
tests/libtest/lib1527.c | 2 +-
tests/libtest/lib1528.c | 4 +-
tests/libtest/lib1529.c | 4 +-
tests/libtest/lib1530.c | 4 +-
tests/libtest/lib1531.c | 2 +-
tests/libtest/lib1532.c | 4 +-
tests/libtest/lib1533.c | 2 +-
tests/libtest/lib1534.c | 4 +-
tests/libtest/lib1535.c | 2 +-
tests/libtest/lib1536.c | 2 +-
tests/libtest/lib1537.c | 4 +-
tests/libtest/lib1538.c | 16 +-
tests/libtest/lib1540.c | 2 +-
tests/libtest/lib1541.c | 11 +-
tests/libtest/lib1550.c | 6 +-
tests/libtest/lib1551.c | 4 +-
tests/libtest/lib1552.c | 4 +-
tests/libtest/lib1553.c | 4 +-
tests/libtest/lib1554.c | 2 +-
tests/libtest/lib1555.c | 4 +-
tests/libtest/lib1556.c | 4 +-
tests/libtest/lib1557.c | 4 +-
tests/libtest/lib1558.c | 6 +-
tests/libtest/lib1559.c | 4 +-
tests/libtest/lib1560.c | 19 +-
tests/libtest/lib1564.c | 2 +-
tests/libtest/lib1565.c | 4 +-
tests/libtest/lib1567.c | 2 +-
tests/libtest/lib1591.c | 4 +-
tests/libtest/lib1592.c | 12 +-
tests/libtest/lib1593.c | 4 +-
tests/libtest/lib1594.c | 4 +-
tests/libtest/lib1900.c | 2 +-
tests/libtest/lib1905.c | 4 +-
tests/libtest/lib1906.c | 4 +-
tests/libtest/lib1907.c | 4 +-
tests/libtest/lib1908.c | 17 +-
tests/libtest/lib1910.c | 2 +-
tests/libtest/lib1911.c | 89 +++
tests/libtest/lib1912.c | 80 ++
tests/libtest/{lib1908.c => lib1913.c} | 11 +-
tests/libtest/lib1915.c | 95 +++
tests/libtest/lib3010.c | 2 +-
tests/libtest/lib500.c | 2 +-
tests/libtest/lib501.c | 2 +-
tests/libtest/lib502.c | 2 +-
tests/libtest/lib503.c | 2 +-
tests/libtest/lib504.c | 2 +-
tests/libtest/lib505.c | 6 +-
tests/libtest/lib506.c | 4 +-
tests/libtest/lib507.c | 4 +-
tests/libtest/lib508.c | 4 +-
tests/libtest/lib509.c | 2 +-
tests/libtest/lib510.c | 4 +-
tests/libtest/lib511.c | 4 +-
tests/libtest/lib512.c | 2 +-
tests/libtest/lib513.c | 4 +-
tests/libtest/lib514.c | 4 +-
tests/libtest/lib515.c | 4 +-
tests/libtest/lib516.c | 4 +-
tests/libtest/lib517.c | 4 +-
tests/libtest/lib518.c | 4 +-
tests/libtest/lib519.c | 2 +-
tests/libtest/lib520.c | 4 +-
tests/libtest/lib521.c | 2 +-
tests/libtest/lib523.c | 2 +-
tests/libtest/lib524.c | 2 +-
tests/libtest/lib525.c | 4 +-
tests/libtest/lib526.c | 4 +-
tests/libtest/lib530.c | 4 +-
tests/libtest/lib533.c | 4 +-
tests/libtest/lib537.c | 4 +-
tests/libtest/lib539.c | 4 +-
tests/libtest/lib540.c | 4 +-
tests/libtest/lib541.c | 6 +-
tests/libtest/lib542.c | 4 +-
tests/libtest/lib543.c | 2 +-
tests/libtest/lib544.c | 4 +-
tests/libtest/lib547.c | 2 +-
tests/libtest/lib549.c | 2 +-
tests/libtest/lib552.c | 4 +-
tests/libtest/lib553.c | 2 +-
tests/libtest/lib554.c | 4 +-
tests/libtest/lib555.c | 4 +-
tests/libtest/lib556.c | 6 +-
tests/libtest/lib557.c | 2 +-
tests/libtest/lib558.c | 2 +-
tests/libtest/lib559.c | 2 +-
tests/libtest/lib560.c | 2 +-
tests/libtest/lib562.c | 4 +-
tests/libtest/lib564.c | 4 +-
tests/libtest/lib566.c | 2 +-
tests/libtest/lib567.c | 2 +-
tests/libtest/lib568.c | 2 +-
tests/libtest/lib569.c | 4 +-
tests/libtest/lib570.c | 8 +-
tests/libtest/lib571.c | 4 +-
tests/libtest/lib572.c | 2 +-
tests/libtest/lib573.c | 2 +-
tests/libtest/lib574.c | 4 +-
tests/libtest/lib575.c | 4 +-
tests/libtest/lib576.c | 2 +-
tests/libtest/lib578.c | 4 +-
tests/libtest/lib579.c | 2 +-
tests/libtest/lib582.c | 2 +-
tests/libtest/lib583.c | 15 +-
tests/libtest/lib586.c | 2 +-
tests/libtest/lib589.c | 4 +-
tests/libtest/lib590.c | 4 +-
tests/libtest/lib591.c | 2 +-
tests/libtest/lib597.c | 4 +-
tests/libtest/lib598.c | 2 +-
tests/libtest/lib599.c | 4 +-
tests/libtest/lib643.c | 2 +-
tests/libtest/lib650.c | 4 +-
tests/libtest/lib651.c | 2 +-
tests/libtest/lib652.c | 2 +-
tests/libtest/lib653.c | 4 +-
tests/libtest/lib654.c | 2 +-
tests/libtest/lib655.c | 4 +-
tests/libtest/lib658.c | 4 +-
tests/libtest/lib659.c | 4 +-
tests/libtest/lib661.c | 4 +-
tests/libtest/lib666.c | 2 +-
tests/libtest/lib667.c | 2 +-
tests/libtest/lib668.c | 2 +-
tests/libtest/lib670.c | 2 +-
tests/libtest/lib674.c | 2 +-
tests/libtest/libauthretry.c | 4 +-
tests/libtest/libntlmconnect.c | 4 +-
tests/libtest/mk-lib1521.pl | 18 +-
tests/libtest/notexists.pl | 2 +-
tests/libtest/sethostname.c | 2 +-
tests/libtest/sethostname.h | 4 +-
tests/libtest/stub_gssapi.c | 4 +-
tests/libtest/stub_gssapi.h | 2 +-
tests/libtest/test.h | 48 +-
tests/libtest/test1013.pl | 2 +-
tests/libtest/test1022.pl | 2 +-
tests/libtest/test307.pl | 2 +-
tests/libtest/test610.pl | 2 +-
tests/libtest/test613.pl | 2 +-
tests/libtest/testtrace.c | 4 +-
tests/libtest/testtrace.h | 2 +-
tests/libtest/testutil.c | 2 +-
tests/libtest/testutil.h | 2 +-
tests/manpage-scan.pl.in | 2 +-
tests/mem-include-scan.pl.in | 2 +-
tests/memanalyze.pl.in | 4 +-
tests/negtelnetserver.py.in | 10 +-
tests/nroff-scan.pl.in | 2 +-
tests/objnames-test08.sh | 217 ------
tests/objnames-test10.sh | 217 ------
tests/objnames.inc | 107 ---
tests/options-scan.pl | 6 +-
tests/pathhelp.pm | 2 +-
tests/rtspserver.pl.in | 2 +-
tests/runtests.1 | 2 +-
tests/runtests.pl.in | 195 ++---
tests/secureserver.pl.in | 2 +-
tests/server/CMakeLists.txt | 2 +-
tests/server/Makefile.am | 4 +-
tests/server/Makefile.inc | 2 +-
tests/server/base64.pl | 2 +-
tests/server/disabled.c | 4 +-
tests/server/fake_ntlm.c | 2 +-
tests/server/getpart.c | 2 +-
tests/server/getpart.h | 2 +-
tests/server/mqttd.c | 9 +-
tests/server/resolve.c | 2 +-
tests/server/rtspd.c | 2 +-
tests/server/server_setup.h | 2 +-
tests/server/server_sockaddr.h | 2 +-
tests/server/sockfilt.c | 8 +-
tests/server/socksd.c | 2 +-
tests/server/sws.c | 2 +-
tests/server/testpart.c | 2 +-
tests/server/tftp.h | 2 +-
tests/server/tftpd.c | 15 +-
tests/server/util.c | 13 +-
tests/server/util.h | 2 +-
tests/serverhelp.pm | 2 +-
tests/smbserver.py.in | 24 +-
tests/sshhelp.pm | 2 +-
tests/sshserver.pl.in | 2 +-
tests/symbol-scan.pl.in | 4 +-
tests/testcurl.1 | 8 +-
tests/testcurl.pl.in | 14 +-
tests/tftpserver.pl.in | 2 +-
tests/unit/CMakeLists.txt | 2 +-
tests/unit/Makefile.am | 6 +-
tests/unit/Makefile.inc | 7 +-
tests/unit/{README => README.md} | 42 +-
tests/unit/curlcheck.h | 2 +-
tests/unit/unit1300.c | 32 +-
tests/unit/unit1301.c | 4 +-
tests/unit/unit1302.c | 2 +-
tests/unit/unit1303.c | 4 +-
tests/unit/unit1304.c | 4 +-
tests/unit/unit1305.c | 4 +-
tests/unit/unit1307.c | 4 +-
tests/unit/unit1308.c | 4 +-
tests/unit/unit1309.c | 4 +-
tests/unit/unit1323.c | 4 +-
tests/unit/unit1330.c | 2 +-
tests/unit/unit1394.c | 2 +-
tests/unit/unit1395.c | 2 +-
tests/unit/unit1396.c | 4 +-
tests/unit/unit1397.c | 4 +-
tests/unit/unit1398.c | 4 +-
tests/unit/unit1399.c | 4 +-
tests/unit/unit1600.c | 2 +-
tests/unit/unit1601.c | 2 +-
tests/unit/unit1602.c | 6 +-
tests/unit/unit1603.c | 6 +-
tests/unit/unit1604.c | 4 +-
tests/unit/unit1605.c | 2 +-
tests/unit/unit1606.c | 4 +-
tests/unit/unit1607.c | 4 +-
tests/unit/unit1608.c | 2 +-
tests/unit/unit1609.c | 4 +-
tests/unit/unit1610.c | 2 +-
tests/unit/unit1611.c | 2 +-
tests/unit/unit1612.c | 2 +-
tests/unit/unit1620.c | 2 +-
tests/unit/unit1621.c | 4 +-
tests/unit/unit1650.c | 2 +-
tests/unit/unit1651.c | 4 +-
tests/unit/unit1652.c | 4 +-
tests/unit/unit1653.c | 44 +-
tests/unit/unit1654.c | 17 +-
tests/unit/unit1655.c | 2 +-
tests/unit/unit1660.c | 171 +++++
tests/{curl_test_data.py.in => util.py} | 35 +-
tests/valgrind.pm | 2 +-
tests/valgrind.supp | 32 +
tests/version-scan.pl.in | 2 +-
winbuild/README.md | 132 ++++
2355 files changed, 14804 insertions(+), 15536 deletions(-)
diff --cc .travis.yml
index db47499fc,b37ac7156..9ce8ee441
--- a/.travis.yml
+++ b/.travis.yml
@@@ -27,231 -33,373 +27,98 @@@ env
- LD_LIBRARY_PATH=/usr/local/lib
addons:
- apt:
- config:
- retries: true
- sources: &common_sources
- - ubuntu-toolchain-r-test
- packages: &common_packages
- - cmake
- - gcc-8
- - valgrind
- - libev-dev
- - libc-ares-dev
- - g++-8
- - libstdc++-8-dev
- - stunnel4
- - libidn2-0-dev
- - gnutls-bin
- - libgnutls28-dev
- - python-impacket
- - pax
- - ncompress
+ apt: &common_apt
+ config:
+ retries: true
+ packages: &common_packages
+ - cmake
+ - valgrind
+ - libev-dev
+ - libc-ares-dev
+ - g++-8
++ - libstdc++-8-dev
+ - stunnel4
+ - libidn2-dev
+ - gnutls-bin
++ - libgnutls28-dev
+ - python-impacket
+ - ninja-build
++ - pax
++ - ncompress
- matrix:
- include:
- - os: linux
- compiler: gcc
- dist: trusty
- env:
- - T=normal C="" CHECKSRC=1
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - os: linux
- compiler: gcc
- dist: trusty
- env:
- - T=normal C="--enable-mqtt"
- - os: linux
- compiler: gcc
- dist: bionic
- env:
- - T=normal C="--disable-verbose"
CPPFLAGS="-Wno-variadic-macros" NOTESTS=1
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - os: linux
- compiler: gcc
- dist: bionic
- before_install:
- # Install and use the current stable release of Go
- - gimme --list
- - eval "$(gimme stable)"
- - gimme --list
- env:
- - T=novalgrind C=""
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- sources:
- - ppa:longsleep/golang-backports
- - *common_sources
- packages:
- - *common_packages
- - os: linux
- compiler: gcc
- dist: xenial
- env:
- - T=novalgrind C="--enable-alt-svc" NOTESTS=
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - os: linux
- compiler: clang
- dist: xenial
- env:
- - T=debug
- - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7"
- addons:
- apt:
- sources:
- - *common_sources
- - llvm-toolchain-xenial-7
- packages:
- - *common_packages
- - clang-7
- - os: linux
- compiler: clang
- dist: xenial
- env:
- - T=debug C="--enable-alt-svc"
- - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7"
- addons:
- apt:
- sources:
- - *common_sources
- - llvm-toolchain-xenial-7
- packages:
- - *common_packages
- - clang-7
- - os: linux
- compiler: clang
- dist: bionic
- env:
- - T=debug C="--with-gnutls --without-ssl"
- - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7"
- addons:
- apt:
- sources:
- - *common_sources
- - llvm-toolchain-bionic-7
- packages:
- - *common_packages
- - clang-7
- - os: linux
- compiler: gcc
- dist: trusty
- env:
- - T=iconv
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - os: linux
- compiler: gcc
- dist: bionic
- env:
- - T=cmake
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - os: linux
- compiler: clang
- dist: bionic
- env:
- - T=cmake
- - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7"
- addons:
- apt:
- sources:
- - *common_sources
- - llvm-toolchain-bionic-7
- packages:
- - *common_packages
- - clang-7
- - os: linux
- compiler: gcc
- dist: xenial
- env:
- - T=torture
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- sources:
- - *common_sources
- packages:
- - *common_packages
- - lcov
- - os: linux
- compiler: gcc
- dist: bionic
- env:
- - T=distcheck
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - os: linux
- compiler: clang
- dist: bionic
- env:
- - T=fuzzer
- - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7"
- addons:
- apt:
- sources:
- - *common_sources
- - llvm-toolchain-bionic-7
- packages:
- - *common_packages
- - clang-7
- - os: linux
- compiler: clang
- dist: bionic
- env:
- - T=tidy
- - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7"
- addons:
- apt:
- sources:
- - *common_sources
- - llvm-toolchain-bionic-7
- packages:
- - *common_packages
- - clang-7
- - clang-tidy-7
- - os: linux
- compiler: clang
- dist: bionic
- env:
- - T=scan-build
- - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7"
- addons:
- apt:
- sources:
- - *common_sources
- - llvm-toolchain-bionic-7
- packages:
- - *common_packages
- - clang-7
- - os: linux
- compiler: clang
- dist: xenial
- env:
- - T=debug
CFLAGS="-fsanitize=address,undefined,signed-integer-overflow
-fno-sanitize-recover=undefined,integer -Wformat -Werror=format-security
-Werror=array-bounds -g" LDFLAGS="-fsanitize=address,undefined
-fno-sanitize-recover=undefined,integer" LIBS="-ldl -lubsan"
- - OVERRIDE_CC="CC=clang-7" OVERRIDE_CXX="CXX=clang++-7"
- addons:
- apt:
- sources:
- - *common_sources
- - llvm-toolchain-xenial-7
- packages:
- - *common_packages
- - clang-7
- - os: linux
- arch: arm64
- compiler: gcc
- dist: bionic
- env:
- - T=debug C="--enable-alt-svc"
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- sources:
- - *common_sources
- packages:
- - *common_packages
- - libev-dev
- - libtool
- - pkg-config
- - zlib1g-dev
+ jobs:
+ include:
+ - env:
- - T=normal C="--with-gssapi --with-libssh2" CHECKSRC=1
++ - T=normal C="" CHECKSRC=1
+ - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - krb5-user
- - libssh2-1-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=normal C=--with-libssh
- # Avoid bionic, its pre-release libssh version triggers deprecation
warnings.
- dist: focal
- addons:
- apt:
- <<: *common_apt
- packages:
- - cmake
- - valgrind
- - libev-dev
- - libc-ares-dev
- - g++-8
- - stunnel4
- - libidn2-dev
- - gnutls-bin
- # The above list is common_packages minus impacket.
- - libssh-dev
- - ninja-build
- - env:
- - T=normal C="--enable-ares"
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - env:
- - T=normal C="--disable-proxy"
+ - env:
+ - T=normal C="--disable-verbose" CPPFLAGS="-Wno-variadic-macros" NOTESTS=1
+ - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=novalgrind BORINGSSL=yes C="--with-ssl=$HOME/boringssl"
LD_LIBRARY_PATH=/home/travis/boringssl/lib:/usr/local/lib
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- before_install:
- - eval "$(gimme stable)"; gimme --list # Install latest Go (for
boringssl)
- - env:
- - T=novalgrind QUICHE="yes" C="--with-ssl=$HOME/quiche/deps/boringssl/src
--with-quiche=$HOME/quiche/target/release"
LD_LIBRARY_PATH=$HOME/quiche/target/release:/usr/local/lib
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=novalgrind LIBRESSL=yes C="--with-ssl=$HOME/libressl"
LD_LIBRARY_PATH=/home/travis/libressl/lib:/usr/local/lib
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - env:
- - T=novalgrind NGTCP2=yes C="--with-ssl=$HOME/ngbuild
--with-ngtcp2=$HOME/ngbuild --with-nghttp3=$HOME/ngbuild" NOTESTS=
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=novalgrind NGTCP2=yes GNUTLS=yes C="PKG_CONFIG_PATH=$HOME/ngbuild
--without-ssl --with-gnutls=$HOME/ngbuild --with-ngtcp2=$HOME/ngbuild
--with-nghttp3=$HOME/ngbuild" NOTESTS=
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - autogen
- - automake
- - autopoint
- - bison
- - gperf
- - libgmp-dev
- - libopts25-dev
- - libp11-kit-dev
- - libtasn1-6-dev
- - nettle-dev
- - env:
- - T=debug-wolfssl C="--with-wolfssl --without-ssl"
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=debug OPENSSL3="yes" C="--with-ssl=$HOME/openssl3"
LD_LIBRARY_PATH=/home/travis/openssl3/lib:/usr/local/lib
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=debug-mesalink C="--with-mesalink --without-ssl" MESALINK=yes
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
+ - env:
+ - T=debug
+ - &clang OVERRIDE_CC="CC=clang-9" OVERRIDE_CXX="CXX=clang++-9"
+ compiler: clang
+ addons:
+ apt:
+ <<: *common_apt
+ packages:
+ - &clang_packages [*common_packages, clang-9]
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
+ - env:
+ - T=debug C="--enable-hsts --disable-alt-svc"
+ - *clang
+ compiler: clang
+ addons:
+ apt:
+ <<: *common_apt
+ packages:
+ - *clang_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=debug C="--with-mbedtls --without-ssl"
- - *clang
- compiler: clang
- addons:
- apt:
- <<: *common_apt
- packages:
- - *clang_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - libmbedtls-dev
+ - env:
+ - T=debug C="--with-gnutls --without-ssl"
+ - *clang
+ compiler: clang
+ addons:
+ apt:
+ <<: *common_apt
+ packages:
+ - *clang_packages
- - libgnutls28-dev
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=debug C="--with-nss --without-ssl" NOTESTS=1 CPPFLAGS="-isystem
/usr/include/nss"
- - *clang
- compiler: clang
- addons:
- apt:
- <<: *common_apt
- packages:
- - *clang_packages
- - libnss3-dev
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
+ - env:
+ - T=iconv
+ - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - env:
- - T=cmake BORINGSSL=yes QUICHE=yes C="-GNinja -DUSE_QUICHE=1
-DOPENSSL_ROOT_DIR=$HOME/boringssl -DCURL_BROTLI=1 -DCURL_ZSTD=1"
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- - PKG_CONFIG_PATH="$HOME/quiche/target/release"
- before_install:
- - eval "$(gimme stable)"; gimme --list # Install latest Go (for
boringssl)
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=cmake NGTCP2=yes C="-GNinja -DUSE_NGTCP2=ON -DCURL_BROTLI=1
-DCURL_ZSTD=1"
- - *clang
- - PKG_CONFIG_PATH="$HOME/ngbuild/lib/pkgconfig"
- compiler: clang
- addons:
- apt:
- <<: *common_apt
- packages:
- - *clang_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
+ - env:
+ - T=torture
+ - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
+ addons:
+ apt:
+ <<: *common_apt
+ packages:
+ - *common_packages
+ - lcov
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - libssh2-1-dev
+ - env:
+ - T=distcheck
+ - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
+ addons:
+ apt:
+ <<: *common_apt
+ packages:
+ - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=fuzzer
- - *clang
- compiler: clang
- addons:
- apt:
- <<: *common_apt
- packages:
- - *clang_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=tidy
- - *clang
- compiler: clang
- addons:
- apt:
- <<: *common_apt
- packages:
- - *clang_packages
- - clang-tidy-9
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
+ - env:
+ - T=scan-build
+ - *clang
+ compiler: clang
+ addons:
+ apt:
+ <<: *common_apt
+ packages:
+ - *clang_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
+ - env:
+ - T=debug CFLAGS="-fsanitize=address,undefined,signed-integer-overflow
-fno-sanitize-recover=undefined,integer -Wformat -Werror=format-security
-Werror=array-bounds -g" LDFLAGS="-fsanitize=address,undefined
-fno-sanitize-recover=undefined,integer" LIBS="-ldl -lubsan" TFLAGS=-n
+ - *clang
+ compiler: clang
+ addons:
+ apt:
+ <<: *common_apt
+ packages:
+ - *clang_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - env:
- - T=debug C="" TFLAGS=-n
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- arch: arm64
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - libev-dev
- - libssl-dev
- - libtool
- - pkg-config
- - zlib1g-dev
-
- - env:
- - T=debug C="" TFLAGS=-n
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- arch: ppc64le
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - libev-dev
- - libssl-dev
- - libtool
- - pkg-config
- - zlib1g-dev
-
- - env:
- - T=debug C="" TFLAGS=-n
- - OVERRIDE_CC="CC=gcc-8" OVERRIDE_CXX="CXX=g++-8"
- arch: s390x
- addons:
- apt:
- <<: *common_apt
- packages:
- - *common_packages
- - libpsl-dev
- - libbrotli-dev
- - libzstd-dev
- - libev-dev
- - libssl-dev
- - libtool
- - pkg-config
- - zlib1g-dev
before_install:
- export "${OVERRIDE_CC-blank=}"
diff --cc CMake/gnurl-config.cmake.in
index 240c3a96e,000000000..aa58ed3b9
mode 100644,000000..100644
--- a/CMake/gnurl-config.cmake.in
+++ b/CMake/gnurl-config.cmake.in
@@@ -1,36 -1,0 +1,36 @@@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+@PACKAGE_INIT@
+
+include(CMakeFindDependencyMacro)
+if(@USE_OPENSSL@)
+ find_dependency(OpenSSL @OPENSSL_VERSION_MAJOR@)
+endif()
+if(@USE_GNUTLS@)
+ find_dependency(GnuTLS @GNUTLS_VERSION_MAJOR@)
+endif()
+if(@USE_ZLIB@)
+ find_dependency(ZLIB @ZLIB_VERSION_MAJOR@)
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake")
+check_required_components("@PROJECT_NAME@")
diff --cc CMakeLists.txt
index 687929a79,6a1a6fe8e..8696fee5a
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@@ -45,11 -45,9 +45,12 @@@ include(Macros
include(CMakeDependentOption)
include(CheckCCompilerFlag)
-project(CURL C)
+project(GNURL C)
+
+message(WARNING "the curl cmake build system is poorly maintained. Be aware")
+
- file(STRINGS $GNURL_SOURCE_DIR}/include/gnurl/curlver.h
CURL_VERSION_H_CONTENTS REGEX "#define LIBCURL_VERSION( |_NUM )")
++file(STRINGS ${GNURL_SOURCE_DIR}/include/gnurl/curlver.h
CURL_VERSION_H_CONTENTS REGEX "#define LIBCURL_VERSION( |_NUM )")
+
-file(STRINGS ${CURL_SOURCE_DIR}/include/curl/curlver.h
CURL_VERSION_H_CONTENTS REGEX "#define LIBCURL_VERSION( |_NUM )")
string(REGEX MATCH "#define LIBCURL_VERSION \"[^\"]*"
CURL_VERSION ${CURL_VERSION_H_CONTENTS})
string(REGEX REPLACE "[^\"]+\"" "" CURL_VERSION ${CURL_VERSION})
@@@ -175,57 -173,51 +183,59 @@@ mark_as_advanced(CURL_DISABLE_TFTP
option(CURL_DISABLE_HTTP "disables HTTP" OFF)
mark_as_advanced(CURL_DISABLE_HTTP)
-option(CURL_DISABLE_LDAPS "to disable LDAPS" OFF)
+option(CURL_DISABLE_LDAPS "to disable LDAPS" ON)
mark_as_advanced(CURL_DISABLE_LDAPS)
-option(CURL_DISABLE_RTSP "to disable RTSP" OFF)
+option(CURL_DISABLE_RTSP "to disable RTSP" ON)
mark_as_advanced(CURL_DISABLE_RTSP)
+
option(CURL_DISABLE_PROXY "to disable proxy" OFF)
mark_as_advanced(CURL_DISABLE_PROXY)
-option(CURL_DISABLE_POP3 "to disable POP3" OFF)
+
+option(CURL_DISABLE_POP3 "to disable POP3" ON)
mark_as_advanced(CURL_DISABLE_POP3)
-option(CURL_DISABLE_IMAP "to disable IMAP" OFF)
+
+option(CURL_DISABLE_IMAP "to disable IMAP" ON)
mark_as_advanced(CURL_DISABLE_IMAP)
-option(CURL_DISABLE_SMTP "to disable SMTP" OFF)
+
+option(CURL_DISABLE_SMTP "to disable SMTP" ON)
mark_as_advanced(CURL_DISABLE_SMTP)
-option(CURL_DISABLE_GOPHER "to disable Gopher" OFF)
+
+option(CURL_DISABLE_GOPHER "to disable Gopher" ON)
mark_as_advanced(CURL_DISABLE_GOPHER)
- option(CURL_ENABLE_MQTT "to enable MQTT" OFF)
- mark_as_advanced(CURL_ENABLE_MQTT)
+ option(CURL_DISABLE_MQTT "to disable MQTT" OFF)
+ mark_as_advanced(CURL_DISABLE_MQTT)
if(HTTP_ONLY)
+ set(CURL_DISABLE_DICT ON)
+ set(CURL_DISABLE_FILE ON)
set(CURL_DISABLE_FTP ON)
+ set(CURL_DISABLE_GOPHER ON)
+ set(CURL_DISABLE_IMAP ON)
set(CURL_DISABLE_LDAP ON)
set(CURL_DISABLE_LDAPS ON)
- set(CURL_DISABLE_TELNET ON)
- set(CURL_DISABLE_DICT ON)
- set(CURL_DISABLE_FILE ON)
- set(CURL_DISABLE_TFTP ON)
- set(CURL_DISABLE_RTSP ON)
+ set(CURL_DISABLE_MQTT ON)
set(CURL_DISABLE_POP3 ON)
- set(CURL_DISABLE_IMAP ON)
+ set(CURL_DISABLE_RTSP ON)
set(CURL_DISABLE_SMB ON)
set(CURL_DISABLE_SMTP ON)
- set(CURL_DISABLE_GOPHER ON)
+ set(CURL_DISABLE_TELNET ON)
+ set(CURL_DISABLE_TFTP ON)
endif()
+ option(CURL_DISABLE_ALTSVC "to disable alt-svc support" OFF)
+ mark_as_advanced(CURL_DISABLE_ALTSVC)
option(CURL_DISABLE_COOKIES "to disable cookies support" OFF)
mark_as_advanced(CURL_DISABLE_COOKIES)
-
option(CURL_DISABLE_CRYPTO_AUTH "to disable cryptographic authentication" OFF)
mark_as_advanced(CURL_DISABLE_CRYPTO_AUTH)
+
option(CURL_DISABLE_VERBOSE_STRINGS "to disable verbose strings" OFF)
mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS)
+
option(ENABLE_IPV6 "Define if you want to enable IPv6 support" ON)
mark_as_advanced(ENABLE_IPV6)
+
if(ENABLE_IPV6 AND NOT WIN32)
include(CheckStructHasMember)
check_struct_has_member("struct sockaddr_in6" sin6_addr "netinet/in.h"
@@@ -665,30 -621,27 +671,27 @@@ option(USE_NGHTTP2 "Use Nghttp2 library
check_library_exists_concat("idn2" idn2_lookup_ul HAVE_LIBIDN2)
# Check for symbol dlopen (same as HAVE_LIBDL)
-check_library_exists("${CURL_LIBS}" dlopen "" HAVE_DLOPEN)
+check_library_exists("${GNURL_LIBS}" dlopen "" HAVE_DLOPEN)
- option(CURL_ZLIB "Set to ON to enable building curl with zlib support." ON)
set(HAVE_LIBZ OFF)
set(HAVE_ZLIB_H OFF)
set(USE_ZLIB OFF)
- if(CURL_ZLIB)
- find_package(ZLIB QUIET)
- if(ZLIB_FOUND)
- set(HAVE_ZLIB_H ON)
- set(HAVE_LIBZ ON)
- set(USE_ZLIB ON)
-
- # Depend on ZLIB via imported targets if supported by the running
- # version of CMake. This allows our dependents to get our dependencies
- # transitively.
- if(NOT CMAKE_VERSION VERSION_LESS 3.4)
- list(APPEND GNURL_LIBS ZLIB::ZLIB)
- else()
- list(APPEND GNURL_LIBS ${ZLIB_LIBRARIES})
- include_directories(${ZLIB_INCLUDE_DIRS})
- endif()
- list(APPEND CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS})
+ optional_dependency(ZLIB)
+ if(ZLIB_FOUND)
+ set(HAVE_ZLIB_H ON)
+ set(HAVE_LIBZ ON)
+ set(USE_ZLIB ON)
+
+ # Depend on ZLIB via imported targets if supported by the running
+ # version of CMake. This allows our dependents to get our dependencies
+ # transitively.
+ if(NOT CMAKE_VERSION VERSION_LESS 3.4)
- list(APPEND CURL_LIBS ZLIB::ZLIB)
++ list(APPEND GNURL_LIBS ZLIB::ZLIB)
+ else()
- list(APPEND CURL_LIBS ${ZLIB_LIBRARIES})
++ list(APPEND GNURL_LIBS ${ZLIB_LIBRARIES})
+ include_directories(${ZLIB_INCLUDE_DIRS})
endif()
+ list(APPEND CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS})
endif()
option(CURL_BROTLI "Set to ON to enable building curl with brotli support."
OFF)
@@@ -770,8 -773,9 +773,8 @@@ if(CMAKE_USE_GSSAPI
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GSS_COMPILER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}
${GSS_LINKER_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}
${GSS_LINKER_FLAGS}")
+ set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS}
${GSS_LINKER_FLAGS}")
- list(APPEND CURL_LIBS ${GSS_LIBRARIES})
-
+ list(APPEND GNURL_LIBS ${GSS_LIBRARIES})
-
else()
message(WARNING "GSSAPI support has been requested but no supporting
libraries found. Skipping.")
endif()
diff --cc Makefile.am
index 75d9ce110,16adc9833..5c4815b2b
--- a/Makefile.am
+++ b/Makefile.am
@@@ -200,9 -327,419 +200,10 @@@ checksrc
(cd lib && $(MAKE) checksrc)
(cd src && $(MAKE) checksrc)
(cd tests && $(MAKE) checksrc)
- (cd include/curl && $(MAKE) checksrc)
+ (cd include/gnurl && $(MAKE) checksrc)
(cd docs/examples && $(MAKE) checksrc)
+ (cd packages && $(MAKE) checksrc)
-.PHONY: vc-ide
-
-vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
- $(VC7_SRCVCPROJ_DEPS) $(VC71_LIBVCPROJ_DEPS) $(VC71_SRCVCPROJ_DEPS) \
- $(VC8_LIBVCPROJ_DEPS) $(VC8_SRCVCPROJ_DEPS) $(VC9_LIBVCPROJ_DEPS) \
- $(VC9_SRCVCPROJ_DEPS) $(VC10_LIBVCXPROJ_DEPS) $(VC10_SRCVCXPROJ_DEPS) \
- $(VC11_LIBVCXPROJ_DEPS) $(VC11_SRCVCXPROJ_DEPS) $(VC12_LIBVCXPROJ_DEPS) \
- $(VC12_SRCVCXPROJ_DEPS) $(VC14_LIBVCXPROJ_DEPS) $(VC14_SRCVCXPROJ_DEPS) \
- $(VC15_LIBVCXPROJ_DEPS) $(VC15_SRCVCXPROJ_DEPS)
- @(win32_lib_srcs='$(LIB_CFILES)'; \
- win32_lib_hdrs='$(LIB_HFILES) config-win32.h'; \
- win32_lib_rc='$(LIB_RCFILES)'; \
- win32_lib_vauth_srcs='$(LIB_VAUTH_CFILES)'; \
- win32_lib_vauth_hdrs='$(LIB_VAUTH_HFILES)'; \
- win32_lib_vquic_srcs='$(LIB_VQUIC_CFILES)'; \
- win32_lib_vquic_hdrs='$(LIB_VQUIC_HFILES)'; \
- win32_lib_vssh_srcs='$(LIB_VSSH_CFILES)'; \
- win32_lib_vssh_hdrs='$(LIB_VSSH_HFILES)'; \
- win32_lib_vtls_srcs='$(LIB_VTLS_CFILES)'; \
- win32_lib_vtls_hdrs='$(LIB_VTLS_HFILES)'; \
- win32_src_srcs='$(CURL_CFILES)'; \
- win32_src_hdrs='$(CURL_HFILES)'; \
- win32_src_rc='$(CURL_RCFILES)'; \
- win32_src_x_srcs='$(CURLX_CFILES)'; \
- win32_src_x_hdrs='$(CURLX_HFILES) ../lib/config-win32.h'; \
- \
- sorted_lib_srcs=`for file in $$win32_lib_srcs; do echo $$file; done |
sort`; \
- sorted_lib_hdrs=`for file in $$win32_lib_hdrs; do echo $$file; done |
sort`; \
- sorted_lib_vauth_srcs=`for file in $$win32_lib_vauth_srcs; do echo
$$file; done | sort`; \
- sorted_lib_vauth_hdrs=`for file in $$win32_lib_vauth_hdrs; do echo
$$file; done | sort`; \
- sorted_lib_vquic_srcs=`for file in $$win32_lib_vquic_srcs; do echo
$$file; done | sort`; \
- sorted_lib_vquic_hdrs=`for file in $$win32_lib_vquic_hdrs; do echo
$$file; done | sort`; \
- sorted_lib_vssh_srcs=`for file in $$win32_lib_vssh_srcs; do echo
$$file; done | sort`; \
- sorted_lib_vssh_hdrs=`for file in $$win32_lib_vssh_hdrs; do echo
$$file; done | sort`; \
- sorted_lib_vtls_srcs=`for file in $$win32_lib_vtls_srcs; do echo
$$file; done | sort`; \
- sorted_lib_vtls_hdrs=`for file in $$win32_lib_vtls_hdrs; do echo
$$file; done | sort`; \
- sorted_src_srcs=`for file in $$win32_src_srcs; do echo $$file; done |
sort`; \
- sorted_src_hdrs=`for file in $$win32_src_hdrs; do echo $$file; done |
sort`; \
- sorted_src_x_srcs=`for file in $$win32_src_x_srcs; do echo $$file; done
| sort`; \
- sorted_src_x_hdrs=`for file in $$win32_src_x_hdrs; do echo $$file; done
| sort`; \
- \
- awk_code='\
-function gen_element(type, dir, file)\
-{\
- sub(/vauth\//, "", file);\
- sub(/vquic\//, "", file);\
- sub(/vssh\//, "", file);\
- sub(/vtls\//, "", file);\
-\
- spaces=" ";\
- if(dir == "lib\\vauth" ||\
- dir == "lib\\vquic" ||\
- dir == "lib\\vssh" ||\
- dir == "lib\\vtls")\
- tabs=" ";\
- else\
- tabs=" ";\
-\
- if(type == "dsp") {\
- printf("# Begin Source File\r\n");\
- printf("\r\n");\
- printf("SOURCE=..\\..\\..\\..\\%s\\%s\r\n", dir, file);\
- printf("# End Source File\r\n");\
- }\
- else if(type == "vcproj1") {\
- printf("%s<File\r\n", tabs);\
- printf("%s RelativePath=\"..\\..\\..\\..\\%s\\%s\">\r\n",\
- tabs, dir, file);\
- printf("%s</File>\r\n", tabs);\
- }\
- else if(type == "vcproj2") {\
- printf("%s<File\r\n", tabs);\
- printf("%s RelativePath=\"..\\..\\..\\..\\%s\\%s\"\r\n",\
- tabs, dir, file);\
- printf("%s>\r\n", tabs);\
- printf("%s</File>\r\n", tabs);\
- }\
- else if(type == "vcxproj") {\
- i = index(file, ".");\
- ext = substr(file, i == 0 ? 0 : i + 1);\
-\
- if(ext == "c")\
- printf("%s<ClCompile Include=\"..\\..\\..\\..\\%s\\%s\" />\r\n",\
- spaces, dir, file);\
- else if(ext == "h")\
- printf("%s<ClInclude Include=\"..\\..\\..\\..\\%s\\%s\" />\r\n",\
- spaces, dir, file);\
- else if(ext == "rc")\
- printf("%s<ResourceCompile Include=\"..\\..\\..\\..\\%s\\%s\" />\r\n",\
- spaces, dir, file);\
- }\
-}\
-\
-{\
-\
- if($$0 == "CURL_LIB_C_FILES") {\
- split(lib_srcs, arr);\
- for(val in arr) gen_element(proj_type, "lib", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_H_FILES") {\
- split(lib_hdrs, arr);\
- for(val in arr) gen_element(proj_type, "lib", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_RC_FILES") {\
- split(lib_rc, arr);\
- for(val in arr) gen_element(proj_type, "lib", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_VAUTH_C_FILES") {\
- split(lib_vauth_srcs, arr);\
- for(val in arr) gen_element(proj_type, "lib\\vauth", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_VAUTH_H_FILES") {\
- split(lib_vauth_hdrs, arr);\
- for(val in arr) gen_element(proj_type, "lib\\vauth", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_VQUIC_C_FILES") {\
- split(lib_vquic_srcs, arr);\
- for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_VQUIC_H_FILES") {\
- split(lib_vquic_hdrs, arr);\
- for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_VSSH_C_FILES") {\
- split(lib_vssh_srcs, arr);\
- for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_VSSH_H_FILES") {\
- split(lib_vssh_hdrs, arr);\
- for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_VTLS_C_FILES") {\
- split(lib_vtls_srcs, arr);\
- for(val in arr) gen_element(proj_type, "lib\\vtls", arr[val]);\
- }\
- else if($$0 == "CURL_LIB_VTLS_H_FILES") {\
- split(lib_vtls_hdrs, arr);\
- for(val in arr) gen_element(proj_type, "lib\\vtls", arr[val]);\
- }\
- else if($$0 == "CURL_SRC_C_FILES") {\
- split(src_srcs, arr);\
- for(val in arr) gen_element(proj_type, "src", arr[val]);\
- }\
- else if($$0 == "CURL_SRC_H_FILES") {\
- split(src_hdrs, arr);\
- for(val in arr) gen_element(proj_type, "src", arr[val]);\
- }\
- else if($$0 == "CURL_SRC_RC_FILES") {\
- split(src_rc, arr);\
- for(val in arr) gen_element(proj_type, "src", arr[val]);\
- }\
- else if($$0 == "CURL_SRC_X_C_FILES") {\
- split(src_x_srcs, arr);\
- for(val in arr) {\
- sub(/..\/lib\//, "", arr[val]);\
- gen_element(proj_type, "lib", arr[val]);\
- }\
- }\
- else if($$0 == "CURL_SRC_X_H_FILES") {\
- split(src_x_hdrs, arr);\
- for(val in arr) {\
- sub(/..\/lib\//, "", arr[val]);\
- gen_element(proj_type, "lib", arr[val]);\
- }\
- }\
- else\
- printf("%s\r\n", $$0);\
-}';\
- \
- echo "generating '$(VC6_LIBDSP)'"; \
- awk -v proj_type=dsp \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC6_LIBTMPL) > $(VC6_LIBDSP) || { exit
1; }; \
- \
- echo "generating '$(VC6_SRCDSP)'"; \
- awk -v proj_type=dsp \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC6_SRCTMPL) > $(VC6_SRCDSP) || { exit
1; }; \
- \
- echo "generating '$(VC7_LIBVCPROJ)'"; \
- awk -v proj_type=vcproj1 \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC7_LIBTMPL) > $(VC7_LIBVCPROJ) || {
exit 1; }; \
- \
- echo "generating '$(VC7_SRCVCPROJ)'"; \
- awk -v proj_type=vcproj1 \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC7_SRCTMPL) > $(VC7_SRCVCPROJ) || {
exit 1; }; \
- \
- echo "generating '$(VC71_LIBVCPROJ)'"; \
- awk -v proj_type=vcproj1 \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC71_LIBTMPL) > $(VC71_LIBVCPROJ) || {
exit 1; }; \
- \
- echo "generating '$(VC71_SRCVCPROJ)'"; \
- awk -v proj_type=vcproj1 \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC71_SRCTMPL) > $(VC71_SRCVCPROJ) || {
exit 1; }; \
- \
- echo "generating '$(VC8_LIBVCPROJ)'"; \
- awk -v proj_type=vcproj2 \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC8_LIBTMPL) > $(VC8_LIBVCPROJ) || {
exit 1; }; \
- \
- echo "generating '$(VC8_SRCVCPROJ)'"; \
- awk -v proj_type=vcproj2 \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC8_SRCTMPL) > $(VC8_SRCVCPROJ) || {
exit 1; }; \
- \
- echo "generating '$(VC9_LIBVCPROJ)'"; \
- awk -v proj_type=vcproj2 \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC9_LIBTMPL) > $(VC9_LIBVCPROJ) || {
exit 1; }; \
- \
- echo "generating '$(VC9_SRCVCPROJ)'"; \
- awk -v proj_type=vcproj2 \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC9_SRCTMPL) > $(VC9_SRCVCPROJ) || {
exit 1; }; \
- \
- echo "generating '$(VC10_LIBVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC10_LIBTMPL) > $(VC10_LIBVCXPROJ) ||
{ exit 1; }; \
- \
- echo "generating '$(VC10_SRCVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC10_SRCTMPL) > $(VC10_SRCVCXPROJ) ||
{ exit 1; }; \
- \
- echo "generating '$(VC11_LIBVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC11_LIBTMPL) > $(VC11_LIBVCXPROJ) ||
{ exit 1; }; \
- \
- echo "generating '$(VC11_SRCVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC11_SRCTMPL) > $(VC11_SRCVCXPROJ) ||
{ exit 1; }; \
- \
- echo "generating '$(VC12_LIBVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC12_LIBTMPL) > $(VC12_LIBVCXPROJ) ||
{ exit 1; }; \
- \
- echo "generating '$(VC12_SRCVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC12_SRCTMPL) > $(VC12_SRCVCXPROJ) ||
{ exit 1; }; \
- \
- echo "generating '$(VC14_LIBVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC14_LIBTMPL) > $(VC14_LIBVCXPROJ) ||
{ exit 1; }; \
- \
- echo "generating '$(VC14_SRCVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC14_SRCTMPL) > $(VC14_SRCVCXPROJ) ||
{ exit 1; }; \
- \
- echo "generating '$(VC15_LIBVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v lib_srcs="$$sorted_lib_srcs" \
- -v lib_hdrs="$$sorted_lib_hdrs" \
- -v lib_rc="$$win32_lib_rc" \
- -v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
- -v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
- -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
- -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
- -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
- -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
- -v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
- -v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
- "$$awk_code" $(srcdir)/$(VC15_LIBTMPL) > $(VC15_LIBVCXPROJ) ||
{ exit 1; }; \
- \
- echo "generating '$(VC15_SRCVCXPROJ)'"; \
- awk -v proj_type=vcxproj \
- -v src_srcs="$$sorted_src_srcs" \
- -v src_hdrs="$$sorted_src_hdrs" \
- -v src_rc="$$win32_src_rc" \
- -v src_x_srcs="$$sorted_src_x_srcs" \
- -v src_x_hdrs="$$sorted_src_x_hdrs" \
- "$$awk_code" $(srcdir)/$(VC15_SRCTMPL) > $(VC15_SRCVCXPROJ) ||
{ exit 1; };)
-
tidy:
(cd src && $(MAKE) tidy)
(cd lib && $(MAKE) tidy)
diff --cc README.md
index 363fd4929,44c85121a..1479aa36d
--- a/README.md
+++ b/README.md
@@@ -1,8 -1,16 +1,9 @@@
-![curl logo](https://curl.se/logo/curl-logo.svg)
+gnurl
+=====
-[![CII Best
Practices](https://bestpractices.coreinfrastructure.org/projects/63/badge)](https://bestpractices.coreinfrastructure.org/projects/63)
-[![Coverity
passed](https://scan.coverity.com/projects/curl/badge.svg)](https://scan.coverity.com/projects/curl)
-[![Travis-CI Build
Status](https://travis-ci.org/curl/curl.svg?branch=master)](https://travis-ci.org/curl/curl)
-[![AppVeyor Build
Status](https://ci.appveyor.com/api/projects/status/l1vv31029huhf4g4?svg=true)](https://ci.appveyor.com/project/curlorg/curl)
-[![Azure DevOps Build
Status](https://dev.azure.com/daniel0244/curl/_apis/build/status/curl.curl?branchName=master)](https://dev.azure.com/daniel0244/curl/_build/latest?definitionId=1&branchName=master)
-[![Cirrus Build
Status](https://api.cirrus-ci.com/github/curl/curl.svg?branch=master)](https://cirrus-ci.com/github/curl/curl)
-[![Backers on Open
Collective](https://opencollective.com/curl/backers/badge.svg)](#backers)
-[![Sponsors on Open
Collective](https://opencollective.com/curl/sponsors/badge.svg)](#sponsors)
-[![Language Grade:
C/C++](https://img.shields.io/lgtm/grade/cpp/g/curl/curl.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/curl/curl/context:cpp)
-[![Codacy
Badge](https://api.codacy.com/project/badge/Grade/d11483a0cc5c4ebd9da4ff9f7cd56690)](https://www.codacy.com/app/curl/curl?utm_source=github.com&utm_medium=referral&utm_content=curl/curl&utm_campaign=Badge_Grade)
-[![Fuzzing
Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/curl.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:curl)
+[![Travis-CI Build
Status](https://travis-ci.org/teknokatze/gnurl.svg?branch=master)](https://travis-ci.org/teknokatze/gnurl)
+[![Cirrus Build
Status](https://api.cirrus-ci.com/github/teknokatze/gnurl.svg?branch=master)](https://cirrus-ci.com/github/teknokatze/gnurl)
++![curl logo](https://curl.se/logo/curl-logo.svg)
Curl is a command-line tool for transferring data specified with URL
syntax. Find out how to use curl by reading [the curl.1 man
@@@ -12,26 -20,26 +13,25 @@@ by reading [the INSTALL document](https
libcurl is the library curl is using to do its job. It is readily available to
be used by your software. Read [the libcurl.3 man
- page](https://curl.haxx.se/libcurl/c/libcurl.html) to learn how!
+ page](https://curl.se/libcurl/c/libcurl.html) to learn how!
- You can find answers to the most frequent questions for curl in [the FAQ
document](https://curl.haxx.se/docs/faq.html).
-You can find answers to the most frequent questions we get in [the FAQ
++You can find answers to the most frequent questions for curl in [the FAQ
+ document](https://curl.se/docs/faq.html).
- Study [the COPYING file](https://curl.haxx.se/docs/copyright.html) for
- distribution terms and similar. If you distribute curl binaries or other
- binaries that involve libcurl, you might enjoy [the LICENSE-MIXING
- document](https://curl.haxx.se/legal/licmix.html).
+ Study [the COPYING file](https://curl.se/docs/copyright.html) for
+ distribution terms.
## Contact
- For curl, if you have problems, questions, ideas or suggestions, please
contact us by posting to a suitable [mailing list](https://curl.haxx.se/mail/).
-If you have problems, questions, ideas or suggestions, please contact us by
-posting to a suitable [mailing list](https://curl.se/mail/).
++For curl, if you have problems, questions, ideas or suggestions, please
contact us by posting to a suitable [mailing list](https://curl.se/mail/).
+For gnurl, if you have problems, questions, ideas or suggestions, please
contact us by posting to a suitable [mailing
list](https://gnunet.org/en/engage.html) or bug tracker.
- All curl contributors to the project are listed in [the THANKS
document](https://curl.haxx.se/docs/thanks.html).
-All contributors to the project are listed in [the THANKS
-document](https://curl.se/docs/thanks.html).
++All curl contributors to the project are listed in [the THANKS
document](https://curl.se/docs/thanks.html).
## Website
-Visit the [curl website](https://curl.se/) for the latest news and
-downloads.
+Visit the [gnurl web site](https://gnunet.org/en/gnurl.html/) for the latest
news and downloads.
- For curl specific information, visit the [curl web
site](https://curl.haxx.se/).
++For curl specific information, visit the [curl web site](https://curl.se/).
## Git
@@@ -43,21 -51,14 +43,20 @@@ To download the very latest source fro
## Security problems
-Report suspected security problems via [our HackerOne
-page](https://hackerone.com/curl) and not in public!
+gnurl is a fork of curl. Any security problems should first be tested with
curl.
- In the unlikely case that you suspect a gnurl specific security problem,
report it to the author of this software (ng0, gnunet.org).
++In the unlikely case that you suspect a gnurl specific security problem,
report it to the author of this fork software (Nikita, gnunet).
## Notice
-Curl contains pieces of source code that is Copyright (c) 1998, 1999 Kungliga
-Tekniska Högskolan. This notice is included here to comply with the
-distribution terms.
+gnurl, and therefore Curl contains pieces of source code that is
+Copyright (c) 1998, 1999 Kungliga Tekniska Högskolan. This notice is
+included here to comply with the distribution terms.
+
+## Backers
+
- In the unlikely case anyone wants to sponsor my work, which primarily covers
NetBSD and GNUnet now, [[click here](https://www.patreon.com/ng0)].
- The continued work on this (micro)fork of curl is financed for by [[Taler
SA](https://taler.net)].
++In the unlikely case anyone wants to sponsor my work, which primarily covers
NetBSD and GNUnet now, [[click here](https://www.patreon.com/teknokatze)].
+
+## Curl - Please support the development of curl, section below from
[curl/curl](https://github.com/curl/curl)
## Backers
diff --cc configure.ac
index fb8fe15df,39bdb5ef1..66b4e6635
--- a/configure.ac
+++ b/configure.ac
@@@ -24,7 -24,7 +24,7 @@@ dnl Process this file with autoconf to
AC_PREREQ(2.57)
dnl We don't know the version number "statically" so we use a dash here
- AC_INIT([gnurl], [-], [a suitable curl mailing list:
https://curl.haxx.se/mail/])
-AC_INIT([curl], [-], [a suitable curl mailing list: https://curl.se/mail/])
++AC_INIT([gnurl], [-], [a suitable curl mailing list: https://curl.se/mail/])
XC_OVR_ZZ50
XC_OVR_ZZ60
@@@ -169,29 -168,8 +169,35 @@@ curl_verbose_msg="enabled (--disable-ve
ssl_backends=
-enable_altsvc="yes"
+dnl valgrind for tests -- coredumps all over the place with the
+dnl valgrind version I here, fixes welcome.
+AC_MSG_CHECKING(wether to enable valgrind in testsuite)
+AC_ARG_ENABLE([valgrind],
+ [AS_HELP_STRING([--enable-valgrind],
+ [Enable valgrind for tests])],
+ [valgrind=${enableval}],
+ [valgrind=no])
+AC_MSG_RESULT($valgrind)
+AS_IF([test "x$valgrind" = "xno"],
+ [AM_CONDITIONAL([VALGRIND],
+ false)
+ AC_DEFINE([VALGRIND],
+ [0],
+ [Running tests with -n])
+ valgrind_msg="no"],
+ [AM_CONDITIONAL([VALGRIND],
+ true)
+ AC_DEFINE([VALGRIND],
+ [1],
+ [Running tests with valgrind])
+ valgrind_msg="yes"])
+
++# curl_altsvc_msg="enabled";
++# ssl_backends=
++#
++#
++# enable_altsvc="yes"
+
dnl
dnl Save some initial values the user might have provided
dnl
@@@ -1830,22 -1754,14 +1840,16 @@@ if test -z "$ssl_backends" -o "x$OPT_SS
case "$OPT_SSL" in
yes)
+ AC_MSG_ERROR([You must not build gnurl with OpenSSL, use --without-ssl!])
dnl --with-ssl (without path) used
- if test x$cross_compiling != xyes; then
- dnl only do pkg-config magic when not cross-compiling
- PKGTEST="yes"
- fi
+ PKGTEST="yes"
PREFIX_OPENSSL=/usr/local/ssl
LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff"
;;
off)
+ AC_MSG_ERROR([You must not build gnurl with OpenSSL, use --without-ssl!])
dnl no --with-ssl option given, just check default places
- if test x$cross_compiling != xyes; then
- dnl only do pkg-config magic when not cross-compiling
- PKGTEST="yes"
- fi
+ PKGTEST="yes"
PREFIX_OPENSSL=
;;
*)
@@@ -5298,10 -5264,9 +5371,10 @@@ AC_MSG_NOTICE([Configured to build gnur
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
+ ECH: ${curl_ech_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
+ valgrind tests: ${valgrind_msg}
])
if test -n "$experimental"; then
cat >&2 << _EOF
diff --cc docs/Makefile.am
index 820764528,9cf657748..376299811
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@@ -41,9 -45,10 +41,9 @@@ EXTRA_DIST
ALTSVC.md \
BINDINGS.md \
BUG-BOUNTY.md \
- BUGS \
+ BUGS.md \
CHECKSRC.md \
CIPHERS.md \
- CMakeLists.txt \
CODE_OF_CONDUCT.md \
CODE_REVIEW.md \
CODE_STYLE.md \
@@@ -80,10 -85,12 +80,10 @@@
SSLCERTS.md \
THANKS \
TODO \
- TheArtOfHttpScripting \
+ TheArtOfHttpScripting.md \
VERSIONS.md
-MAN2HTML= roffit $< >$@
-
-SUFFIXES = .1 .html .pdf
+SUFFIXES = .1
# $(abs_builddir) is to disable VPATH when searching for this file, which
# would otherwise find the copy in $(srcdir) which breaks the $(HUGE)
diff --cc docs/cmdline-opts/page-footer
index de77c4e0c,d1f32a66f..f105eb759
--- a/docs/cmdline-opts/page-footer
+++ b/docs/cmdline-opts/page-footer
@@@ -39,6 -37,9 +39,10 @@@ accesses the target URL through the pro
The list of host names can also be include numerical IP addresses, and IPv6
versions should then be given without enclosing brackets.
+ IPv6 numerical addresses are compared as strings, so they will only match if
+ the representations are the same: "::1" is the same as "::0:1" but they don't
+ match.
++
.IP "CURL_SSL_BACKEND <TLS backend>"
If curl was built with support for "MultiSSL", meaning that it has built-in
support for more than one TLS backend, this environment variable can be set to
@@@ -275,10 -276,11 +279,10 @@@ is the protocol used for HTTP/3 transfe
.IP XX
More error codes will appear here in future releases. The existing ones
are meant to never change.
-.SH AUTHORS / CONTRIBUTORS
+.Sh AUTHORS
Daniel Stenberg is the main author, but the whole list of contributors is
found in the separate THANKS file.
-.SH WWW
-https://curl.se
-.SH "SEE ALSO"
-.BR ftp (1),
-.BR wget (1)
+.Sh SEE ALSO
- .Lk https://curl.haxx.se
++.Lk https://curl.se
+.Xr ftp 1 ,
+.Xr wget 1
diff --cc docs/examples/.gitignore
index cf5571bbf,f1f0e39cf..45661bb7e
--- a/docs/examples/.gitignore
+++ b/docs/examples/.gitignore
@@@ -1,10 -1,5 +1,11 @@@
+altsvc
+http3
+http3-present
+imap-authzid
+pop3-authzid
+smtp-authzid
10-at-a-time
+ altsvc
anyauthput
certinfo
chkspeed
diff --cc docs/libcurl/gnurl_easy_cleanup.3
index fd05f44fb,000000000..0411b1809
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_cleanup.3
+++ b/docs/libcurl/gnurl_easy_cleanup.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH gnurl_easy_cleanup 3 "22 Aug 2007" "libcurl 7.17.0" "libgnurl Manual"
+.SH NAME
+curl_easy_cleanup - End a libcurl easy handle
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+.BI "void curl_easy_cleanup(CURL *" handle ");"
+.SH DESCRIPTION
+This function must be the last function to call for an easy session. It is the
+opposite of the \fIcurl_easy_init(3)\fP function and must be called with the
+same \fIhandle\fP as input that a \fIcurl_easy_init(3)\fP call returned.
+
+This might close all connections this handle has used and possibly has kept
+open until now - unless it was attached to a multi handle while doing the
+transfers. Don't call this function if you intend to transfer more files,
+re-using handles is a key to good performance with libcurl.
+
+Occasionally you may get your progress callback or header callback called from
+within \fIcurl_easy_cleanup(3)\fP (if previously set for the handle using
+\fIcurl_easy_setopt(3)\fP). Like if libcurl decides to shut down the
+connection and the protocol is of a kind that requires a command/response
+sequence before disconnect. Examples of such protocols are FTP, POP3 and IMAP.
+
+Any use of the \fBhandle\fP after this function has been called and have
+returned, is illegal. \fIcurl_easy_cleanup(3)\fP kills the handle and all
+memory associated with it!
+
+Passing in a NULL pointer in \fIhandle\fP will make this function return
+immediately with no action.
+.SH "OLD TIMES"
+For libcurl versions before 7.17,: after you've called this function, you can
+safely remove all the strings you've previously told libcurl to use, as it
+won't use them anymore now.
+.SH RETURN VALUE
+None
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH "SEE ALSO"
+.BR curl_easy_init "(3), " curl_easy_duphandle "(3), "
+.BR curl_easy_reset "(3), "
+.BR curl_multi_cleanup "(3), " curl_multi_remove_handle "(3) "
diff --cc docs/libcurl/gnurl_easy_duphandle.3
index bf413235c,000000000..df5277d2e
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_duphandle.3
+++ b/docs/libcurl/gnurl_easy_duphandle.3
@@@ -1,53 -1,0 +1,53 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_easy_duphandle 3 "19 Sep 2014" "libcurl" "libgnurl Manual"
+.SH NAME
+curl_easy_duphandle - Clone a libcurl session handle
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+.BI "CURL *curl_easy_duphandle(CURL *"handle ");"
+
+.SH DESCRIPTION
+This function will return a new curl handle, a duplicate, using all the
+options previously set in the input curl \fIhandle\fP. Both handles can
+subsequently be used independently and they must both be freed with
+\fIcurl_easy_cleanup(3)\fP.
+
+All strings that the input handle has been told to point to (as opposed to
+copy) with previous calls to \fIcurl_easy_setopt(3)\fP using char * inputs,
+will be pointed to by the new handle as well. You must therefore make sure to
+keep the data around until both handles have been cleaned up.
+
+The new handle will \fBnot\fP inherit any state information, no connections,
+no SSL sessions and no cookies. It also will not inherit any share object
+states or options (it will be made as if \fICURLOPT_SHARE(3)\fP was set to
+NULL).
+
+In multi-threaded programs, this function must be called in a synchronous way,
+the input handle may not be in use when cloned.
+.SH RETURN VALUE
+If this function returns NULL, something went wrong and no valid handle was
+returned.
+.SH "SEE ALSO"
+.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_easy_reset "(3),"
+.BR curl_global_init "(3)"
diff --cc docs/libcurl/gnurl_easy_escape.3
index 8430ea1c2,000000000..fed95a650
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_escape.3
+++ b/docs/libcurl/gnurl_easy_escape.3
@@@ -1,67 -1,0 +1,68 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH gnurl_easy_escape 3 "7 April 2006" "libcurl 7.15.4" "libgnurl Manual"
+.SH NAME
+curl_easy_escape - URL encodes the given string
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "char *curl_easy_escape( CURL *" curl ", const char *" string
+.BI ", int "length " );"
+.ad
+.SH DESCRIPTION
+This function converts the given input \fIstring\fP to a URL encoded string
+and returns that as a new allocated string. All input characters that are not
+a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped"
+version (%NN where NN is a two-digit hexadecimal number).
+
+If \fIlength\fP is set to 0 (zero), \fIcurl_easy_escape(3)\fP uses strlen() on
- the input \fIstring\fP to find out the size.
++the input \fIstring\fP to find out the size. This function does not accept
++input strings longer than \fBCURL_MAX_INPUT_LENGTH\fP (8 MB).
+
+You must \fIcurl_free(3)\fP the returned string when you're done with it.
+.SH ENCODING
+libcurl is typically not aware of, nor does it care about, character
+encodings. \fIcurl_easy_escape(3)\fP encodes the data byte-by-byte into the
+URL encoded version without knowledge or care for what particular character
+encoding the application or the receiving server may assume that the data
+uses.
+
+The caller of \fIcurl_easy_escape(3)\fP must make sure that the data passed in
+to the function is encoded correctly.
+.SH AVAILABILITY
+Added in 7.15.4 and replaces the old \fIcurl_escape(3)\fP function.
+.SH RETURN VALUE
+A pointer to a null-terminated string or NULL if it failed.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ char *output = curl_easy_escape(curl, "data to convert", 15);
+ if(output) {
+ printf("Encoded: %s\\n", output);
+ curl_free(output);
+ }
+}
+.fi
+.SH "SEE ALSO"
+.BR curl_easy_unescape "(3), " curl_free "(3), " RFC 3986
diff --cc docs/libcurl/gnurl_easy_getinfo.3
index c6a338e1c,000000000..105699377
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_getinfo.3
+++ b/docs/libcurl/gnurl_easy_getinfo.3
@@@ -1,283 -1,0 +1,286 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH gnurl_easy_getinfo 3 "11 Feb 2009" "libcurl 7.19.4" "libgnurl Manual"
+.SH NAME
+curl_easy_getinfo - extract information from a curl handle
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+.B "CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... );"
+
+.SH DESCRIPTION
+Request internal information from the curl session with this function. The
+third argument \fBMUST\fP be a pointer to a long, a pointer to a char *, a
+pointer to a struct curl_slist * or a pointer to a double (as this
+documentation describes further down). The data pointed-to will be filled in
+accordingly and can be relied upon only if the function returns CURLE_OK. Use
+this function AFTER a performed transfer if you want to get transfer related
+data.
+
+You should not free the memory returned by this function unless it is
+explicitly mentioned below.
+.SH AVAILABLE INFORMATION
+The following information can be extracted:
+.IP CURLINFO_EFFECTIVE_METHOD
+Last used HTTP method.
+See \fICURLINFO_EFFECTIVE_METHOD(3)\fP
+.IP CURLINFO_EFFECTIVE_URL
+Last used URL.
+See \fICURLINFO_EFFECTIVE_URL(3)\fP
+.IP CURLINFO_RESPONSE_CODE
+Last received response code.
+See \fICURLINFO_RESPONSE_CODE(3)\fP
+.IP CURLINFO_HTTP_CONNECTCODE
+Last proxy CONNECT response code.
+See \fICURLINFO_HTTP_CONNECTCODE(3)\fP
+.IP CURLINFO_HTTP_VERSION
+The http version used in the connection.
+See \fICURLINFO_HTTP_VERSION(3)\fP
+.IP CURLINFO_FILETIME
+Remote time of the retrieved document. See \fICURLINFO_FILETIME(3)\fP
+.IP CURLINFO_FILETIME_T
+Remote time of the retrieved document. See \fICURLINFO_FILETIME_T(3)\fP
+.IP CURLINFO_TOTAL_TIME
+Total time of previous transfer.
+See \fICURLINFO_TOTAL_TIME(3)\fP
+.IP CURLINFO_TOTAL_TIME_T
+Total time of previous transfer.
+See \fICURLINFO_TOTAL_TIME_T(3)\fP
+.IP CURLINFO_NAMELOOKUP_TIME
+Time from start until name resolving completed.
+See \fICURLINFO_NAMELOOKUP_TIME(3)\fP
+.IP CURLINFO_NAMELOOKUP_TIME_T
+Time from start until name resolving completed.
+See \fICURLINFO_NAMELOOKUP_TIME_T(3)\fP
+.IP CURLINFO_CONNECT_TIME
+Time from start until remote host or proxy completed.
+See \fICURLINFO_CONNECT_TIME(3)\fP
+.IP CURLINFO_CONNECT_TIME_T
+Time from start until remote host or proxy completed.
+See \fICURLINFO_CONNECT_TIME_T(3)\fP
+.IP CURLINFO_APPCONNECT_TIME
+Time from start until SSL/SSH handshake completed.
+See \fICURLINFO_APPCONNECT_TIME(3)\fP
+.IP CURLINFO_APPCONNECT_TIME_T
+Time from start until SSL/SSH handshake completed.
+See \fICURLINFO_APPCONNECT_TIME_T(3)\fP
+.IP CURLINFO_PRETRANSFER_TIME
+Time from start until just before the transfer begins.
+See \fICURLINFO_PRETRANSFER_TIME(3)\fP
+.IP CURLINFO_PRETRANSFER_TIME_T
+Time from start until just before the transfer begins.
+See \fICURLINFO_PRETRANSFER_TIME_T(3)\fP
+.IP CURLINFO_STARTTRANSFER_TIME
+Time from start until just when the first byte is received.
+See \fICURLINFO_STARTTRANSFER_TIME(3)\fP
+.IP CURLINFO_STARTTRANSFER_TIME_T
+Time from start until just when the first byte is received.
+See \fICURLINFO_STARTTRANSFER_TIME_T(3)\fP
+.IP CURLINFO_REDIRECT_TIME
+Time taken for all redirect steps before the final transfer.
+See \fICURLINFO_REDIRECT_TIME(3)\fP
+.IP CURLINFO_REDIRECT_TIME_T
+Time taken for all redirect steps before the final transfer.
+See \fICURLINFO_REDIRECT_TIME_T(3)\fP
+.IP CURLINFO_REDIRECT_COUNT
+Total number of redirects that were followed.
+See \fICURLINFO_REDIRECT_COUNT(3)\fP
+.IP CURLINFO_REDIRECT_URL
+URL a redirect would take you to, had you enabled redirects.
+See \fICURLINFO_REDIRECT_URL(3)\fP
+.IP CURLINFO_SIZE_UPLOAD
+(Deprecated) Number of bytes uploaded.
+See \fICURLINFO_SIZE_UPLOAD(3)\fP
+.IP CURLINFO_SIZE_UPLOAD_T
+Number of bytes uploaded.
+See \fICURLINFO_SIZE_UPLOAD_T(3)\fP
+.IP CURLINFO_SIZE_DOWNLOAD
+(Deprecated) Number of bytes downloaded.
+See \fICURLINFO_SIZE_DOWNLOAD(3)\fP
+.IP CURLINFO_SIZE_DOWNLOAD_T
+Number of bytes downloaded.
+See \fICURLINFO_SIZE_DOWNLOAD_T(3)\fP
+.IP CURLINFO_SPEED_DOWNLOAD
+(Deprecated) Average download speed.
+See \fICURLINFO_SPEED_DOWNLOAD(3)\fP
+.IP CURLINFO_SPEED_DOWNLOAD_T
+Average download speed.
+See \fICURLINFO_SPEED_DOWNLOAD_T(3)\fP
+.IP CURLINFO_SPEED_UPLOAD
+(Deprecated) Average upload speed.
+See \fICURLINFO_SPEED_UPLOAD(3)\fP
+.IP CURLINFO_SPEED_UPLOAD_T
+Average upload speed.
+See \fICURLINFO_SPEED_UPLOAD_T(3)\fP
+.IP CURLINFO_HEADER_SIZE
+Number of bytes of all headers received.
+See \fICURLINFO_HEADER_SIZE(3)\fP
+.IP CURLINFO_REQUEST_SIZE
+Number of bytes sent in the issued HTTP requests.
+See \fICURLINFO_REQUEST_SIZE(3)\fP
+.IP CURLINFO_SSL_VERIFYRESULT
+Certificate verification result.
+See \fICURLINFO_SSL_VERIFYRESULT(3)\fP
++.IP CURLINFO_PROXY_ERROR
++Detailed proxy error.
++See \fICURLINFO_PROXY_ERROR(3)\fP
+.IP CURLINFO_PROXY_SSL_VERIFYRESULT
+Proxy certificate verification result.
+See \fICURLINFO_PROXY_SSL_VERIFYRESULT(3)\fP
+.IP CURLINFO_SSL_ENGINES
+A list of OpenSSL crypto engines.
+See \fICURLINFO_SSL_ENGINES(3)\fP
+.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD
+(Deprecated) Content length from the Content-Length header.
+See \fICURLINFO_CONTENT_LENGTH_DOWNLOAD(3)\fP
+.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
+Content length from the Content-Length header.
+See \fICURLINFO_CONTENT_LENGTH_DOWNLOAD_T(3)\fP
+.IP CURLINFO_CONTENT_LENGTH_UPLOAD
+(Deprecated) Upload size. See \fICURLINFO_CONTENT_LENGTH_UPLOAD(3)\fP
+.IP CURLINFO_CONTENT_LENGTH_UPLOAD_T
+Upload size. See \fICURLINFO_CONTENT_LENGTH_UPLOAD_T(3)\fP
+.IP CURLINFO_CONTENT_TYPE
+Content type from the Content-Type header.
+See \fICURLINFO_CONTENT_TYPE(3)\fP
+.IP CURLINFO_RETRY_AFTER
+The value from the from the Retry-After header.
+See \fICURLINFO_RETRY_AFTER(3)\fP
+.IP CURLINFO_PRIVATE
+User's private data pointer.
+See \fICURLINFO_PRIVATE(3)\fP
+.IP CURLINFO_HTTPAUTH_AVAIL
+Available HTTP authentication methods.
+See \fICURLINFO_HTTPAUTH_AVAIL(3)\fP
+.IP CURLINFO_PROXYAUTH_AVAIL
+Available HTTP proxy authentication methods.
+See \fICURLINFO_PROXYAUTH_AVAIL(3)\fP
+.IP CURLINFO_OS_ERRNO
+The errno from the last failure to connect.
+See \fICURLINFO_OS_ERRNO(3)\fP
+.IP CURLINFO_NUM_CONNECTS
+Number of new successful connections used for previous transfer.
+See \fICURLINFO_NUM_CONNECTS(3)\fP
+.IP CURLINFO_PRIMARY_IP
+IP address of the last connection.
+See \fICURLINFO_PRIMARY_IP(3)\fP
+.IP CURLINFO_PRIMARY_PORT
+Port of the last connection.
+See \fICURLINFO_PRIMARY_PORT(3)\fP
+.IP CURLINFO_LOCAL_IP
+Local-end IP address of last connection.
+See \fICURLINFO_LOCAL_IP(3)\fP
+.IP CURLINFO_LOCAL_PORT
+Local-end port of last connection.
+See \fICURLINFO_LOCAL_PORT(3)\fP
+.IP CURLINFO_COOKIELIST
+List of all known cookies.
+See \fICURLINFO_COOKIELIST(3)\fP
+.IP CURLINFO_LASTSOCKET
+Last socket used.
+See \fICURLINFO_LASTSOCKET(3)\fP
+.IP CURLINFO_ACTIVESOCKET
+The session's active socket.
+See \fICURLINFO_ACTIVESOCKET(3)\fP
+.IP CURLINFO_FTP_ENTRY_PATH
+The entry path after logging in to an FTP server.
+See \fICURLINFO_FTP_ENTRY_PATH(3)\fP
+.IP CURLINFO_CERTINFO
+Certificate chain.
+See \fICURLINFO_CERTINFO(3)\fP
+.IP CURLINFO_TLS_SSL_PTR
+TLS session info that can be used for further processing.
+See \fICURLINFO_TLS_SSL_PTR(3)\fP
+.IP CURLINFO_TLS_SESSION
+TLS session info that can be used for further processing. See
+\fICURLINFO_TLS_SESSION(3)\fP. Deprecated option, use
+\fICURLINFO_TLS_SSL_PTR(3)\fP instead!
+.IP CURLINFO_CONDITION_UNMET
+Whether or not a time conditional was met or 304 HTTP response.
+See \fICURLINFO_CONDITION_UNMET(3)\fP
+.IP CURLINFO_RTSP_SESSION_ID
+RTSP session ID.
+See \fICURLINFO_RTSP_SESSION_ID(3)\fP
+.IP CURLINFO_RTSP_CLIENT_CSEQ
+RTSP CSeq that will next be used.
+See \fICURLINFO_RTSP_CLIENT_CSEQ(3)\fP
+.IP CURLINFO_RTSP_SERVER_CSEQ
+RTSP CSeq that will next be expected.
+See \fICURLINFO_RTSP_SERVER_CSEQ(3)\fP
+.IP CURLINFO_RTSP_CSEQ_RECV
+RTSP CSeq last received.
+See \fICURLINFO_RTSP_CSEQ_RECV(3)\fP
+.IP CURLINFO_PROTOCOL
+The protocol used for the connection. (Added in 7.52.0)
+See \fICURLINFO_PROTOCOL(3)\fP
+.IP CURLINFO_SCHEME
+The scheme used for the connection. (Added in 7.52.0)
+See \fICURLINFO_SCHEME(3)\fP
+.SH TIMES
+.nf
+An overview of the six time values available from curl_easy_getinfo()
+
+curl_easy_perform()
+ |
+ |--NAMELOOKUP
+ |--|--CONNECT
+ |--|--|--APPCONNECT
+ |--|--|--|--PRETRANSFER
+ |--|--|--|--|--STARTTRANSFER
+ |--|--|--|--|--|--TOTAL
+ |--|--|--|--|--|--REDIRECT
+.fi
+.IP NAMELOOKUP
+\fICURLINFO_NAMELOOKUP_TIME\fP and \fICURLINFO_NAMELOOKUP_TIME_T\fP.
+The time it took from the start until the name resolving was completed.
+.IP CONNECT
+\fICURLINFO_CONNECT_TIME\fP and \fICURLINFO_CONNECT_TIME_T\fP.
+The time it took from the start until the connect
+to the remote host (or proxy) was completed.
+.IP APPCONNECT
+\fICURLINFO_APPCONNECT_TIME\fP and \fICURLINFO_APPCONNECT_TIME_T\fP.
+The time it took from the start until the SSL
+connect/handshake with the remote host was completed. (Added in 7.19.0)
+The latter is the integer version (measuring microseconds). (Added in 7.60.0)
+.IP PRETRANSFER
+\fICURLINFO_PRETRANSFER_TIME\fP and \fICURLINFO_PRETRANSFER_TIME_T\fP.
+The time it took from the start until the
+file transfer is just about to begin. This includes all pre-transfer commands
+and negotiations that are specific to the particular protocol(s) involved.
+.IP STARTTRANSFER
+\fICURLINFO_STARTTRANSFER_TIME\fP and \fICURLINFO_STARTTRANSFER_TIME_T\fP.
+The time it took from the start until the
+first byte is received by libcurl.
+.IP TOTAL
+\fICURLINFO_TOTAL_TIME\fP and \fICURLINFO_TOTAL_TIME_T\fP.
+Total time of the previous request.
+.IP REDIRECT
+\fICURLINFO_REDIRECT_TIME\fP and \fICURLINFO_REDIRECT_TIME_T\fP.
+The time it took for all redirection steps
+include name lookup, connect, pretransfer and transfer before final
+transaction was started. So, this is zero if no redirection took place.
+.SH RETURN VALUE
+If the operation was successful, CURLE_OK is returned. Otherwise an
+appropriate error code will be returned.
+.SH "SEE ALSO"
+.BR curl_easy_setopt "(3)"
diff --cc docs/libcurl/gnurl_easy_init.3
index a17400dc5,000000000..af8950038
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_init.3
+++ b/docs/libcurl/gnurl_easy_init.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_easy_init 3 "4 March 2002" "libcurl 7.8.1" "libgnurl Manual"
+.SH NAME
+curl_easy_init - Start a libcurl easy session
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+.BI "CURL *curl_easy_init( );"
+.SH DESCRIPTION
+This function must be the first function to call, and it returns a CURL easy
+handle that you must use as input to other functions in the easy
+interface. This call \fBMUST\fP have a corresponding call to
+\fIcurl_easy_cleanup(3)\fP when the operation is complete.
+
+If you did not already call \fIcurl_global_init(3)\fP, \fIcurl_easy_init(3)\fP
+does it automatically. This may be lethal in multi-threaded cases, since
+\fIcurl_global_init(3)\fP is not thread-safe, and it may result in resource
+problems because there is no corresponding cleanup.
+
+You are strongly advised to not allow this automatic behaviour, by calling
+\fIcurl_global_init(3)\fP yourself properly. See the description in
+\fBlibcurl\fP(3) of global environment requirements for details of how to use
+this function.
+.SH RETURN VALUE
+If this function returns NULL, something went wrong and you cannot use the
+other curl functions.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH "SEE ALSO"
+.BR curl_easy_cleanup "(3), " curl_global_init "(3), " curl_easy_reset "(3), "
+.BR curl_easy_perform "(3) "
diff --cc docs/libcurl/gnurl_easy_pause.3
index 6d223f2dd,000000000..3f27639d2
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_pause.3
+++ b/docs/libcurl/gnurl_easy_pause.3
@@@ -1,103 -1,0 +1,103 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_easy_pause 3 "17 Dec 2007" "libcurl 7.18.0" "libgnurl Manual"
+.SH NAME
+curl_easy_pause - pause and unpause a connection
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+.BI "CURLcode curl_easy_pause(CURL *"handle ", int "bitmask " );"
+
+.SH DESCRIPTION
+Using this function, you can explicitly mark a running connection to get
+paused, and you can unpause a connection that was previously paused.
+
+A connection can be paused by using this function or by letting the read or
+the write callbacks return the proper magic return code
+(\fICURL_READFUNC_PAUSE\fP and \fICURL_WRITEFUNC_PAUSE\fP). A write callback
+that returns pause signals to the library that it couldn't take care of any
+data at all, and that data will then be delivered again to the callback when
+the writing is later unpaused.
+
+While it may feel tempting, take care and notice that you cannot call this
+function from another thread. To unpause, you may for example call it from the
+progress callback (\fICURLOPT_PROGRESSFUNCTION(3)\fP), which gets called at
+least once per second, even if the connection is paused.
+
+When this function is called to unpause reading, the chance is high that you
+will get your write callback called before this function returns.
+
+The \fBhandle\fP argument is of course identifying the handle that operates on
+the connection you want to pause or unpause.
+
+The \fBbitmask\fP argument is a set of bits that sets the new state of the
+connection. The following bits can be used:
+.IP CURLPAUSE_RECV
+Pause receiving data. There will be no data received on this connection until
+this function is called again without this bit set. Thus, the write callback
+(\fICURLOPT_WRITEFUNCTION(3)\fP) won't be called.
+.IP CURLPAUSE_SEND
+Pause sending data. There will be no data sent on this connection until this
+function is called again without this bit set. Thus, the read callback
+(\fICURLOPT_READFUNCTION(3)\fP) won't be called.
+.IP CURLPAUSE_ALL
+Convenience define that pauses both directions.
+.IP CURLPAUSE_CONT
+Convenience define that unpauses both directions.
+.SH RETURN VALUE
+CURLE_OK (zero) means that the option was set properly, and a non-zero return
+code means something wrong occurred after the new state was set. See the
+\fIlibcurl-errors(3)\fP man page for the full list with descriptions.
+.SH LIMITATIONS
+The pausing of transfers does not work with protocols that work without
+network connectivity, like FILE://. Trying to pause such a transfer, in any
+direction, will cause problems in the worst case or an error in the best case.
+.SH AVAILABILITY
+This function was added in libcurl 7.18.0. Before this version, there was no
+explicit support for pausing transfers.
+.SH "USAGE WITH THE MULTI-SOCKET INTERFACE"
+Before libcurl 7.32.0, when a specific handle was unpaused with this function,
+there was no particular forced rechecking or similar of the socket's state,
+which made the continuation of the transfer get delayed until next
+multi-socket call invoke or even longer. Alternatively, the user could
+forcibly call for example \fIcurl_multi_socket_all(3)\fP - with a rather hefty
+performance penalty.
+
+Starting in libcurl 7.32.0, unpausing a transfer will schedule a timeout
+trigger for that handle 1 millisecond into the future, so that a
+curl_multi_socket_action( ... CURL_SOCKET_TIMEOUT) can be used immediately
+afterwards to get the transfer going again as desired.
+.SH "MEMORY USE"
+When pausing a read by returning the magic return code from a write callback,
+the read data is already in libcurl's internal buffers so it'll have to keep
+it in an allocated buffer until the reading is again unpaused using this
+function.
+
+If the downloaded data is compressed and is asked to get uncompressed
+automatically on download, libcurl will continue to uncompress the entire
+downloaded chunk and it will cache the data uncompressed. This has the side-
+effect that if you download something that is compressed a lot, it can result
+in a very large data amount needing to be allocated to save the data during
+the pause. This said, you should probably consider not using paused reading if
+you allow libcurl to uncompress data automatically.
+.SH "SEE ALSO"
+.BR curl_easy_cleanup "(3), " curl_easy_reset "(3)"
diff --cc docs/libcurl/gnurl_easy_perform.3
index 36c6675f0,000000000..6e1ea6f37
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_perform.3
+++ b/docs/libcurl/gnurl_easy_perform.3
@@@ -1,74 -1,0 +1,74 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_easy_perform 3 "5 Mar 2001" "libcurl 7.7" "libgnurl Manual"
+.SH NAME
+curl_easy_perform - perform a blocking file transfer
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_easy_perform(CURL *" easy_handle ");"
+.ad
+.SH DESCRIPTION
+Invoke this function after \fIcurl_easy_init(3)\fP and all the
+\fIcurl_easy_setopt(3)\fP calls are made, and will perform the transfer as
+described in the options. It must be called with the same \fBeasy_handle\fP as
+input as the \fIcurl_easy_init(3)\fP call returned.
+
+\fIcurl_easy_perform(3)\fP performs the entire request in a blocking manner
+and returns when done, or if it failed. For non-blocking behavior, see
+\fIcurl_multi_perform(3)\fP.
+
+You can do any amount of calls to \fIcurl_easy_perform(3)\fP while using the
+same \fBeasy_handle\fP. If you intend to transfer more than one file, you are
+even encouraged to do so. libcurl will then attempt to re-use the same
+connection for the following transfers, thus making the operations faster,
+less CPU intense and using less network resources. Just note that you will
+have to use \fIcurl_easy_setopt(3)\fP between the invokes to set options for
+the following curl_easy_perform.
+
+You must never call this function simultaneously from two places using the
+same \fBeasy_handle\fP. Let the function return first before invoking it
+another time. If you want parallel transfers, you must use several curl
+easy_handles.
+
+While the \fBeasy_handle\fP is added to a multi handle, it cannot be used by
+\fIcurl_easy_perform(3)\fP.
+.SH RETURN VALUE
+CURLE_OK (0) means everything was ok, non-zero means an error occurred as
+.I <gnurl/curl.h>
+defines - see \fIlibcurl-errors(3)\fP. If the \fICURLOPT_ERRORBUFFER(3)\fP was
+set with \fIcurl_easy_setopt(3)\fP there will be a readable error message in
+the error buffer when non-zero is returned.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH "SEE ALSO"
+.BR curl_easy_init "(3), " curl_easy_setopt "(3), "
+.BR curl_multi_add_handle "(3), " curl_multi_perform "(3), "
+.BR libcurl-errors "(3), "
diff --cc docs/libcurl/gnurl_easy_recv.3
index d5127757f,000000000..abcc97457
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_recv.3
+++ b/docs/libcurl/gnurl_easy_recv.3
@@@ -1,84 -1,0 +1,84 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH gnurl_easy_recv 3 "29 April 2008" "libcurl 7.18.2" "libgnurl Manual"
+.SH NAME
+curl_easy_recv - receives raw data on an "easy" connection
+.SH SYNOPSIS
+.B #include <gnurl/easy.h>
+.sp
+.BI "CURLcode curl_easy_recv( CURL *" curl ", void *" buffer ","
+.BI "size_t " buflen ", size_t *" n ");"
+.ad
+.SH DESCRIPTION
+This function receives raw data from the established connection. You may use
+it together with \fIcurl_easy_send(3)\fP to implement custom protocols using
+libcurl. This functionality can be particularly useful if you use proxies
+and/or SSL encryption: libcurl will take care of proxy negotiation and
+connection set-up.
+
+\fBbuffer\fP is a pointer to your buffer that will get the received
+data. \fBbuflen\fP is the maximum amount of data you can get in that
+buffer. The variable \fBn\fP points to will receive the number of received
+bytes.
+
+To establish the connection, set \fICURLOPT_CONNECT_ONLY(3)\fP option before
+calling \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP. Note that
+\fIcurl_easy_recv(3)\fP does not work on connections that were created without
+this option.
+
+The call will return \fBCURLE_AGAIN\fP if there is no data to read - the
+socket is used in non-blocking mode internally. When \fBCURLE_AGAIN\fP is
+returned, use your operating system facilities like \fIselect(2)\fP to wait
+for data. The socket may be obtained using \fIcurl_easy_getinfo(3)\fP with
+\fICURLINFO_ACTIVESOCKET(3)\fP.
+
+Wait on the socket only if \fIcurl_easy_recv(3)\fP returns \fBCURLE_AGAIN\fP.
+The reason for this is libcurl or the SSL library may internally cache some
+data, therefore you should call \fIcurl_easy_recv(3)\fP until all data is
+read which would include any cached data.
+
+Furthermore if you wait on the socket and it tells you there is data to read,
+\fIcurl_easy_recv(3)\fP may return \fBCURLE_AGAIN\fP if the only data that was
+read was for internal SSL processing, and no other data is available.
+
+.SH AVAILABILITY
+Added in 7.18.2.
+.SH RETURN VALUE
+On success, returns \fBCURLE_OK\fP, stores the received data into
+\fBbuffer\fP, and the number of bytes it actually read into \fB*n\fP.
+
+On failure, returns the appropriate error code.
+
+The function may return \fBCURLE_AGAIN\fP. In this case, use your operating
+system facilities to wait until data can be read, and retry.
+
+Reading exactly 0 bytes indicates a closed connection.
+
+If there's no socket available to use from the previous transfer, this
function
+returns \fBCURLE_UNSUPPORTED_PROTOCOL\fP.
+.SH EXAMPLE
+See \fBsendrecv.c\fP in \fBdocs/examples\fP directory for usage example.
+.SH "SEE ALSO"
+.BR curl_easy_setopt "(3), " curl_easy_perform "(3), "
+.BR curl_easy_getinfo "(3), "
+.BR curl_easy_send "(3) "
diff --cc docs/libcurl/gnurl_easy_reset.3
index 5bf6ddf9a,000000000..05b7b069f
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_reset.3
+++ b/docs/libcurl/gnurl_easy_reset.3
@@@ -1,44 -1,0 +1,44 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_easy_reset 3 "31 July 2004" "libcurl 7.12.1" "libgnurl Manual"
+.SH NAME
+curl_easy_reset - reset all options of a libcurl session handle
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+.BI "void curl_easy_reset(CURL *"handle ");"
+
+.SH DESCRIPTION
+Re-initializes all options previously set on a specified CURL handle to the
+default values. This puts back the handle to the same state as it was in when
+it was just created with \fIcurl_easy_init(3)\fP.
+
+It does not change the following information kept in the handle: live
+connections, the Session ID cache, the DNS cache, the cookies, the shares or
+the alt-svc cache.
+.SH AVAILABILITY
+This function was added in libcurl 7.12.1
+.SH RETURN VALUE
+Nothing
+.SH "SEE ALSO"
+.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_easy_setopt "(3),"
+.BR curl_easy_duphandle "(3)"
diff --cc docs/libcurl/gnurl_easy_send.3
index 08c0671b0,000000000..91c1324d4
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_send.3
+++ b/docs/libcurl/gnurl_easy_send.3
@@@ -1,75 -1,0 +1,75 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH gnurl_easy_send 3 "29 April 2008" "libcurl 7.18.2" "libgnurl Manual"
+.SH NAME
+curl_easy_send - sends raw data over an "easy" connection
+.SH SYNOPSIS
+.B #include <gnurl/easy.h>
+.sp
+.BI "CURLcode curl_easy_send( CURL *" curl ", const void *" buffer ","
+.BI " size_t " buflen ", size_t *" n ");"
+.ad
+.SH DESCRIPTION
+This function sends arbitrary data over the established connection. You may
+use it together with \fIcurl_easy_recv(3)\fP to implement custom protocols
+using libcurl. This functionality can be particularly useful if you use
+proxies and/or SSL encryption: libcurl will take care of proxy negotiation and
+connection set-up.
+
+\fBbuffer\fP is a pointer to the data of length \fBbuflen\fP that you want
sent.
+The variable \fBn\fP points to will receive the number of sent bytes.
+
+To establish the connection, set \fICURLOPT_CONNECT_ONLY(3)\fP option before
+calling \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP. Note that
+\fIcurl_easy_send(3)\fP will not work on connections that were created without
+this option.
+
+The call will return \fBCURLE_AGAIN\fP if it's not possible to send data right
+now - the socket is used in non-blocking mode internally. When
+\fBCURLE_AGAIN\fP is returned, use your operating system facilities like
+\fIselect(2)\fP to wait until the socket is writable. The socket may be
+obtained using \fIcurl_easy_getinfo(3)\fP with \fICURLINFO_ACTIVESOCKET(3)\fP.
+
+Furthermore if you wait on the socket and it tells you it's writable,
+\fIcurl_easy_send(3)\fP may return \fBCURLE_AGAIN\fP if the only data that was
+sent was for internal SSL processing, and no other data could be sent.
+
+.SH AVAILABILITY
+Added in 7.18.2.
+.SH RETURN VALUE
+On success, returns \fBCURLE_OK\fP and stores the number of bytes actually
+sent into \fB*n\fP. Note that this may very well be less than the amount you
+wanted to send.
+
+On failure, returns the appropriate error code.
+
+This function may return \fBCURLE_AGAIN\fP. In this case, use your operating
+system facilities to wait until the socket is writable, and retry.
+
+If there's no socket available to use from the previous transfer, this
function
+returns \fBCURLE_UNSUPPORTED_PROTOCOL\fP.
+.SH EXAMPLE
+See \fBsendrecv.c\fP in \fBdocs/examples\fP directory for usage example.
+.SH "SEE ALSO"
+.BR curl_easy_setopt "(3), " curl_easy_perform "(3), " curl_easy_getinfo
"(3), "
+.BR curl_easy_recv "(3) "
diff --cc docs/libcurl/gnurl_easy_setopt.3
index 6d6e3f842,000000000..848981927
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_setopt.3
+++ b/docs/libcurl/gnurl_easy_setopt.3
@@@ -1,663 -1,0 +1,681 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH gnurl_easy_setopt 3 "25 Jun 2014" "libcurl 7.38.0" "libgnurl Manual"
+.SH NAME
+curl_easy_setopt \- set options for a curl easy handle
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
+.SH DESCRIPTION
+\fIcurl_easy_setopt(3)\fP is used to tell libcurl how to behave. By setting
+the appropriate options, the application can change libcurl's behavior. All
+options are set with an \fIoption\fP followed by a \fIparameter\fP. That
+parameter can be a \fBlong\fP, a \fBfunction pointer\fP, an \fBobject
+pointer\fP or a \fBcurl_off_t\fP, depending on what the specific option
+expects. Read this manual carefully as bad input values may cause libcurl to
+behave badly! You can only set one option in each function call. A typical
+application uses many \fIcurl_easy_setopt(3)\fP calls in the setup phase.
+
+Options set with this function call are valid for all forthcoming transfers
+performed using this \fIhandle\fP. The options are not in any way reset
+between transfers, so if you want subsequent transfers with different options,
+you must change them between the transfers. You can optionally reset all
+options back to internal default with \fIcurl_easy_reset(3)\fP.
+
+Strings passed to libcurl as 'char *' arguments, are copied by the library;
+thus the string storage associated to the pointer argument may be overwritten
+after \fIcurl_easy_setopt(3)\fP returns. The only exception to this rule is
+really \fICURLOPT_POSTFIELDS(3)\fP, but the alternative that copies the string
+\fICURLOPT_COPYPOSTFIELDS(3)\fP has some usage characteristics you need to
- read up on.
++read up on. This function does not accept input strings longer than
++\fBCURL_MAX_INPUT_LENGTH\fP (8 MB).
+
+The order in which the options are set does not matter.
+
+Before version 7.17.0, strings were not copied. Instead the user was forced
+keep them available until libcurl no longer needed them.
+
+The \fIhandle\fP is the return code from a \fIcurl_easy_init(3)\fP or
+\fIcurl_easy_duphandle(3)\fP call.
+.SH BEHAVIOR OPTIONS
+.IP CURLOPT_VERBOSE
+Display verbose information. See \fICURLOPT_VERBOSE(3)\fP
+.IP CURLOPT_HEADER
+Include the header in the body output. See \fICURLOPT_HEADER(3)\fP
+.IP CURLOPT_NOPROGRESS
+Shut off the progress meter. See \fICURLOPT_NOPROGRESS(3)\fP
+.IP CURLOPT_NOSIGNAL
+Do not install signal handlers. See \fICURLOPT_NOSIGNAL(3)\fP
+.IP CURLOPT_WILDCARDMATCH
+Transfer multiple files according to a file name pattern. See
\fICURLOPT_WILDCARDMATCH(3)\fP
+.SH CALLBACK OPTIONS
+.IP CURLOPT_WRITEFUNCTION
+Callback for writing data. See \fICURLOPT_WRITEFUNCTION(3)\fP
+.IP CURLOPT_WRITEDATA
+Data pointer to pass to the write callback. See \fICURLOPT_WRITEDATA(3)\fP
+.IP CURLOPT_READFUNCTION
+Callback for reading data. See \fICURLOPT_READFUNCTION(3)\fP
+.IP CURLOPT_READDATA
+Data pointer to pass to the read callback. See \fICURLOPT_READDATA(3)\fP
+.IP CURLOPT_IOCTLFUNCTION
+Callback for I/O operations. See \fICURLOPT_IOCTLFUNCTION(3)\fP
+.IP CURLOPT_IOCTLDATA
+Data pointer to pass to the I/O callback. See \fICURLOPT_IOCTLDATA(3)\fP
+.IP CURLOPT_SEEKFUNCTION
+Callback for seek operations. See \fICURLOPT_SEEKFUNCTION(3)\fP
+.IP CURLOPT_SEEKDATA
+Data pointer to pass to the seek callback. See \fICURLOPT_SEEKDATA(3)\fP
+.IP CURLOPT_SOCKOPTFUNCTION
+Callback for sockopt operations. See \fICURLOPT_SOCKOPTFUNCTION(3)\fP
+.IP CURLOPT_SOCKOPTDATA
+Data pointer to pass to the sockopt callback. See \fICURLOPT_SOCKOPTDATA(3)\fP
+.IP CURLOPT_OPENSOCKETFUNCTION
+Callback for socket creation. See \fICURLOPT_OPENSOCKETFUNCTION(3)\fP
+.IP CURLOPT_OPENSOCKETDATA
+Data pointer to pass to the open socket callback. See
\fICURLOPT_OPENSOCKETDATA(3)\fP
+.IP CURLOPT_CLOSESOCKETFUNCTION
+Callback for closing socket. See \fICURLOPT_CLOSESOCKETFUNCTION(3)\fP
+.IP CURLOPT_CLOSESOCKETDATA
+Data pointer to pass to the close socket callback. See
\fICURLOPT_CLOSESOCKETDATA(3)\fP
+.IP CURLOPT_PROGRESSFUNCTION
+OBSOLETE callback for progress meter. See \fICURLOPT_PROGRESSFUNCTION(3)\fP
+.IP CURLOPT_PROGRESSDATA
+Data pointer to pass to the progress meter callback. See
\fICURLOPT_PROGRESSDATA(3)\fP
+.IP CURLOPT_XFERINFOFUNCTION
+Callback for progress meter. See \fICURLOPT_XFERINFOFUNCTION(3)\fP
+.IP CURLOPT_XFERINFODATA
+Data pointer to pass to the progress meter callback. See
\fICURLOPT_XFERINFODATA(3)\fP
+.IP CURLOPT_HEADERFUNCTION
+Callback for writing received headers. See \fICURLOPT_HEADERFUNCTION(3)\fP
+.IP CURLOPT_HEADERDATA
+Data pointer to pass to the header callback. See \fICURLOPT_HEADERDATA(3)\fP
+.IP CURLOPT_DEBUGFUNCTION
+Callback for debug information. See \fICURLOPT_DEBUGFUNCTION(3)\fP
+.IP CURLOPT_DEBUGDATA
+Data pointer to pass to the debug callback. See \fICURLOPT_DEBUGDATA(3)\fP
+.IP CURLOPT_SSL_CTX_FUNCTION
+Callback for SSL context logic. See \fICURLOPT_SSL_CTX_FUNCTION(3)\fP
+.IP CURLOPT_SSL_CTX_DATA
+Data pointer to pass to the SSL context callback. See
\fICURLOPT_SSL_CTX_DATA(3)\fP
+.IP CURLOPT_CONV_TO_NETWORK_FUNCTION
+Callback for code base conversion. See
\fICURLOPT_CONV_TO_NETWORK_FUNCTION(3)\fP
+.IP CURLOPT_CONV_FROM_NETWORK_FUNCTION
+Callback for code base conversion. See
\fICURLOPT_CONV_FROM_NETWORK_FUNCTION(3)\fP
+.IP CURLOPT_CONV_FROM_UTF8_FUNCTION
+Callback for code base conversion. See
\fICURLOPT_CONV_FROM_UTF8_FUNCTION(3)\fP
+.IP CURLOPT_INTERLEAVEFUNCTION
+Callback for RTSP interleaved data. See \fICURLOPT_INTERLEAVEFUNCTION(3)\fP
+.IP CURLOPT_INTERLEAVEDATA
+Data pointer to pass to the RTSP interleave callback. See
\fICURLOPT_INTERLEAVEDATA(3)\fP
+.IP CURLOPT_CHUNK_BGN_FUNCTION
+Callback for wildcard download start of chunk. See
\fICURLOPT_CHUNK_BGN_FUNCTION(3)\fP
+.IP CURLOPT_CHUNK_END_FUNCTION
+Callback for wildcard download end of chunk. See
\fICURLOPT_CHUNK_END_FUNCTION(3)\fP
+.IP CURLOPT_CHUNK_DATA
+Data pointer to pass to the chunk callbacks. See \fICURLOPT_CHUNK_DATA(3)\fP
+.IP CURLOPT_FNMATCH_FUNCTION
+Callback for wildcard matching. See \fICURLOPT_FNMATCH_FUNCTION(3)\fP
+.IP CURLOPT_FNMATCH_DATA
+Data pointer to pass to the wildcard matching callback. See
\fICURLOPT_FNMATCH_DATA(3)\fP
+.IP CURLOPT_SUPPRESS_CONNECT_HEADERS
+Suppress proxy CONNECT response headers from user callbacks. See
\fICURLOPT_SUPPRESS_CONNECT_HEADERS(3)\fP
+.IP CURLOPT_RESOLVER_START_FUNCTION
+Callback to be called before a new resolve request is started. See
\fICURLOPT_RESOLVER_START_FUNCTION(3)\fP
+.IP CURLOPT_RESOLVER_START_DATA
+Data pointer to pass to resolver start callback. See
\fICURLOPT_RESOLVER_START_DATA(3)\fP
+.SH ERROR OPTIONS
+.IP CURLOPT_ERRORBUFFER
+Error message buffer. See \fICURLOPT_ERRORBUFFER(3)\fP
+.IP CURLOPT_STDERR
+stderr replacement stream. See \fICURLOPT_STDERR(3)\fP
+.IP CURLOPT_FAILONERROR
+Fail on HTTP 4xx errors. \fICURLOPT_FAILONERROR(3)\fP
+.IP CURLOPT_KEEP_SENDING_ON_ERROR
+Keep sending on HTTP >= 300 errors. \fICURLOPT_KEEP_SENDING_ON_ERROR(3)\fP
+.SH NETWORK OPTIONS
+.IP CURLOPT_URL
+URL to work on. See \fICURLOPT_URL(3)\fP
+.IP CURLOPT_PATH_AS_IS
+Disable squashing /../ and /./ sequences in the path. See
\fICURLOPT_PATH_AS_IS(3)\fP
+.IP CURLOPT_PROTOCOLS
+Allowed protocols. See \fICURLOPT_PROTOCOLS(3)\fP
+.IP CURLOPT_REDIR_PROTOCOLS
+Protocols to allow redirects to. See \fICURLOPT_REDIR_PROTOCOLS(3)\fP
+.IP CURLOPT_DEFAULT_PROTOCOL
+Default protocol. See \fICURLOPT_DEFAULT_PROTOCOL(3)\fP
+.IP CURLOPT_PROXY
+Proxy to use. See \fICURLOPT_PROXY(3)\fP
+.IP CURLOPT_PRE_PROXY
+Socks proxy to use. See \fICURLOPT_PRE_PROXY(3)\fP
+.IP CURLOPT_PROXYPORT
+Proxy port to use. See \fICURLOPT_PROXYPORT(3)\fP
+.IP CURLOPT_PROXYTYPE
+Proxy type. See \fICURLOPT_PROXYTYPE(3)\fP
+.IP CURLOPT_NOPROXY
+Filter out hosts from proxy use. \fICURLOPT_NOPROXY(3)\fP
+.IP CURLOPT_HTTPPROXYTUNNEL
+Tunnel through the HTTP proxy. \fICURLOPT_HTTPPROXYTUNNEL(3)\fP
+.IP CURLOPT_CONNECT_TO
+Connect to a specific host and port. See \fICURLOPT_CONNECT_TO(3)\fP
+.IP CURLOPT_SOCKS5_AUTH
+Socks5 authentication methods. See \fICURLOPT_SOCKS5_AUTH(3)\fP
+.IP CURLOPT_SOCKS5_GSSAPI_SERVICE
+Socks5 GSSAPI service name. \fICURLOPT_SOCKS5_GSSAPI_SERVICE(3)\fP
+.IP CURLOPT_SOCKS5_GSSAPI_NEC
+Socks5 GSSAPI NEC mode. See \fICURLOPT_SOCKS5_GSSAPI_NEC(3)\fP
+.IP CURLOPT_PROXY_SERVICE_NAME
+Proxy authentication service name. \fICURLOPT_PROXY_SERVICE_NAME(3)\fP
+.IP CURLOPT_HAPROXYPROTOCOL
+Send an HAProxy PROXY protocol v1 header. See \fICURLOPT_HAPROXYPROTOCOL(3)\fP
+.IP CURLOPT_SERVICE_NAME
+Authentication service name. \fICURLOPT_SERVICE_NAME(3)\fP
+.IP CURLOPT_INTERFACE
+Bind connection locally to this. See \fICURLOPT_INTERFACE(3)\fP
+.IP CURLOPT_LOCALPORT
+Bind connection locally to this port. See \fICURLOPT_LOCALPORT(3)\fP
+.IP CURLOPT_LOCALPORTRANGE
+Bind connection locally to port range. See \fICURLOPT_LOCALPORTRANGE(3)\fP
+.IP CURLOPT_DNS_CACHE_TIMEOUT
+Timeout for DNS cache. See \fICURLOPT_DNS_CACHE_TIMEOUT(3)\fP
+.IP CURLOPT_DNS_USE_GLOBAL_CACHE
+OBSOLETE Enable global DNS cache. See \fICURLOPT_DNS_USE_GLOBAL_CACHE(3)\fP
+.IP CURLOPT_DOH_URL
+Use this DOH server for name resolves. See \fICURLOPT_DOH_URL(3)\fP
+.IP CURLOPT_BUFFERSIZE
+Ask for alternate buffer size. See \fICURLOPT_BUFFERSIZE(3)\fP
+.IP CURLOPT_PORT
+Port number to connect to. See \fICURLOPT_PORT(3)\fP
+.IP CURLOPT_TCP_FASTOPEN
+Enable TFO, TCP Fast Open. See \fICURLOPT_TCP_FASTOPEN(3)\fP
+.IP CURLOPT_TCP_NODELAY
+Disable the Nagle algorithm. See \fICURLOPT_TCP_NODELAY(3)\fP
+.IP CURLOPT_ADDRESS_SCOPE
+IPv6 scope for local addresses. See \fICURLOPT_ADDRESS_SCOPE(3)\fP
+.IP CURLOPT_TCP_KEEPALIVE
+Enable TCP keep-alive. See \fICURLOPT_TCP_KEEPALIVE(3)\fP
+.IP CURLOPT_TCP_KEEPIDLE
+Idle time before sending keep-alive. See \fICURLOPT_TCP_KEEPIDLE(3)\fP
+.IP CURLOPT_TCP_KEEPINTVL
+Interval between keep-alive probes. See \fICURLOPT_TCP_KEEPINTVL(3)\fP
+.IP CURLOPT_UNIX_SOCKET_PATH
+Path to a Unix domain socket. See \fICURLOPT_UNIX_SOCKET_PATH(3)\fP
+.IP CURLOPT_ABSTRACT_UNIX_SOCKET
+Path to an abstract Unix domain socket. See
\fICURLOPT_ABSTRACT_UNIX_SOCKET(3)\fP
+.SH NAMES and PASSWORDS OPTIONS (Authentication)
+.IP CURLOPT_NETRC
+Enable .netrc parsing. See \fICURLOPT_NETRC(3)\fP
+.IP CURLOPT_NETRC_FILE
+\&.netrc file name. See \fICURLOPT_NETRC_FILE(3)\fP
+.IP CURLOPT_USERPWD
+User name and password. See \fICURLOPT_USERPWD(3)\fP
+.IP CURLOPT_PROXYUSERPWD
+Proxy user name and password. See \fICURLOPT_PROXYUSERPWD(3)\fP
+.IP CURLOPT_USERNAME
+User name. See \fICURLOPT_USERNAME(3)\fP
+.IP CURLOPT_PASSWORD
+Password. See \fICURLOPT_PASSWORD(3)\fP
+.IP CURLOPT_LOGIN_OPTIONS
+Login options. See \fICURLOPT_LOGIN_OPTIONS(3)\fP
+.IP CURLOPT_PROXYUSERNAME
+Proxy user name. See \fICURLOPT_PROXYUSERNAME(3)\fP
+.IP CURLOPT_PROXYPASSWORD
+Proxy password. See \fICURLOPT_PROXYPASSWORD(3)\fP
+.IP CURLOPT_HTTPAUTH
+HTTP server authentication methods. See \fICURLOPT_HTTPAUTH(3)\fP
+.IP CURLOPT_TLSAUTH_USERNAME
+TLS authentication user name. See \fICURLOPT_TLSAUTH_USERNAME(3)\fP
+.IP CURLOPT_PROXY_TLSAUTH_USERNAME
+Proxy TLS authentication user name. See
\fICURLOPT_PROXY_TLSAUTH_USERNAME(3)\fP
+.IP CURLOPT_TLSAUTH_PASSWORD
+TLS authentication password. See \fICURLOPT_TLSAUTH_PASSWORD(3)\fP
+.IP CURLOPT_PROXY_TLSAUTH_PASSWORD
+Proxy TLS authentication password. See \fICURLOPT_PROXY_TLSAUTH_PASSWORD(3)\fP
+.IP CURLOPT_TLSAUTH_TYPE
+TLS authentication methods. See \fICURLOPT_TLSAUTH_TYPE(3)\fP
+.IP CURLOPT_PROXY_TLSAUTH_TYPE
+Proxy TLS authentication methods. See \fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP
+.IP CURLOPT_PROXYAUTH
+HTTP proxy authentication methods. See \fICURLOPT_PROXYAUTH(3)\fP
+.IP CURLOPT_SASL_AUTHZID
+SASL authorisation identity (identity to act as). See
\fICURLOPT_SASL_AUTHZID(3)\fP
+.IP CURLOPT_SASL_IR
+Enable SASL initial response. See \fICURLOPT_SASL_IR(3)\fP
+.IP CURLOPT_XOAUTH2_BEARER
+OAuth2 bearer token. See \fICURLOPT_XOAUTH2_BEARER(3)\fP
+.IP CURLOPT_DISALLOW_USERNAME_IN_URL
+Don't allow username in URL. See \fICURLOPT_DISALLOW_USERNAME_IN_URL(3)\fP
+.SH HTTP OPTIONS
+.IP CURLOPT_AUTOREFERER
+Automatically set Referer: header. See \fICURLOPT_AUTOREFERER(3)\fP
+.IP CURLOPT_ACCEPT_ENCODING
+Accept-Encoding and automatic decompressing data. See
\fICURLOPT_ACCEPT_ENCODING(3)\fP
+.IP CURLOPT_TRANSFER_ENCODING
+Request Transfer-Encoding. See \fICURLOPT_TRANSFER_ENCODING(3)\fP
+.IP CURLOPT_FOLLOWLOCATION
+Follow HTTP redirects. See \fICURLOPT_FOLLOWLOCATION(3)\fP
+.IP CURLOPT_UNRESTRICTED_AUTH
+Do not restrict authentication to original host.
\fICURLOPT_UNRESTRICTED_AUTH(3)\fP
+.IP CURLOPT_MAXREDIRS
+Maximum number of redirects to follow. See \fICURLOPT_MAXREDIRS(3)\fP
+.IP CURLOPT_POSTREDIR
+How to act on redirects after POST. See \fICURLOPT_POSTREDIR(3)\fP
+.IP CURLOPT_PUT
+Issue an HTTP PUT request. See \fICURLOPT_PUT(3)\fP
+.IP CURLOPT_POST
+Issue an HTTP POST request. See \fICURLOPT_POST(3)\fP
+.IP CURLOPT_POSTFIELDS
+Send a POST with this data. See \fICURLOPT_POSTFIELDS(3)\fP
+.IP CURLOPT_POSTFIELDSIZE
+The POST data is this big. See \fICURLOPT_POSTFIELDSIZE(3)\fP
+.IP CURLOPT_POSTFIELDSIZE_LARGE
+The POST data is this big. See \fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP
+.IP CURLOPT_COPYPOSTFIELDS
+Send a POST with this data - and copy it. See \fICURLOPT_COPYPOSTFIELDS(3)\fP
+.IP CURLOPT_HTTPPOST
+Multipart formpost HTTP POST. See \fICURLOPT_HTTPPOST(3)\fP
+.IP CURLOPT_REFERER
+Referer: header. See \fICURLOPT_REFERER(3)\fP
+.IP CURLOPT_USERAGENT
+User-Agent: header. See \fICURLOPT_USERAGENT(3)\fP
+.IP CURLOPT_HTTPHEADER
+Custom HTTP headers. See \fICURLOPT_HTTPHEADER(3)\fP
+.IP CURLOPT_HEADEROPT
+Control custom headers. See \fICURLOPT_HEADEROPT(3)\fP
+.IP CURLOPT_PROXYHEADER
+Custom HTTP headers sent to proxy. See \fICURLOPT_PROXYHEADER(3)\fP
+.IP CURLOPT_HTTP200ALIASES
+Alternative versions of 200 OK. See \fICURLOPT_HTTP200ALIASES(3)\fP
+.IP CURLOPT_COOKIE
+Cookie(s) to send. See \fICURLOPT_COOKIE(3)\fP
+.IP CURLOPT_COOKIEFILE
+File to read cookies from. See \fICURLOPT_COOKIEFILE(3)\fP
+.IP CURLOPT_COOKIEJAR
+File to write cookies to. See \fICURLOPT_COOKIEJAR(3)\fP
+.IP CURLOPT_COOKIESESSION
+Start a new cookie session. See \fICURLOPT_COOKIESESSION(3)\fP
+.IP CURLOPT_COOKIELIST
+Add or control cookies. See \fICURLOPT_COOKIELIST(3)\fP
+.IP CURLOPT_ALTSVC
+Specify the Alt-Svc: cache file name. See \fICURLOPT_ALTSVC(3)\fP
+.IP CURLOPT_ALTSVC_CTRL
+Enable and configure Alt-Svc: treatment. See \fICURLOPT_ALTSVC_CTRL(3)\fP
++.IP CURLOPT_HSTS
++Set HSTS cache file. See \fICURLOPT_HSTS(3)\fP
++.IP CURLOPT_HSTS_CTRL
++Enable HSTS. See \fICURLOPT_HSTS_CTRL(3)\fP
++.IP CURLOPT_HSTSREADFUNCTION
++Set HSTS read callback. See \fICURLOPT_HSTSREADFUNCTION(3)\fP
++.IP CURLOPT_HSTSREADDATA
++Pass pointer to the HSTS read callback. See \fICURLOPT_HSTSREADDATA(3)\fP
++.IP CURLOPT_HSTSWRITEFUNCTION
++Set HSTS write callback. See \fICURLOPT_HSTSWRITEFUNCTION(3)\fP
++.IP CURLOPT_HSTSWRITEDATA
++Pass pointer to the HSTS write callback. See \fICURLOPT_HSTSWRITEDATA(3)\fP
+.IP CURLOPT_HTTPGET
+Do an HTTP GET request. See \fICURLOPT_HTTPGET(3)\fP
+.IP CURLOPT_REQUEST_TARGET
+Set the request target. \fICURLOPT_REQUEST_TARGET(3)\fP
+.IP CURLOPT_HTTP_VERSION
+HTTP version to use. \fICURLOPT_HTTP_VERSION(3)\fP
+.IP CURLOPT_HTTP09_ALLOWED
+Allow HTTP/0.9 responses. \fICURLOPT_HTTP09_ALLOWED(3)\fP
+.IP CURLOPT_IGNORE_CONTENT_LENGTH
+Ignore Content-Length. See \fICURLOPT_IGNORE_CONTENT_LENGTH(3)\fP
+.IP CURLOPT_HTTP_CONTENT_DECODING
+Disable Content decoding. See \fICURLOPT_HTTP_CONTENT_DECODING(3)\fP
+.IP CURLOPT_HTTP_TRANSFER_DECODING
+Disable Transfer decoding. See \fICURLOPT_HTTP_TRANSFER_DECODING(3)\fP
+.IP CURLOPT_EXPECT_100_TIMEOUT_MS
+100-continue timeout. See \fICURLOPT_EXPECT_100_TIMEOUT_MS(3)\fP
+.IP CURLOPT_TRAILERFUNCTION
+Set callback for sending trailing headers. See
+\fICURLOPT_TRAILERFUNCTION(3)\fP
+.IP CURLOPT_TRAILERDATA
+Custom pointer passed to the trailing headers callback. See
+\fICURLOPT_TRAILERDATA(3)\fP
+.IP CURLOPT_PIPEWAIT
+Wait on connection to pipeline on it. See \fICURLOPT_PIPEWAIT(3)\fP
+.IP CURLOPT_STREAM_DEPENDS
+This HTTP/2 stream depends on another. See \fICURLOPT_STREAM_DEPENDS(3)\fP
+.IP CURLOPT_STREAM_DEPENDS_E
+This HTTP/2 stream depends on another exclusively. See
+\fICURLOPT_STREAM_DEPENDS_E(3)\fP
+.IP CURLOPT_STREAM_WEIGHT
+Set this HTTP/2 stream's weight. See \fICURLOPT_STREAM_WEIGHT(3)\fP
+.SH SMTP OPTIONS
+.IP CURLOPT_MAIL_FROM
+Address of the sender. See \fICURLOPT_MAIL_FROM(3)\fP
+.IP CURLOPT_MAIL_RCPT
+Address of the recipients. See \fICURLOPT_MAIL_RCPT(3)\fP
+.IP CURLOPT_MAIL_AUTH
+Authentication address. See \fICURLOPT_MAIL_AUTH(3)\fP
+.IP CURLOPT_MAIL_RCPT_ALLLOWFAILS
+Allow RCPT TO command to fail for some recipients. See
\fICURLOPT_MAIL_RCPT_ALLLOWFAILS(3)\fP
+.SH TFTP OPTIONS
+.IP CURLOPT_TFTP_BLKSIZE
+TFTP block size. See \fICURLOPT_TFTP_BLKSIZE(3)\fP
+.IP CURLOPT_TFTP_NO_OPTIONS
+Do not send TFTP options requests. See \fICURLOPT_TFTP_NO_OPTIONS(3)\fP
+.SH FTP OPTIONS
+.IP CURLOPT_FTPPORT
+Use active FTP. See \fICURLOPT_FTPPORT(3)\fP
+.IP CURLOPT_QUOTE
+Commands to run before transfer. See \fICURLOPT_QUOTE(3)\fP
+.IP CURLOPT_POSTQUOTE
+Commands to run after transfer. See \fICURLOPT_POSTQUOTE(3)\fP
+.IP CURLOPT_PREQUOTE
+Commands to run just before transfer. See \fICURLOPT_PREQUOTE(3)\fP
+.IP CURLOPT_APPEND
+Append to remote file. See \fICURLOPT_APPEND(3)\fP
+.IP CURLOPT_FTP_USE_EPRT
+Use EPTR. See \fICURLOPT_FTP_USE_EPRT(3)\fP
+.IP CURLOPT_FTP_USE_EPSV
+Use EPSV. See \fICURLOPT_FTP_USE_EPSV(3)\fP
+.IP CURLOPT_FTP_USE_PRET
+Use PRET. See \fICURLOPT_FTP_USE_PRET(3)\fP
+.IP CURLOPT_FTP_CREATE_MISSING_DIRS
+Create missing directories on the remote server. See
\fICURLOPT_FTP_CREATE_MISSING_DIRS(3)\fP
+.IP CURLOPT_FTP_RESPONSE_TIMEOUT
+Timeout for FTP responses. See \fICURLOPT_FTP_RESPONSE_TIMEOUT(3)\fP
+.IP CURLOPT_FTP_ALTERNATIVE_TO_USER
+Alternative to USER. See \fICURLOPT_FTP_ALTERNATIVE_TO_USER(3)\fP
+.IP CURLOPT_FTP_SKIP_PASV_IP
+Ignore the IP address in the PASV response. See
\fICURLOPT_FTP_SKIP_PASV_IP(3)\fP
+.IP CURLOPT_FTPSSLAUTH
+Control how to do TLS. See \fICURLOPT_FTPSSLAUTH(3)\fP
+.IP CURLOPT_FTP_SSL_CCC
+Back to non-TLS again after authentication. See \fICURLOPT_FTP_SSL_CCC(3)\fP
+.IP CURLOPT_FTP_ACCOUNT
+Send ACCT command. See \fICURLOPT_FTP_ACCOUNT(3)\fP
+.IP CURLOPT_FTP_FILEMETHOD
+Specify how to reach files. See \fICURLOPT_FTP_FILEMETHOD(3)\fP
+.SH RTSP OPTIONS
+.IP CURLOPT_RTSP_REQUEST
+RTSP request. See \fICURLOPT_RTSP_REQUEST(3)\fP
+.IP CURLOPT_RTSP_SESSION_ID
+RTSP session-id. See \fICURLOPT_RTSP_SESSION_ID(3)\fP
+.IP CURLOPT_RTSP_STREAM_URI
+RTSP stream URI. See \fICURLOPT_RTSP_STREAM_URI(3)\fP
+.IP CURLOPT_RTSP_TRANSPORT
+RTSP Transport: header. See \fICURLOPT_RTSP_TRANSPORT(3)\fP
+.IP CURLOPT_RTSP_CLIENT_CSEQ
+Client CSEQ number. See \fICURLOPT_RTSP_CLIENT_CSEQ(3)\fP
+.IP CURLOPT_RTSP_SERVER_CSEQ
+CSEQ number for RTSP Server->Client request. See
\fICURLOPT_RTSP_SERVER_CSEQ(3)\fP
+.SH PROTOCOL OPTIONS
+.IP CURLOPT_TRANSFERTEXT
+Use text transfer. See \fICURLOPT_TRANSFERTEXT(3)\fP
+.IP CURLOPT_PROXY_TRANSFER_MODE
+Add transfer mode to URL over proxy. See \fICURLOPT_PROXY_TRANSFER_MODE(3)\fP
+.IP CURLOPT_CRLF
+Convert newlines. See \fICURLOPT_CRLF(3)\fP
+.IP CURLOPT_RANGE
+Range requests. See \fICURLOPT_RANGE(3)\fP
+.IP CURLOPT_RESUME_FROM
+Resume a transfer. See \fICURLOPT_RESUME_FROM(3)\fP
+.IP CURLOPT_RESUME_FROM_LARGE
+Resume a transfer. See \fICURLOPT_RESUME_FROM_LARGE(3)\fP
+.IP CURLOPT_CURLU
+Set URL to work on with CURLU *. See \fICURLOPT_CURLU(3)\fP
+.IP CURLOPT_CUSTOMREQUEST
+Custom request/method. See \fICURLOPT_CUSTOMREQUEST(3)\fP
+.IP CURLOPT_FILETIME
+Request file modification date and time. See \fICURLOPT_FILETIME(3)\fP
+.IP CURLOPT_DIRLISTONLY
+List only. See \fICURLOPT_DIRLISTONLY(3)\fP
+.IP CURLOPT_NOBODY
+Do not get the body contents. See \fICURLOPT_NOBODY(3)\fP
+.IP CURLOPT_INFILESIZE
+Size of file to send. \fICURLOPT_INFILESIZE(3)\fP
+.IP CURLOPT_INFILESIZE_LARGE
+Size of file to send. \fICURLOPT_INFILESIZE_LARGE(3)\fP
+.IP CURLOPT_UPLOAD
+Upload data. See \fICURLOPT_UPLOAD(3)\fP
+.IP CURLOPT_UPLOAD_BUFFERSIZE
+Set upload buffer size. See \fICURLOPT_UPLOAD_BUFFERSIZE(3)\fP
+.IP CURLOPT_MIMEPOST
+Post/send MIME data. See \fICURLOPT_MIMEPOST(3)\fP
+.IP CURLOPT_MAXFILESIZE
+Maximum file size to get. See \fICURLOPT_MAXFILESIZE(3)\fP
+.IP CURLOPT_MAXFILESIZE_LARGE
+Maximum file size to get. See \fICURLOPT_MAXFILESIZE_LARGE(3)\fP
+.IP CURLOPT_TIMECONDITION
+Make a time conditional request. See \fICURLOPT_TIMECONDITION(3)\fP
+.IP CURLOPT_TIMEVALUE
+Time value for the time conditional request. See \fICURLOPT_TIMEVALUE(3)\fP
+.IP CURLOPT_TIMEVALUE_LARGE
+Time value for the time conditional request. See
\fICURLOPT_TIMEVALUE_LARGE(3)\fP
+.SH CONNECTION OPTIONS
+.IP CURLOPT_TIMEOUT
+Timeout for the entire request. See \fICURLOPT_TIMEOUT(3)\fP
+.IP CURLOPT_TIMEOUT_MS
+Millisecond timeout for the entire request. See \fICURLOPT_TIMEOUT_MS(3)\fP
+.IP CURLOPT_LOW_SPEED_LIMIT
+Low speed limit to abort transfer. See \fICURLOPT_LOW_SPEED_LIMIT(3)\fP
+.IP CURLOPT_LOW_SPEED_TIME
+Time to be below the speed to trigger low speed abort. See
\fICURLOPT_LOW_SPEED_TIME(3)\fP
+.IP CURLOPT_MAX_SEND_SPEED_LARGE
+Cap the upload speed to this. See \fICURLOPT_MAX_SEND_SPEED_LARGE(3)\fP
+.IP CURLOPT_MAX_RECV_SPEED_LARGE
+Cap the download speed to this. See \fICURLOPT_MAX_RECV_SPEED_LARGE(3)\fP
+.IP CURLOPT_MAXCONNECTS
+Maximum number of connections in the connection pool. See
\fICURLOPT_MAXCONNECTS(3)\fP
+.IP CURLOPT_FRESH_CONNECT
+Use a new connection. \fICURLOPT_FRESH_CONNECT(3)\fP
+.IP CURLOPT_FORBID_REUSE
+Prevent subsequent connections from re-using this. See
\fICURLOPT_FORBID_REUSE(3)\fP
+.IP CURLOPT_MAXAGE_CONN
+Limit the age of connections for reuse. See \fICURLOPT_MAXAGE_CONN(3)\fP
+.IP CURLOPT_CONNECTTIMEOUT
+Timeout for the connection phase. See \fICURLOPT_CONNECTTIMEOUT(3)\fP
+.IP CURLOPT_CONNECTTIMEOUT_MS
+Millisecond timeout for the connection phase. See
\fICURLOPT_CONNECTTIMEOUT_MS(3)\fP
+.IP CURLOPT_IPRESOLVE
+IP version to resolve to. See \fICURLOPT_IPRESOLVE(3)\fP
+.IP CURLOPT_CONNECT_ONLY
+Only connect, nothing else. See \fICURLOPT_CONNECT_ONLY(3)\fP
+.IP CURLOPT_USE_SSL
+Use TLS/SSL. See \fICURLOPT_USE_SSL(3)\fP
+.IP CURLOPT_RESOLVE
+Provide fixed/fake name resolves. See \fICURLOPT_RESOLVE(3)\fP
+.IP CURLOPT_DNS_INTERFACE
+Bind name resolves to this interface. See \fICURLOPT_DNS_INTERFACE(3)\fP
+.IP CURLOPT_DNS_LOCAL_IP4
+Bind name resolves to this IP4 address. See \fICURLOPT_DNS_LOCAL_IP4(3)\fP
+.IP CURLOPT_DNS_LOCAL_IP6
+Bind name resolves to this IP6 address. See \fICURLOPT_DNS_LOCAL_IP6(3)\fP
+.IP CURLOPT_DNS_SERVERS
+Preferred DNS servers. See \fICURLOPT_DNS_SERVERS(3)\fP
+.IP CURLOPT_DNS_SHUFFLE_ADDRESSES
+Shuffle addresses before use. See \fICURLOPT_DNS_SHUFFLE_ADDRESSES(3)\fP
+.IP CURLOPT_ACCEPTTIMEOUT_MS
+Timeout for waiting for the server's connect back to be accepted. See
\fICURLOPT_ACCEPTTIMEOUT_MS(3)\fP
+.IP CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS
+Timeout for happy eyeballs. See \fICURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS(3)\fP
+.IP CURLOPT_UPKEEP_INTERVAL_MS
+Sets the interval at which connection upkeep are performed. See
+\fICURLOPT_UPKEEP_INTERVAL_MS(3)\fP
+.SH SSL and SECURITY OPTIONS
+.IP CURLOPT_SSLCERT
+Client cert. See \fICURLOPT_SSLCERT(3)\fP
+.IP CURLOPT_SSLCERT_BLOB
+Client cert memory buffer. See \fICURLOPT_SSLCERT_BLOB(3)\fP
+.IP CURLOPT_PROXY_SSLCERT
+Proxy client cert. See \fICURLOPT_PROXY_SSLCERT(3)\fP
+.IP CURLOPT_PROXY_SSLCERT_BLOB
+Proxy client cert memory buffer. See \fICURLOPT_PROXY_SSLCERT_BLOB(3)\fP
+.IP CURLOPT_SSLCERTTYPE
+Client cert type. See \fICURLOPT_SSLCERTTYPE(3)\fP
+.IP CURLOPT_PROXY_SSLCERTTYPE
+Proxy client cert type. See \fICURLOPT_PROXY_SSLCERTTYPE(3)\fP
+.IP CURLOPT_SSLKEY
+Client key. See \fICURLOPT_SSLKEY(3)\fP
+.IP CURLOPT_SSLKEY_BLOB
+Client key memory buffer. See \fICURLOPT_SSLKEY_BLOB(3)\fP
+.IP CURLOPT_PROXY_SSLKEY
+Proxy client key. See \fICURLOPT_PROXY_SSLKEY(3)\fP
+.IP CURLOPT_PROXY_SSLKEY_BLOB
+Proxy client key. See \fICURLOPT_PROXY_SSLKEY_BLOB(3)\fP
+.IP CURLOPT_SSLKEYTYPE
+Client key type. See \fICURLOPT_SSLKEYTYPE(3)\fP
+.IP CURLOPT_PROXY_SSLKEYTYPE
+Proxy client key type. See \fICURLOPT_PROXY_SSLKEYTYPE(3)\fP
+.IP CURLOPT_KEYPASSWD
+Client key password. See \fICURLOPT_KEYPASSWD(3)\fP
+.IP CURLOPT_PROXY_KEYPASSWD
+Proxy client key password. See \fICURLOPT_PROXY_KEYPASSWD(3)\fP
++.IP CURLOPT_SSL_EC_CURVES
++Set key exchange curves. See \fICURLOPT_SSL_EC_CURVES(3)\fP
+.IP CURLOPT_SSL_ENABLE_ALPN
+Enable use of ALPN. See \fICURLOPT_SSL_ENABLE_ALPN(3)\fP
+.IP CURLOPT_SSL_ENABLE_NPN
+Enable use of NPN. See \fICURLOPT_SSL_ENABLE_NPN(3)\fP
+.IP CURLOPT_SSLENGINE
+Use identifier with SSL engine. See \fICURLOPT_SSLENGINE(3)\fP
+.IP CURLOPT_SSLENGINE_DEFAULT
+Default SSL engine. See \fICURLOPT_SSLENGINE_DEFAULT(3)\fP
+.IP CURLOPT_SSL_FALSESTART
+Enable TLS False Start. See \fICURLOPT_SSL_FALSESTART(3)\fP
+.IP CURLOPT_SSLVERSION
+SSL version to use. See \fICURLOPT_SSLVERSION(3)\fP
+.IP CURLOPT_PROXY_SSLVERSION
+Proxy SSL version to use. See \fICURLOPT_PROXY_SSLVERSION(3)\fP
+.IP CURLOPT_SSL_VERIFYHOST
+Verify the host name in the SSL certificate. See
\fICURLOPT_SSL_VERIFYHOST(3)\fP
+.IP CURLOPT_PROXY_SSL_VERIFYHOST
+Verify the host name in the proxy SSL certificate. See
\fICURLOPT_PROXY_SSL_VERIFYHOST(3)\fP
+.IP CURLOPT_SSL_VERIFYPEER
+Verify the SSL certificate. See \fICURLOPT_SSL_VERIFYPEER(3)\fP
+.IP CURLOPT_PROXY_SSL_VERIFYPEER
+Verify the proxy SSL certificate. See \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP
+.IP CURLOPT_SSL_VERIFYSTATUS
+Verify the SSL certificate's status. See \fICURLOPT_SSL_VERIFYSTATUS(3)\fP
+.IP CURLOPT_CAINFO
+CA cert bundle. See \fICURLOPT_CAINFO(3)\fP
+.IP CURLOPT_PROXY_CAINFO
+Proxy CA cert bundle. See \fICURLOPT_PROXY_CAINFO(3)\fP
+.IP CURLOPT_ISSUERCERT
+Issuer certificate. See \fICURLOPT_ISSUERCERT(3)\fP
+.IP CURLOPT_ISSUERCERT_BLOB
+Issuer certificate memory buffer. See \fICURLOPT_ISSUERCERT_BLOB(3)\fP
+.IP CURLOPT_PROXY_ISSUERCERT
+Proxy issuer certificate. See \fICURLOPT_PROXY_ISSUERCERT(3)\fP
+.IP CURLOPT_PROXY_ISSUERCERT_BLOB
+Proxy issuer certificate memory buffer. See
\fICURLOPT_PROXY_ISSUERCERT_BLOB(3)\fP
+.IP CURLOPT_CAPATH
+Path to CA cert bundle. See \fICURLOPT_CAPATH(3)\fP
+.IP CURLOPT_PROXY_CAPATH
+Path to proxy CA cert bundle. See \fICURLOPT_PROXY_CAPATH(3)\fP
+.IP CURLOPT_CRLFILE
+Certificate Revocation List. See \fICURLOPT_CRLFILE(3)\fP
+.IP CURLOPT_PROXY_CRLFILE
+Proxy Certificate Revocation List. See \fICURLOPT_PROXY_CRLFILE(3)\fP
+.IP CURLOPT_CERTINFO
+Extract certificate info. See \fICURLOPT_CERTINFO(3)\fP
+.IP CURLOPT_PINNEDPUBLICKEY
+Set pinned SSL public key . See \fICURLOPT_PINNEDPUBLICKEY(3)\fP
+.IP CURLOPT_PROXY_PINNEDPUBLICKEY
+Set the proxy's pinned SSL public key. See
+\fICURLOPT_PROXY_PINNEDPUBLICKEY(3)\fP
+.IP CURLOPT_RANDOM_FILE
+Provide source for entropy random data. See \fICURLOPT_RANDOM_FILE(3)\fP
+.IP CURLOPT_EGDSOCKET
+Identify EGD socket for entropy. See \fICURLOPT_EGDSOCKET(3)\fP
+.IP CURLOPT_SSL_CIPHER_LIST
+Ciphers to use. See \fICURLOPT_SSL_CIPHER_LIST(3)\fP
+.IP CURLOPT_PROXY_SSL_CIPHER_LIST
+Proxy ciphers to use. See \fICURLOPT_PROXY_SSL_CIPHER_LIST(3)\fP
+.IP CURLOPT_TLS13_CIPHERS
+TLS 1.3 cipher suites to use. See \fICURLOPT_TLS13_CIPHERS(3)\fP
+.IP CURLOPT_PROXY_TLS13_CIPHERS
+Proxy TLS 1.3 cipher suites to use. See \fICURLOPT_PROXY_TLS13_CIPHERS(3)\fP
+.IP CURLOPT_SSL_SESSIONID_CACHE
+Disable SSL session-id cache. See \fICURLOPT_SSL_SESSIONID_CACHE(3)\fP
+.IP CURLOPT_SSL_OPTIONS
+Control SSL behavior. See \fICURLOPT_SSL_OPTIONS(3)\fP
+.IP CURLOPT_PROXY_SSL_OPTIONS
+Control proxy SSL behavior. See \fICURLOPT_PROXY_SSL_OPTIONS(3)\fP
+.IP CURLOPT_KRBLEVEL
+Kerberos security level. See \fICURLOPT_KRBLEVEL(3)\fP
+.IP CURLOPT_GSSAPI_DELEGATION
+Disable GSS-API delegation. See \fICURLOPT_GSSAPI_DELEGATION(3)\fP
+.SH SSH OPTIONS
+.IP CURLOPT_SSH_AUTH_TYPES
+SSH authentication types. See \fICURLOPT_SSH_AUTH_TYPES(3)\fP
+.IP CURLOPT_SSH_COMPRESSION
+Enable SSH compression. See \fICURLOPT_SSH_COMPRESSION(3)\fP
+.IP CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
+MD5 of host's public key. See \fICURLOPT_SSH_HOST_PUBLIC_KEY_MD5(3)\fP
+.IP CURLOPT_SSH_PUBLIC_KEYFILE
+File name of public key. See \fICURLOPT_SSH_PUBLIC_KEYFILE(3)\fP
+.IP CURLOPT_SSH_PRIVATE_KEYFILE
+File name of private key. See \fICURLOPT_SSH_PRIVATE_KEYFILE(3)\fP
+.IP CURLOPT_SSH_KNOWNHOSTS
+File name with known hosts. See \fICURLOPT_SSH_KNOWNHOSTS(3)\fP
+.IP CURLOPT_SSH_KEYFUNCTION
+Callback for known hosts handling. See \fICURLOPT_SSH_KEYFUNCTION(3)\fP
+.IP CURLOPT_SSH_KEYDATA
+Custom pointer to pass to ssh key callback. See \fICURLOPT_SSH_KEYDATA(3)\fP
+.SH OTHER OPTIONS
+.IP CURLOPT_PRIVATE
+Private pointer to store. See \fICURLOPT_PRIVATE(3)\fP
+.IP CURLOPT_SHARE
+Share object to use. See \fICURLOPT_SHARE(3)\fP
+.IP CURLOPT_NEW_FILE_PERMS
+Mode for creating new remote files. See \fICURLOPT_NEW_FILE_PERMS(3)\fP
+.IP CURLOPT_NEW_DIRECTORY_PERMS
+Mode for creating new remote directories. See
\fICURLOPT_NEW_DIRECTORY_PERMS(3)\fP
+.SH TELNET OPTIONS
+.IP CURLOPT_TELNETOPTIONS
+TELNET options. See \fICURLOPT_TELNETOPTIONS(3)\fP
+.SH RETURN VALUE
+\fICURLE_OK\fP (zero) means that the option was set properly, non-zero means
an
+error occurred as \fI<gnurl/curl.h>\fP defines. See the
\fIlibcurl-errors(3)\fP
+man page for the full list with descriptions.
+
+Strings passed on to libcurl must be shorter than 8000000 bytes, otherwise
+\fIcurl_easy_setopt(3)\fP returns \fBCURLE_BAD_FUNCTION_ARGUMENT\fP (added in
+7.65.0).
+
++\fBCURLE_BAD_FUNCTION_ARGUMENT\fP is returned when the argument to an option
++is invalid, like perhaps out of range.a
++
+If you try to set an option that libcurl doesn't know about, perhaps because
+the library is too old to support it or the option was removed in a recent
+version, this function will return \fICURLE_UNKNOWN_OPTION\fP. If support for
+the option was disabled at compile-time, it will return
+\fICURLE_NOT_BUILT_IN\fP.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH "SEE ALSO"
+.BR curl_easy_init "(3), " curl_easy_cleanup "(3), " curl_easy_reset "(3), "
+.BR curl_easy_getinfo "(3), " curl_multi_setopt "(3), "
diff --cc docs/libcurl/gnurl_easy_strerror.3
index ec49d2cc0,000000000..5463f3830
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_strerror.3
+++ b/docs/libcurl/gnurl_easy_strerror.3
@@@ -1,40 -1,0 +1,40 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_easy_strerror 3 "26 Apr 2004" "libcurl 7.12" "libgnurl Manual"
+.SH NAME
+curl_easy_strerror - return string describing error code
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+const char *curl_easy_strerror(CURLcode errornum);
+.SH DESCRIPTION
+The \fIcurl_easy_strerror(3)\fP function returns a string describing the
+CURLcode error code passed in the argument \fIerrornum\fP.
+
+Typically applications also appreciate \fICURLOPT_ERRORBUFFER(3)\fP for more
+specific error descriptions generated at run-time.
+.SH AVAILABILITY
+This function was added in libcurl 7.12.0
+.SH RETURN VALUE
+A pointer to a null-terminated string.
+.SH "SEE ALSO"
+.BR libcurl-errors "(3), " curl_multi_strerror "(3), " curl_share_strerror
"(3)"
diff --cc docs/libcurl/gnurl_easy_unescape.3
index 9841b4435,000000000..a997f2ef8
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_unescape.3
+++ b/docs/libcurl/gnurl_easy_unescape.3
@@@ -1,54 -1,0 +1,54 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH gnurl_easy_unescape 3 "7 April 2006" "libcurl 7.15.4" "libgnurl Manual"
+.SH NAME
+curl_easy_unescape - URL decodes the given string
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "char *curl_easy_unescape( CURL *" curl ", const char *" url
+.BI ", int "inlength ", int *" outlength " );"
+.ad
+.SH DESCRIPTION
+This function converts the given URL encoded input string to a "plain string"
+and returns that in an allocated memory area. All input characters that are
+URL encoded (%XX where XX is a two-digit hexadecimal number) are converted to
+their binary versions.
+
+If the \fBlength\fP argument is set to 0 (zero), \fIcurl_easy_unescape(3)\fP
+will use strlen() on the input \fIurl\fP string to find out the size.
+
+If \fBoutlength\fP is non-NULL, the function will write the length of the
+returned string in the integer it points to. This allows an escaped string
+containing %00 to still get used properly after unescaping. Since this is a
+pointer to an \fIint\fP type, it can only return a value up to INT_MAX so no
+longer string can be unescaped if the string length is returned in this
+parameter.
+
+You must \fIcurl_free(3)\fP the returned string when you're done with it.
+.SH AVAILABILITY
+Added in 7.15.4 and replaces the old \fIcurl_unescape(3)\fP function.
+.SH RETURN VALUE
+A pointer to a null-terminated string or NULL if it failed.
+.SH "SEE ALSO"
+.BR curl_easy_escape "(3), " curl_free "(3)," RFC 3986
diff --cc docs/libcurl/gnurl_easy_upkeep.3
index 761902381,000000000..9437959d8
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_easy_upkeep.3
+++ b/docs/libcurl/gnurl_easy_upkeep.3
@@@ -1,77 -1,0 +1,77 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH gnurl_easy_upkeep 3 "31 Oct 2018" "libcurl 7.62.0" "libgnurl Manual"
+.SH NAME
+curl_easy_upkeep - Perform any connection upkeep checks.
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+.BI "CURLcode curl_easy_upkeep(CURL *" handle ");"
+.SH DESCRIPTION
+
+Some protocols have "connection upkeep" mechanisms. These mechanisms usually
+send some traffic on existing connections in order to keep them alive; this
+can prevent connections from being closed due to overzealous firewalls, for
+example.
+
+Currently the only protocol with a connection upkeep mechanism is HTTP/2: when
+the connection upkeep interval is exceeded and \fIcurl_easy_upkeep(3)\fP
+is called, an HTTP/2 PING frame is sent on the connection.
+
+This function must be explicitly called in order to perform the upkeep work.
+The connection upkeep interval is set with
+\fICURLOPT_UPKEEP_INTERVAL_MS(3)\fP.
+
+.SH AVAILABILITY
+Added in 7.62.0.
+.SH RETURN VALUE
+On success, returns \fBCURLE_OK\fP.
+
+On failure, returns the appropriate error code.
+
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ /* Make a connection to an HTTP/2 server. */
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Set the interval to 30000ms / 30s */
+ curl_easy_setopt(curl, CURLOPT_UPKEEP_INTERVAL_MS, 30000L);
+
+ curl_easy_perform(curl);
+
+ /* Perform more work here. */
+
+ /* While the connection is being held open, curl_easy_upkeep() can be
+ called. If curl_easy_upkeep() is called and the time since the last
+ upkeep exceeds the interval, then an HTTP/2 PING is sent. */
+ curl_easy_upkeep(curl);
+
+ /* Perform more work here. */
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+
+.fi
diff --cc docs/libcurl/gnurl_escape.3
index c65392801,000000000..3a28d4fa4
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_escape.3
+++ b/docs/libcurl/gnurl_escape.3
@@@ -1,48 -1,0 +1,48 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_escape 3 "6 March 2002" "libcurl 7.9" "libgnurl Manual"
+.SH NAME
+curl_escape - URL encodes the given string
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "char *curl_escape( const char *" url ", int "length " );"
+.ad
+.SH DESCRIPTION
+Obsolete function. Use \fIcurl_easy_escape(3)\fP instead!
+
+This function will convert the given input string to an URL encoded string and
+return that as a new allocated string. All input characters that are not a-z,
+A-Z or 0-9 will be converted to their "URL escaped" version (%NN where NN is a
+two-digit hexadecimal number).
+
+If the 'length' argument is set to 0, curl_escape() will use strlen() on the
+input 'url' string to find out the size.
+
+You must \fIcurl_free(3)\fP the returned string when you're done with it.
+.SH AVAILABILITY
+Since 7.15.4, \fIcurl_easy_escape(3)\fP should be used. This function will
+be removed in a future release.
+.SH RETURN VALUE
+A pointer to a null-terminated string or NULL if it failed.
+.SH "SEE ALSO"
+.BR curl_unescape "(3), " curl_free "(3), " RFC 2396
diff --cc docs/libcurl/gnurl_formadd.3
index e3a48e49d,000000000..581d551d0
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_formadd.3
+++ b/docs/libcurl/gnurl_formadd.3
@@@ -1,267 -1,0 +1,267 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_formadd 3 "24 June 2002" "libcurl 7.9.8" "libgnurl Manual"
+.SH NAME
+curl_formadd - add a section to a multipart/formdata HTTP POST
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLFORMcode curl_formadd(struct curl_httppost ** " firstitem,
+.BI "struct curl_httppost ** " lastitem, " ...);"
+.ad
+.SH DESCRIPTION
+This function is deprecated. Do not use! See \fIcurl_mime_init(3)\fP instead!
+
+curl_formadd() is used to append sections when building a multipart/formdata
+HTTP POST (sometimes referred to as RFC2388-style posts). Append one section
+at a time until you've added all the sections you want included and then you
+pass the \fIfirstitem\fP pointer as parameter to \fICURLOPT_HTTPPOST(3)\fP.
+\fIlastitem\fP is set after each \fIcurl_formadd(3)\fP call and on repeated
+invokes it should be left as set to allow repeated invokes to find the end of
+the list faster.
+
+After the \fIlastitem\fP pointer follow the real arguments.
+
+The pointers \fIfirstitem\fP and \fIlastitem\fP should both be pointing to
+NULL in the first call to this function. All list-data will be allocated by
+the function itself. You must call \fIcurl_formfree(3)\fP on the
+\fIfirstitem\fP after the form post has been done to free the resources.
+
+Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
+You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual.
+
+First, there are some basics you need to understand about multipart/formdata
+posts. Each part consists of at least a NAME and a CONTENTS part. If the part
+is made for file upload, there are also a stored CONTENT-TYPE and a FILENAME.
+Below, we'll discuss what options you use to set these properties in the
+parts you want to add to your post.
+
+The options listed first are for making normal parts. The options from
+\fICURLFORM_FILE\fP through \fICURLFORM_BUFFERLENGTH\fP are for file upload
+parts.
+.SH OPTIONS
+.IP CURLFORM_COPYNAME
+followed by a string which provides the \fIname\fP of this part. libcurl
+copies the string so your application doesn't need to keep it around after
+this function call. If the name isn't NUL-terminated, you must set its length
+with \fBCURLFORM_NAMELENGTH\fP. The \fIname\fP is not allowed to contain
+zero-valued bytes. The copied data will be freed by \fIcurl_formfree(3)\fP.
+.IP CURLFORM_PTRNAME
+followed by a string which provides the \fIname\fP of this part. libcurl
+will use the pointer and refer to the data in your application, so you
+must make sure it remains until curl no longer needs it. If the name
+isn't NUL-terminated, you must set its length with \fBCURLFORM_NAMELENGTH\fP.
+The \fIname\fP is not allowed to contain zero-valued bytes.
+.IP CURLFORM_COPYCONTENTS
+followed by a pointer to the contents of this part, the actual data
+to send away. libcurl copies the provided data, so your application doesn't
+need to keep it around after this function call. If the data isn't null
+terminated, or if you'd like it to contain zero bytes, you must
+set the length of the name with \fBCURLFORM_CONTENTSLENGTH\fP. The copied
+data will be freed by \fIcurl_formfree(3)\fP.
+.IP CURLFORM_PTRCONTENTS
+followed by a pointer to the contents of this part, the actual data
+to send away. libcurl will use the pointer and refer to the data in your
+application, so you must make sure it remains until curl no longer needs it.
+If the data isn't NUL-terminated, or if you'd like it to contain zero bytes,
+you must set its length with \fBCURLFORM_CONTENTSLENGTH\fP.
+.IP CURLFORM_CONTENTLEN
+followed by a curl_off_t value giving the length of the contents. Note that
+for \fICURLFORM_STREAM\fP contents, this option is mandatory.
+
+If you pass a 0 (zero) for this option, libcurl will instead do a strlen() on
+the contents to figure out the size. If you really want to send a zero byte
+content then you must make sure strlen() on the data pointer returns zero.
+
+(Option added in 7.46.0)
+.IP CURLFORM_CONTENTSLENGTH
+(This option is deprecated. Use \fICURLFORM_CONTENTLEN\fP instead!)
+
+followed by a long giving the length of the contents. Note that for
+\fICURLFORM_STREAM\fP contents, this option is mandatory.
+
+If you pass a 0 (zero) for this option, libcurl will instead do a strlen() on
+the contents to figure out the size. If you really want to send a zero byte
+content then you must make sure strlen() on the data pointer returns zero.
+.IP CURLFORM_FILECONTENT
+followed by a filename, causes that file to be read and its contents used
+as data in this part. This part does \fInot\fP automatically become a file
+upload part simply because its data was read from a file.
+
+The specified file needs to kept around until the associated transfer is done.
+.IP CURLFORM_FILE
+followed by a filename, makes this part a file upload part. It sets the
+\fIfilename\fP field to the basename of the provided filename, it reads the
+contents of the file and passes them as data and sets the content-type if the
+given file match one of the internally known file extensions. For
+\fBCURLFORM_FILE\fP the user may send one or more files in one part by
+providing multiple \fBCURLFORM_FILE\fP arguments each followed by the filename
+(and each \fICURLFORM_FILE\fP is allowed to have a
+\fICURLFORM_CONTENTTYPE\fP).
+
+The given upload file has to exist in its full in the file system already when
+the upload starts, as libcurl needs to read the correct file size beforehand.
+
+The specified file needs to kept around until the associated transfer is done.
+.IP CURLFORM_CONTENTTYPE
+is used in combination with \fICURLFORM_FILE\fP. Followed by a pointer to a
+string which provides the content-type for this part, possibly instead of an
+internally chosen one.
+.IP CURLFORM_FILENAME
+is used in combination with \fICURLFORM_FILE\fP. Followed by a pointer to a
+string, it tells libcurl to use the given string as the \fIfilename\fP in the
+file upload part instead of the actual file name.
+.IP CURLFORM_BUFFER
+is used for custom file upload parts without use of \fICURLFORM_FILE\fP. It
+tells libcurl that the file contents are already present in a buffer. The
+parameter is a string which provides the \fIfilename\fP field in the content
+header.
+.IP CURLFORM_BUFFERPTR
+is used in combination with \fICURLFORM_BUFFER\fP. The parameter is a pointer
+to the buffer to be uploaded. This buffer must not be freed until after
+\fIcurl_easy_cleanup(3)\fP is called. You must also use
+\fICURLFORM_BUFFERLENGTH\fP to set the number of bytes in the buffer.
+.IP CURLFORM_BUFFERLENGTH
+is used in combination with \fICURLFORM_BUFFER\fP. The parameter is a
+long which gives the length of the buffer.
+.IP CURLFORM_STREAM
+Tells libcurl to use the \fICURLOPT_READFUNCTION(3)\fP callback to get
+data. The parameter you pass to \fICURLFORM_STREAM\fP is the pointer passed on
+to the read callback's fourth argument. If you want the part to look like a
+file upload one, set the \fICURLFORM_FILENAME\fP parameter as well. Note that
+when using \fICURLFORM_STREAM\fP, \fICURLFORM_CONTENTSLENGTH\fP must also be
+set with the total expected length of the part unless the formpost is sent
+chunked encoded. (Option added in libcurl 7.18.2)
+.IP CURLFORM_ARRAY
+Another possibility to send options to curl_formadd() is the
+\fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as
+its value. Each curl_forms structure element has a CURLformoption and a char
+pointer. The final element in the array must be a CURLFORM_END. All available
+options can be used in an array, except the CURLFORM_ARRAY option itself! The
+last argument in such an array must always be \fBCURLFORM_END\fP.
+.IP CURLFORM_CONTENTHEADER
+specifies extra headers for the form POST section. This takes a curl_slist
+prepared in the usual way using \fBcurl_slist_append\fP and appends the list
+of headers to those libcurl automatically generates. The list must exist while
+the POST occurs, if you free it before the post completes you may experience
+problems.
+
+When you've passed the HttpPost pointer to \fIcurl_easy_setopt(3)\fP (using
+the \fICURLOPT_HTTPPOST(3)\fP option), you must not free the list until after
+you've called \fIcurl_easy_cleanup(3)\fP for the curl handle.
+
+See example below.
+.SH AVAILABILITY
+Deprecated in 7.56.0. Before this release, field names were allowed to
+contain zero-valued bytes. The pseudo-filename "-" to read stdin is
+discouraged although still supported, but data is not read before being
+actually sent: the effective data size can then not be automatically
+determined, resulting in a chunked encoding transfer. Backslashes and
+double quotes in field and file names are now escaped before transmission.
+.SH RETURN VALUE
+0 means everything was ok, non-zero means an error occurred corresponding
+to a CURL_FORMADD_* constant defined in
+.I <gnurl/curl.h>
+.SH EXAMPLE
+.nf
+
+ struct curl_httppost* post = NULL;
+ struct curl_httppost* last = NULL;
+ char namebuffer[] = "name buffer";
+ long namelength = strlen(namebuffer);
+ char buffer[] = "test buffer";
+ char htmlbuffer[] = "<HTML>test buffer</HTML>";
+ long htmlbufferlength = strlen(htmlbuffer);
+ struct curl_forms forms[3];
+ char file1[] = "my-face.jpg";
+ char file2[] = "your-face.jpg";
+ /* add null character into htmlbuffer, to demonstrate that
+ transfers of buffers containing null characters actually work
+ */
+ htmlbuffer[8] = '\\0';
+
+ /* Add simple name/content section */
+ curl_formadd(&post, &last, CURLFORM_COPYNAME, "name",
+ CURLFORM_COPYCONTENTS, "content", CURLFORM_END);
+
+ /* Add simple name/content/contenttype section */
+ curl_formadd(&post, &last, CURLFORM_COPYNAME, "htmlcode",
+ CURLFORM_COPYCONTENTS, "<HTML></HTML>",
+ CURLFORM_CONTENTTYPE, "text/html", CURLFORM_END);
+
+ /* Add name/ptrcontent section */
+ curl_formadd(&post, &last, CURLFORM_COPYNAME, "name_for_ptrcontent",
+ CURLFORM_PTRCONTENTS, buffer, CURLFORM_END);
+
+ /* Add ptrname/ptrcontent section */
+ curl_formadd(&post, &last, CURLFORM_PTRNAME, namebuffer,
+ CURLFORM_PTRCONTENTS, buffer, CURLFORM_NAMELENGTH,
+ namelength, CURLFORM_END);
+
+ /* Add name/ptrcontent/contenttype section */
+ curl_formadd(&post, &last, CURLFORM_COPYNAME, "html_code_with_hole",
+ CURLFORM_PTRCONTENTS, htmlbuffer,
+ CURLFORM_CONTENTSLENGTH, htmlbufferlength,
+ CURLFORM_CONTENTTYPE, "text/html", CURLFORM_END);
+
+ /* Add simple file section */
+ curl_formadd(&post, &last, CURLFORM_COPYNAME, "picture",
+ CURLFORM_FILE, "my-face.jpg", CURLFORM_END);
+
+ /* Add file/contenttype section */
+ curl_formadd(&post, &last, CURLFORM_COPYNAME, "picture",
+ CURLFORM_FILE, "my-face.jpg",
+ CURLFORM_CONTENTTYPE, "image/jpeg", CURLFORM_END);
+
+ /* Add two file section */
+ curl_formadd(&post, &last, CURLFORM_COPYNAME, "pictures",
+ CURLFORM_FILE, "my-face.jpg",
+ CURLFORM_FILE, "your-face.jpg", CURLFORM_END);
+
+ /* Add two file section using CURLFORM_ARRAY */
+ forms[0].option = CURLFORM_FILE;
+ forms[0].value = file1;
+ forms[1].option = CURLFORM_FILE;
+ forms[1].value = file2;
+ forms[2].option = CURLFORM_END;
+
+ /* Add a buffer to upload */
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "name",
+ CURLFORM_BUFFER, "data",
+ CURLFORM_BUFFERPTR, record,
+ CURLFORM_BUFFERLENGTH, record_length,
+ CURLFORM_END);
+
+ /* no option needed for the end marker */
+ curl_formadd(&post, &last, CURLFORM_COPYNAME, "pictures",
+ CURLFORM_ARRAY, forms, CURLFORM_END);
+ /* Add the content of a file as a normal post text value */
+ curl_formadd(&post, &last, CURLFORM_COPYNAME, "filecontent",
+ CURLFORM_FILECONTENT, ".bashrc", CURLFORM_END);
+ /* Set the form info */
+ curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
+
+.SH "SEE ALSO"
+.BR curl_easy_setopt "(3),"
+.BR curl_formfree "(3),"
+.BR curl_mime_init "(3)"
diff --cc docs/libcurl/gnurl_formfree.3
index 24764dc59,000000000..71df7e19a
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_formfree.3
+++ b/docs/libcurl/gnurl_formfree.3
@@@ -1,51 -1,0 +1,51 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_formfree 3 "6 April 2001" "libcurl 7.7.1" "libgnurl Manual"
+.SH NAME
+curl_formfree - free a previously build multipart/formdata HTTP POST chain
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "void curl_formfree(struct curl_httppost *" form);
+.ad
+.SH DESCRIPTION
+This function is deprecated. Do not use! See \fIcurl_mime_init(3)\fP instead!
+
+curl_formfree() is used to clean up data previously built/appended with
+\fIcurl_formadd(3)\fP. This must be called when the data has been used, which
+typically means after \fIcurl_easy_perform(3)\fP has been called.
+
+The pointer to free is the same pointer you passed to the
+\fICURLOPT_HTTPPOST(3)\fP option, which is the \fIfirstitem\fP pointer from
+the \fIcurl_formadd(3)\fP invoke(s).
+
+\fBform\fP is the pointer as returned from a previous call to
+\fIcurl_formadd(3)\fP and may be NULL.
+
+Passing in a NULL pointer in \fIform\fP will make this function return
+immediately with no action.
+.SH AVAILABILITY
+Deprecated in 7.56.0.
+.SH RETURN VALUE
+None
+.SH "SEE ALSO"
+.BR curl_formadd "(3), " curl_mime_init "(3), " curl_mime_free "(3)"
diff --cc docs/libcurl/gnurl_formget.3
index 261e51df6,000000000..c9e43bd75
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_formget.3
+++ b/docs/libcurl/gnurl_formget.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_formget 3 "20 June 2006" "libcurl 7.15.5" "libgnurl Manual"
+.SH NAME
+curl_formget - serialize a previously built multipart/formdata HTTP POST chain
+.SH SYNOPSIS
+.nf
+.B #include <gnurl/curl.h>
+
+int curl_formget(struct curl_httppost * form, void *userp,
+ curl_formget_callback append );
+.SH DESCRIPTION
+curl_formget() is used to serialize data previously built/appended with
+\fIcurl_formadd(3)\fP. Accepts a void pointer as second argument named
+\fIuserp\fP which will be passed as the first argument to the
+curl_formget_callback function.
+
+.BI "typedef size_t (*curl_formget_callback)(void *" userp, " const char *"
buf,
+.BI " size_t " len ");"
+
+The curl_formget_callback will be executed for each part of the HTTP POST
+chain. The character buffer passed to the callback must not be freed. The
+callback should return the buffer length passed to it on success.
+
+If the \fBCURLFORM_STREAM\fP option is used in the formpost, it will prevent
+\fIcurl_formget(3)\fP from working until you've performed the actual HTTP
+request as only then will libcurl get the actual read callback to use!
+.SH RETURN VALUE
+0 means everything was ok, non-zero means an error occurred
+.SH EXAMPLE
+.nf
+
+ size_t print_httppost_callback(void *arg, const char *buf, size_t len)
+ {
+ fwrite(buf, len, 1, stdout);
+ (*(size_t *) arg) += len;
+ return len;
+ }
+
+ size_t print_httppost(struct curl_httppost *post)
+ {
+ size_t total_size = 0;
+ if(curl_formget(post, &total_size, print_httppost_callback)) {
+ return (size_t) -1;
+ }
+ return total_size;
+ }
+.SH AVAILABILITY
+This function was added in libcurl 7.15.5. The form API is deprecated in
+libcurl 7.56.0.
+.SH "SEE ALSO"
+.BR curl_formadd "(3), " curl_mime_init "(3)"
diff --cc docs/libcurl/gnurl_free.3
index e9901fa74,000000000..e13e1b985
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_free.3
+++ b/docs/libcurl/gnurl_free.3
@@@ -1,38 -1,0 +1,38 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_free 3 "12 Aug 2003" "libcurl 7.10" "libgnurl Manual"
+.SH NAME
+curl_free - reclaim memory that has been obtained through a libcurl call
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "void curl_free( char *" ptr " );"
+.ad
+.SH DESCRIPTION
+curl_free reclaims memory that has been obtained through a libcurl call. Use
+\fIcurl_free(3)\fP instead of free() to avoid anomalies that can result from
+differences in memory management between your application and libcurl.
+
+Passing in a NULL pointer in \fIptr\fP will make this function return
+immediately with no action.
+.SH "SEE ALSO"
+.BR curl_easy_unescape "(3), " curl_easy_escape "(3) "
diff --cc docs/libcurl/gnurl_getdate.3
index eb122eaf3,000000000..a29e485af
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_getdate.3
+++ b/docs/libcurl/gnurl_getdate.3
@@@ -1,110 -1,0 +1,110 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_getdate 3 "12 Aug 2005" "libcurl 7.0" "libgnurl Manual"
+.SH NAME
+curl_getdate - Convert a date string to number of seconds
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "time_t curl_getdate(char *" datestring ", time_t *"now " );"
+.ad
+.SH DESCRIPTION
+\fIcurl_getdate(3)\fP returns the number of seconds since the Epoch, January
+1st 1970 00:00:00 in the UTC time zone, for the date and time that the
+\fIdatestring\fP parameter specifies. The \fInow\fP parameter is not used,
+pass a NULL there.
+.SH PARSING DATES AND TIMES
+A "date" is a string containing several items separated by whitespace. The
+order of the items is immaterial. A date string may contain many flavors of
+items:
+.TP 0.8i
+.B calendar date items
+Can be specified several ways. Month names can only be three-letter english
+abbreviations, numbers can be zero-prefixed and the year may use 2 or 4
digits.
+Examples: 06 Nov 1994, 06-Nov-94 and Nov-94 6.
+.TP
+.B time of the day items
+This string specifies the time on a given day. You must specify it with 6
+digits with two colons: HH:MM:SS. To not include the time in a date string,
+will make the function assume 00:00:00. Example: 18:19:21.
+.TP
+.B time zone items
+Specifies international time zone. There are a few acronyms supported, but in
+general you should instead use the specific relative time compared to
+UTC. Supported formats include: -1200, MST, +0100.
+.TP
+.B day of the week items
+Specifies a day of the week. Days of the week may be spelled out in full
+(using english): `Sunday', `Monday', etc or they may be abbreviated to their
+first three letters. This is usually not info that adds anything.
+.TP
+.B pure numbers
+If a decimal number of the form YYYYMMDD appears, then YYYY is read as the
+year, MM as the month number and DD as the day of the month, for the specified
+calendar date.
+.PP
+.SH EXAMPLES
+.nf
+Sun, 06 Nov 1994 08:49:37 GMT
+Sunday, 06-Nov-94 08:49:37 GMT
+Sun Nov 6 08:49:37 1994
+06 Nov 1994 08:49:37 GMT
+06-Nov-94 08:49:37 GMT
+Nov 6 08:49:37 1994
+06 Nov 1994 08:49:37
+06-Nov-94 08:49:37
+1994 Nov 6 08:49:37
+GMT 08:49:37 06-Nov-94 Sunday
+94 6 Nov 08:49:37
+1994 Nov 6
+06-Nov-94
+Sun Nov 6 94
+1994.Nov.6
+Sun/Nov/6/94/GMT
+Sun, 06 Nov 1994 08:49:37 CET
+06 Nov 1994 08:49:37 EST
+Sun, 12 Sep 2004 15:05:58 -0700
+Sat, 11 Sep 2004 21:32:11 +0200
+20040912 15:05:58 -0700
+20040911 +0200
+.fi
+.SH STANDARDS
+This parser was written to handle date formats specified in RFC 822 (including
+the update in RFC 1123) using time zone name or time zone delta and RFC 850
+(obsoleted by RFC 1036) and ANSI C's asctime() format. These formats are the
+only ones RFC 7231 says HTTP applications may use.
+.SH RETURN VALUE
+This function returns -1 when it fails to parse the date string. Otherwise it
+returns the number of seconds as described.
+
+On systems with a signed 32 bit time_t: if the year is larger than 2037 or
+less than 1903, this function will return -1.
+
+On systems with an unsigned 32 bit time_t: if the year is larger than 2106 or
+less than 1970, this function will return -1.
+
+On systems with 64 bit time_t: if the year is less than 1583, this function
+will return -1. (The Gregorian calendar was first introduced 1582 so no "real"
+dates in this way of doing dates existed before then.)
+.SH "SEE ALSO"
+.BR curl_easy_escape "(3), " curl_easy_unescape "(3), "
+.BR CURLOPT_TIMECONDITION "(3), " CURLOPT_TIMEVALUE "(3) "
diff --cc docs/libcurl/gnurl_getenv.3
index a953eba35,000000000..3d1f8929e
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_getenv.3
+++ b/docs/libcurl/gnurl_getenv.3
@@@ -1,49 -1,0 +1,49 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_getenv 3 "30 April 2004" "libcurl 7.12" "libgnurl Manual"
+.SH NAME
+curl_getenv - return value for environment name
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "char *curl_getenv(const char *" name ");"
+.ad
+.SH DESCRIPTION
+curl_getenv() is a portable wrapper for the getenv() function, meant to
+emulate its behaviour and provide an identical interface for all operating
+systems libcurl builds on (including win32).
+
+You must \fIcurl_free(3)\fP the returned string when you're done with it.
+.SH AVAILABILITY
+This function will be removed from the public libcurl API in a near future. It
+will instead be made "available" by source code access only, and then as
+curlx_getenv().
+.SH RETURN VALUE
+A pointer to a null-terminated string or NULL if it failed to find the
+specified name.
+.SH NOTE
+Under unix operating systems, there isn't any point in returning an allocated
+memory, although other systems won't work properly if this isn't done. The
+unix implementation thus has to suffer slightly from the drawbacks of other
+systems.
+.SH "SEE ALSO"
+.BR getenv "(3C), "
diff --cc docs/libcurl/gnurl_global_cleanup.3
index a5b6675c2,000000000..8fdfc1162
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_global_cleanup.3
+++ b/docs/libcurl/gnurl_global_cleanup.3
@@@ -1,55 -1,0 +1,55 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_global_cleanup 3 "17 Feb 2006" "libcurl 7.8" "libgnurl Manual"
+.SH NAME
+curl_global_cleanup - global libcurl cleanup
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "void curl_global_cleanup(void);"
+.ad
+.SH DESCRIPTION
+This function releases resources acquired by \fIcurl_global_init(3)\fP.
+
+You should call \fIcurl_global_cleanup(3)\fP once for each call you make to
+\fIcurl_global_init(3)\fP, after you are done using libcurl.
+
+\fBThis function is not thread safe.\fP You must not call it when any other
+thread in the program (i.e. a thread sharing the same memory) is running.
+This doesn't just mean no other thread that is using libcurl. Because
+\fIcurl_global_cleanup(3)\fP calls functions of other libraries that are
+similarly thread unsafe, it could conflict with any other thread that uses
+these other libraries.
+
+See the description in \fIlibcurl(3)\fP of global environment requirements for
+details of how to use this function.
+.SH CAUTION
+\fIcurl_global_cleanup(3)\fP does not block waiting for any libcurl-created
+threads to terminate (such as threads used for name resolving). If a module
+containing libcurl is dynamically unloaded while libcurl-created threads are
+still running then your program may crash or other corruption may occur. We
+recommend you do not run libcurl from any module that may be unloaded
+dynamically. This behavior may be addressed in the future.
+.SH "SEE ALSO"
+.BR curl_global_init "(3), "
+.BR libcurl "(3), "
+.BR libcurl-thread "(3), "
diff --cc docs/libcurl/gnurl_global_init.3
index db84fad00,000000000..abc6d9b60
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_global_init.3
+++ b/docs/libcurl/gnurl_global_init.3
@@@ -1,103 -1,0 +1,103 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_global_init 3 "11 May 2004" "libcurl 7.12" "libgnurl Manual"
+.SH NAME
+curl_global_init - Global libcurl initialisation
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_global_init(long " flags ");"
+.ad
+.SH DESCRIPTION
+This function sets up the program environment that libcurl needs. Think of it
+as an extension of the library loader.
+
+This function must be called at least once within a program (a program is all
+the code that shares a memory space) before the program calls any other
+function in libcurl. The environment it sets up is constant for the life of
+the program and is the same for every program, so multiple calls have the same
+effect as one call.
+
+The flags option is a bit pattern that tells libcurl exactly what features to
+init, as described below. Set the desired bits by ORing the values together.
+In normal operation, you must specify CURL_GLOBAL_ALL. Don't use any other
+value unless you are familiar with it and mean to control internal operations
of
+libcurl.
+
+\fBThis function is not thread safe.\fP You must not call it when any other
+thread in the program (i.e. a thread sharing the same memory) is running.
+This doesn't just mean no other thread that is using libcurl. Because
+\fIcurl_global_init(3)\fP calls functions of other libraries that are
+similarly thread unsafe, it could conflict with any other thread that uses
+these other libraries.
+
+If you are initializing libcurl from a Windows DLL you should not initialize
it
+from DllMain or a static initializer because Windows holds the loader lock
+during that time and it could cause a deadlock.
+
+See the description in \fIlibcurl(3)\fP of global environment requirements for
+details of how to use this function.
+.SH FLAGS
+.IP CURL_GLOBAL_ALL
+Initialize everything possible. This sets all known bits except
+\fBCURL_GLOBAL_ACK_EINTR\fP.
+
+.IP CURL_GLOBAL_SSL
+(This flag's presence or absence serves no meaning since 7.57.0. The
+description below is for older libcurl versions.)
+
+Initialize SSL.
+
+The implication here is that if this bit is not set, the initialization of the
+SSL layer needs to be done by the application or at least outside of
+libcurl. The exact procedure how to do SSL initialization depends on the TLS
+backend libcurl uses.
+
+Doing TLS based transfers without having the TLS layer initialized may lead to
+unexpected behaviors.
+.IP CURL_GLOBAL_WIN32
+Initialize the Win32 socket libraries.
+
+The implication here is that if this bit is not set, the initialization of
+winsock has to be done by the application or you risk getting undefined
+behaviors. This option exists for when the initialization is handled outside
+of libcurl so there's no need for libcurl to do it again.
+.IP CURL_GLOBAL_NOTHING
+Initialise nothing extra. This sets no bit.
+.IP CURL_GLOBAL_DEFAULT
+A sensible default. It will init both SSL and Win32. Right now, this equals
+the functionality of the \fBCURL_GLOBAL_ALL\fP mask.
+.IP CURL_GLOBAL_ACK_EINTR
+This bit has no point since 7.69.0 but its behavior is instead the default.
+
+Before 7.69.0: when this flag is set, curl will acknowledge EINTR condition
+when connecting or when waiting for data. Otherwise, curl waits until full
+timeout elapses. (Added in 7.30.0)
+.SH RETURN VALUE
+If this function returns non-zero, something went wrong and you cannot use the
+other curl functions.
+.SH "SEE ALSO"
+.BR curl_global_init_mem "(3), "
+.BR curl_global_cleanup "(3), "
+.BR curl_global_sslset "(3), "
+.BR curl_easy_init "(3) "
+.BR libcurl "(3) "
diff --cc docs/libcurl/gnurl_global_init_mem.3
index ddd64db7f,000000000..d3d1d9279
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_global_init_mem.3
+++ b/docs/libcurl/gnurl_global_init_mem.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_global_init_mem 3 "10 May 2004" "libcurl 7.12.0" "libgnurl Manual"
+.SH NAME
+curl_global_init_mem - Global libcurl initialisation with memory callbacks
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.nf
+.B "CURLcode curl_global_init_mem(long " flags,
+.B " curl_malloc_callback "m,
+.B " curl_free_callback "f,
+.B " curl_realloc_callback "r,
+.B " curl_strdup_callback "s,
+.B " curl_calloc_callback "c ");"
+.SH DESCRIPTION
+This function works exactly as \fIcurl_global_init(3)\fP with one addition: it
+allows the application to set callbacks to replace the otherwise used internal
+memory functions.
+
+If you are using libcurl from multiple threads or libcurl was built with the
+threaded resolver option then the callback functions must be thread safe. The
+threaded resolver is a common build option to enable (and in some cases the
+default) so we strongly urge you to make your callback functions thread safe.
+
+All callback arguments must be set to valid function pointers. The
+prototypes for the given callbacks must match these:
+.IP "void *malloc_callback(size_t size);"
+To replace malloc()
+.IP "void free_callback(void *ptr);"
+To replace free()
+.IP "void *realloc_callback(void *ptr, size_t size);"
+To replace realloc()
+.IP "char *strdup_callback(const char *str);"
+To replace strdup()
+.IP "void *calloc_callback(size_t nmemb, size_t size);"
+To replace calloc()
+.RE
+This function is otherwise the same as \fIcurl_global_init(3)\fP, please refer
+to that man page for documentation.
+.SH "CAUTION"
+Manipulating these gives considerable powers to the application to severely
+screw things up for libcurl. Take care!
+.SH AVAILABILITY
+Added in 7.12.0
+.SH "SEE ALSO"
+.BR curl_global_init "(3), "
+.BR curl_global_cleanup "(3), "
diff --cc docs/libcurl/gnurl_global_sslset.3
index ed9c236d7,000000000..8cc67a234
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_global_sslset.3
+++ b/docs/libcurl/gnurl_global_sslset.3
@@@ -1,102 -1,0 +1,102 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_global_sslset 3 "15 July 2017" "libcurl 7.56" "libgnurl Manual"
+.SH NAME
+curl_global_sslset - Select SSL backend to use with libcurl
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.nf
+
+typedef struct {
+ curl_sslbackend id;
+ const char *name;
+} curl_ssl_backend;
+
+typedef enum {
+ CURLSSLBACKEND_NONE = 0,
+ CURLSSLBACKEND_OPENSSL = 1,
+ CURLSSLBACKEND_GNUTLS = 2,
+ CURLSSLBACKEND_NSS = 3,
+ CURLSSLBACKEND_GSKIT = 5,
+ CURLSSLBACKEND_POLARSSL = 6, /* deprecated */
+ CURLSSLBACKEND_WOLFSSL = 7,
+ CURLSSLBACKEND_SCHANNEL = 8,
+ CURLSSLBACKEND_SECURETRANSPORT = 9,
+ CURLSSLBACKEND_AXTLS = 10, /* deprecated */
+ CURLSSLBACKEND_MBEDTLS = 11,
+ CURLSSLBACKEND_MESALINK = 12,
+ CURLSSLBACKEND_BEARSSL = 13
+} curl_sslbackend;
+
+.B "CURLsslset curl_global_sslset(curl_sslbackend " id,
+.B " const char *" name,
+.B " curl_ssl_backend ***" avail ");"
+.fi
+.SH DESCRIPTION
+This function configures at runtime which SSL backend to use with
+libcurl. This function can only be used to select an SSL backend once, and it
+must be called \fBbefore\fP \fIcurl_global_init(3)\fP.
+
+The backend can be identified by the \fIid\fP
+(e.g. \fBCURLSSLBACKEND_OPENSSL\fP). The backend can also be specified via the
+\fIname\fP parameter for a case insensitive match (passing -1 as \fIid\fP). If
+both \fIid\fP and \fIname\fP are specified, the \fIname\fP will be ignored.
+
+If neither \fIid\fP nor \fPname\fP are specified, the function will fail with
+CURLSSLSET_UNKNOWN_BACKEND and set the \fIavail\fP pointer to the
+NULL-terminated list of available backends. The available backends are those
+that this particular build of libcurl supports.
+
+Since libcurl 7.60.0, the \fIavail\fP pointer will always be set to the list
+of alternatives if non-NULL.
+
+Upon success, the function returns CURLSSLSET_OK.
+
+If the specified SSL backend is not available, the function returns
+CURLSSLSET_UNKNOWN_BACKEND and sets the \fIavail\fP pointer to a
+NULL-terminated list of available SSL backends. In this case, you may call the
+function again to try to select a different backend.
+
+The SSL backend can be set only once. If it has already been set, a subsequent
+attempt to change it will result in a \fBCURLSSLSET_TOO_LATE\fP.
+
+\fBThis function is not thread safe.\fP You must not call it when any other
+thread in the program (i.e. a thread sharing the same memory) is running.
+This doesn't just mean no other thread that is using libcurl.
+
+.SH AVAILABILITY
+This function was added in libcurl 7.56.0. Before this version, there was no
+support for choosing SSL backends at runtime.
+.SH RETURN VALUE
+If this function returns CURLSSLSET_OK, the backend was successfully selected.
+
+If the chosen backend is unknown (or support for the chosen backend has not
+been compiled into libcurl), the function returns
\fICURLSSLSET_UNKNOWN_BACKEND\fP.
+
+If the backend had been configured previously, or if \fIcurl_global_init(3)\fP
+has already been called, the function returns \fICURLSSLSET_TOO_LATE\fP.
+
+If this libcurl was built completely without SSL support, with no backends at
+all, this function returns \fICURLSSLSET_NO_BACKENDS\fP.
+.SH "SEE ALSO"
+.BR curl_global_init "(3), "
+.BR libcurl "(3) "
diff --cc docs/libcurl/gnurl_mime_addpart.3
index 9aab787eb,000000000..330b28f71
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_addpart.3
+++ b/docs/libcurl/gnurl_mime_addpart.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_addpart 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_addpart - append a new empty part to a mime structure
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "curl_mimepart * curl_mime_addpart(curl_mime * " mime ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_addpart(3)\fP creates and appends a new empty part to the given
+mime structure and returns a handle to it. The returned part handle can
+subsequently be populated using functions from the mime API.
+
+\fImime\fP is the handle of the mime structure in which the new part must be
+appended.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+A mime part structure handle, or NULL upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* continue and set name + data to the part */
+ curl_mime_data(part, "This is the field data", CURL_ZERO_TERMINATED);
+ curl_mime_name(part, "data");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_init "(3),"
+.BR curl_mime_name "(3),"
+.BR curl_mime_data "(3),"
+.BR curl_mime_data_cb "(3),"
+.BR curl_mime_filedata "(3),"
+.BR curl_mime_filename "(3),"
+.BR curl_mime_subparts "(3),"
+.BR curl_mime_type "(3),"
+.BR curl_mime_headers "(3),"
+.BR curl_mime_encoder "(3)"
diff --cc docs/libcurl/gnurl_mime_data.3
index 728826ab0,000000000..1cc4d2a10
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_data.3
+++ b/docs/libcurl/gnurl_mime_data.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_data 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_data - set a mime part's body data from memory
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_mime_data(curl_mimepart * " part ", const char * " data
+.BI ", size_t " datasize ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_data(3)\fP sets a mime part's body content from memory data.
+
+\fIdata\fP points to the data bytes: those are copied to the part and their
+storage may safely be reused after call.
+\fIdatasize\fP is the number of data bytes: it can be set to
+\fICURL_ZERO_TERMINATED\fP to indicate \fIdata\fP is a null-terminated
+character string.
+\fIpart\fP is the part's to assign contents to.
+
+Setting a part's contents twice is valid: only the value set by the last call
+is retained. It is possible to unassign part's contents by setting
+\fIdata\fP to NULL.
+
+Setting very large data is memory consuming: one might consider using
+\fIcurl_mime_data_cb(3)\fP in such a case.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* add data to the part */
+ curl_mime_data(part, "raw contents to send", CURL_ZERO_TERMINATED);
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_data_cb "(3),"
+.BR curl_mime_name "(3),"
+.BR curl_mime_type "(3)"
diff --cc docs/libcurl/gnurl_mime_data_cb.3
index 2fd7413c4,000000000..1eadf1e04
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_data_cb.3
+++ b/docs/libcurl/gnurl_mime_data_cb.3
@@@ -1,167 -1,0 +1,167 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_data_cb 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_data_cb - set a callback-based data source for a mime part's body
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+size_t readfunc(char *buffer, size_t size, size_t nitems, void *arg);
+.br
+int seekfunc(void *arg, curl_off_t offset, int origin);
+.br
+void freefunc(void *arg);
+.sp
+.BI "CURLcode curl_mime_data_cb(curl_mimepart * " part ", curl_off_t "
datasize ,
+.br
+.BI " curl_read_callback " readfunc ", curl_seek_callback " seekfunc ,
+.br
+.BI " curl_free_callback " freefunc ", void * " arg ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_data_cb(3)\fP sets the data source of a mime part's body content
+from a data read callback function.
+
+\fIpart\fP is the part's to assign contents to.
+
+\fIreadfunc\fP is a pointer to a data read callback function, with a signature
+as shown by the above prototype. It may not be set to NULL.
+
+\fIseekfunc\fP is a pointer to a seek callback function, with a signature as
+shown by the above prototype. This function will be used upon resending data
+(i.e.: after a redirect); this pointer may be set to NULL, in which case a
+resend is not possible.
+
+\fIfreefunc\fP is a pointer to a user resource freeing callback function, with
+a signature as shown by the above prototype. If no resource is to be freed, it
+may safely be set to NULL. This function will be called upon mime structure
+freeing.
+
+\fIarg\fP is a user defined argument to callback functions.
+
+The read callback function gets called by libcurl as soon as it needs to
+read data in order to send it to the peer - like if you ask it to upload or
+post data to the server. The data area pointed at by the pointer \fIbuffer\fP
+should be filled up with at most \fIsize\fP multiplied with \fInmemb\fP number
+of bytes by your function.
+
+Your read function must then return the actual number of bytes that it stored
+in that memory area. Returning 0 will signal end-of-file to the library and
+cause it to stop the current transfer.
+
+If you stop the current transfer by returning 0 "pre-maturely" (i.e. before
the
+server expected it, like when you've said you will upload N bytes and you
+upload less than N bytes), you may experience that the server "hangs" waiting
+for the rest of the data that won't come.
+
+The read callback may return \fICURL_READFUNC_ABORT\fP to stop the current
+operation immediately, resulting in a \fICURLE_ABORTED_BY_CALLBACK\fP error
+code from the transfer.
+
+The callback can return \fICURL_READFUNC_PAUSE\fP to cause reading from this
+connection to pause. See \fIcurl_easy_pause(3)\fP for further details.
+
+The seek function gets called by libcurl to rewind input stream data or to
+seek to a certain position. The function shall work like fseek(3) or lseek(3)
+and it gets SEEK_SET, SEEK_CUR or SEEK_END as argument for \fIorigin\fP,
+although libcurl currently only passes SEEK_SET.
+
+The callback function must return \fICURL_SEEKFUNC_OK\fP on success,
+\fICURL_SEEKFUNC_FAIL\fP to cause the upload operation to fail or
+\fICURL_SEEKFUNC_CANTSEEK\fP to indicate that while the seek failed, libcurl
+is free to work around the problem if possible. The latter can sometimes be
+done by instead reading from the input or similar.
+
+Care must be taken if the part is bound to a curl easy handle that is later
+duplicated: the \fIarg\fP pointer argument is also duplicated, resulting in
+the pointed item to be shared between the original and the copied handle.
+In particular, special attention should be given to the \fIfreefunc\fP
+procedure code since it will be called twice with the same argument.
+
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+Sending a huge data string will cause the same amount of memory to be
+allocated: to avoid overhead resources consumption, one might want to use a
+callback source to avoid data duplication. In this case, original data
+must be retained until after the transfer terminates.
+.nf
+
+char hugedata[512000];
+
+struct ctl {
+ char *buffer;
+ curl_off_t size;
+ curl_off_t position;
+};
+
+size_t read_callback(char *buffer, size_t size, size_t nitems, void *arg)
+{
+ struct ctl *p = (struct ctl *) arg;
+ curl_off_t sz = p->size - p->position;
+
+ nitems *= size;
+ if(sz > nitems)
+ sz = nitems;
+ if(sz)
+ memcpy(buffer, p->buffer + p->position, sz);
+ p->position += sz;
+ return sz;
+}
+
+int seek_callback(void *arg, curl_off_t offset, int origin)
+{
+ struct ctl *p = (struct ctl *) arg;
+
+ switch(origin) {
+ case SEEK_END:
+ offset += p->size;
+ break;
+ case SEEK_CUR:
+ offset += p->position;
+ break;
+ }
+
+ if(offset < 0)
+ return CURL_SEEKFUNC_FAIL;
+ p->position = offset;
+ return CURL_SEEKFUNC_OK;
+}
+
+ CURL *easy = curl_easy_init();
+ curl_mime *mime = curl_mime_init(easy);
+ curl_mimepart *part = curl_mime_addpart(mime);
+ struct ctl hugectl;
+
+ hugectl.buffer = hugedata;
+ hugectl.size = sizeof hugedata;
+ hugectl.position = 0;
+ curl_mime_data_cb(part, hugectl.size, read_callback, seek_callback, NULL,
+ &hugectl);
+
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_data "(3),"
+.BR curl_mime_name "(3),"
+.BR curl_easy_duphandle "(3)"
diff --cc docs/libcurl/gnurl_mime_encoder.3
index d0546b6b0,000000000..1026a679b
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_encoder.3
+++ b/docs/libcurl/gnurl_mime_encoder.3
@@@ -1,97 -1,0 +1,97 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_encoder 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_encoder - set a mime part's encoder and content transfer encoding
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_mime_encoder(curl_mimepart * " part ,
+.BI "const char * " encoding ");"
+.ad
+.SH DESCRIPTION
+curl_mime_encoder() requests a mime part's content to be encoded before being
+transmitted.
+
+\fIpart\fP is the part's handle to assign an encoder.
+\fIencoding\fP is a pointer to a null-terminated encoding scheme. It may be
+set to NULL to disable an encoder previously attached to the part. The
encoding
+scheme storage may safely be reused after this function returns.
+
+Setting a part's encoder twice is valid: only the value set by the last call
is
+retained.
+
+Upon multipart rendering, the part's content is encoded according to the
+pertaining scheme and a corresponding \fIContent-Transfer-Encoding"\fP header
+is added to the part.
+
+Supported encoding schemes are:
+.br
+"\fIbinary\fP": the data is left unchanged, the header is added.
+.br
+"\fI8bit\fP": header added, no data change.
+.br
+"\fI7bit\fP": the data is unchanged, but is each byte is checked
+to be a 7-bit value; if not, a read error occurs.
+.br
+"\fIbase64\fP": Data is converted to base64 encoding, then split in
+CRLF-terminated lines of at most 76 characters.
+.br
+"\fIquoted-printable\fP": data is encoded in quoted printable lines of
+at most 76 characters. Since the resulting size of the final data cannot be
+determined prior to reading the original data, it is left as unknown, causing
+chunked transfer in HTTP. For the same reason, this encoder may not be used
+with IMAP. This encoder targets text data that is mostly ASCII and should
+not be used with other types of data.
+
+If the original data is already encoded in such a scheme, a custom
+\fIContent-Transfer-Encoding\fP header should be added with
+\FIcurl_mime_headers\fP() instead of setting a part encoder.
+
+Encoding should not be applied to multiparts, thus the use of this
+function on a part with content set with \fIcurl_mime_subparts\fP() is
+strongly discouraged.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* send a file */
+ curl_mime_filedata(part, "image.png");
+
+ /* encode file data in base64 for transfer */
+ curl_mime_encoder(part, "base64");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_headers "(3),"
+.BR curl_mime_subparts "(3)"
diff --cc docs/libcurl/gnurl_mime_filedata.3
index e89d22fea,000000000..deb0d4510
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_filedata.3
+++ b/docs/libcurl/gnurl_mime_filedata.3
@@@ -1,84 -1,0 +1,84 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_filedata 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_filedata - set a mime part's body data from a file contents
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_mime_filedata(curl_mimepart * " part ,
+.BI " const char * " filename ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_filedata(3)\fP sets a mime part's body content from the named
+file's contents. This is an alternative to \fIcurl_mime_data(3)\fP for setting
+data to a mime part.
+
+\fIpart\fP is the part's to assign contents to.
+
+\fIfilename\fP points to the null-terminated file's path name. The pointer can
+be NULL to detach the previous part contents settings. Filename storage can
+be safely be reused after this call.
+
+As a side effect, the part's remote file name is set to the base name of the
+given \fIfilename\fP if it is a valid named file. This can be undone or
+overridden by a subsequent call to \fIcurl_mime_filename(3)\fP.
+
+The contents of the file is read during the file transfer in a streaming
+manner to allow huge files to get transferred without using much memory. It
+therefore requires that the file is kept intact during the entire request.
+
+If the file size cannot be determined before actually reading it (such as for
+a device or named pipe), the whole mime structure containing the part
+will be transferred as chunks by HTTP and rejected by IMAP.
+
+Setting a part's contents twice is valid: only the value set by the last call
+is retained.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure. CURLE_READ_ERROR is only an
+indication that the file is not yet readable: it can be safely ignored at
+this time, but the file must be made readable before the pertaining
+easy handle is performed.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* send data from this file */
+ curl_mime_filedata(part, "image.png");
+
+ /* set name */
+ curl_mime_name(part, "data");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_data "(3),"
+.BR curl_mime_filename "(3),"
+.BR curl_mime_name "(3)"
diff --cc docs/libcurl/gnurl_mime_filename.3
index 6534a9ce5,000000000..a231545d5
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_filename.3
+++ b/docs/libcurl/gnurl_mime_filename.3
@@@ -1,72 -1,0 +1,72 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_filename 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_filename - set a mime part's remote file name
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_mime_filename(curl_mimepart * " part ,
+.BI "const char * " filename ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_filename(3)\fP sets a mime part's remote file name. When remote
+file name is set, content data is processed as a file, whatever is the part's
+content source. A part's remote file name is transmitted to the server in the
+associated Content-Disposition generated header.
+
+\fIpart\fP is the part's handle to assign the remote file name to.
+
+\fIfilename\fP points to the null-terminated file name string; it may be set
+to NULL to remove a previously attached remote file name.
+
+The remote file name string is copied into the part, thus the associated
+storage may safely be released or reused after call. Setting a part's file
+name twice is valid: only the value set by the last call is retained.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* send image data from memory */
+ curl_mime_data(part, imagebuf, imagebuf_len);
+
+ /* set a file name to make it look like a file upload */
+ curl_mime_filename(part, "image.png");
+
+ /* set name */
+ curl_mime_name(part, "data");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_filedata "(3),"
+.BR curl_mime_data "(3)"
diff --cc docs/libcurl/gnurl_mime_free.3
index 8476d1a32,000000000..4677c3f73
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_free.3
+++ b/docs/libcurl/gnurl_mime_free.3
@@@ -1,50 -1,0 +1,50 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_free 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_free - free a previously built mime structure
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "void curl_mime_free(curl_mime *" mime);
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_free(3)\fP is used to clean up data previously built/appended
+with \fIcurl_mime_addpart(3)\fP and other mime-handling functions. This must
+be called when the data has been used, which typically means after
+\fIcurl_easy_perform(3)\fP has been called.
+
+The handle to free is the one you passed to
+the \fICURLOPT_MIMEPOST(3)\fP option: attached subparts mime structures must
+not be explicitly freed as they are by the top structure freeing.
+
+\fBmime\fP is the handle as returned from a previous call to
+\fIcurl_mime_init(3)\fP and may be NULL.
+
+Passing in a NULL pointer in \fImime\fP will make this function return
+immediately with no action.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+None
+.SH "SEE ALSO"
+.BR curl_mime_init "(3)"
diff --cc docs/libcurl/gnurl_mime_headers.3
index ae54efd81,000000000..0e9b365b7
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_headers.3
+++ b/docs/libcurl/gnurl_mime_headers.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_headers 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_headers - set a mime part's custom headers
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_mime_headers(curl_mimepart * " part ,
+.BI "struct curl_slist * " headers ", int " take_ownership ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_headers(3)\fP sets a mime part's custom headers.
+
+\fIpart\fP is the part's handle to assign the custom headers list to.
+
+\fIheaders\fP is the head of a list of custom headers; it may be set to NULL
+to remove a previously attached custom header list.
+
+\fItake_ownership\fP: when non-zero, causes the list to be freed upon
+replacement or mime structure deletion; in this case the list must not be
+freed explicitly.
+
+Setting a part's custom headers list twice is valid: only the value set by
+the last call is retained.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ struct curl_slist *headers = NULL;
+
- headers = curl_slist_append("Custom-Header: mooo", headers);
++ headers = curl_slist_append(headers, "Custom-Header: mooo");
+
+ /* use these headers, please take ownership */
+ curl_mime_headers(part, headers, TRUE);
+
+ /* pass on this data */
+ curl_mime_data(part, "12345679", CURL_ZERO_TERMINATED);
+
+ /* set name */
+ curl_mime_name(part, "numbers");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3)"
diff --cc docs/libcurl/gnurl_mime_init.3
index d6a49d1e7,000000000..e83df3874
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_init.3
+++ b/docs/libcurl/gnurl_mime_init.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_init 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_init - create a mime handle
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "curl_mime * curl_mime_init(CURL * " easy_handle ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_init(3)\fP creates a handle to a new empty mime structure
+intended to be used with \fIeasy_handle\fP. This mime structure can be
+subsequently filled using the mime API, then attached to \fIeasy_handle\fP
+using option \fICURLOPT_MIMEPOST(3)\fP within a \fIcurl_easy_setopt(3)\fP
+call.
+
+Using a mime handle is the recommended way to post an HTTP form, format and
+send a multi-part e-mail with SMTP or upload such an e-mail to an IMAP server.
+
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+A mime struct handle, or NULL upon failure.
+.SH EXAMPLE
+.nf
+
+ CURL *easy = curl_easy_init();
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* Build an HTTP form with a single field named "data", */
+ mime = curl_mime_init(easy);
+ part = curl_mime_addpart(mime);
+ curl_mime_data(part, "This is the field data", CURL_ZERO_TERMINATED);
+ curl_mime_name(part, "data");
+
+ /* Post and send it. */
+ curl_easy_setopt(easy, CURLOPT_MIMEPOST, mime);
- curl_easy_setopt(easy, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(easy, CURLOPT_URL, "https://example.com");
+ curl_easy_perform(easy);
+
+ /* Clean-up. */
+ curl_easy_cleanup(easy);
+ curl_mime_free(mime);
+
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_free "(3),"
+.BR CURLOPT_MIMEPOST "(3)"
diff --cc docs/libcurl/gnurl_mime_name.3
index 79afe7515,000000000..a8504b112
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_name.3
+++ b/docs/libcurl/gnurl_mime_name.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_name 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_name - set a mime part's name
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_mime_name(curl_mimepart * " part ", const char * " name
");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_name(3)\fP sets a mime part's name. This is the way HTTP form
+fields are named.
+
+\fIpart\fP is the part's handle to assign a name to.
+
+\fIname\fP points to the null-terminated name string.
+
+The name string is copied into the part, thus the associated storage may
+safely be released or reused after call. Setting a part's name twice is valid:
+only the value set by the last call is retained. It is possible to "unname" a
+part by setting \fIname\fP to NULL.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* give the part a name */
+ curl_mime_name(part, "shoe_size");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_data "(3),"
+.BR curl_mime_type "(3)"
diff --cc docs/libcurl/gnurl_mime_subparts.3
index ab57e6159,000000000..4f9883655
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_subparts.3
+++ b/docs/libcurl/gnurl_mime_subparts.3
@@@ -1,53 -1,0 +1,53 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_subparts 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_subparts - set subparts of a multipart mime part
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_mime_subparts(curl_mimepart * " part ,
+.BI "curl_mime * " subparts ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_subparts(3)\fP sets a multipart mime part's content from a mime
+structure.
+
+\fIpart\fP is a handle to the multipart part.
+
+\fIsubparts\fP is a mime structure handle holding the subparts. After
+\fIcurl_mime_subparts\fP succeeds, the mime structure handle belongs to the
+multipart part and must not be freed explicitly. It may however be updated by
+subsequent calls to mime API functions.
+
+Setting a part's contents twice is valid: only the value set by the last call
+is retained. It is possible to unassign previous part's contents by setting
+\fIsubparts\fP to NULL.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+TODO
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_init "(3)"
diff --cc docs/libcurl/gnurl_mime_type.3
index 1c1daae9b,000000000..29bbbf008
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mime_type.3
+++ b/docs/libcurl/gnurl_mime_type.3
@@@ -1,83 -1,0 +1,83 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_mime_type 3 "22 August 2017" "libcurl 7.56.0" "libgnurl Manual"
+.SH NAME
+curl_mime_type - set a mime part's content type
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLcode curl_mime_type(curl_mimepart * " part ,
+.BI "const char * " mimetype ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_mime_type(3)\fP sets a mime part's content type.
+
+\fIpart\fP is the part's handle to assign the content type to.
+
+\fImimetype\fP points to the null-terminated file mime type string; it may be
+set to NULL to remove a previously attached mime type.
+
+The mime type string is copied into the part, thus the associated storage may
+safely be released or reused after call. Setting a part's type twice is valid:
+only the value set by the last call is retained.
+
+In the absence of a mime type and if needed by the protocol specifications,
+a default mime type is determined by the context:
+.br
+- If set as a custom header, use this value.
+.br
+- application/form-data for an HTTP form post.
+.br
+- If a remote file name is set, the mime type is taken from the file name
+extension, or application/octet-stream by default.
+.br
+- For a multipart part, multipart/mixed.
+.br
+- text/plain in other cases.
+.SH AVAILABILITY
+As long as at least one of HTTP, SMTP or IMAP is enabled. Added in 7.56.0.
+.SH RETURN VALUE
+CURLE_OK or a CURL error code upon failure.
+.SH EXAMPLE
+.nf
+ curl_mime *mime;
+ curl_mimepart *part;
+
+ /* create a mime handle */
+ mime = curl_mime_init(easy);
+
+ /* add a part */
+ part = curl_mime_addpart(mime);
+
+ /* get data from this file */
+ curl_mime_filedata(part, "image.png");
+
+ /* content-type for this part */
+ curl_mime_type(part, "image/png");
+
+ /* set name */
+ curl_mime_name(part, "image");
+.fi
+.SH "SEE ALSO"
+.BR curl_mime_addpart "(3),"
+.BR curl_mime_name "(3),"
+.BR curl_mime_data "(3)"
diff --cc docs/libcurl/gnurl_mprintf.3
index c34898afc,000000000..4a19e8cbf
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_mprintf.3
+++ b/docs/libcurl/gnurl_mprintf.3
@@@ -1,103 -1,0 +1,103 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_printf 3 "30 April 2004" "libcurl 7.12" "libgnurl Manual"
+.SH NAME
+curl_maprintf, curl_mfprintf, curl_mprintf, curl_msnprintf, curl_msprintf
+curl_mvaprintf, curl_mvfprintf, curl_mvprintf, curl_mvsnprintf,
+curl_mvsprintf - formatted output conversion
+.SH SYNOPSIS
+.B #include <gnurl/mprintf.h>
+.sp
+.BI "int curl_mprintf(const char *" format ", ...);"
+.br
+.BI "int curl_mfprintf(FILE *" fd ", const char *" format ", ...);"
+.br
+.BI "int curl_msprintf(char *" buffer ", const char *" format ", ...);"
+.br
+.BI "int curl_msnprintf(char *" buffer ", size_t " maxlength ", const char *"
format ", ...);"
+.br
+.BI "int curl_mvprintf(const char *" format ", va_list " args ");"
+.br
+.BI "int curl_mvfprintf(FILE *" fd ", const char *" format ", va_list " args
");"
+.br
+.BI "int curl_mvsprintf(char *" buffer ", const char *" format ", va_list "
args ");"
+.br
+.BI "int curl_mvsnprintf(char *" buffer ", size_t " maxlength ", const char
*" format ", va_list " args ");"
+.br
+.BI "char *curl_maprintf(const char *" format ", ...);"
+.br
+.BI "char *curl_mvaprintf(const char *" format ", va_list " args ");"
+.SH DESCRIPTION
+These are all functions that produce output according to a format string and
+given arguments. These are mostly clones of the well-known C-style functions
+and there will be no detailed explanation of all available formatting rules
+and usage here.
+
+See this table for notable exceptions.
+.RS
+.TP
+.B curl_mprintf()
+Normal printf() clone.
+.TP
+.B curl_mfprintf()
+Normal fprintf() clone.
+.TP
+.B curl_msprintf()
+Normal sprintf() clone.
+.TP
+.B curl_msnprintf()
+snprintf() clone. Many systems don't have this. It is just like \fBsprintf\fP
+but with an extra argument after the buffer that specifies the length of the
+target buffer.
+.TP
+.B curl_mvprintf()
+Normal vprintf() clone.
+.TP
+.B curl_mvfprintf()
+Normal vfprintf() clone.
+.TP
+.B curl_mvsprintf()
+Normal vsprintf() clone.
+.TP
+.B curl_mvsnprintf()
+vsnprintf() clone. Many systems don't have this. It is just like
+\fBvsprintf\fP but with an extra argument after the buffer that specifies the
+length of the target buffer.
+.TP
+.B curl_maprintf()
+Like printf() but returns the output string as a malloc()ed string. The
+returned string must be free()ed by the receiver.
+.TP
+.B curl_mvaprintf()
+Like curl_maprintf() but takes a va_list pointer argument instead of a
+variable amount of arguments.
+.RE
+.SH AVAILABILITY
+These functions will be removed from the public libcurl API in the future. Do
+not use them in any new programs or projects.
+.SH RETURN VALUE
+The \fBcurl_maprintf\fP and \fBcurl_mvaprintf\fP functions return a pointer to
+a newly allocated string, or NULL if it failed.
+
+All other functions return the number of characters they actually outputted.
+.SH "SEE ALSO"
+.BR printf "(3), " sprintf "(3), " fprintf "(3), " vprintf "(3) "
diff --cc docs/libcurl/gnurl_multi_add_handle.3
index c1d103f17,000000000..c8c230f34
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_add_handle.3
+++ b/docs/libcurl/gnurl_multi_add_handle.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_add_handle 3 "4 March 2002" "libcurl 7.9.5" "libgnurl Manual"
+.SH NAME
+curl_multi_add_handle - add an easy handle to a multi session
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle);
+.ad
+.SH DESCRIPTION
+Adds a standard easy handle to the multi stack. This function call will make
+this \fImulti_handle\fP control the specified \fIeasy_handle\fP.
+
+While an easy handle is added to a multi stack, you cannot and you must not
+use \fIcurl_easy_perform(3)\fP on that handle. After having removed the easy
+handle from the multi stack again, it is perfectly fine to use it with the
+easy interface again.
+
+If the easy handle is not set to use a shared (\fICURLOPT_SHARE(3)\fP) or
+global DNS cache (\fICURLOPT_DNS_USE_GLOBAL_CACHE(3)\fP), it will be made to
+use the DNS cache that is shared between all easy handles within the multi
+handle when \fIcurl_multi_add_handle(3)\fP is called.
+
+When an easy interface is added to a multi handle, it will use a shared
+connection cache owned by the multi handle. Removing and adding new easy
+handles will not affect the pool of connections or the ability to do
+connection re-use.
+
+If you have \fICURLMOPT_TIMERFUNCTION(3)\fP set in the multi handle (and you
+really should if you're working event-based with
+\fIcurl_multi_socket_action(3)\fP and friends), that callback will be called
+from within this function to ask for an updated timer so that your main event
+loop will get the activity on this handle to get started.
+
+The easy handle will remain added to the multi handle until you remove it
+again with \fIcurl_multi_remove_handle(3)\fP - even when a transfer with that
+specific easy handle is completed.
+
+You should remove the easy handle from the multi stack before you terminate
+first the easy handle and then the multi handle:
+
+1 - \fIcurl_multi_remove_handle(3)\fP
+
+2 - \fIcurl_easy_cleanup(3)\fP
+
+3 - \fIcurl_multi_cleanup(3)\fP
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code.
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3)," curl_multi_init "(3), "
+.BR curl_multi_setopt "(3), " curl_multi_socket_action "(3) "
diff --cc docs/libcurl/gnurl_multi_assign.3
index 7cb2bf29b,000000000..395986966
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_assign.3
+++ b/docs/libcurl/gnurl_multi_assign.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_assign 3 "9 Jul 2006" "libcurl 7.16.0" "libgnurl Manual"
+.SH NAME
+curl_multi_assign \- set data to associate with an internal socket
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd,
+ void *sockptr);
+.SH DESCRIPTION
+This function creates an association in the multi handle between the given
+socket and a private pointer of the application. This is designed for
+\fIcurl_multi_socket_action(3)\fP uses.
+
+When set, the \fIsockptr\fP pointer will be passed to all future socket
+callbacks for the specific \fIsockfd\fP socket.
+
+If the given \fIsockfd\fP isn't already in use by libcurl, this function will
+return an error.
+
+libcurl only keeps one single pointer associated with a socket, so calling
+this function several times for the same socket will make the last set pointer
+get used.
+
+The idea here being that this association (socket to private pointer) is
+something that just about every application that uses this API will need and
+then libcurl can just as well do it since it already has an internal hash
+table lookup for this.
+.SH "RETURN VALUE"
+The standard CURLMcode for multi interface error codes.
+.SH "TYPICAL USAGE"
+In a typical application you allocate a struct or at least use some kind of
+semi-dynamic data for each socket that we must wait for action on when using
+the \fIcurl_multi_socket_action(3)\fP approach.
+
+When our socket-callback gets called by libcurl and we get to know about yet
+another socket to wait for, we can use \fIcurl_multi_assign(3)\fP to point out
+the particular data so that when we get updates about this same socket again,
+we don't have to find the struct associated with this socket by ourselves.
+.SH AVAILABILITY
+This function was added in libcurl 7.15.5.
+.SH "SEE ALSO"
+.BR curl_multi_setopt "(3), " curl_multi_socket_action "(3) "
diff --cc docs/libcurl/gnurl_multi_cleanup.3
index cc3691137,000000000..6cb0537c2
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_cleanup.3
+++ b/docs/libcurl/gnurl_multi_cleanup.3
@@@ -1,50 -1,0 +1,50 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_cleanup 3 "1 March 2002" "libcurl 7.9.5" "libgnurl Manual"
+.SH NAME
+curl_multi_cleanup - close down a multi session
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLMcode curl_multi_cleanup( CURLM *multi_handle );"
+.ad
+.SH DESCRIPTION
+Cleans up and removes a whole multi stack. It does not free or touch any
+individual easy handles in any way - they still need to be closed
+individually, using the usual \fIcurl_easy_cleanup(3)\fP way. The order of
+cleaning up should be:
+
+1 - \fIcurl_multi_remove_handle(3)\fP before any easy handles are cleaned up
+
+2 - \fIcurl_easy_cleanup(3)\fP can now be called independently since the easy
+handle is no longer connected to the multi handle
+
+3 - \fIcurl_multi_cleanup(3)\fP should be called when all easy handles are
+removed
+
+Passing in a NULL pointer in \fImulti_handle\fP will make this function return
+CURLM_BAD_HANDLE immediately with no other action.
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code. On success,
+CURLM_OK is returned.
+.SH "SEE ALSO"
+.BR curl_multi_init "(3)," curl_easy_cleanup "(3)," curl_easy_init "(3)"
diff --cc docs/libcurl/gnurl_multi_fdset.3
index 81fb4b1dc,000000000..74cb22511
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_fdset.3
+++ b/docs/libcurl/gnurl_multi_fdset.3
@@@ -1,84 -1,0 +1,84 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_fdset 3 "2 Jan 2006" "libcurl 7.16.0" "libgnurl Manual"
+.SH NAME
+curl_multi_fdset - extracts file descriptor information from a multi handle
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_fdset(CURLM *multi_handle,
+ fd_set *read_fd_set,
+ fd_set *write_fd_set,
+ fd_set *exc_fd_set,
+ int *max_fd);
+.ad
+.SH DESCRIPTION
+This function extracts file descriptor information from a given multi_handle.
+libcurl returns its fd_set sets. The application can use these to select() on,
+but be sure to FD_ZERO them before calling this function as
+\fIcurl_multi_fdset(3)\fP only adds its own descriptors, it doesn't zero or
+otherwise remove any others. The \fIcurl_multi_perform(3)\fP function should
+be called as soon as one of them is ready to be read from or written to.
+
+If the \fIread_fd_set\fP argument is not a null pointer, it points to an
+object of type fd_set that on returns specifies the file descriptors to be
+checked for being ready to read.
+
+If the \fIwrite_fd_set\fP argument is not a null pointer, it points to an
+object of type fd_set that on return specifies the file descriptors to be
+checked for being ready to write.
+
+If the \fIexc_fd_set\fP argument is not a null pointer, it points to an object
+of type fd_set that on return specifies the file descriptors to be checked for
+error conditions pending.
+
+If no file descriptors are set by libcurl, \fImax_fd\fP will contain -1 when
+this function returns. Otherwise it will contain the highest descriptor number
+libcurl set. When libcurl returns -1 in \fImax_fd\fP, it is because libcurl
+currently does something that isn't possible for your application to monitor
+with a socket and unfortunately you can then not know exactly when the current
+action is completed using select(). You then need to wait a while before you
+proceed and call \fIcurl_multi_perform(3)\fP anyway. How long to wait? Unless
+\fIcurl_multi_timeout(3)\fP gives you a lower number, we suggest 100
+milliseconds or so, but you may want to test it out in your own particular
+conditions to find a suitable value.
+
+When doing select(), you should use \fIcurl_multi_timeout(3)\fP to figure out
+how long to wait for action. Call \fIcurl_multi_perform(3)\fP even if no
+activity has been seen on the fd_sets after the timeout expires as otherwise
+internal retries and timeouts may not work as you'd think and want.
+
+If one of the sockets used by libcurl happens to be larger than what can be
+set in an fd_set, which on POSIX systems means that the file descriptor is
+larger than FD_SETSIZE, then libcurl will try to not set it. Setting a too
+large file descriptor in an fd_set implies an out of bounds write which can
+cause crashes, or worse. The effect of NOT storing it will possibly save you
+from the crash, but will make your program NOT wait for sockets it should wait
+for...
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code. See
+\fIlibcurl-errors(3)\fP
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
+.BR curl_multi_wait "(3), "
+.BR curl_multi_timeout "(3), " curl_multi_perform "(3), " select "(2) "
diff --cc docs/libcurl/gnurl_multi_info_read.3
index daa754a9a,000000000..e89b30f8d
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_info_read.3
+++ b/docs/libcurl/gnurl_multi_info_read.3
@@@ -1,94 -1,0 +1,94 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_info_read 3 "18 Dec 2004" "libcurl 7.10.3" "libgnurl Manual"
+.SH NAME
+curl_multi_info_read - read multi stack informationals
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMsg *curl_multi_info_read( CURLM *multi_handle,
+ int *msgs_in_queue);
+.ad
+.SH DESCRIPTION
+Ask the multi handle if there are any messages/informationals from the
+individual transfers. Messages may include informationals such as an error
+code from the transfer or just the fact that a transfer is completed. More
+details on these should be written down as well.
+
+Repeated calls to this function will return a new struct each time, until a
+NULL is returned as a signal that there is no more to get at this point. The
+integer pointed to with \fImsgs_in_queue\fP will contain the number of
+remaining messages after this function was called.
+
+When you fetch a message using this function, it is removed from the internal
+queue so calling this function again will not return the same message
+again. It will instead return new messages at each new invoke until the queue
+is emptied.
+
+\fBWARNING:\fP The data the returned pointer points to will not survive
+calling \fIcurl_multi_cleanup(3)\fP, \fIcurl_multi_remove_handle(3)\fP or
+\fIcurl_easy_cleanup(3)\fP.
+
+The 'CURLMsg' struct is very simple and only contains very basic information.
+If more involved information is wanted, the particular "easy handle" is
+present in that struct and can be used in subsequent regular
+\fIcurl_easy_getinfo(3)\fP calls (or similar):
+
+.nf
+ struct CURLMsg {
+ CURLMSG msg; /* what this message means */
+ CURL *easy_handle; /* the handle it concerns */
+ union {
+ void *whatever; /* message-specific data */
+ CURLcode result; /* return code for transfer */
+ } data;
+ };
+.fi
+When \fBmsg\fP is \fICURLMSG_DONE\fP, the message identifies a transfer that
+is done, and then \fBresult\fP contains the return code for the easy handle
+that just completed.
+
+At this point, there are no other \fBmsg\fP types defined.
+.SH EXAMPLE
+.nf
+struct CURLMsg *m;
+
+/* call curl_multi_perform or curl_multi_socket_action first, then loop
+ through and check if there are any transfers that have completed */
+
+do {
+ int msgq = 0;
+ m = curl_multi_info_read(multi_handle, &msgq);
+ if(m && (m->msg == CURLMSG_DONE)) {
+ CURL *e = m->easy_handle;
+ transfers--;
+ curl_multi_remove_handle(multi_handle, e);
+ curl_easy_cleanup(e);
+ }
+} while(m);
+.fi
+.SH "RETURN VALUE"
+A pointer to a filled-in struct, or NULL if it failed or ran out of
+structs. It also writes the number of messages left in the queue (after this
+read) in the integer the second argument points to.
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3), " curl_multi_init "(3), " curl_multi_perform
"(3)"
diff --cc docs/libcurl/gnurl_multi_init.3
index d06c12f4e,000000000..0b4f9e0ca
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_init.3
+++ b/docs/libcurl/gnurl_multi_init.3
@@@ -1,39 -1,0 +1,39 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_init 3 "1 March 2002" "libcurl 7.9.5" "libgnurl Manual"
+.SH NAME
+curl_multi_init - create a multi handle
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLM *curl_multi_init( );"
+.ad
+.SH DESCRIPTION
+This function returns a CURLM handle to be used as input to all the other
+multi-functions, sometimes referred to as a multi handle in some places in the
+documentation. This init call MUST have a corresponding call to
+\fIcurl_multi_cleanup(3)\fP when the operation is complete.
+.SH RETURN VALUE
+If this function returns NULL, something went wrong and you cannot use the
+other curl functions.
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3)," curl_global_init "(3)," curl_easy_init "(3)"
diff --cc docs/libcurl/gnurl_multi_perform.3
index f59cc5e53,000000000..76fa3ff12
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_perform.3
+++ b/docs/libcurl/gnurl_multi_perform.3
@@@ -1,130 -1,0 +1,130 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_perform 3 "1 March 2002" "libcurl 7.9.5" "libgnurl Manual"
+.SH NAME
+curl_multi_perform - reads/writes available data from each easy handle
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles);
+.ad
+.SH DESCRIPTION
+This function handles transfers on all the added handles that need attention
+in an non-blocking fashion.
+
+When an application has found out there's data available for the multi_handle
+or a timeout has elapsed, the application should call this function to
+read/write whatever there is to read or write right now etc.
+\fIcurl_multi_perform(3)\fP returns as soon as the reads/writes are done. This
+function does not require that there actually is any data available for
+reading or that data can be written, it can be called just in case. It will
+write the number of handles that still transfer data in the second argument's
+integer-pointer.
+
+If the amount of \fIrunning_handles\fP is changed from the previous call (or
+is less than the amount of easy handles you've added to the multi handle), you
+know that there is one or more transfers less "running". You can then call
+\fIcurl_multi_info_read(3)\fP to get information about each individual
+completed transfer, and that returned info includes CURLcode and more. If an
+added handle fails very quickly, it may never be counted as a running_handle.
+You could use \fIcurl_multi_info_read(3)\fP to track actual status of the
+added handles in that case.
+
+When \fIrunning_handles\fP is set to zero (0) on the return of this function,
+there is no longer any transfers in progress.
+.SH EXAMPLE
+.nf
+#ifdef _WIN32
+#define SHORT_SLEEP Sleep(100)
+#else
+#define SHORT_SLEEP usleep(100000)
+#endif
+
+fd_set fdread;
+fd_set fdwrite;
+fd_set fdexcep;
+int maxfd = -1;
+
+long curl_timeo;
+
+curl_multi_timeout(multi_handle, &curl_timeo);
+if(curl_timeo < 0)
+ curl_timeo = 1000;
+
+timeout.tv_sec = curl_timeo / 1000;
+timeout.tv_usec = (curl_timeo % 1000) * 1000;
+
+FD_ZERO(&fdread);
+FD_ZERO(&fdwrite);
+FD_ZERO(&fdexcep);
+
+/* get file descriptors from the transfers */
+mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+if(maxfd == -1) {
+ SHORT_SLEEP;
+ rc = 0;
+}
+else
+ rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+
+switch(rc) {
+case -1:
+ /* select error */
+ break;
+case 0:
+default:
+ /* timeout or readable/writable sockets */
+ curl_multi_perform(multi_handle, &still_running);
+ break;
+}
+
+/* if there are still transfers, loop! */
+.fi
+.SH "RETURN VALUE"
+CURLMcode type, general libcurl multi interface error code.
+
+Before version 7.20.0 (released on February 9 2010): If you receive
\fICURLM_CALL_MULTI_PERFORM\fP, this
+basically means that you should call \fIcurl_multi_perform(3)\fP again, before
+you select() on more actions. You don't have to do it immediately, but the
+return code means that libcurl may have more data available to return or that
+there may be more data to send off before it is "satisfied". Do note that
+\fIcurl_multi_perform(3)\fP will return \fICURLM_CALL_MULTI_PERFORM\fP only
+when it wants to be called again \fBimmediately\fP. When things are fine and
+there is nothing immediate it wants done, it'll return \fICURLM_OK\fP and you
+need to wait for \&"action" and then call this function again.
+
+This function only returns errors etc regarding the whole multi stack.
+Problems still might have occurred on individual transfers even when this
+function returns \fICURLM_OK\fP. Use \fIcurl_multi_info_read(3)\fP to figure
+out how individual transfers did.
+.SH "TYPICAL USAGE"
+Most applications will use \fIcurl_multi_fdset(3)\fP to get the multi_handle's
+file descriptors, and \fIcurl_multi_timeout(3)\fP to get a suitable timeout
+period, then it'll wait for action on the file descriptors using
+\fBselect(3)\fP. As soon as one or more file descriptor is ready,
+\fIcurl_multi_perform(3)\fP gets called.
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
+.BR curl_multi_wait "(3), "
+.BR curl_multi_fdset "(3), " curl_multi_info_read "(3), "
+.BR libcurl-errors "(3)"
diff --cc docs/libcurl/gnurl_multi_poll.3
index adab68d5e,000000000..37fcd7581
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_poll.3
+++ b/docs/libcurl/gnurl_multi_poll.3
@@@ -1,117 -1,0 +1,117 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_poll 3 "29 Jul 2019" "libcurl 7.66.0" "libgnurl Manual"
+.SH NAME
+curl_multi_poll - polls on all easy handles in a multi handle
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_poll(CURLM *multi_handle,
+ struct curl_waitfd extra_fds[],
+ unsigned int extra_nfds,
+ int timeout_ms,
+ int *numfds);
+.ad
+.SH DESCRIPTION
+\fIcurl_multi_poll(3)\fP polls all file descriptors used by the curl easy
+handles contained in the given multi handle set. It will block until activity
+is detected on at least one of the handles or \fItimeout_ms\fP has passed.
+Alternatively, if the multi handle has a pending internal timeout that has a
+shorter expiry time than \fItimeout_ms\fP, that shorter time will be used
+instead to make sure timeout accuracy is reasonably kept.
+
+The calling application may pass additional curl_waitfd structures which are
+similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call.
+
+On completion, if \fInumfds\fP is non-NULL, it will be populated with the
+total number of file descriptors on which interesting events occurred. This
+number can include both libcurl internal descriptors as well as descriptors
+provided in \fIextra_fds\fP.
+
+The \fIcurl_multi_wakeup(3)\fP function can be used from another thread to
+wake up this function and return faster. This is one of the details
+that makes this function different than \fIcurl_multi_wait(3)\fP which cannot
+be woken up this way.
+
+If no extra file descriptors are provided and libcurl has no file descriptor
+to offer to wait for, this function will instead wait during \fItimeout_ms\fP
+milliseconds (or shorter if an internal timer indicates so). This is the
+other detail that makes this function different than
+\fIcurl_multi_wait(3)\fP.
+
+This function is encouraged to be used instead of select(3) when using the
+multi interface to allow applications to easier circumvent the common problem
+with 1024 maximum file descriptors.
+.SH curl_waitfd
+.nf
+struct curl_waitfd {
+ curl_socket_t fd;
+ short events;
+ short revents;
+};
+.fi
+.IP CURL_WAIT_POLLIN
+Bit flag to curl_waitfd.events indicating the socket should poll on read
+events such as new data received.
+.IP CURL_WAIT_POLLPRI
+Bit flag to curl_waitfd.events indicating the socket should poll on high
+priority read events such as out of band data.
+.IP CURL_WAIT_POLLOUT
+Bit flag to curl_waitfd.events indicating the socket should poll on write
+events such as the socket being clear to write without blocking.
+.SH EXAMPLE
+.nf
+CURL *easy_handle;
+CURLM *multi_handle;
+
+/* add the individual easy handle */
+curl_multi_add_handle(multi_handle, easy_handle);
+
+do {
+ CURLMcode mc;
+ int numfds;
+
+ mc = curl_multi_perform(multi_handle, &still_running);
+
+ if(mc == CURLM_OK) {
+ /* wait for activity or timeout */
+ mc = curl_multi_poll(multi_handle, NULL, 0, 1000, &numfds);
+ }
+
+ if(mc != CURLM_OK) {
+ fprintf(stderr, "curl_multi failed, code %d.\\n", mc);
+ break;
+ }
+
+} while(still_running);
+
+curl_multi_remove_handle(multi_handle, easy_handle);
+.fi
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code. See
+\fIlibcurl-errors(3)\fP
+.SH AVAILABILITY
+This function was added in libcurl 7.66.0.
+.SH "SEE ALSO"
+.BR curl_multi_fdset "(3), " curl_multi_perform "(3), "
+.BR curl_multi_wait "(3), " curl_multi_wakeup "(3)"
diff --cc docs/libcurl/gnurl_multi_remove_handle.3
index 0987ea287,000000000..9f7cc9e3b
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_remove_handle.3
+++ b/docs/libcurl/gnurl_multi_remove_handle.3
@@@ -1,47 -1,0 +1,47 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_remove_handle 3 "6 March 2002" "libcurl 7.9.5" "libgnurl
Manual"
+.SH NAME
+curl_multi_remove_handle - remove an easy handle from a multi session
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle);
+.ad
+.SH DESCRIPTION
+Removes a given \fIeasy_handle\fP from the \fImulti_handle\fP. This will make
+the specified easy handle be removed from this multi handle's control.
+
+When the easy handle has been removed from a multi stack, it is again
+perfectly legal to invoke \fIcurl_easy_perform(3)\fP on this easy handle.
+
+Removing an easy handle while being used is perfectly legal and will
+effectively halt the transfer in progress involving that easy handle. All
+other easy handles and transfers will remain unaffected.
+
+It is fine to remove a handle at any time during a transfer, just not from
+within any libcurl callback function.
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code.
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3)," curl_multi_init "(3), "
+.BR curl_multi_add_handle "(3) "
diff --cc docs/libcurl/gnurl_multi_setopt.3
index dd141be0c,000000000..583274eab
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_setopt.3
+++ b/docs/libcurl/gnurl_multi_setopt.3
@@@ -1,80 -1,0 +1,80 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_setopt 3 "4 Nov 2014" "libcurl 7.39.0" "libgnurl Manual"
+.SH NAME
+curl_multi_setopt \- set options for a curl multi handle
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param);
+.SH DESCRIPTION
+\fIcurl_multi_setopt(3)\fP is used to tell a libcurl multi handle how to
+behave. By using the appropriate options to \fIcurl_multi_setopt(3)\fP, you
+can change libcurl's behaviour when using that multi handle. All options are
+set with the \fIoption\fP followed by the parameter \fIparam\fP. That
+parameter can be a \fBlong\fP, a \fBfunction pointer\fP, an \fBobject
+pointer\fP or a \fBcurl_off_t\fP type, depending on what the specific option
+expects. Read this manual carefully as bad input values may cause libcurl to
+behave badly! You can only set one option in each function call.
+
+.SH OPTIONS
+.IP CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE
+See \fICURLMOPT_CHUNK_LENGTH_PENALTY_SIZE(3)\fP
+.IP CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE
+See \fICURLMOPT_CONTENT_LENGTH_PENALTY_SIZE(3)\fP
+.IP CURLMOPT_MAX_HOST_CONNECTIONS
+See \fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP
+.IP CURLMOPT_MAX_PIPELINE_LENGTH
+See \fICURLMOPT_MAX_PIPELINE_LENGTH(3)\fP
+.IP CURLMOPT_MAX_TOTAL_CONNECTIONS
+See \fICURLMOPT_MAX_TOTAL_CONNECTIONS(3)\fP
+.IP CURLMOPT_MAXCONNECTS
+See \fICURLMOPT_MAXCONNECTS(3)\fP
+.IP CURLMOPT_PIPELINING
+See \fICURLMOPT_PIPELINING(3)\fP
+.IP CURLMOPT_PIPELINING_SITE_BL
+See \fICURLMOPT_PIPELINING_SITE_BL(3)\fP
+.IP CURLMOPT_PIPELINING_SERVER_BL
+See \fICURLMOPT_PIPELINING_SERVER_BL(3)\fP
+.IP CURLMOPT_PUSHFUNCTION
+See \fICURLMOPT_PUSHFUNCTION(3)\fP
+.IP CURLMOPT_PUSHDATA
+See \fICURLMOPT_PUSHDATA(3)\fP
+.IP CURLMOPT_SOCKETFUNCTION
+See \fICURLMOPT_SOCKETFUNCTION(3)\fP
+.IP CURLMOPT_SOCKETDATA
+See \fICURLMOPT_SOCKETDATA(3)\fP
+.IP CURLMOPT_TIMERFUNCTION
+See \fICURLMOPT_TIMERFUNCTION(3)\fP
+.IP CURLMOPT_TIMERDATA
+See \fICURLMOPT_TIMERDATA(3)\fP
+.IP CURLMOPT_MAX_CONCURRENT_STREAMS
+See \fICURLMOPT_MAX_CONCURRENT_STREAMS(3)\fP
+.SH RETURNS
+The standard CURLMcode for multi interface error codes. Note that it returns a
+CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl
+doesn't know of.
+.SH AVAILABILITY
+This function was added in libcurl 7.15.4.
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
+.BR curl_multi_socket "(3), " curl_multi_info_read "(3)"
diff --cc docs/libcurl/gnurl_multi_socket.3
index 3ca76e668,000000000..01b801e89
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_socket.3
+++ b/docs/libcurl/gnurl_multi_socket.3
@@@ -1,159 -1,0 +1,159 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_socket 3 "9 Jul 2006" "libcurl 7.16.0" "libgnurl Manual"
+.SH NAME
+curl_multi_socket \- reads/writes available data
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+CURLMcode curl_multi_socket(CURLM * multi_handle, curl_socket_t sockfd,
+ int *running_handles);
+
+CURLMcode curl_multi_socket_all(CURLM *multi_handle,
+ int *running_handles);
+.fi
+.SH DESCRIPTION
+These functions are deprecated. Do not use! See
+\fIcurl_multi_socket_action(3)\fP instead!
+
+At return, the integer \fBrunning_handles\fP points to will contain the number
+of still running easy handles within the multi handle. When this number
+reaches zero, all transfers are complete/done. Note that when you call
+\fIcurl_multi_socket_action(3)\fP on a specific socket and the counter
+decreases by one, it DOES NOT necessarily mean that this exact socket/transfer
+is the one that completed. Use \fIcurl_multi_info_read(3)\fP to figure out
+which easy handle that completed.
+
+The \fIcurl_multi_socket_action(3)\fP functions inform the application about
+updates in the socket (file descriptor) status by doing none, one, or multiple
+calls to the socket callback function set with the
+\fICURLMOPT_SOCKETFUNCTION(3)\fP option to \fIcurl_multi_setopt(3)\fP. They
+update the status with changes since the previous time the callback was
+called.
+
+Get the timeout time by setting the \fICURLMOPT_TIMERFUNCTION(3)\fP option
+with \fIcurl_multi_setopt(3)\fP. Your application will then get called with
+information on how long to wait for socket actions at most before doing the
+timeout action: call the \fIcurl_multi_socket_action(3)\fP function with the
+\fBsockfd\fP argument set to CURL_SOCKET_TIMEOUT. You can also use the
+\fIcurl_multi_timeout(3)\fP function to poll the value at any given time, but
+for an event-based system using the callback is far better than relying on
+polling the timeout value.
+
+Usage of \fIcurl_multi_socket(3)\fP is deprecated, whereas the function is
+equivalent to \fIcurl_multi_socket_action(3)\fP with \fBev_bitmask\fP set to
+0.
+
+Force libcurl to (re-)check all its internal sockets and transfers instead of
+just a single one by calling \fIcurl_multi_socket_all(3)\fP. Note that there
+should not be any reason to use this function!
+.SH "CALLBACK DETAILS"
+
+The socket \fBcallback\fP function uses a prototype like this
+.nf
+
+ int curl_socket_callback(CURL *easy, /* easy handle */
+ curl_socket_t s, /* socket */
+ int action, /* see values below */
+ void *userp, /* private callback pointer */
+ void *socketp); /* private socket pointer */
+
+.fi
+The callback MUST return 0.
+
+The \fIeasy\fP argument is a pointer to the easy handle that deals with this
+particular socket. Note that a single handle may work with several sockets
+simultaneously.
+
+The \fIs\fP argument is the actual socket value as you use it within your
+system.
+
+The \fIaction\fP argument to the callback has one of five values:
+.RS
+.IP "CURL_POLL_NONE (0)"
+register, not interested in readiness (yet)
+.IP "CURL_POLL_IN (1)"
+register, interested in read readiness
+.IP "CURL_POLL_OUT (2)"
+register, interested in write readiness
+.IP "CURL_POLL_INOUT (3)"
+register, interested in both read and write readiness
+.IP "CURL_POLL_REMOVE (4)"
+unregister
+.RE
+
+The \fIsocketp\fP argument is a private pointer you have previously set with
+\fIcurl_multi_assign(3)\fP to be associated with the \fIs\fP socket. If no
+pointer has been set, socketp will be NULL. This argument is of course a
+service to applications that want to keep certain data or structs that are
+strictly associated to the given socket.
+
+The \fIuserp\fP argument is a private pointer you have previously set with
+\fIcurl_multi_setopt(3)\fP and the \fICURLMOPT_SOCKETDATA(3)\fP option.
+.SH "RETURN VALUE"
+CURLMcode type, general libcurl multi interface error code.
+
+Legacy: If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this basically means
+that you should call \fIcurl_multi_socket(3)\fP again, before you wait for
+more actions on libcurl's sockets. You don't have to do it immediately, but
+the return code means that libcurl may have more data available to return or
+that there may be more data to send off before it is "satisfied".
+
+In modern libcurls, \fICURLM_CALL_MULTI_PERFORM\fP or
+\fICURLM_CALL_MULTI_SOCKET\fP should not be returned and no application needs
+to care about them.
+
+NOTE that the return code is for the whole multi stack. Problems still might
have
+occurred on individual transfers even when one of these functions
+return OK.
+.SH "TYPICAL USAGE"
+1. Create a multi handle
+
+2. Set the socket callback with \fICURLMOPT_SOCKETFUNCTION(3)\fP
+
+3. Set the timeout callback with \fICURLMOPT_TIMERFUNCTION(3)\fP, to get to
+know what timeout value to use when waiting for socket activities.
+
+4. Add easy handles with curl_multi_add_handle()
+
+5. Provide some means to manage the sockets libcurl is using, so you can check
+them for activity. This can be done through your application code, or by way
+of an external library such as libevent or glib.
+
+6. Wait for activity on any of libcurl's sockets, use the timeout value your
+callback has been told
+
+7, When activity is detected, call curl_multi_socket_action() for the
+socket(s) that got action. If no activity is detected and the timeout expires,
+call \fIcurl_multi_socket_action(3)\fP with \fICURL_SOCKET_TIMEOUT\fP
+
+8. Go back to step 6.
+.SH AVAILABILITY
+This function was added in libcurl 7.15.4, and is deemed stable since
+7.16.0.
+
+\fIcurl_multi_socket(3)\fP is deprecated, use
+\fIcurl_multi_socket_action(3)\fP instead!
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
+.BR curl_multi_fdset "(3), " curl_multi_info_read "(3), "
+.BR "the hiperfifo.c example"
diff --cc docs/libcurl/gnurl_multi_socket_action.3
index 35b709231,000000000..419cc12fb
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_socket_action.3
+++ b/docs/libcurl/gnurl_multi_socket_action.3
@@@ -1,96 -1,0 +1,96 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_socket_action 3 "9 Jul 2006" "libcurl 7.16.0" "libgnurl
Manual"
+.SH NAME
+curl_multi_socket_action \- reads/writes available data given an action
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_socket_action(CURLM * multi_handle,
+ curl_socket_t sockfd,
+ int ev_bitmask,
+ int *running_handles);
+.fi
+.SH DESCRIPTION
+When the application has detected action on a socket handled by libcurl, it
+should call \fIcurl_multi_socket_action(3)\fP with the \fBsockfd\fP argument
+set to the socket with the action. When the events on a socket are known, they
+can be passed as an events bitmask \fBev_bitmask\fP by first setting
+\fBev_bitmask\fP to 0, and then adding using bitwise OR (|) any combination of
+events to be chosen from CURL_CSELECT_IN, CURL_CSELECT_OUT or
+CURL_CSELECT_ERR. When the events on a socket are unknown, pass 0 instead, and
+libcurl will test the descriptor internally. It is also permissible to pass
+CURL_SOCKET_TIMEOUT to the \fBsockfd\fP parameter in order to initiate the
+whole process or when a timeout occurs.
+
+At return, \fBrunning_handles\fP points to the number of running easy handles
+within the multi handle. When this number reaches zero, all transfers are
+complete/done. When you call \fIcurl_multi_socket_action(3)\fP on a specific
+socket and the counter decreases by one, it DOES NOT necessarily mean that
+this exact socket/transfer is the one that completed. Use
+\fIcurl_multi_info_read(3)\fP to figure out which easy handle that completed.
+
+The \fIcurl_multi_socket_action(3)\fP function informs the application about
+updates in the socket (file descriptor) status by doing none, one, or multiple
+calls to the socket callback function set with the
+\fICURLMOPT_SOCKETFUNCTION(3)\fP option to \fIcurl_multi_setopt(3)\fP. They
+update the status with changes since the previous time the callback was
+called.
+
+Get the timeout time by setting the \fICURLMOPT_TIMERFUNCTION(3)\fP option
+with \fIcurl_multi_setopt(3)\fP. Your application will then get called with
+information on how long to wait for socket actions at most before doing the
+timeout action: call the \fIcurl_multi_socket_action(3)\fP function with the
+\fBsockfd\fP argument set to CURL_SOCKET_TIMEOUT. You can also use the
+\fIcurl_multi_timeout(3)\fP function to poll the value at any given time, but
+for an event-based system using the callback is far better than relying on
+polling the timeout value.
+.SH "TYPICAL USAGE"
+1. Create a multi handle
+
+2. Set the socket callback with \fICURLMOPT_SOCKETFUNCTION(3)\fP
+
+3. Set the timeout callback with \fICURLMOPT_TIMERFUNCTION(3)\fP, to get to
+know what timeout value to use when waiting for socket activities.
+
+4. Add easy handles with curl_multi_add_handle()
+
+5. Provide some means to manage the sockets libcurl is using, so you can check
+them for activity. This can be done through your application code, or by way
+of an external library such as libevent or glib.
+
+6. Call curl_multi_socket_action(..., CURL_SOCKET_TIMEOUT, 0, ...)
+to kickstart everything. To get one or more callbacks called.
+
+7. Wait for activity on any of libcurl's sockets, use the timeout value your
+callback has been told.
+
+8, When activity is detected, call curl_multi_socket_action() for the
+socket(s) that got action. If no activity is detected and the timeout expires,
+call \fIcurl_multi_socket_action(3)\fP with \fICURL_SOCKET_TIMEOUT\fP.
+.SH AVAILABILITY
+This function was added in libcurl 7.15.4, and is deemed stable since 7.16.0.
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
+.BR curl_multi_fdset "(3), " curl_multi_info_read "(3), "
+.BR "the hiperfifo.c example"
diff --cc docs/libcurl/gnurl_multi_strerror.3
index feb6cd684,000000000..24dbdb946
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_strerror.3
+++ b/docs/libcurl/gnurl_multi_strerror.3
@@@ -1,37 -1,0 +1,37 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_strerror 3 "26 Apr 2004" "libcurl 7.12" "libgnurl Manual"
+.SH NAME
+curl_multi_strerror - return string describing error code
+.SH SYNOPSIS
+.nf
+.B #include <gnurl/curl.h>
+.BI "const char *curl_multi_strerror(CURLMcode " errornum ");"
+.SH DESCRIPTION
+The curl_multi_strerror() function returns a string describing the CURLMcode
+error code passed in the argument \fIerrornum\fP.
+.SH AVAILABILITY
+This function was added in libcurl 7.12.0
+.SH RETURN VALUE
+A pointer to a null-terminated string.
+.SH "SEE ALSO"
+.BR libcurl-errors "(3), " curl_easy_strerror "(3), " curl_share_strerror
"(3)"
diff --cc docs/libcurl/gnurl_multi_timeout.3
index e2620dd8f,000000000..76e45ac25
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_timeout.3
+++ b/docs/libcurl/gnurl_multi_timeout.3
@@@ -1,78 -1,0 +1,78 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_timeout 3 "2 Jan 2006" "libcurl 7.16.0" "libgnurl Manual"
+.SH NAME
+curl_multi_timeout \- how long to wait for action before proceeding
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_timeout(CURLM *multi_handle, long *timeout);
+.SH DESCRIPTION
+
+An application using the libcurl multi interface should call
+\fIcurl_multi_timeout(3)\fP to figure out how long it should wait for socket
+actions \- at most \- before proceeding.
+
+Proceeding means either doing the socket-style timeout action: call the
+\fIcurl_multi_socket_action(3)\fP function with the \fBsockfd\fP argument set
+to CURL_SOCKET_TIMEOUT, or call \fIcurl_multi_perform(3)\fP if you're using
+the simpler and older multi interface approach.
+
+The timeout value returned in the long \fBtimeout\fP points to, is in number
+of milliseconds at this very moment. If 0, it means you should proceed
+immediately without waiting for anything. If it returns -1, there's no timeout
+at all set.
+
+An application that uses the multi_socket API SHOULD NOT use this function,
but
+SHOULD instead use \fIcurl_multi_setopt(3)\fP and its
+\fPCURLMOPT_TIMERFUNCTION\fP option for proper and desired behavior.
+
+Note: if libcurl returns a -1 timeout here, it just means that libcurl
+currently has no stored timeout value. You must not wait too long (more than a
+few seconds perhaps) before you call curl_multi_perform() again.
+.SH EXAMPLE
+.nf
+struct timeval timeout;
+long timeo;
+
+curl_multi_timeout(multi_handle, &timeo);
+if(timeo < 0)
+ /* no set timeout, use a default */
+ timeo = 980;
+
+timeout.tv_sec = timeo / 1000;
+timeout.tv_usec = (timeo % 1000) * 1000;
+
+/* wait for activities no longer than the set timeout */
+select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+.fi
+.SH "RETURN VALUE"
+The standard CURLMcode for multi interface error codes.
+.SH "TYPICAL USAGE"
+Call \fIcurl_multi_timeout(3)\fP, then wait for action on the sockets. You
+figure out which sockets to wait for by calling \fIcurl_multi_fdset(3)\fP or
+by a previous call to \fIcurl_multi_socket(3)\fP.
+.SH AVAILABILITY
+This function was added in libcurl 7.15.4.
+.SH "SEE ALSO"
+.BR curl_multi_fdset "(3), " curl_multi_info_read "(3), "
+.BR curl_multi_socket "(3), " curl_multi_setopt "(3) "
diff --cc docs/libcurl/gnurl_multi_wait.3
index 21c0842b4,000000000..64a7426a9
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_wait.3
+++ b/docs/libcurl/gnurl_multi_wait.3
@@@ -1,123 -1,0 +1,123 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_wait 3 "12 Jul 2012" "libcurl 7.28.0" "libgnurl Manual"
+.SH NAME
+curl_multi_wait - polls on all easy handles in a multi handle
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_wait(CURLM *multi_handle,
+ struct curl_waitfd extra_fds[],
+ unsigned int extra_nfds,
+ int timeout_ms,
+ int *numfds);
+.ad
+.SH DESCRIPTION
+\fIcurl_multi_wait(3)\fP polls all file descriptors used by the curl easy
+handles contained in the given multi handle set. It will block until activity
+is detected on at least one of the handles or \fItimeout_ms\fP has passed.
+Alternatively, if the multi handle has a pending internal timeout that has a
+shorter expiry time than \fItimeout_ms\fP, that shorter time will be used
+instead to make sure timeout accuracy is reasonably kept.
+
+The calling application may pass additional curl_waitfd structures which are
+similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call.
+
+On completion, if \fInumfds\fP is non-NULL, it will be populated with the
+total number of file descriptors on which interesting events occurred. This
+number can include both libcurl internal descriptors as well as descriptors
+provided in \fIextra_fds\fP.
+
+If no extra file descriptors are provided and libcurl has no file descriptor
+to offer to wait for, this function will return immediately. (Try
+\fIcurl_multi_poll(3)\fP instead if you rather avoid this behavior.)
+
+This function is encouraged to be used instead of select(3) when using the
+multi interface to allow applications to easier circumvent the common problem
+with 1024 maximum file descriptors.
+.SH curl_waitfd
+.nf
+struct curl_waitfd {
+ curl_socket_t fd;
+ short events;
+ short revents;
+};
+.fi
+.IP CURL_WAIT_POLLIN
+Bit flag to curl_waitfd.events indicating the socket should poll on read
+events such as new data received.
+.IP CURL_WAIT_POLLPRI
+Bit flag to curl_waitfd.events indicating the socket should poll on high
+priority read events such as out of band data.
+.IP CURL_WAIT_POLLOUT
+Bit flag to curl_waitfd.events indicating the socket should poll on write
+events such as the socket being clear to write without blocking.
+.SH EXAMPLE
+.nf
+CURL *easy_handle;
+CURLM *multi_handle;
+
+/* add the individual easy handle */
+curl_multi_add_handle(multi_handle, easy_handle);
+
+do {
+ CURLMcode mc;
+ int numfds;
+
+ mc = curl_multi_perform(multi_handle, &still_running);
+
+ if(mc == CURLM_OK ) {
+ /* wait for activity, timeout or "nothing" */
+ mc = curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds);
+ }
+
+ if(mc != CURLM_OK) {
+ fprintf(stderr, "curl_multi failed, code %d.\\n", mc);
+ break;
+ }
+
+ /* 'numfds' being zero means either a timeout or no file descriptors to
+ wait for. Try timeout on first occurrence, then assume no file
+ descriptors and no file descriptors to wait for means wait for 100
+ milliseconds. */
+
+ if(!numfds) {
+ repeats++; /* count number of repeated zero numfds */
+ if(repeats > 1) {
+ WAITMS(100); /* sleep 100 milliseconds */
+ }
+ }
+ else
+ repeats = 0;
+
+} while(still_running);
+
+curl_multi_remove_handle(multi_handle, easy_handle);
+.fi
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code. See
+\fIlibcurl-errors(3)\fP
+.SH AVAILABILITY
+This function was added in libcurl 7.28.0.
+.SH "SEE ALSO"
+.BR curl_multi_fdset "(3), " curl_multi_perform "(3)", curl_multi_poll "(3) ",
diff --cc docs/libcurl/gnurl_multi_wakeup.3
index c47f85549,000000000..f029fb721
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_multi_wakeup.3
+++ b/docs/libcurl/gnurl_multi_wakeup.3
@@@ -1,86 -1,0 +1,86 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_multi_wakeup 3 "17 Nov 2019" "libcurl 7.68.0" "libgnurl Manual"
+.SH NAME
+curl_multi_wakeup - wakes up a sleeping curl_multi_poll call
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_wakeup(CURLM *multi_handle);
+.ad
+.SH DESCRIPTION
+This function can be called from any thread and it wakes up a
+sleeping \fIcurl_multi_poll(3)\fP call that is currently (or will be)
+waiting for activity or a timeout.
+
+If the function is called when there is no \fIcurl_multi_poll(3)\fP call,
+it will cause the next call to return immediately.
+
+Calling this function only guarantees to wake up the current (or the next
+if there is no current) \fIcurl_multi_poll(3)\fP call, which means it is
+possible that multiple calls to this function will wake up the same waiting
+operation.
+
+This function has no effect on \fIcurl_multi_wait(3)\fP calls.
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code.
+.SH AVAILABILITY
+Added in 7.68.0
+.SH EXAMPLE
+.nf
+CURL *easy_handle;
+CURLM *multi_handle;
+
+/* add the individual easy handle */
+curl_multi_add_handle(multi_handle, easy_handle);
+
+/* this is thread 1 */
+do {
+ CURLMcode mc;
+ int numfds;
+
+ mc = curl_multi_perform(multi_handle, &still_running);
+
+ if(mc == CURLM_OK) {
+ /* wait for activity, timeout or wakeup */
+ mc = curl_multi_poll(multi_handle, NULL, 0, 10000, &numfds);
+ }
+
+ if(time_to_die())
+ exit(1);
+
+} while(still_running);
+
+curl_multi_remove_handle(multi_handle, easy_handle);
+
+/* this is thread 2 */
+
+if(something makes us decide to stop thread 1) {
+
+ set_something_to_signal_thread_1_to_exit();
+
+ curl_multi_wakeup(multi_handle);
+}
+
+.fi
+.SH "SEE ALSO"
+.BR curl_multi_poll "(3), " curl_multi_wait "(3)"
diff --cc docs/libcurl/gnurl_share_cleanup.3
index 9c07e0cbb,000000000..e3352573d
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_share_cleanup.3
+++ b/docs/libcurl/gnurl_share_cleanup.3
@@@ -1,42 -1,0 +1,42 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_share_cleanup 3 "8 Aug 2003" "libcurl 7.10.7" "libgnurl Manual"
+.SH NAME
+curl_share_cleanup - Clean up a shared object
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLSHcode curl_share_cleanup(CURLSH *" share_handle ");"
+.ad
+.SH DESCRIPTION
+This function deletes a shared object. The share handle cannot be used anymore
+when this function has been called.
+
+Passing in a NULL pointer in \fIshare_handle\fP will make this function return
+immediately with no action.
+.SH RETURN VALUE
+CURLSHE_OK (zero) means that the option was set properly, non-zero means an
+error occurred as \fI<gnurl/curl.h>\fP defines. See the \fIlibcurl-errors.3\fP
+man page for the full list with descriptions. If an error occurs, then the
+share object will not be deleted.
+.SH "SEE ALSO"
+.BR curl_share_init "(3), " curl_share_setopt "(3)"
diff --cc docs/libcurl/gnurl_share_init.3
index 4b479a614,000000000..954b10324
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_share_init.3
+++ b/docs/libcurl/gnurl_share_init.3
@@@ -1,43 -1,0 +1,43 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_share_init 3 "8 Aug 2003" "libcurl 7.10.7" "libgnurl Manual"
+.SH NAME
+curl_share_init - Create a shared object
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "CURLSH *curl_share_init( );"
+.ad
+.SH DESCRIPTION
+This function returns a CURLSH handle to be used as input to all the other
+share-functions, sometimes referred to as a share handle in some places in the
+documentation. This init call MUST have a corresponding call to
+\fIcurl_share_cleanup\fP when all operations using the share are complete.
+
+This \fIshare handle\fP is what you pass to curl using the
+\fICURLOPT_SHARE(3)\fP option with \fIcurl_easy_setopt(3)\fP, to make that
+specific curl handle use the data in this share.
+.SH RETURN VALUE
+If this function returns NULL, something went wrong (out of memory, etc.)
+and therefore the share object was not created.
+.SH "SEE ALSO"
+.BR curl_share_cleanup "(3), " curl_share_setopt "(3)"
diff --cc docs/libcurl/gnurl_share_setopt.3
index a446b6451,000000000..022211149
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_share_setopt.3
+++ b/docs/libcurl/gnurl_share_setopt.3
@@@ -1,114 -1,0 +1,114 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_share_setopt 3 "8 Aug 2003" "libcurl 7.10.7" "libgnurl Manual"
+.SH NAME
+curl_share_setopt - Set options for a shared object
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+CURLSHcode curl_share_setopt(CURLSH *share, CURLSHoption option, parameter);
+.ad
+.SH DESCRIPTION
+Set the \fIoption\fP to \fIparameter\fP for the given \fIshare\fP.
+.SH OPTIONS
+.IP CURLSHOPT_LOCKFUNC
+The \fIparameter\fP must be a pointer to a function matching the following
+prototype:
+
+void lock_function(CURL *handle, curl_lock_data data, curl_lock_access access,
+void *userptr);
+
+The \fIdata\fP argument tells what kind of data libcurl wants to lock. Make
+sure that the callback uses a different lock for each kind of data.
+
+\fIaccess\fP defines what access type libcurl wants, shared or single.
+
+\fIuserptr\fP is the pointer you set with \fICURLSHOPT_USERDATA\fP.
+.IP CURLSHOPT_UNLOCKFUNC
+The \fIparameter\fP must be a pointer to a function matching the following
+prototype:
+
+void unlock_function(CURL *handle, curl_lock_data data, void *userptr);
+
+\fIdata\fP defines what data libcurl wants to unlock, and you must make sure
+that only one lock is given at any time for each kind of data.
+
+\fIuserptr\fP is the pointer you set with \fICURLSHOPT_USERDATA\fP.
+.IP CURLSHOPT_SHARE
+The \fIparameter\fP specifies a type of data that should be shared. This may
+be set to one of the values described below.
+.RS
+.IP CURL_LOCK_DATA_COOKIE
+Cookie data will be shared across the easy handles using this shared object.
+Note that this does not activate an easy handle's cookie handling. You can do
+that separately by using \fICURLOPT_COOKIEFILE(3)\fP for example.
+.IP CURL_LOCK_DATA_DNS
+Cached DNS hosts will be shared across the easy handles using this shared
+object. Note that when you use the multi interface, all easy handles added to
+the same multi handle will share DNS cache by default without using this
+option.
+.IP CURL_LOCK_DATA_SSL_SESSION
+SSL session IDs will be shared across the easy handles using this shared
+object. This will reduce the time spent in the SSL handshake when reconnecting
+to the same server. Note SSL session IDs are reused within the same easy
handle
+by default. Note this symbol was added in 7.10.3 but was not implemented until
+7.23.0.
+.IP CURL_LOCK_DATA_CONNECT
+Put the connection cache in the share object and make all easy handles using
+this share object share the connection cache.
+
+Note that due to a known bug, it is not safe to share connections this way
+between multiple concurrent threads.
+
+Connections that are used for HTTP/1.1 Pipelining or HTTP/2 multiplexing only
+get additional transfers added to them if the existing connection is held by
+the same multi or easy handle. libcurl does not support doing HTTP/2 streams
+in different threads using a shared connection.
+
+Support for \fBCURL_LOCK_DATA_CONNECT\fP was added in 7.57.0, but the symbol
+existed before this.
+
+Note that when you use the multi interface, all easy handles added to the same
+multi handle will share connection cache by default without using this option.
+.IP CURL_LOCK_DATA_PSL
+The Public Suffix List stored in the share object is made available to all
+easy handle bound to the later. Since the Public Suffix List is periodically
+refreshed, this avoids updates in too many different contexts.
+
+\fBCURL_LOCK_DATA_PSL\fP exists since 7.61.0.
+
+Note that when you use the multi interface, all easy handles added to the same
+multi handle will share PSL cache by default without using this option.
+.RE
+.IP CURLSHOPT_UNSHARE
+This option does the opposite of \fICURLSHOPT_SHARE\fP. It specifies that
+the specified \fIparameter\fP will no longer be shared. Valid values are
+the same as those for \fICURLSHOPT_SHARE\fP.
+.IP CURLSHOPT_USERDATA
+The \fIparameter\fP allows you to specify a pointer to data that will be
passed
+to the lock_function and unlock_function each time it is called.
+.SH RETURN VALUE
+CURLSHE_OK (zero) means that the option was set properly, non-zero means an
+error occurred as \fI<gnurl/curl.h>\fP defines. See the \fIlibcurl-errors.3\fP
+man page for the full list with descriptions.
+.SH "SEE ALSO"
+.BR curl_share_cleanup "(3), " curl_share_init "(3)"
diff --cc docs/libcurl/gnurl_share_strerror.3
index 5cb755742,000000000..b579298d5
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_share_strerror.3
+++ b/docs/libcurl/gnurl_share_strerror.3
@@@ -1,37 -1,0 +1,37 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_share_strerror 3 "26 Apr 2004" "libcurl 7.12" "libgnurl Manual"
+.SH NAME
+curl_share_strerror - return string describing error code
+.SH SYNOPSIS
+.nf
+.B #include <gnurl/curl.h>
+.BI "const char *curl_share_strerror(CURLSHcode " errornum ");"
+.SH DESCRIPTION
+The curl_share_strerror() function returns a string describing the CURLSHcode
+error code passed in the argument \fIerrornum\fP.
+.SH AVAILABILITY
+This function was added in libcurl 7.12.0
+.SH RETURN VALUE
+A pointer to a null-terminated string.
+.SH "SEE ALSO"
+.BR libcurl-errors "(3), " curl_multi_strerror "(3), " curl_easy_strerror
"(3)"
diff --cc docs/libcurl/gnurl_slist_append.3
index 963ad760d,000000000..c76cb7881
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_slist_append.3
+++ b/docs/libcurl/gnurl_slist_append.3
@@@ -1,72 -1,0 +1,72 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_slist_append 3 "19 Jun 2003" "libcurl 7.10.4" "libgnurl Manual"
+.SH NAME
+curl_slist_append - add a string to an slist
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "struct curl_slist *curl_slist_append(struct curl_slist *" list,
+.BI "const char * "string ");"
+.ad
+.SH DESCRIPTION
+\fIcurl_slist_append(3)\fP appends a string to a linked list of strings. The
+existing \fBlist\fP should be passed as the first argument and the new list is
+returned from this function. Pass in NULL in the \fBlist\fP argument to create
+a new list. The specified \fBstring\fP has been appended when this function
+returns. \fIcurl_slist_append(3)\fP copies the string.
+
+The list should be freed again (after usage) with
+\fIcurl_slist_free_all(3)\fP.
+.SH RETURN VALUE
+A null pointer is returned if anything went wrong, otherwise the new list
+pointer is returned. To avoid overwriting an existing non-empty list on
+failure, the new list should be returned to a temporary variable which can
+be tested for NULL before updating the original list pointer.
+.SH EXAMPLE
+.nf
+CURL *handle;
+struct curl_slist *slist=NULL;
+struct curl_slist *temp=NULL;
+
+slist = curl_slist_append(slist, "pragma:");
+
+if (slist == NULL)
+ return -1;
+
+temp = curl_slist_append(slist, "Accept:")
+
+if (temp == NULL) {
+ curl_slist_free_all(slist);
+ return -1;
+}
+
+slist = temp;
+
+curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
+
+curl_easy_perform(handle);
+
+curl_slist_free_all(slist); /* free the list again */
+.fi
+.SH "SEE ALSO"
+.BR curl_slist_free_all "(3), "
diff --cc docs/libcurl/gnurl_slist_free_all.3
index bb9c522f7,000000000..30ab779fa
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_slist_free_all.3
+++ b/docs/libcurl/gnurl_slist_free_all.3
@@@ -1,55 -1,0 +1,55 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_slist_free_all 3 "5 March 2001" "libcurl 7.0" "libgnurl Manual"
+.SH NAME
+curl_slist_free_all - free an entire curl_slist list
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "void curl_slist_free_all(struct curl_slist *" list);
+.ad
+.SH DESCRIPTION
+curl_slist_free_all() removes all traces of a previously built curl_slist
+linked list.
+
+Passing in a NULL pointer in \fIlist\fP will make this function return
+immediately with no action.
+.SH RETURN VALUE
+Nothing.
+.SH EXAMPLE
+.nf
+CURL *handle;
+struct curl_slist *slist=NULL;
+
+slist = curl_slist_append(slist, "X-libcurl: coolness");
+
+if (slist == NULL)
+ return -1;
+
+curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
+
+curl_easy_perform(handle);
+
+curl_slist_free_all(slist); /* free the list again */
+.fi
+.SH "SEE ALSO"
+.BR curl_slist_append "(3), "
diff --cc docs/libcurl/gnurl_strequal.3
index 4b7752cd7,000000000..3dab5cec2
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_strequal.3
+++ b/docs/libcurl/gnurl_strequal.3
@@@ -1,51 -1,0 +1,51 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_strequal 3 "30 April 2004" "libcurl 7.12" "libgnurl Manual"
+.SH NAME
+curl_strequal, curl_strnequal - case insensitive string comparisons
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "int curl_strequal(char *" str1 ", char *" str2 ");"
+.sp
+.BI "int curl_strnequal(char *" str1 ", char *" str2 ", size_t " len ");"
+.SH DESCRIPTION
+The
+.B curl_strequal()
+function compares the two strings \fIstr1\fP and \fIstr2\fP, ignoring the case
+of the characters. It returns a non-zero (TRUE) integer if the strings are
+identical.
+.sp
+The \fBcurl_strnequal()\fP function is similar, except it only compares the
+first \fIlen\fP characters of \fIstr1\fP.
+.sp
+These functions are provided by libcurl to enable applications to compare
+strings in a truly portable manner. There are no standard portable case
+insensitive string comparison functions. These two work on all platforms.
+.SH AVAILABILITY
+These functions will be removed from the public libcurl API in a near
+future. They will instead be made "available" by source code access only, and
+then as curlx_strequal() and curlx_strenqual().
+.SH RETURN VALUE
+Non-zero if the strings are identical. Zero if they're not.
+.SH "SEE ALSO"
+.BR strcmp "(3), " strcasecmp "(3)"
diff --cc docs/libcurl/gnurl_unescape.3
index c88b3947f,000000000..6fb54eb23
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_unescape.3
+++ b/docs/libcurl/gnurl_unescape.3
@@@ -1,48 -1,0 +1,48 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_unescape 3 "22 March 2001" "libcurl 7.7" "libgnurl Manual"
+.SH NAME
+curl_unescape - URL decodes the given string
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "char *curl_unescape( const char *" url ", int "length " );"
+.ad
+.SH DESCRIPTION
+Obsolete function. Use \fIcurl_easy_unescape(3)\fP instead!
+
+This function will convert the given URL encoded input string to a "plain
+string" and return that as a new allocated string. All input characters that
+are URL encoded (%XX where XX is a two-digit hexadecimal number) will be
+converted to their plain text versions.
+
+If the 'length' argument is set to 0, curl_unescape() will use strlen() on the
+input 'url' string to find out the size.
+
+You must \fIcurl_free(3)\fP the returned string when you're done with it.
+.SH AVAILABILITY
+Since 7.15.4, \fIcurl_easy_unescape(3)\fP should be used. This function will
+be removed in a future release.
+.SH RETURN VALUE
+A pointer to a null-terminated string or NULL if it failed.
+.SH "SEE ALSO"
+.br curl_easy_escape "(3)," curl_easy_unescape "(3)," curl_free "(3)," RFC
2396
diff --cc docs/libcurl/gnurl_url.3
index 325865ae2,000000000..68b6cd042
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_url.3
+++ b/docs/libcurl/gnurl_url.3
@@@ -1,53 -1,0 +1,53 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_url 3 "6 Aug 2018" "libcurl" "libgnurl Manual"
+.SH NAME
+curl_url - returns a new CURLU handle
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+CURLU *curl_url();
+.SH DESCRIPTION
+This function will allocates and returns a pointer to a fresh CURLU handle, to
+be used for further use of the URL API.
+.SH RETURN VALUE
+Returns a \fBCURLU *\fP if successful, or NULL if out of memory.
+.SH EXAMPLE
+.nf
+ CURLUcode rc;
+ CURLU *url = curl_url();
+ rc = curl_url_set(url, CURLUPART_URL, "https://example.com", 0);
+ if(!rc) {
+ char *scheme;
+ rc = curl_url_get(url, CURLUPART_SCHEME, &scheme, 0);
+ if(!rc) {
+ printf("the scheme is %s\\n", scheme);
+ curl_free(scheme);
+ }
+ curl_url_cleanup(url);
+ }
+.fi
+.SH AVAILABILITY
+Added in curl 7.62.0
+.SH "SEE ALSO"
+.BR curl_url_cleanup "(3), " curl_url_get "(3), " curl_url_set "(3), "
+.BR curl_url_dup "(3), "
diff --cc docs/libcurl/gnurl_url_cleanup.3
index f0bfefdba,000000000..7452601f9
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_url_cleanup.3
+++ b/docs/libcurl/gnurl_url_cleanup.3
@@@ -1,44 -1,0 +1,44 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_url_cleanup 3 "6 Aug 2018" "libcurl" "libgnurl Manual"
+.SH NAME
+curl_url_cleanup - free a CURLU handle
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+void curl_url_cleanup(CURLU *handle);
+.fi
+.SH DESCRIPTION
+Frees all the resources associated with the given CURLU handle!
+.SH RETURN VALUE
+none
+.SH EXAMPLE
+.nf
+ CURLU *url = curl_url();
+ curl_url_set(url, CURLUPART_URL, "https://example.com", 0);
+ curl_url_cleanup(url);
+.fi
+.SH AVAILABILITY
+Added in curl 7.62.0
+.SH "SEE ALSO"
+.BR curl_url_dup "(3), " curl_url "(3), " curl_url_set "(3), "
+.BR curl_url_get "(3), "
diff --cc docs/libcurl/gnurl_url_dup.3
index 7fa8d17c7,000000000..ea11af04e
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_url_dup.3
+++ b/docs/libcurl/gnurl_url_dup.3
@@@ -1,52 -1,0 +1,52 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_url_dup 3 "6 Aug 2018" "libcurl" "libgnurl Manual"
+.SH NAME
+curl_url_dup - duplicate a CURLU handle
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+CURLU *curl_url_dup(CURLU *inhandle);
+.fi
+.SH DESCRIPTION
+Duplicates a given CURLU \fIinhandle\fP and all its contents and returns a
+pointer to a new CURLU handle. The new handle also needs to be freed with
+\fIcurl_url_cleanup(3)\fP.
+.SH RETURN VALUE
+Returns a new handle or NULL if out of memory.
+.SH EXAMPLE
+.nf
+ CURLUcode rc;
+ CURLU *url = curl_url();
+ CURLU *url2;
+ rc = curl_url_set(url, CURLUPART_URL, "https://example.com", 0);
+ if(!rc) {
+ url2 = curl_url_dup(url); /* clone it! */
+ curl_url_cleanup(url2);
+ }
+ curl_url_cleanup(url);
+.fi
+.SH AVAILABILITY
+Added in curl 7.62.0
+.SH "SEE ALSO"
+.BR curl_url_cleanup "(3), " curl_url "(3), " curl_url_set "(3), "
+.BR curl_url_get "(3), "
diff --cc docs/libcurl/gnurl_url_get.3
index 20edd1427,000000000..647e76432
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_url_get.3
+++ b/docs/libcurl/gnurl_url_get.3
@@@ -1,115 -1,0 +1,115 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_url_get 3 "6 Aug 2018" "libcurl" "libgnurl Manual"
+.SH NAME
+curl_url_get - extract a part from a URL
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+.nf
+CURLUcode curl_url_get(CURLU *url,
+ CURLUPart what,
+ char **part,
+ unsigned int flags)
+.fi
+.SH DESCRIPTION
+Given the \fIurl\fP handle of an already parsed URL, this function lets the
+user extract individual pieces from it.
+
+The \fIwhat\fP argument should be the particular part to extract (see list
+below) and \fIpart\fP points to a 'char *' to get updated to point to a newly
+allocated string with the contents.
+
+The \fIflags\fP argument is a bitmask with individual features.
+
+The returned part pointer must be freed with \fIcurl_free(3)\fP after use.
+.SH FLAGS
+The flags argument is zero, one or more bits set in a bitmask.
+.IP CURLU_DEFAULT_PORT
+If the handle has no port stored, this option will make \fIcurl_url_get(3)\fP
+return the default port for the used scheme.
+.IP CURLU_DEFAULT_SCHEME
+If the handle has no scheme stored, this option will make
+\fIcurl_url_get(3)\fP return the default scheme instead of error.
+.IP CURLU_NO_DEFAULT_PORT
+Instructs \fIcurl_url_get(3)\fP to not return a port number if it matches the
+default port for the scheme.
+.IP CURLU_URLDECODE
+Asks \fIcurl_url_get(3)\fP to URL decode the contents before returning it. It
+will not attempt to decode the scheme, the port number or the full URL.
+
+The query component will also get plus-to-space conversion as a bonus when
+this bit is set.
+
+Note that this URL decoding is charset unaware and you will get a zero
+terminated string back with data that could be intended for a particular
+encoding.
+
+If there's any byte values lower than 32 in the decoded string, the get
+operation will return an error instead.
+.SH PARTS
+.IP CURLUPART_URL
+When asked to return the full URL, \fIcurl_url_get(3)\fP will return a
+normalized and possibly cleaned up version of what was previously parsed.
+.IP CURLUPART_SCHEME
+Scheme cannot be URL decoded on get.
+.IP CURLUPART_USER
+.IP CURLUPART_PASSWORD
+.IP CURLUPART_OPTIONS
+.IP CURLUPART_HOST
+The host name. If it is an IPv6 numeric address, the zoneid will not be part
+of it but is provided separately in \fICURLUPART_ZONEID\fP. IPv6 numerical
+addresses are returned within brackets ([]).
+.IP CURLUPART_ZONEID
+If the host name is a numeric IPv6 address, this field might also be set.
+.IP CURLUPART_PORT
+Port cannot be URL decoded on get.
+.IP CURLUPART_PATH
+.IP CURLUPART_QUERY
+The query part will also get pluses converted to space when asked to URL
+decode on get with the CURLU_URLDECODE bit.
+.IP CURLUPART_FRAGMENT
+.SH RETURN VALUE
+Returns a CURLUcode error value, which is CURLUE_OK (0) if everything went
+fine.
+
+If this function returns an error, no URL part is returned.
+.SH EXAMPLE
+.nf
+ CURLUcode rc;
+ CURLU *url = curl_url();
+ rc = curl_url_set(url, CURLUPART_URL, "https://example.com", 0);
+ if(!rc) {
+ char *scheme;
+ rc = curl_url_get(url, CURLUPART_SCHEME, &scheme, 0);
+ if(!rc) {
+ printf("the scheme is %s\\n", scheme);
+ curl_free(scheme);
+ }
+ curl_url_cleanup(url);
+ }
+.fi
+.SH AVAILABILITY
+Added in curl 7.62.0. CURLUPART_ZONEID was added in 7.65.0.
+.SH "SEE ALSO"
+.BR curl_url_cleanup "(3), " curl_url "(3), " curl_url_set "(3), "
+.BR curl_url_dup "(3), "
diff --cc docs/libcurl/gnurl_url_set.3
index 043ec38fb,000000000..23bc33279
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_url_set.3
+++ b/docs/libcurl/gnurl_url_set.3
@@@ -1,146 -1,0 +1,146 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_url_set 3 "6 Aug 2018" "libcurl" "libgnurl Manual"
+.SH NAME
+curl_url_set - set a URL part
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+
+CURLUcode curl_url_set(CURLU *url,
+ CURLUPart part,
+ const char *content,
+ unsigned int flags)
+.fi
+.SH DESCRIPTION
+Given the \fIurl\fP handle of an already parsed URL, this function lets the
+user set/update individual pieces of it.
+
+The \fIpart\fP argument should identify the particular URL part (see list
+below) to set or change, with \fIcontent\fP pointing to a null-terminated
+string with the new contents for that URL part. The contents should be in the
+form and encoding they'd use in a URL: URL encoded.
+
+Setting a part to a NULL pointer will effectively remove that part's contents
+from the CURLU handle.
+
+The \fIflags\fP argument is a bitmask with independent features.
+.SH PARTS
+.IP CURLUPART_URL
+Allows the full URL of the handle to be replaced. If the handle already is
+populated with a URL, the new URL can be relative to the previous.
+
+When successfully setting a new URL, relative or absolute, the handle contents
+will be replaced with the information of the newly set URL.
+
+Pass a pointer to a null-terminated string to the \fIurl\fP parameter. The
+string must point to a correctly formatted "RFC 3986+" URL or be a NULL
+pointer.
+.IP CURLUPART_SCHEME
+Scheme cannot be URL decoded on set.
+.IP CURLUPART_USER
+.IP CURLUPART_PASSWORD
+.IP CURLUPART_OPTIONS
+.IP CURLUPART_HOST
+The host name. If it is IDNA the string must then be encoded as your locale
+says or UTF-8 (when WinIDN is used). If it is a bracketed IPv6 numeric address
+it may contain a zone id (or you can use CURLUPART_ZONEID).
+.IP CURLUPART_ZONEID
+If the host name is a numeric IPv6 address, this field can also be set.
+.IP CURLUPART_PORT
+Port cannot be URL encoded on set. The given port number is provided as a
+string and the decimal number must be between 1 and 65535. Anything else will
+return an error.
+.IP CURLUPART_PATH
+If a path is set in the URL without a leading slash, a slash will be inserted
+automatically when this URL is read from the handle.
+.IP CURLUPART_QUERY
+The query part will also get spaces converted to pluses when asked to URL
+encode on set with the CURLU_URLENCODE bit.
+
+If used together with the \fICURLU_APPENDQUERY\fP bit, the provided part will
+be appended on the end of the existing query - and if the previous part didn't
+end with an ampersand (&), an ampersand will be inserted before the new
+appended part.
+
+When \fICURLU_APPENDQUERY\fP is used together with \fICURLU_URLENCODE\fP, the
+first '=' symbol will not be URL encoded.
+
+The question mark in the URL is not part of the actual query contents.
+.IP CURLUPART_FRAGMENT
+The hash sign in the URL is not part of the actual fragment contents.
+.SH FLAGS
+The flags argument is zero, one or more bits set in a bitmask.
+.IP CURLU_NON_SUPPORT_SCHEME
+If set, allows \fIcurl_url_set(3)\fP to set a non-supported scheme.
+.IP CURLU_URLENCODE
+When set, \fIcurl_url_set(3)\fP URL encodes the part on entry, except for
+scheme, port and URL.
+
+When setting the path component with URL encoding enabled, the slash character
+will be skipped.
+
+The query part gets space-to-plus conversion before the URL conversion.
+
+This URL encoding is charset unaware and will convert the input on a
+byte-by-byte manner.
+.IP CURLU_DEFAULT_SCHEME
+If set, will make libcurl allow the URL to be set without a scheme and then
+sets that to the default scheme: HTTPS. Overrides the \fICURLU_GUESS_SCHEME\fP
+option if both are set.
+.IP CURLU_GUESS_SCHEME
+If set, will make libcurl allow the URL to be set without a scheme and it
+instead "guesses" which scheme that was intended based on the host name. If
+the outermost sub-domain name matches DICT, FTP, IMAP, LDAP, POP3 or SMTP then
+that scheme will be used, otherwise it picks HTTP. Conflicts with the
+\fICURLU_DEFAULT_SCHEME\fP option which takes precedence if both are set.
+.IP CURLU_NO_AUTHORITY
+If set, skips authority checks. The RFC allows individual schemes to omit the
+host part (normally the only mandatory part of the authority), but libcurl
+cannot know whether this is permitted for custom schemes. Specifying the flag
+permits empty authority sections, similar to how file scheme is handled.
+
+.SH RETURN VALUE
+Returns a CURLUcode error value, which is CURLUE_OK (0) if everything went
+fine.
+
+A URL string passed on to \fIcurl_url_set(3)\fP for the \fBCURLUPART_URL\fP
+part, must be shorter than 8000000 bytes otherwise it returns
+\fBCURLUE_MALFORMED_INPUT\fP (added in 7.65.0).
+
- If this function returns an error, no URL part is returned.
++If this function returns an error, no URL part is set.
+.SH EXAMPLE
+.nf
+ CURLUcode rc;
+ CURLU *url = curl_url();
+ rc = curl_url_set(url, CURLUPART_URL, "https://example.com", 0);
+ if(!rc) {
+ char *scheme;
+ /* change it to an FTP URL */
+ rc = curl_url_set(url, CURLUPART_SCHEME, "ftp", 0);
+ }
+ curl_url_cleanup(url);
+.fi
+.SH AVAILABILITY
+Added in curl 7.62.0. CURLUPART_ZONEID was added in 7.65.0.
+.SH "SEE ALSO"
+.BR curl_url_cleanup "(3), " curl_url "(3), " curl_url_get "(3), "
+.BR curl_url_dup "(3), "
diff --cc docs/libcurl/gnurl_version.3
index d08ef0bdc,000000000..5c4c28cb0
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_version.3
+++ b/docs/libcurl/gnurl_version.3
@@@ -1,39 -1,0 +1,39 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH gnurl_version 3 "5 March 2001" "libcurl 7.0" "libgnurl Manual"
+.SH NAME
+curl_version - returns the libcurl version string
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "char *curl_version( );"
+.ad
+.SH DESCRIPTION
+Returns a human readable string with the version number of libcurl and some of
+its important components (like OpenSSL version).
+
+We recommend using \fIcurl_version_info(3)\fP instead!
+.SH RETURN VALUE
+A pointer to a null-terminated string. The string resides in a statically
+allocated buffer and must not be freed by the caller.
+.SH "SEE ALSO"
+.BR curl_version_info "(3)"
diff --cc docs/libcurl/gnurl_version_info.3
index 2e8ed2956,000000000..15042dc42
mode 100644,000000..100644
--- a/docs/libcurl/gnurl_version_info.3
+++ b/docs/libcurl/gnurl_version_info.3
@@@ -1,216 -1,0 +1,220 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH gnurl_version_info 3 "2 Nov 2014" "libcurl 7.40.0" "libgnurl Manual"
+.SH NAME
+curl_version_info - returns run-time libcurl version info
+.SH SYNOPSIS
+.B #include <gnurl/curl.h>
+.sp
+.BI "curl_version_info_data *curl_version_info( CURLversion "age ");"
+.ad
+.SH DESCRIPTION
+Returns a pointer to a filled in static struct with information about various
+features in the running version of libcurl. \fIage\fP should be set to the
+version of this functionality by the time you write your program. This way,
+libcurl will always return a proper struct that your program understands,
+while programs in the future might get a different
+struct. \fBCURLVERSION_NOW\fP will be the most recent one for the library you
+have installed:
+
+ data = curl_version_info(CURLVERSION_NOW);
+
+Applications should use this information to judge if things are possible to do
+or not, instead of using compile-time checks, as dynamic/DLL libraries can be
+changed independent of applications.
+
+The curl_version_info_data struct looks like this
+
+.nf
+typedef struct {
+ CURLversion age; /* see description below */
+
+ const char *version; /* human readable string */
+ unsigned int version_num; /* numeric representation */
+ const char *host; /* human readable string */
+ int features; /* bitmask, see below */
+ char *ssl_version; /* human readable string */
+ long ssl_version_num; /* not used, always zero */
+ const char *libz_version; /* human readable string */
+ const char * const *protocols; /* protocols */
+
+ /* when 'age' is CURLVERSION_SECOND or higher, the members below exist */
+ const char *ares; /* human readable string */
+ int ares_num; /* number */
+
+ /* when 'age' is CURLVERSION_THIRD or higher, the members below exist */
+ const char *libidn; /* human readable string */
+
+ /* when 'age' is CURLVERSION_FOURTH or higher (>= 7.16.1), the members
+ below exist */
+ int iconv_ver_num; /* '_libiconv_version' if iconv support enabled */
+
+ const char *libssh_version; /* human readable string */
+
+ /* when 'age' is CURLVERSION_FIFTH or higher (>= 7.57.0), the members
+ below exist */
+ unsigned int brotli_ver_num; /* Numeric Brotli version
+ (MAJOR << 24) | (MINOR << 12) | PATCH */
+ const char *brotli_version; /* human readable string. */
+
+ /* when 'age' is CURLVERSION_SIXTH or higher (>= 7.66.0), the members
+ below exist */
+ unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
+ (MAJOR << 16) | (MINOR << 8) | PATCH */
+ const char *nghttp2_version; /* human readable string. */
+
+ const char *quic_version; /* human readable quic (+ HTTP/3) library +
+ version or NULL */
+
+ /* when 'age' is CURLVERSION_SEVENTH or higher (>= 7.70.0), the members
+ below exist */
+ const char *cainfo; /* the built-in default CURLOPT_CAINFO, might
+ be NULL */
+ const char *capath; /* the built-in default CURLOPT_CAPATH, might
+ be NULL */
+ /* when 'age' is CURLVERSION_EIGHTH or higher (>= 7.71.0), the members
+ below exist */
+ unsigned int zstd_ver_num; /* Numeric Zstd version
+ (MAJOR << 24) | (MINOR << 12) | PATCH */
+ const char *zstd_version; /* human readable string. */
+} curl_version_info_data;
+.fi
+
+\fIage\fP describes what the age of this struct is. The number depends on how
+new the libcurl you're using is. You are however guaranteed to get a struct
+that you have a matching struct for in the header, as you tell libcurl your
+"age" with the input argument.
+
+\fIversion\fP is just an ascii string for the libcurl version.
+
+\fIversion_num\fP is a 24 bit number created like this: <8 bits major number>
+| <8 bits minor number> | <8 bits patch number>. Version 7.9.8 is therefore
+returned as 0x070908.
+
+\fIhost\fP is an ascii string showing what host information that this libcurl
+was built for. As discovered by a configure script or set by the build
+environment.
+
+\fIfeatures\fP can have none, one or more bits set, and the currently defined
+bits are:
+.RS
+.IP CURL_VERSION_ALTSVC
+HTTP Alt-Svc parsing and the associated options (Added in 7.64.1)
+.IP CURL_VERSION_ASYNCHDNS
+libcurl was built with support for asynchronous name lookups, which allows
+more exact timeouts (even on Windows) and less blocking when using the multi
+interface. (added in 7.10.7)
+.IP CURL_VERSION_BROTLI
+supports HTTP Brotli content encoding using libbrotlidec (Added in 7.57.0)
+.IP CURL_VERSION_ZSTD
+supports HTTP zstd content encoding using zstd library (Added in 7.72.0)
+.IP CURL_VERSION_CONV
+libcurl was built with support for character conversions, as provided by the
+CURLOPT_CONV_* callbacks. (Added in 7.15.4)
+.IP CURL_VERSION_CURLDEBUG
+libcurl was built with memory tracking debug capabilities. This is mainly of
+interest for libcurl hackers. (added in 7.19.6)
+.IP CURL_VERSION_DEBUG
+libcurl was built with debug capabilities (added in 7.10.6)
+.IP CURL_VERSION_GSSAPI
+libcurl was built with support for GSS-API. This makes libcurl use provided
+functions for Kerberos and SPNEGO authentication. It also allows libcurl
+to use the current user credentials without the app having to pass them on.
+(Added in 7.38.0)
+.IP CURL_VERSION_GSSNEGOTIATE
+supports HTTP GSS-Negotiate (added in 7.10.6)
++.IP CURL_VERSION_HSTS
++libcurl was built with support for HSTS (HTTP Strict Transport Security)
++(Added in 7.74.0)
+.IP CURL_VERSION_HTTPS_PROXY
+libcurl was built with support for HTTPS-proxy.
+(Added in 7.52.0)
+.IP CURL_VERSION_HTTP2
+libcurl was built with support for HTTP2.
+(Added in 7.33.0)
+.IP CURL_VERSION_HTTP3
+HTTP/3 and QUIC support are built-in (Added in 7.66.0)
+.IP CURL_VERSION_IDN
+libcurl was built with support for IDNA, domain names with international
+letters. (Added in 7.12.0)
+.IP CURL_VERSION_IPV6
+supports IPv6
+.IP CURL_VERSION_KERBEROS4
+supports Kerberos V4 (when using FTP). Legacy bit. Deprecated since 7.33.0.
+.IP CURL_VERSION_KERBEROS5
+supports Kerberos V5 authentication for FTP, IMAP, POP3, SMTP and SOCKSv5
proxy
+(Added in 7.40.0)
+.IP CURL_VERSION_LARGEFILE
+libcurl was built with support for large files. (Added in 7.11.1)
+.IP CURL_VERSION_UNICODE
+libcurl was built with Unicode support on Windows. This makes non-ASCII
+characters work in filenames and options passed to libcurl. (Added in 7.72.0)
+.IP CURL_VERSION_LIBZ
+supports HTTP deflate using libz (Added in 7.10)
+.IP CURL_VERSION_MULTI_SSL
+libcurl was built with multiple SSL backends. For details, see
+\fIcurl_global_sslset(3)\fP.
+(Added in 7.56.0)
+.IP CURL_VERSION_NTLM
+supports HTTP NTLM (added in 7.10.6)
+.IP CURL_VERSION_NTLM_WB
+libcurl was built with support for NTLM delegation to a winbind helper.
+(Added in 7.22.0)
+.IP CURL_VERSION_PSL
+libcurl was built with support for Mozilla's Public Suffix List. This makes
+libcurl ignore cookies with a domain that's on the list.
+(Added in 7.47.0)
+.IP CURL_VERSION_SPNEGO
+libcurl was built with support for SPNEGO authentication (Simple and Protected
+GSS-API Negotiation Mechanism, defined in RFC 2478.) (added in 7.10.8)
+.IP CURL_VERSION_SSL
+supports SSL (HTTPS/FTPS) (Added in 7.10)
+.IP CURL_VERSION_SSPI
+libcurl was built with support for SSPI. This is only available on Windows and
+makes libcurl use Windows-provided functions for Kerberos, NTLM, SPNEGO and
+Digest authentication. It also allows libcurl to use the current user
+credentials without the app having to pass them on. (Added in 7.13.2)
+.IP CURL_VERSION_TLSAUTH_SRP
- libcurl was built with support for TLS-SRP. (Added in 7.21.4)
++libcurl was built with support for TLS-SRP (in one or more of the built-in TLS
++backends). (Added in 7.21.4)
+.IP CURL_VERSION_UNIX_SOCKETS
+libcurl was built with support for Unix domain sockets.
+(Added in 7.40.0)
+.RE
+\fIssl_version\fP is an ASCII string for the TLS library name + version
+used. If libcurl has no SSL support, this is NULL. For example "Schannel",
+\&"SecureTransport" or "OpenSSL/1.1.0g".
+
+\fIssl_version_num\fP is always 0.
+
+\fIlibz_version\fP is an ASCII string (there is no numerical version). If
+libcurl has no libz support, this is NULL.
+
+\fIprotocols\fP is a pointer to an array of char * pointers, containing the
+names protocols that libcurl supports (using lowercase letters). The protocol
+names are the same as would be used in URLs. The array is terminated by a NULL
+entry.
+.SH RETURN VALUE
+A pointer to a curl_version_info_data struct.
+.SH "SEE ALSO"
+\fIcurl_version(3)\fP
diff --cc docs/libcurl/libgnurl-url.3
index bdf82ec15,000000000..5b375131e
mode 100644,000000..100644
--- a/docs/libcurl/libgnurl-url.3
+++ b/docs/libcurl/libgnurl-url.3
@@@ -1,137 -1,0 +1,137 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH libcurl 3 "10 Sep 2018" "libcurl" "libcurl url interface"
+.SH NAME
+libcurl-url \- URL interface overview
+.SH DESCRIPTION
+The URL interface provides a set of functions for parsing and generating URLs.
+.SH INCLUDE
+You still only include <gnurl/curl.h> in your code. Note that the URL API was
+introduced in 7.62.0.
+.SH CREATE
+Create a handle that holds URL info and resources with \fIcurl_url(3)\fP:
+
+ CURLU *h = curl_url();
+.SH CLEANUP
+When done with it, clean it up with \fIcurl_url_cleanup(3)\fP:
+
+ curl_url_cleanup(h);
+.SH DUPLICATE
+When you need a copy of a handle, just duplicate it with
\fIcurl_url_dup(3)\fP:
+
+ CURLU *nh = curl_url_dup(h);
+.SH PARSING
+By "setting" a URL to the handle with \fIcurl_url_set(3)\fP, the URL is parsed
+and stored in the handle. If the URL is not syntactically correct it will
+return an error instead.
+
+.nf
+ rc = curl_url_set(h, CURLUPART_URL,
+ "https://example.com:449/foo/bar?name=moo", 0);
+.fi
+
+The zero in the fourth argument is a bitmask for changing specific features.
+
+If successful, this stores the URL in its individual parts within the handle.
+.SH REDIRECT
+When a handle already contains info about a URL, setting a relative URL will
+make it "redirect" to adapt to it.
+
+ rc = curl_url_set(h, CURLUPART_URL, "../test?another", 0);
+.SH "GET URL"
+The `CURLU` handle represents a URL and you can easily extract that with
+\fIcurl_url_get(3)\fP:
+
+ char *url;
+ rc = curl_url_get(h, CURLUPART_URL, &url, 0);
+ curl_free(url);
+
+The zero in the fourth argument is a bitmask for changing specific features.
+.SH "GET PARTS"
+When a URL has been parsed or parts have been set, you can extract those
+pieces from the handle at any time.
+
+.nf
+ rc = curl_url_get(h, CURLUPART_HOST, &host, 0);
+ rc = curl_url_get(h, CURLUPART_SCHEME, &scheme, 0);
+ rc = curl_url_get(h, CURLUPART_USER, &user, 0);
+ rc = curl_url_get(h, CURLUPART_PASSWORD, &password, 0);
+ rc = curl_url_get(h, CURLUPART_PORT, &port, 0);
+ rc = curl_url_get(h, CURLUPART_PATH, &path, 0);
+ rc = curl_url_get(h, CURLUPART_QUERY, &query, 0);
+ rc = curl_url_get(h, CURLUPART_FRAGMENT, &fragment, 0);
+.fi
+
+Extracted parts are not URL decoded unless the user also asks for it with the
+CURLU_URLDECODE flag set in the fourth bitmask argument.
+
+Remember to free the returned string with \fIcurl_free(3)\fP when you're done
+with it!
+.SH "SET PARTS"
+A user set individual URL parts, either after having parsed a full URL or
+instead of parsing such.
+
+.nf
+ rc = curl_url_set(urlp, CURLUPART_HOST, "www.example.com", 0);
+ rc = curl_url_set(urlp, CURLUPART_SCHEME, "https", 0);
+ rc = curl_url_set(urlp, CURLUPART_USER, "john", 0);
+ rc = curl_url_set(urlp, CURLUPART_PASSWORD, "doe", 0);
+ rc = curl_url_set(urlp, CURLUPART_PORT, "443", 0);
+ rc = curl_url_set(urlp, CURLUPART_PATH, "/index.html", 0);
+ rc = curl_url_set(urlp, CURLUPART_QUERY, "name=john", 0);
+ rc = curl_url_set(urlp, CURLUPART_FRAGMENT, "anchor", 0);
+.fi
+
+Set parts are not URL encoded unless the user asks for it with the
+`CURLU_URLENCODE` flag.
+.SH "APPENDQUERY"
+An application can append a string to the right end of the query part with the
+`CURLU_APPENDQUERY` flag to \fIcurl_url_set(3)\fP.
+
+Imagine a handle that holds the URL `https://example.com/?shoes=2`. An
+application can then add the string `hat=1` to the query part like this:
+
+.nf
+ rc = curl_url_set(urlp, CURLUPART_QUERY, "hat=1", CURLU_APPENDQUERY);
+.fi
+
+It will even notice the lack of an ampersand (`&`) separator so it will inject
+one too, and the handle's full URL will then equal
+`https://example.com/?shoes=2&hat=1`.
+
+The appended string can of course also get URL encoded on add, and if asked to
+URL encode, the encoding process will skip the '=' character. For example,
+append `candy=N&N` to what we already have, and URL encode it to deal with the
+ampersand in the data:
+
+.nf
+ rc = curl_url_set(urlp, CURLUPART_QUERY, "candy=N&N",
+ CURLU_APPENDQUERY | CURLU_URLENCODE);
+.fi
+
+Now the URL looks like
+.nf
+ https://example.com/?shoes=2&hat=1&candy=N%26N`
+.fi
+.SH "SEE ALSO"
+.BR curl_url "(3), " curl_url_cleanup "(3), " curl_url_get "(3), "
+.BR curl_url_dup "(3), " curl_url_set "(3), " CURLOPT_URL "(3), "
diff --cc docs/libcurl/libgnurl.m4
index c4f484813,000000000..036230c85
mode 100644,000000..100644
--- a/docs/libcurl/libgnurl.m4
+++ b/docs/libcurl/libgnurl.m4
@@@ -1,272 -1,0 +1,272 @@@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2006 - 2020, David Shaw <dshaw@jabberwocky.com>
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION],
+# [ACTION-IF-YES], [ACTION-IF-NO])
+# ----------------------------------------------------------
+# David Shaw <dshaw@jabberwocky.com> May-09-2006
+#
+# Checks for libcurl. DEFAULT-ACTION is the string yes or no to
+# specify whether to default to --with-libcurl or --without-libcurl.
+# If not supplied, DEFAULT-ACTION is yes. MINIMUM-VERSION is the
+# minimum version of libcurl to accept. Pass the version as a regular
+# version number like 7.10.1. If not supplied, any version is
+# accepted. ACTION-IF-YES is a list of shell commands to run if
+# libcurl was successfully found and passed the various tests.
+# ACTION-IF-NO is a list of shell commands that are run otherwise.
+# Note that using --without-libcurl does run ACTION-IF-NO.
+#
+# This macro #defines HAVE_LIBCURL if a working libcurl setup is
+# found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary
+# values. Other useful defines are LIBCURL_FEATURE_xxx where xxx are
+# the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy
+# where yyy are the various protocols supported by libcurl. Both xxx
+# and yyy are capitalized. See the list of AH_TEMPLATEs at the top of
+# the macro for the complete list of possible defines. Shell
+# variables $libcurl_feature_xxx and $libcurl_protocol_yyy are also
+# defined to 'yes' for those features and protocols that were found.
+# Note that xxx and yyy keep the same capitalization as in the
+# curl-config list (e.g. it's "HTTP" and not "http").
+#
+# Users may override the detected values by doing something like:
+# LIBCURL="-lcurl" LIBCURL_CPPFLAGS="-I/usr/myinclude" ./configure
+#
+# For the sake of sanity, this macro assumes that any libcurl that is
+# found is after version 7.7.2, the first version that included the
+# curl-config script. Note that it is very important for people
+# packaging binary versions of libcurl to include this script!
+# Without curl-config, we can only guess what protocols are available,
+# or use curl_version_info to figure it out at runtime.
+
+AC_DEFUN([LIBCURL_CHECK_CONFIG],
+[
+ AH_TEMPLATE([LIBCURL_FEATURE_SSL],[Defined if libcurl supports SSL])
+ AH_TEMPLATE([LIBCURL_FEATURE_KRB4],[Defined if libcurl supports KRB4])
+ AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6])
+ AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz])
+ AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports
AsynchDNS])
+ AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN])
+ AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI])
+ AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM])
+
+ AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_RTSP],[Defined if libcurl supports RTSP])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_POP3],[Defined if libcurl supports POP3])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_IMAP],[Defined if libcurl supports IMAP])
+ AH_TEMPLATE([LIBCURL_PROTOCOL_SMTP],[Defined if libcurl supports SMTP])
+
+ AC_ARG_WITH(libcurl,
+ AS_HELP_STRING([--with-libcurl=PREFIX],[look for the curl library in
PREFIX/lib and headers in PREFIX/include]),
+ [_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])])
+
+ if test "$_libcurl_with" != "no" ; then
+
+ AC_PROG_AWK
+
+ _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\");
X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'"
+
+ _libcurl_try_link=yes
+
+ if test -d "$_libcurl_with" ; then
+ LIBCURL_CPPFLAGS="-I$withval/include"
+ _libcurl_ldflags="-L$withval/lib"
+ AC_PATH_PROG([_libcurl_config],[curl-config],[],
+ ["$withval/bin"])
+ else
+ AC_PATH_PROG([_libcurl_config],[curl-config],[],[$PATH])
+ fi
+
+ if test x$_libcurl_config != "x" ; then
+ AC_CACHE_CHECK([for the version of libcurl],
+ [libcurl_cv_lib_curl_version],
+ [libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK
'{print $[]2}'`])
+
+ _libcurl_version=`echo $libcurl_cv_lib_curl_version |
$_libcurl_version_parse`
+ _libcurl_wanted=`echo ifelse([$2],,[0],[$2]) |
$_libcurl_version_parse`
+
+ if test $_libcurl_wanted -gt 0 ; then
+ AC_CACHE_CHECK([for libcurl >= version $2],
+ [libcurl_cv_lib_version_ok],
+ [
+ if test $_libcurl_version -ge $_libcurl_wanted ; then
+ libcurl_cv_lib_version_ok=yes
+ else
+ libcurl_cv_lib_version_ok=no
+ fi
+ ])
+ fi
+
+ if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok =
xyes ; then
+ if test x"$LIBCURL_CPPFLAGS" = "x" ; then
+ LIBCURL_CPPFLAGS=`$_libcurl_config --cflags`
+ fi
+ if test x"$LIBCURL" = "x" ; then
+ LIBCURL=`$_libcurl_config --libs`
+
+ # This is so silly, but Apple actually has a bug in their
+ # curl-config script. Fixed in Tiger, but there are still
+ # lots of Panther installs around.
+ case "${host}" in
+ powerpc-apple-darwin7*)
+ LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'`
+ ;;
+ esac
+ fi
+
+ # All curl-config scripts support --feature
+ _libcurl_features=`$_libcurl_config --feature`
+
+ # Is it modern enough to have --protocols? (7.12.4)
+ if test $_libcurl_version -ge 461828 ; then
+ _libcurl_protocols=`$_libcurl_config --protocols`
+ fi
+ else
+ _libcurl_try_link=no
+ fi
+
+ unset _libcurl_wanted
+ fi
+
+ if test $_libcurl_try_link = yes ; then
+
+ # we didn't find curl-config, so let's see if the user-supplied
+ # link line (or failing that, "-lcurl") is enough.
+ LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"}
+
+ AC_CACHE_CHECK([whether libcurl is usable],
+ [libcurl_cv_lib_curl_usable],
+ [
+ _libcurl_save_cppflags=$CPPFLAGS
+ CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS"
+ _libcurl_save_libs=$LIBS
+ LIBS="$LIBCURL $LIBS"
+
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <gnurl/curl.h>]],[[
+/* Try and use a few common options to force a failure if we are
+ missing symbols or can't link. */
+int x;
+curl_easy_setopt(NULL,CURLOPT_URL,NULL);
+x=CURL_ERROR_SIZE;
+x=CURLOPT_WRITEFUNCTION;
+x=CURLOPT_WRITEDATA;
+x=CURLOPT_ERRORBUFFER;
+x=CURLOPT_STDERR;
+x=CURLOPT_VERBOSE;
+if (x) {;}
+]])],libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no)
+
+ CPPFLAGS=$_libcurl_save_cppflags
+ LIBS=$_libcurl_save_libs
+ unset _libcurl_save_cppflags
+ unset _libcurl_save_libs
+ ])
+
+ if test $libcurl_cv_lib_curl_usable = yes ; then
+
+ # Does curl_free() exist in this version of libcurl?
+ # If not, fake it with free()
+
+ _libcurl_save_cppflags=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
+ _libcurl_save_libs=$LIBS
+ LIBS="$LIBS $LIBCURL"
+
+ AC_CHECK_FUNC(curl_free,,
+ AC_DEFINE(curl_free,free,
+ [Define curl_free() as free() if our version of curl lacks
curl_free.]))
+
+ CPPFLAGS=$_libcurl_save_cppflags
+ LIBS=$_libcurl_save_libs
+ unset _libcurl_save_cppflags
+ unset _libcurl_save_libs
+
+ AC_DEFINE(HAVE_LIBCURL,1,
+ [Define to 1 if you have a functional curl library.])
+ AC_SUBST(LIBCURL_CPPFLAGS)
+ AC_SUBST(LIBCURL)
+
+ for _libcurl_feature in $_libcurl_features ; do
+
AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_feature_$_libcurl_feature),[1])
+ eval AS_TR_SH(libcurl_feature_$_libcurl_feature)=yes
+ done
+
+ if test "x$_libcurl_protocols" = "x" ; then
+
+ # We don't have --protocols, so just assume that all
+ # protocols are available
+ _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT TFTP"
+
+ if test x$libcurl_feature_SSL = xyes ; then
+ _libcurl_protocols="$_libcurl_protocols HTTPS"
+
+ # FTPS wasn't standards-compliant until version
+ # 7.11.0 (0x070b00 == 461568)
+ if test $_libcurl_version -ge 461568; then
+ _libcurl_protocols="$_libcurl_protocols FTPS"
+ fi
+ fi
+
+ # RTSP, IMAP, POP3 and SMTP were added in
+ # 7.20.0 (0x071400 == 463872)
+ if test $_libcurl_version -ge 463872; then
+ _libcurl_protocols="$_libcurl_protocols RTSP IMAP POP3 SMTP"
+ fi
+ fi
+
+ for _libcurl_protocol in $_libcurl_protocols ; do
+
AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_protocol_$_libcurl_protocol),[1])
+ eval AS_TR_SH(libcurl_protocol_$_libcurl_protocol)=yes
+ done
+ else
+ unset LIBCURL
+ unset LIBCURL_CPPFLAGS
+ fi
+ fi
+
+ unset _libcurl_try_link
+ unset _libcurl_version_parse
+ unset _libcurl_config
+ unset _libcurl_feature
+ unset _libcurl_features
+ unset _libcurl_protocol
+ unset _libcurl_protocols
+ unset _libcurl_version
+ unset _libcurl_ldflags
+ fi
+
+ if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes
; then
+ # This is the IF-NO path
+ ifelse([$4],,:,[$4])
+ else
+ # This is the IF-YES path
+ ifelse([$3],,:,[$3])
+ fi
+
+ unset _libcurl_with
+])dnl
diff --cc docs/libcurl/opts/GNURLINFO_ACTIVESOCKET.3
index 3a3d54fa3,000000000..601e5d572
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_ACTIVESOCKET.3
+++ b/docs/libcurl/opts/GNURLINFO_ACTIVESOCKET.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_ACTIVESOCKET 3 "12 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_ACTIVESOCKET \- get the active socket
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_ACTIVESOCKET,
+ curl_socket_t *socket);
+.SH DESCRIPTION
+Pass a pointer to a curl_socket_t to receive the most recently active socket
+used for the transfer connection by this curl session. If the socket is no
+longer valid, \fICURL_SOCKET_BAD\fP is returned. When you are finished working
+with the socket, you must call \fIcurl_easy_cleanup(3)\fP as usual on the easy
+handle and let libcurl close the socket and cleanup other resources associated
+with the handle. This option returns the active socket only after the transfer
+is complete, and is typically used in combination with
+\fICURLOPT_CONNECT_ONLY(3)\fP, which skips the transfer phase.
+
+\fICURLINFO_ACTIVESOCKET(3)\fP was added as a replacement for
+\fICURLINFO_LASTSOCKET(3)\fP since that one isn't working on all platforms.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_socket_t sockfd;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Do not do the transfer - only connect to host */
+ curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
+ res = curl_easy_perform(curl);
+
+ /* Extract the socket from the curl handle */
+ res = curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &sockfd);
+
+ if(res != CURLE_OK) {
+ printf("Error: %s\\n", curl_easy_strerror(res));
+ return 1;
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.45.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_LASTSOCKET "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_APPCONNECT_TIME.3
index 03ade4a3c,000000000..a99ecd555
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_APPCONNECT_TIME.3
+++ b/docs/libcurl/opts/GNURLINFO_APPCONNECT_TIME.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_APPCONNECT_TIME 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_APPCONNECT_TIME \- get the time until the SSL/SSH handshake is
completed
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_APPCONNECT_TIME, double
*timep);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the time, in seconds, it took from the
+start until the SSL/SSH connect/handshake to the remote host was completed.
+This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME(3)\fP
+time, except for cases such as HTTP pipelining where the pretransfer time can
+be delayed due to waits in line for the pipeline and more.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double connect;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_APPCONNECT_TIME, &connect);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", connect);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_APPCONNECT_TIME_T "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_APPCONNECT_TIME_T.3
index 1ae9e6c9e,000000000..b192efc57
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_APPCONNECT_TIME_T.3
+++ b/docs/libcurl/opts/GNURLINFO_APPCONNECT_TIME_T.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_APPCONNECT_TIME_T 3 "28 Apr 2018" "libcurl 7.61.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_APPCONNECT_TIME_T \- get the time until the SSL/SSH handshake is
completed
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_APPCONNECT_TIME_T,
curl_off_t *timep);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t to receive the time, in microseconds,
+it took from the
+start until the SSL/SSH connect/handshake to the remote host was completed.
+This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME_T(3)\fP
+time, except for cases such as HTTP pipelining where the pretransfer time can
+be delayed due to waits in line for the pipeline and more.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_off_t connect;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_APPCONNECT_TIME_T, &connect);
+ if(CURLE_OK == res) {
+ printf("Time: %" CURL_FORMAT_CURL_OFF_T ".%06ld", connect / 1000000,
+ (long)(connect % 1000000));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.61.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_APPCONNECT_TIME "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_CERTINFO.3
index d3782fd39,000000000..7be8a24fc
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_CERTINFO.3
+++ b/docs/libcurl/opts/GNURLINFO_CERTINFO.3
@@@ -1,81 -1,0 +1,81 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_CERTINFO 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_CERTINFO \- get the TLS certificate chain
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CERTINFO,
+ struct curl_certinfo **chainp);
+.SH DESCRIPTION
+Pass a pointer to a 'struct curl_certinfo *' and you'll get it set to point to
+a struct that holds a number of linked lists with info about the certificate
+chain, assuming you had \fICURLOPT_CERTINFO(3)\fP enabled when the request was
+made. The struct reports how many certs it found and then you can extract info
+for each of those certs by following the linked lists. The info chain is
+provided in a series of data in the format "name:content" where the content is
+for the specific named data. See also the certinfo.c example.
+.SH PROTOCOLS
+All TLS-based
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
+
+ /* connect to any HTTPS site, trusted or not */
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+
+ curl_easy_setopt(curl, CURLOPT_CERTINFO, 1L);
+
+ res = curl_easy_perform(curl);
+
+ if (!res) {
+ struct curl_certinfo *ci;
+ res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &ci);
+
+ if (!res) {
+ printf("%d certs!\\n", ci->num_of_certs);
+
+ for(i = 0; i < ci->num_of_certs; i++) {
+ struct curl_slist *slist;
+
+ for(slist = ci->certinfo[i]; slist; slist = slist->next)
+ printf("%s\\n", slist->data);
+ }
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+This option is only working in libcurl built with OpenSSL, NSS, Schannel or
+GSKit support. Schannel support added in 7.50.0
+
+Added in 7.19.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_CONDITION_UNMET.3
index dcd6fc0e5,000000000..c37d0530c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_CONDITION_UNMET.3
+++ b/docs/libcurl/opts/GNURLINFO_CONDITION_UNMET.3
@@@ -1,70 -1,0 +1,70 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_CONDITION_UNMET 3 "1 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_CONDITION_UNMET \- get info on unmet time conditional or 304 HTTP
response.
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONDITION_UNMET, long
*unmet);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the number 1 if the condition provided in
+the previous request didn't match (see \fICURLOPT_TIMECONDITION(3)\fP). Alas,
+if this returns a 1 you know that the reason you didn't get data in return is
+because it didn't fulfill the condition. The long this argument points to will
+get a zero stored if the condition instead was met. This can also return 1 if
+the server responded with a 304 HTTP status code, for example after sending a
+custom "If-Match-*" header.
+.SH PROTOCOLS
+HTTP and some
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* January 1, 2020 is 1577833200 */
+ curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
+
+ /* If-Modified-Since the above time stamp */
+ curl_easy_setopt(curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the time condition */
+ long unmet;
+ res = curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &unmet);
+ if(!res) {
+ printf("The time condition was %sfulfilled\\n", unmet?"NOT":"");
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_CONNECT_TIME.3
index 651850cde,000000000..e94626aa6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_CONNECT_TIME.3
+++ b/docs/libcurl/opts/GNURLINFO_CONNECT_TIME.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_CONNECT_TIME 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_CONNECT_TIME \- get the time until connect
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME, double
*timep);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the total time in seconds from the start
+until the connection to the remote host (or proxy) was completed.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double connect;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME, &connect);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", connect);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_CONNECT_TIME_T "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_CONNECT_TIME_T.3
index 3479cc851,000000000..759f3a52a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_CONNECT_TIME_T.3
+++ b/docs/libcurl/opts/GNURLINFO_CONNECT_TIME_T.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_CONNECT_TIME_T 3 "28 Apr 2018" "libcurl 7.61.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_CONNECT_TIME_T \- get the time until connect
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME_T, curl_off_t
*timep);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t to receive the total time in microseconds
+from the start until the connection to the remote host (or proxy) was
completed.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_off_t connect;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME_T, &connect);
+ if(CURLE_OK == res) {
+ printf("Time: %" CURL_FORMAT_CURL_OFF_T ".%06ld", connect / 1000000,
+ (long)(connect % 1000000));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.61.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), " CURLINFO_CONNECT_TIME
"(3)"
diff --cc docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_DOWNLOAD.3
index 639299337,000000000..8498f8fb6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_DOWNLOAD.3
+++ b/docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_DOWNLOAD.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "1 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
+ double *content_length);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the content-length of the download. This
+is the value read from the Content-Length: field. Since 7.19.4, this returns
+-1 if the size isn't known.
+
+\fICURLINFO_CONTENT_LENGTH_DOWNLOAD_T(3)\fP is a newer replacement that
returns a more
+sensible variable type.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ double cl;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &cl);
+ if(!res) {
+ printf("Size: %.0f\\n", cl);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.6.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_CONTENT_LENGTH_UPLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
index 74ca85049,000000000..99aad3842
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "25 May 2017" "libcurl 7.55.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
+ curl_off_t *content_length);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the content-length of the
+download. This is the value read from the Content-Length: field. Stores -1 if
+the size isn't known.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ curl_off_t cl;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &cl);
+ if(!res) {
+ printf("Download size: %" CURL_FORMAT_CURL_OFF_T "\\n", cl);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_CONTENT_LENGTH_UPLOAD_T "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_UPLOAD.3
index cd668e9eb,000000000..56a914b7a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_UPLOAD.3
+++ b/docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_UPLOAD.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_CONTENT_LENGTH_UPLOAD 3 "1 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_UPLOAD,
+ double *content_length);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the specified size of the upload. Since
+7.19.4, this returns -1 if the size isn't known.
+
+\fICURLINFO_CONTENT_LENGTH_UPLOAD_T(3)\fP is a newer replacement that returns
a
+more sensible variable type.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the upload */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ double cl;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_UPLOAD, &cl);
+ if(!res) {
+ printf("Size: %.0f\\n", cl);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.6.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_CONTENT_LENGTH_DOWNLOAD_T "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_UPLOAD_T.3
index f6c033fb8,000000000..334e7058a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_UPLOAD_T.3
+++ b/docs/libcurl/opts/GNURLINFO_CONTENT_LENGTH_UPLOAD_T.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "25 May 2017" "libcurl 7.55.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_UPLOAD_T,
+ curl_off_t *content_length);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the specified size of the
+upload. Stores -1 if the size isn't known.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the upload */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ curl_off_t cl;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_UPLOAD_T, &cl);
+ if(!res) {
+ printf("Upload size: %" CURL_FORMAT_CURL_OFF_T "\\n", cl);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_CONTENT_LENGTH_DOWNLOAD_T "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_CONTENT_TYPE.3
index a75a223fa,000000000..80fb69d56
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_CONTENT_TYPE.3
+++ b/docs/libcurl/opts/GNURLINFO_CONTENT_TYPE.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_CONTENT_TYPE 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_CONTENT_TYPE \- get Content-Type
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_TYPE, char **ct);
+.SH DESCRIPTION
+Pass a pointer to a char pointer to receive the content-type of the downloaded
+object. This is the value read from the Content-Type: field. If you get NULL,
+it means that the server didn't send a valid Content-Type header or that the
+protocol used doesn't support this.
+
+The \fBct\fP pointer will be NULL or pointing to private memory you MUST NOT
+free it - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract the content-type */
+ char *ct = NULL;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
+ if(!res && ct) {
+ printf("Content-Type: %s\\n", ct);
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.9.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_COOKIELIST.3
index e82ddb8a3,000000000..088392df7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_COOKIELIST.3
+++ b/docs/libcurl/opts/GNURLINFO_COOKIELIST.3
@@@ -1,77 -1,0 +1,77 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_COOKIELIST 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_COOKIELIST \- get all known cookies
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_COOKIELIST,
+ struct curl_slist **cookies);
+.SH DESCRIPTION
+Pass a pointer to a 'struct curl_slist *' to receive a linked-list of all
+cookies curl knows (expired ones, too). Don't forget to call
+\fIcurl_slist_free_all(3)\fP on the list after it has been used. If there are
+no cookies (cookies for the handle have not been enabled or simply none have
+been received) 'struct curl_slist *' will be set to point to NULL.
+
+Since 7.43.0 cookies that were imported in the Set-Cookie format without a
+domain name are not exported by this option.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* enable the cookie engine */
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract all known cookies */
+ struct curl_slist *cookies = NULL;
+ res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
+ if(!res && cookies) {
+ /* a linked list of cookies in cookie file format */
+ struct curl_slist *each = cookies;
+ while(each) {
+ printf("%s\\n", each->data);
+ each = each->next;
+ }
+ /* we must free these cookies when we're done */
+ curl_slist_free_all(cookies);
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.14.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLOPT_COOKIELIST "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_EFFECTIVE_METHOD.3
index 57e45c26a,000000000..7b356c6dd
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_EFFECTIVE_METHOD.3
+++ b/docs/libcurl/opts/GNURLINFO_EFFECTIVE_METHOD.3
@@@ -1,68 -1,0 +1,68 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_EFFECTIVE_METHOD 3 "28 Aug 2015" "libcurl 7.72.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_EFFECTIVE_METHOD \- get the last used HTTP method
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_EFFECTIVE_METHOD,
+ char **methodp);
+.fi
+.SH DESCRIPTION
+Pass in a pointer to a char pointer and get the last used effective HTTP
+method.
+
+In cases when you've asked libcurl to follow redirects, the method may very
+well not be the same method the first request would use.
+
+The \fBmethodp\fP pointer will be NULL or pointing to private memory you MUST
+NOT free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ char *method = NULL;
+ curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_METHOD, &method);
+ if(method)
+ printf("Redirected to method: %s\\n", method);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.72.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_EFFECTIVE_URL.3
index ce9ec45f5,000000000..484641b58
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_EFFECTIVE_URL.3
+++ b/docs/libcurl/opts/GNURLINFO_EFFECTIVE_URL.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_EFFECTIVE_URL 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_EFFECTIVE_URL \- get the last used URL
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_EFFECTIVE_URL, char **urlp);
+.SH DESCRIPTION
+Pass in a pointer to a char pointer and get the last used effective URL.
+
+In cases when you've asked libcurl to follow redirects, it may very well not
+be the same value you set with \fICURLOPT_URL(3)\fP.
+
+The \fBurlp\fP pointer will be NULL or pointing to private memory you MUST NOT
+free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ char *url = NULL;
+ curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url);
+ if(url)
+ printf("Redirect to: %s\\n", url);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_FILETIME.3
index b23b8afd2,000000000..c5c1d2ccf
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_FILETIME.3
+++ b/docs/libcurl/opts/GNURLINFO_FILETIME.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_FILETIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_FILETIME \- get the remote time of the retrieved document
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_FILETIME, long *timep);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the remote time of the retrieved document
+(in number of seconds since 1 jan 1970 in the GMT/UTC time zone). If you get
+-1, it can be because of many reasons (it might be unknown, the server might
+hide it or the server doesn't support the command that tells document time
+etc) and the time of the document is unknown.
+
+You must tell libcurl to collect this information before the transfer is made,
+by using the \fICURLOPT_FILETIME(3)\fP option to \fIcurl_easy_setopt(3)\fP or
+you will unconditionally get a -1 back.
+
+Consider using \fICURLINFO_FILETIME_T(3)\fP to be able to extract dates beyond
+the year 2038 on systems using 32 bit longs.
+.SH PROTOCOLS
+HTTP(S), FTP(S), SFTP
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* Ask for filetime */
+ curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
+ if((CURLE_OK == res) && (filetime >= 0)) {
+ time_t file_time = (time_t)filetime;
+ printf("filetime %s: %s", filename, ctime(&file_time));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.5
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_FILETIME_T.3
index 6ffd1a168,000000000..9cb2e209c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_FILETIME_T.3
+++ b/docs/libcurl/opts/GNURLINFO_FILETIME_T.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_FILETIME 3 "25 Jan 2018" "libcurl 7.59.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_FILETIME_T \- get the remote time of the retrieved document
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_FILETIME_T, curl_off_t
*timep);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t to receive the remote time of the retrieved
+document (in number of seconds since 1 jan 1970 in the GMT/UTC time zone). If
+you get -1, it can be because of many reasons (it might be unknown, the server
+might hide it or the server doesn't support the command that tells document
+time etc) and the time of the document is unknown.
+
+You must ask libcurl to collect this information before the transfer is made,
+by using the \fICURLOPT_FILETIME(3)\fP option to \fIcurl_easy_setopt(3)\fP or
+you will unconditionally get a -1 back.
+
+This option is an alternative to \fICURLINFO_FILETIME(3)\fP to allow systems
+with 32 bit long variables to extract dates outside of the 32bit timestamp
+range.
+.SH PROTOCOLS
+HTTP(S), FTP(S), SFTP
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* Ask for filetime */
+ curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ curl_off_t filetime;
+ res = curl_easy_getinfo(curl, CURLINFO_FILETIME_T, &filetime);
+ if((CURLE_OK == res) && (filetime >= 0)) {
+ time_t file_time = (time_t)filetime;
+ printf("filetime %s: %s", filename, ctime(&file_time));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.59.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_FTP_ENTRY_PATH.3
index ee74c2c39,000000000..6bcd0ad3e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_FTP_ENTRY_PATH.3
+++ b/docs/libcurl/opts/GNURLINFO_FTP_ENTRY_PATH.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_FTP_ENTRY_PATH 3 "12 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_FTP_ENTRY_PATH \- get entry path in FTP server
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_FTP_ENTRY_PATH, char
**path);
+.SH DESCRIPTION
+Pass a pointer to a char pointer to receive a pointer to a string holding the
+path of the entry path. That is the initial path libcurl ended up in when
+logging on to the remote FTP server. This stores a NULL as pointer if
+something is wrong.
+
+The \fBpath\fP pointer will be NULL or pointing to private memory you MUST NOT
+free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
+.SH PROTOCOLS
+FTP(S) and SFTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract the entry path */
+ char *ep = NULL;
+ res = curl_easy_getinfo(curl, CURLINFO_FTP_ENTRY_PATH, &ep);
+ if(!res && ep) {
+ printf("Entry path was: %s\\n", ep);
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.4. Works for SFTP since 7.21.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_HEADER_SIZE.3
index bc0418158,000000000..c9eb4ee3a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_HEADER_SIZE.3
+++ b/docs/libcurl/opts/GNURLINFO_HEADER_SIZE.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_HEADER_SIZE 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_HEADER_SIZE \- get size of retrieved headers
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HEADER_SIZE, long *sizep);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the total size of all the headers
+received. Measured in number of bytes.
+
+The total includes the size of any received headers suppressed by
+\fICURLOPT_SUPPRESS_CONNECT_HEADERS(3)\fP.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long size;
+ res = curl_easy_getinfo(curl, CURLINFO_HEADER_SIZE, &size);
+ if(!res)
+ printf("Header size: %ld bytes\\n", size);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_REQUEST_SIZE "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_HTTPAUTH_AVAIL.3
index 5d83d00ea,000000000..0cc2adacb
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_HTTPAUTH_AVAIL.3
+++ b/docs/libcurl/opts/GNURLINFO_HTTPAUTH_AVAIL.3
@@@ -1,70 -1,0 +1,70 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_HTTPAUTH_AVAIL 3 "12 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTPAUTH_AVAIL, long
*authp);
+.SH DESCRIPTION
+Pass a pointer to a long to receive a bitmask indicating the authentication
+method(s) available according to the previous response. The meaning of the
+bits is explained in the \fICURLOPT_HTTPAUTH(3)\fP option for
+\fIcurl_easy_setopt(3)\fP.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract the available authentication types */
+ long auth;
+ res = curl_easy_getinfo(curl, CURLINFO_HTTPAUTH_AVAIL, &auth);
+ if(!res) {
+ if(!auth)
+ printf("No auth available, perhaps no 401?\\n");
+ else {
+ printf("%s%s%s%s\\n",
+ auth & CURLAUTH_BASIC ? "Basic ":"",
+ auth & CURLAUTH_DIGEST ? "Digest ":"",
+ auth & CURLAUTH_NEGOTIATE ? "Negotiate ":"",
+ auth % CURLAUTH_NTLM ? "NTLM ":"");
+ }
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added RFC2617 in 7.10.8
+Added RFC7616 in 7.57.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_HTTP_CONNECTCODE.3
index 356ac2a88,000000000..3e47f2079
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_HTTP_CONNECTCODE.3
+++ b/docs/libcurl/opts/GNURLINFO_HTTP_CONNECTCODE.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_HTTP_CONNECTCODE 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_HTTP_CONNECTCODE \- get the CONNECT response code
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_CONNECTCODE, long *p);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the last received HTTP proxy response code
+to a CONNECT request. The returned value will be zero if no such response code
+was available.
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* typically CONNECT is used to do HTTPS over HTTP proxies */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://127.0.0.1");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long code;
+ res = curl_easy_getinfo(curl, CURLINFO_HTTP_CONNECTCODE, &code);
+ if(!res && code)
+ printf("The CONNECT response code: %03ld\\n", code);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10.7
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLINFO_RESPONSE_CODE "(3), "
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_HTTP_VERSION.3
index caa43c725,000000000..f8f319888
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_HTTP_VERSION.3
+++ b/docs/libcurl/opts/GNURLINFO_HTTP_VERSION.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_HTTP_VERSION 3 "11 May 2016" "libcurl 7.50.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_HTTP_VERSION \- get the http version used in the connection
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_VERSION, long *p);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the version used in the last http
+connection. The returned value will be CURL_HTTP_VERSION_1_0,
+CURL_HTTP_VERSION_1_1, CURL_HTTP_VERSION_2_0, CURL_HTTP_VERSION_3 or 0 if the
+version can't be determined.
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long http_version;
+ curl_easy_getinfo(curl, CURLINFO_HTTP_VERSION, &http_version);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.50.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLINFO_RESPONSE_CODE "(3), "
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_LASTSOCKET.3
index f3e717220,000000000..70e44afef
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_LASTSOCKET.3
+++ b/docs/libcurl/opts/GNURLINFO_LASTSOCKET.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_LASTSOCKET 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_LASTSOCKET \- get the last socket used
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LASTSOCKET, long *socket);
+.SH DESCRIPTION
+Deprecated since 7.45.0. Use \fICURLINFO_ACTIVESOCKET(3)\fP instead.
+
+Pass a pointer to a long to receive the last socket used by this curl
+session. If the socket is no longer valid, -1 is returned. When you finish
+working with the socket, you must call curl_easy_cleanup() as usual and let
+libcurl close the socket and cleanup other resources associated with the
+handle. This is typically used in combination with
+\fICURLOPT_CONNECT_ONLY(3)\fP.
+
+NOTE: this API is deprecated since it is not working on win64 where the SOCKET
+type is 64 bits large while its 'long' is 32 bits. Use the
+\fICURLINFO_ACTIVESOCKET(3)\fP instead, if possible.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ long sockfd; /* doesn't work on win64! */
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Do not do the transfer - only connect to host */
+ curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
+ res = curl_easy_perform(curl);
+
+ /* Extract the socket from the curl handle */
+ res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockfd);
+
+ if(res != CURLE_OK) {
+ printf("Error: %s\\n", curl_easy_strerror(res));
+ return 1;
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_ACTIVESOCKET "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_LOCAL_IP.3
index a2fe9b736,000000000..78ccf85f7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_LOCAL_IP.3
+++ b/docs/libcurl/opts/GNURLINFO_LOCAL_IP.3
@@@ -1,68 -1,0 +1,68 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_LOCAL_IP 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_LOCAL_IP \- get local IP address of last connection
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LOCAL_IP, char **ip);
+.SH DESCRIPTION
+Pass a pointer to a char pointer to receive the pointer to a null-terminated
+string holding the IP address of the local end of most recent connection done
+with this \fBcurl\fP handle. This string may be IPv6 when that is
+enabled. Note that you get a pointer to a memory area that will be re-used at
+next request so you need to copy the string if you want to keep the
+information.
+
+The \fBip\fP pointer will be NULL or pointing to private memory you MUST NOT
+free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+{
+ char *ip;
+
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+ /* Check for errors */
+ if((res == CURLE_OK) &&
+ !curl_easy_getinfo(curl, CURLINFO_LOCAL_IP, &ip) && ip) {
+ printf("Local IP: %s\\n", ip);
+ }
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_PRIMARY_IP "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_LOCAL_PORT.3
index 9b10fd3ff,000000000..f197d3800
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_LOCAL_PORT.3
+++ b/docs/libcurl/opts/GNURLINFO_LOCAL_PORT.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_LOCAL_PORT 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_LOCAL_PORT \- get the latest local port number
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LOCAL_PORT, long *portp);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the local port number of the most recent
+connection done with this \fBcurl\fP handle.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+{
+ CURL *curl;
+ CURLcode res;
+
+ curl = curl_easy_init();
+ if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ res = curl_easy_perform(curl);
+
+ if(CURLE_OK == res) {
+ long port;
+ res = curl_easy_getinfo(curl, CURLINFO_LOCAL_PORT, &port);
+
+ if(CURLE_OK == res) {
+ printf("We used local port: %ld\\n", port);
+ }
+ }
+ curl_easy_cleanup(curl);
+ }
+ return 0;
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_PRIMARY_PORT "(3), " CURLINFO_LOCAL_IP "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_NAMELOOKUP_TIME.3
index 52d374d1f,000000000..e3b0d1e4e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_NAMELOOKUP_TIME.3
+++ b/docs/libcurl/opts/GNURLINFO_NAMELOOKUP_TIME.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_NAMELOOKUP_TIME 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_NAMELOOKUP_TIME \- get the name lookup time
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME, double
*timep);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the total time in seconds from the start
+until the name resolving was completed.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double namelookup;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &namelookup);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", namelookup);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_NAMELOOKUP_TIME_T "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_NAMELOOKUP_TIME_T.3
index 542df9736,000000000..14b473737
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_NAMELOOKUP_TIME_T.3
+++ b/docs/libcurl/opts/GNURLINFO_NAMELOOKUP_TIME_T.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_NAMELOOKUP_TIME_T 3 "28 Apr 2018" "libcurl 7.61.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_NAMELOOKUP_TIME_T \- get the name lookup time in microseconds
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME_T,
curl_off_t *timep);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t to receive the total time in microseconds
+from the start until the name resolving was completed.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_off_t namelookup;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME_T, &namelookup);
+ if(CURLE_OK == res) {
+ printf("Time: %" CURL_FORMAT_CURL_OFF_T ".%06ld", namelookup / 1000000,
+ (long)(namelookup % 1000000));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.61.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_NAMELOOKUP_TIME "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_NUM_CONNECTS.3
index 982f02241,000000000..d87c08ef5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_NUM_CONNECTS.3
+++ b/docs/libcurl/opts/GNURLINFO_NUM_CONNECTS.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_NUM_CONNECTS 3 "12 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_NUM_CONNECTS \- get number of created connections
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NUM_CONNECTS, long *nump);
+.SH DESCRIPTION
+Pass a pointer to a long to receive how many new connections libcurl had to
+create to achieve the previous transfer (only the successful connects are
+counted). Combined with \fICURLINFO_REDIRECT_COUNT(3)\fP you are able to know
+how many times libcurl successfully reused existing connection(s) or not. See
+the connection options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries
+to make persistent connections to save time.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long connects;
+ res = curl_easy_getinfo(curl, CURLINFO_NUM_CONNECTS, &connects);
+ if(res)
+ printf("It needed %d connects\\n", connects);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.12.3
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_OS_ERRNO.3
index 2e987b1ae,000000000..8e9d1f587
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_OS_ERRNO.3
+++ b/docs/libcurl/opts/GNURLINFO_OS_ERRNO.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_OS_ERRNO 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_OS_ERRNO \- get errno number from last connect failure
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_OS_ERRNO, long *errnop);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the errno variable from a connect failure.
+Note that the value is only set on failure, it is not reset upon a successful
+operation. The number is OS and system specific.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res != CURLE_OK) {
+ long error;
+ res = curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &error);
+ if(res && error) {
+ printf("Errno: %ld\\n", error);
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.12.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_PRETRANSFER_TIME.3
index 515293439,000000000..b0a1d6fb9
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_PRETRANSFER_TIME.3
+++ b/docs/libcurl/opts/GNURLINFO_PRETRANSFER_TIME.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_PRETRANSFER_TIME 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_PRETRANSFER_TIME \- get the time until the file transfer start
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRETRANSFER_TIME, double
*timep);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the time, in seconds, it took from the
+start until the file transfer is just about to begin. This includes all
+pre-transfer commands and negotiations that are specific to the particular
+protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
+specific request that triggers a transfer.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double pretransfer;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME, &pretransfer);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", pretransfer);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_PRETRANSFER_TIME_T "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_PRETRANSFER_TIME_T.3
index 1cccdef70,000000000..a00ed8395
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_PRETRANSFER_TIME_T.3
+++ b/docs/libcurl/opts/GNURLINFO_PRETRANSFER_TIME_T.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_PRETRANSFER_TIME_T 3 "28 Apr 2018" "libcurl 7.61.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_PRETRANSFER_TIME_T \- get the time until the file transfer start
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRETRANSFER_TIME_T,
curl_off_t *timep);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t to receive the time, in microseconds,
+it took from the
+start until the file transfer is just about to begin. This includes all
+pre-transfer commands and negotiations that are specific to the particular
+protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
+specific request that triggers a transfer.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_off_t pretransfer;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME_T, &pretransfer);
+ if(CURLE_OK == res) {
+ printf("Time: %" CURL_FORMAT_CURL_OFF_T ".%06ld", pretransfer / 1000000,
+ (long)(pretransfer % 1000000));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.61.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_PRETRANSFER_TIME "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_PRIMARY_IP.3
index 3100c2086,000000000..8466e70eb
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_PRIMARY_IP.3
+++ b/docs/libcurl/opts/GNURLINFO_PRIMARY_IP.3
@@@ -1,67 -1,0 +1,67 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_PRIMARY_IP 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_PRIMARY_IP \- get IP address of last connection
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIMARY_IP, char **ip);
+.SH DESCRIPTION
+Pass a pointer to a char pointer to receive the pointer to a null-terminated
+string holding the IP address of the most recent connection done with this
+\fBcurl\fP handle. This string may be IPv6 when that is enabled. Note that you
+get a pointer to a memory area that will be re-used at next request so you
+need to copy the string if you want to keep the information.
+
+The \fBip\fP pointer will be NULL or pointing to private memory you MUST NOT
+free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
+.SH PROTOCOLS
+All network based ones
+.SH EXAMPLE
+.nf
+{
+ char *ip;
+
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+ /* Check for errors */
+ if((res == CURLE_OK) &&
+ !curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, &ip) && ip) {
+ printf("IP: %s\\n", ip);
+ }
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_PRIMARY_PORT "(3), " CURLINFO_LOCAL_IP "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_PRIMARY_PORT.3
index 44658e4c7,000000000..5a37b23d1
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_PRIMARY_PORT.3
+++ b/docs/libcurl/opts/GNURLINFO_PRIMARY_PORT.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_PRIMARY_PORT 3 "12 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_PRIMARY_PORT \- get the latest destination port number
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIMARY_PORT, long *portp);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the destination port of the most recent
+connection done with this \fBcurl\fP handle.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long port;
+ res = curl_easy_getinfo(curl, CURLINFO_PRIMARY_PORT, &port);
+ if(!res)
+ printf("Connected to remote port: %ld\\n", port);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_PRIVATE.3
index 027ae245e,000000000..a0006e20c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_PRIVATE.3
+++ b/docs/libcurl/opts/GNURLINFO_PRIVATE.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_PRIVATE 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_PRIVATE \- get the private pointer
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIVATE, char **private);
+.SH DESCRIPTION
+Pass a pointer to a char pointer to receive the pointer to the private data
+associated with the curl handle (set with the \fICURLOPT_PRIVATE(3)\fP).
+Please note that for internal reasons, the value is returned as a char
+pointer, although effectively being a 'void *'.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ void *pointer = 0x2345454;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ /* set the private pointer */
+ curl_easy_setopt(curl, CURLOPT_PRIVATE, pointer);
+ ret = curl_easy_perform(curl);
+
+ /* extract the private pointer again */
+ ret = curl_easy_getinfo(curl, CURLINFO_PRIVATE, &pointer);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10.3
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLOPT_PRIVATE "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_PROTOCOL.3
index ff6546379,000000000..e8430e5e4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_PROTOCOL.3
+++ b/docs/libcurl/opts/GNURLINFO_PROTOCOL.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_PROTOCOL 3 "23 November 2016" "libcurl 7.52.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_PROTOCOL \- get the protocol used in the connection
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROTOCOL, long *p);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the version used in the last http
+connection. The returned value will be exactly one of the CURLPROTO_* values:
+
+.nf
+CURLPROTO_DICT, CURLPROTO_FILE, CURLPROTO_FTP, CURLPROTO_FTPS,
+CURLPROTO_GOPHER, CURLPROTO_HTTP, CURLPROTO_HTTPS, CURLPROTO_IMAP,
+CURLPROTO_IMAPS, CURLPROTO_LDAP, CURLPROTO_LDAPS, CURLPROTO_POP3,
+CURLPROTO_POP3S, CURLPROTO_RTMP, CURLPROTO_RTMPE, CURLPROTO_RTMPS,
+CURLPROTO_RTMPT, CURLPROTO_RTMPTE, CURLPROTO_RTMPTS, CURLPROTO_RTSP,
+CURLPROTO_SCP, CURLPROTO_SFTP, CURLPROTO_SMB, CURLPROTO_SMBS, CURLPROTO_SMTP,
+CURLPROTO_SMTPS, CURLPROTO_TELNET, CURLPROTO_TFTP, CURLPROTO_MQTT
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long protocol;
+ curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLINFO_RESPONSE_CODE "(3), "
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_PROXYAUTH_AVAIL.3
index 5a5064e09,000000000..437d45b46
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_PROXYAUTH_AVAIL.3
+++ b/docs/libcurl/opts/GNURLINFO_PROXYAUTH_AVAIL.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_PROXYAUTH_AVAIL 3 "12 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROXYAUTH_AVAIL, long
*authp);
+.SH DESCRIPTION
+Pass a pointer to a long to receive a bitmask indicating the authentication
+method(s) available according to the previous response. The meaning of the
+bits is explained in the \fICURLOPT_PROXYAUTH(3)\fP option for
+\fIcurl_easy_setopt(3)\fP.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://127.0.0.1:80");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract the available proxy authentication types */
+ long auth;
+ res = curl_easy_getinfo(curl, CURLINFO_PROXYAUTH_AVAIL, &auth);
+ if(!res) {
+ if(!auth)
+ printf("No proxy auth available, perhaps no 407?\\n");
+ else {
+ printf("%s%s%s%s\\n",
+ auth & CURLAUTH_BASIC ? "Basic ":"",
+ auth & CURLAUTH_DIGEST ? "Digest ":"",
+ auth & CURLAUTH_NEGOTIATE ? "Negotiate ":"",
+ auth % CURLAUTH_NTLM ? "NTLM ":"");
+ }
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added RFC2617 in 7.10.8
+Added RFC7616 in 7.57.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_PROXY_SSL_VERIFYRESULT.3
index 48d166c60,000000000..79da9ecb4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_PROXY_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/GNURLINFO_PROXY_SSL_VERIFYRESULT.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_PROXY_SSL_VERIFYRESULT 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate
verification
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROXY_SSL_VERIFYRESULT,
long *result);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the result of the certificate verification
+that was requested (using the \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP
+option. This is only used for HTTPS proxies.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ long verifyresult;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy:443");
+ res = curl_easy_perform(curl);
+ curl_easy_getinfo(curl, CURLINFO_PROXY_SSL_VERIFYRESULT, &verifyresult);
+ printf("The peer verification said %s\\n", verifyresult?
+ "fine":"BAAAD");
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SSL_VERIFYRESULT "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_REDIRECT_COUNT.3
index 9cdce3897,000000000..0a52d2016
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_REDIRECT_COUNT.3
+++ b/docs/libcurl/opts/GNURLINFO_REDIRECT_COUNT.3
@@@ -1,55 -1,0 +1,55 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_REDIRECT_COUNT 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_REDIRECT_COUNT \- get the number of redirects
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_COUNT, long
*countp);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the total number of redirections that were
+actually followed.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long redirects;
+ curl_easy_getinfo(curl, CURLINFO_REDIRECT_COUNT, &redirects);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.9.7
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_REDIRECT_TIME.3
index 26f3f5117,000000000..d26a346a3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_REDIRECT_TIME.3
+++ b/docs/libcurl/opts/GNURLINFO_REDIRECT_TIME.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_REDIRECT_TIME 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_REDIRECT_TIME \- get the time for all redirection steps
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_TIME, double
*timep);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the total time, in seconds, it took for
+all redirection steps include name lookup, connect, pretransfer and transfer
+before final transaction was started. CURLINFO_REDIRECT_TIME contains the
+complete execution time for multiple redirections.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double redirect;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME, &redirect);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", redirect);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.9.7
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_REDIRECT_TIME_T "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_REDIRECT_TIME_T.3
index 093bbae1f,000000000..168f5d180
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_REDIRECT_TIME_T.3
+++ b/docs/libcurl/opts/GNURLINFO_REDIRECT_TIME_T.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_REDIRECT_TIME_T 3 "28 Apr 2018" "libcurl 7.61.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_REDIRECT_TIME_T \- get the time for all redirection steps
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_TIME_T, curl_off_t
*timep);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t to receive the total time, in microseconds,
+it took for
+all redirection steps include name lookup, connect, pretransfer and transfer
+before final transaction was started. \fICURLINFO_REDIRECT_TIME_T\fP contains
+the complete execution time for multiple redirections.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_off_t redirect;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME_T, &redirect);
+ if(CURLE_OK == res) {
+ printf("Time: %" CURL_FORMAT_CURL_OFF_T ".%06ld", redirect / 1000000,
+ (long)(redirect % 1000000));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.61.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), " CURLINFO_REDIRECT_TIME
"(3)"
diff --cc docs/libcurl/opts/GNURLINFO_REDIRECT_URL.3
index 6ba66d726,000000000..9bf35eb30
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_REDIRECT_URL.3
+++ b/docs/libcurl/opts/GNURLINFO_REDIRECT_URL.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_REDIRECT_URL 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_URL, char **urlp);
+.SH DESCRIPTION
+Pass a pointer to a char pointer to receive the URL a redirect \fIwould\fP
+take you to if you would enable \fICURLOPT_FOLLOWLOCATION(3)\fP. This can come
+very handy if you think using the built-in libcurl redirect logic isn't good
+enough for you but you would still prefer to avoid implementing all the magic
+of figuring out the new URL.
+
+This URL is also set if the \fICURLOPT_MAXREDIRS(3)\fP limit prevented a
+redirect to happen (since 7.54.1).
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ char *url = NULL;
+ curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &url);
+ if(url)
+ printf("Redirect to: %s\\n", url);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.18.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_REQUEST_SIZE.3
index 33606b0dd,000000000..2f85ffba5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_REQUEST_SIZE.3
+++ b/docs/libcurl/opts/GNURLINFO_REQUEST_SIZE.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_REQUEST_SIZE 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_REQUEST_SIZE \- get size of sent request
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REQUEST_SIZE, long *sizep);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the total size of the issued
+requests. This is so far only for HTTP requests. Note that this may be more
+than one request if \fICURLOPT_FOLLOWLOCATION(3)\fP is enabled.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long req;
+ res = curl_easy_getinfo(curl, CURLINFO_REQUEST_SIZE, &req);
+ if(!res)
+ printf("Request size: %ld bytes\\n", req);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_HEADER_SIZE "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_RESPONSE_CODE.3
index 9632fd837,000000000..e9ded3515
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_RESPONSE_CODE.3
+++ b/docs/libcurl/opts/GNURLINFO_RESPONSE_CODE.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_RESPONSE_CODE 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_RESPONSE_CODE \- get the last response code
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RESPONSE_CODE, long *codep);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the last received HTTP, FTP or SMTP
+response code. This option was previously known as CURLINFO_HTTP_CODE in
+libcurl 7.10.7 and earlier. The stored value will be zero if no server
+response code has been received. Note that a proxy's CONNECT response should
+be read with \fICURLINFO_HTTP_CONNECTCODE(3)\fP and not this.
+
+Support for SMTP responses added in 7.25.0.
+.SH PROTOCOLS
+HTTP, FTP and SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long response_code;
+ curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10.8. CURLINFO_HTTP_CODE was added in 7.4.1.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_HTTP_CONNECTCODE "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_RETRY_AFTER.3
index 785c6b4df,000000000..eede14931
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_RETRY_AFTER.3
+++ b/docs/libcurl/opts/GNURLINFO_RETRY_AFTER.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_RETRY_AFTER 3 "6 Aug 2019" "libcurl 7.66.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_RETRY_AFTER \- returns the Retry-After retry delay
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RETRY_AFTER, curl_off_t
*retry);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t variable to receive the number of seconds the
- HTTP server suggesets the client should wait until the next request is
++HTTP server suggests the client should wait until the next request is
+issued. The information from the "Retry-After:" header.
+
+While the HTTP header might contain a fixed date string, the
+\fICURLINFO_RETRY_AFTER(3)\fP will always return number of seconds to wait -
+or zero if there was no header or the header couldn't be parsed.
+.SH DEFAULT
+Returns zero delay if there was no header.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ curl_off_t wait = 0;
+ curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &wait);
+ if(wait)
+ printf("Wait for %" CURL_FORMAT_CURL_OFF_T " seconds\\n", wait);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in curl 7.66.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_HEADERFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_RTSP_CLIENT_CSEQ.3
index 2efeb618a,000000000..1f163187c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/GNURLINFO_RTSP_CLIENT_CSEQ.3
@@@ -1,54 -1,0 +1,54 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_RTSP_CLIENT_CSEQ 3 "1 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_RTSP_CLIENT_CSEQ \- get the next RTSP client CSeq
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_CLIENT_CSEQ, long
*cseq);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the next CSeq that will be used by the
+application.
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://rtsp.example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long cseq;
+ curl_easy_getinfo(curl, CURLINFO_RTSP_CLIENT_CSEQ, &cseq);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_RTSP_CSEQ_RECV.3
index added9c70,000000000..1ff4fd09f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_RTSP_CSEQ_RECV.3
+++ b/docs/libcurl/opts/GNURLINFO_RTSP_CSEQ_RECV.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_RTSP_CSEQ_RECV 3 "12 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_RTSP_CSEQ_RECV \- get the recently received CSeq
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_CSEQ_RECV, long *cseq);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the most recently received CSeq from the
+server. If your application encounters a \fICURLE_RTSP_CSEQ_ERROR\fP then you
+may wish to troubleshoot and/or fix the CSeq mismatch by peeking at this
+value.
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://rtsp.example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long cseq;
+ curl_easy_getinfo(curl, CURLINFO_RTSP_CSEQ_RECV, &cseq);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_RTSP_SERVER_CSEQ.3
index 88abb0709,000000000..82b1a6b59
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/GNURLINFO_RTSP_SERVER_CSEQ.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_RTSP_SERVER_CSEQ 3 "1 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_RTSP_SERVER_CSEQ \- get the next RTSP server CSeq
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_SERVER_CSEQ, long
*cseq);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the next CSeq that will be expected by the
+application.
+
+Llistening for server initiated requests is currently unimplemented!
+
+Applications wishing to resume an RTSP session on another connection should
+retrieve this info before closing the active connection.
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://rtsp.example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ long cseq;
+ curl_easy_getinfo(curl, CURLINFO_RTSP_SERVER_CSEQ, &cseq);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_RTSP_SESSION_ID.3
index c2a2df18e,000000000..dc66fee4c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/GNURLINFO_RTSP_SESSION_ID.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_RTSP_SESSION_ID 3 "12 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_RTSP_SESSION_ID \- get RTSP session ID
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_SESSION_ID, char **id);
+.SH DESCRIPTION
+Pass a pointer to a char pointer to receive a pointer to a string holding the
+most recent RTSP Session ID.
+
+Applications wishing to resume an RTSP session on another connection should
+retrieve this info before closing the active connection.
+
+The \fBid\fP pointer will be NULL or pointing to private memory you MUST NOT
+free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://rtsp.example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ char *id;
+ curl_easy_getinfo(curl, CURLINFO_RTSP_SESSION_ID, &id);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SCHEME.3
index 13f0a023a,000000000..8c983d04d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SCHEME.3
+++ b/docs/libcurl/opts/GNURLINFO_SCHEME.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SCHEME 3 "23 November 2016" "libcurl 7.52.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the
connection
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SCHEME, char **scheme);
+.SH DESCRIPTION
+Pass a pointer to a char pointer to receive the pointer to a null-terminated
+string holding the URL scheme used for the most recent connection done with
+this CURL \fBhandle\fP.
+
+The \fBscheme\fP pointer will be NULL or pointing to private memory you MUST
+NOT free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ char *scheme = NULL;
+ curl_easy_getinfo(curl, CURLINFO_SCHEME, &scheme);
+ if(scheme)
+ printf("scheme: %s\\n", scheme); /* scheme: HTTP */
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLINFO_RESPONSE_CODE "(3), "
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SIZE_DOWNLOAD.3
index f3c224fd6,000000000..d849103e3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SIZE_DOWNLOAD.3
+++ b/docs/libcurl/opts/GNURLINFO_SIZE_DOWNLOAD.3
@@@ -1,67 -1,0 +1,67 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SIZE_DOWNLOAD 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_DOWNLOAD, double *dlp);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the total amount of bytes that were
+downloaded. The amount is only for the latest transfer and will be reset
+again for each new transfer. This counts actual payload data, what's also
+commonly called body. All meta and header data are excluded and will not be
+counted in this number.
+
+\fICURLINFO_SIZE_DOWNLOAD_T(3)\fP is a newer replacement that returns a more
+sensible variable type.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ double dl;
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &dl);
+ if(!res) {
+ printf("Downloaded %.0f bytes\\n", cl);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD_T "(3), "
+.BR CURLINFO_SIZE_UPLOAD_T "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SIZE_DOWNLOAD_T.3
index bee15f477,000000000..ac17a10ec
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SIZE_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/GNURLINFO_SIZE_DOWNLOAD_T.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SIZE_DOWNLOAD_T 3 "25 May 2017" "libcurl 7.55.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_DOWNLOAD_T, curl_off_t
*dlp);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the total amount of bytes that
+were downloaded. The amount is only for the latest transfer and will be reset
+again for each new transfer. This counts actual payload data, what's also
+commonly called body. All meta and header data are excluded and will not be
+counted in this number.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* check the size */
+ curl_off_t dl;
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD_T, &dl);
+ if(!res) {
+ printf("Downloaded %" CURL_FORMAT_CURL_OFF_T " bytes\\n", dl);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD "(3), "
+.BR CURLINFO_SIZE_UPLOAD_T "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SIZE_UPLOAD.3
index 3915385ac,000000000..80e2cced5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SIZE_UPLOAD.3
+++ b/docs/libcurl/opts/GNURLINFO_SIZE_UPLOAD.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SIZE_UPLOAD 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_UPLOAD, double
*uploadp);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the total amount of bytes that were
+uploaded.
+
+\fICURLINFO_SIZE_UPLOAD_T(3)\fP is a newer replacement that returns a more
+sensible variable type.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ double ul;
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &ul);
+ if(!res) {
+ printf("Uploaded %.0f bytes\\n", ul);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD_T "(3), " CURLINFO_SIZE_UPLOAD_T "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SIZE_UPLOAD_T.3
index d042d7d7e,000000000..727a01013
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SIZE_UPLOAD_T.3
+++ b/docs/libcurl/opts/GNURLINFO_SIZE_UPLOAD_T.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SIZE_UPLOAD_T 3 "25 May 2017" "libcurl 7.55.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_UPLOAD_T, curl_off_t
*uploadp);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the total amount of bytes that
+were uploaded.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ curl_off_t ul;
+ res = curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD_T, &ul);
+ if(!res) {
+ printf("Uploaded %" CURL_FORMAT_CURL_OFF_T " bytes\\n", ul);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SIZE_DOWNLOAD_T "(3), " CURLINFO_SIZE_UPLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SPEED_DOWNLOAD.3
index b30e1c183,000000000..93c5238d8
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SPEED_DOWNLOAD.3
+++ b/docs/libcurl/opts/GNURLINFO_SPEED_DOWNLOAD.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SPEED_DOWNLOAD 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_SPEED_DOWNLOAD \- get download speed
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_DOWNLOAD, double
*speed);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the average download speed that curl
+measured for the complete download. Measured in bytes/second.
+
+\fICURLINFO_SPEED_DOWNLOAD_T(3)\fP is a newer replacement that returns a more
+sensible variable type.
+.SH PROTOCOLS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ double speed;
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD, &speed);
+ if(!res) {
+ printf("Download speed %.0f bytes/sec\\n", ul);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SPEED_UPLOAD "(3), "
+.BR CURLINFO_SIZE_UPLOAD_T "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SPEED_DOWNLOAD_T.3
index 2c574b44e,000000000..f963d9029
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SPEED_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/GNURLINFO_SPEED_DOWNLOAD_T.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SPEED_DOWNLOAD_T 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_SPEED_DOWNLOAD_T \- get download speed
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_DOWNLOAD_T,
curl_off_t *speed);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the average download speed
+that curl measured for the complete download. Measured in bytes/second.
+.SH PROTOCOLS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ curl_off_t speed;
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD_T, &speed);
+ if(!res) {
+ printf("Download speed %" CURL_FORMAT_CURL_OFF_T " bytes/sec\\n",
speed);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SPEED_UPLOAD "(3), "
+.BR CURLINFO_SIZE_UPLOAD_T "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SPEED_UPLOAD.3
index 5ab3d92fe,000000000..775091e96
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SPEED_UPLOAD.3
+++ b/docs/libcurl/opts/GNURLINFO_SPEED_UPLOAD.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SPEED_UPLOAD 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_SPEED_UPLOAD \- get upload speed
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_UPLOAD, double
*speed);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the average upload speed that curl
+measured for the complete upload. Measured in bytes/second.
+
+\fICURLINFO_SPEED_UPLOAD_T(3)\fP is a newer replacement that returns a more
+sensible variable type.
+.SH PROTOCOLS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ double speed;
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &speed);
+ if(!res) {
+ printf("Upload speed %.0f bytes/sec\\n", ul);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SPEED_DOWNLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SPEED_UPLOAD_T.3
index 7959222d3,000000000..c8ada230a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SPEED_UPLOAD_T.3
+++ b/docs/libcurl/opts/GNURLINFO_SPEED_UPLOAD_T.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SPEED_UPLOAD_T 3 "25 May 2017" "libcurl 7.55.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_SPEED_UPLOAD_T \- get upload speed
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_UPLOAD_T, curl_off_t
*speed);
+.SH DESCRIPTION
+Pass a pointer to a \fIcurl_off_t\fP to receive the average upload speed that
+curl measured for the complete upload. Measured in bytes/second.
+.SH PROTOCOLS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Perform the request */
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ curl_off_t speed;
+ res = curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD_T, &speed);
+ if(!res) {
+ printf("Upload speed %" CURL_FORMAT_CURL_OFF_T " bytes/sec\\n", speed);
+ }
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_SPEED_DOWNLOAD_T "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SSL_ENGINES.3
index 9a0120bdf,000000000..640cc0ebc
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SSL_ENGINES.3
+++ b/docs/libcurl/opts/GNURLINFO_SSL_ENGINES.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SSL_ENGINES 3 "1 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_SSL_ENGINES \- get an slist of OpenSSL crypto-engines
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SSL_ENGINES,
+ struct curl_slist **engine_list);
+.SH DESCRIPTION
+Pass the address of a 'struct curl_slist *' to receive a linked-list of
+OpenSSL crypto-engines supported. Note that engines are normally implemented
+in separate dynamic libraries. Hence not all the returned engines may be
+available at run-time. \fBNOTE:\fP you must call \fIcurl_slist_free_all(3)\fP
+on the list pointer once you're done with it, as libcurl will not free the
+data for you.
+.SH PROTOCOLS
+All TLS based ones.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ struct curl_slist *engines;
+ res = curl_easy_getinfo(curl, CURLINFO_SSL_ENGINES, &engines);
+ if((res == CURLE_OK) && engines) {
+ /* we have a list, free it when done using it */
+ curl_slist_free_all(engines);
+ }
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.12.3. Available in OpenSSL builds with "engine" support.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_SSL_VERIFYRESULT.3
index 5b4d64341,000000000..a71efe758
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/GNURLINFO_SSL_VERIFYRESULT.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_SSL_VERIFYRESULT 3 "1 Sep 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SSL_VERIFYRESULT, long
*result);
+.SH DESCRIPTION
+Pass a pointer to a long to receive the result of the server SSL certificate
+verification that was requested (using the \fICURLOPT_SSL_VERIFYPEER(3)\fP
+option).
+
+0 is a positive result. Non-zero is an error.
+.SH PROTOCOLS
+All using TLS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ long verifyresult;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ curl_easy_getinfo(curl, CURLINFO_SSL_VERIFYRESULT, &verifyresult);
+ printf("The peer verification said %s\\n", verifyresult?
+ "BAAAD":"fine");
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.5. Only set by the OpenSSL/libressl/boringssl, NSS and GnuTLS
backends.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_STARTTRANSFER_TIME.3
index 6ac4707c8,000000000..0335846f9
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_STARTTRANSFER_TIME.3
+++ b/docs/libcurl/opts/GNURLINFO_STARTTRANSFER_TIME.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_STARTTRANSFER_TIME 3 "28 Aug 2015" "libcurl 7.44.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_STARTTRANSFER_TIME \- get the time until the first byte is received
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_STARTTRANSFER_TIME, double
*timep);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the time, in seconds, it took from the
+start until the first byte is received by libcurl. This includes
+\fICURLINFO_PRETRANSFER_TIME(3)\fP and also the time the server needs to
+calculate the result.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double start;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME, &start);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", start);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.9.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_STARTTRANSFER_TIME_T "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_STARTTRANSFER_TIME_T.3
index db71fd8e2,000000000..da8e17e9e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_STARTTRANSFER_TIME_T.3
+++ b/docs/libcurl/opts/GNURLINFO_STARTTRANSFER_TIME_T.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_STARTTRANSFER_TIME_T 3 "28 Apr 2018" "libcurl 7.61.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_STARTTRANSFER_TIME_T \- get the time until the first byte is received
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_STARTTRANSFER_TIME_T,
curl_off_t *timep);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t to receive the time, in microseconds,
+it took from the
+start until the first byte is received by libcurl. This includes
+\fICURLINFO_PRETRANSFER_TIME_T(3)\fP and also the time the server needs to
+calculate the result.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_off_t start;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME_T, &start);
+ if(CURLE_OK == res) {
+ printf("Time: %" CURL_FORMAT_CURL_OFF_T ".%06ld", start / 1000000,
+ (long)(start % 1000000));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.61.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
CURLINFO_STARTTRANSFER_TIME "(3)"
diff --cc docs/libcurl/opts/GNURLINFO_TLS_SESSION.3
index 293fb0217,000000000..0ad56e4ab
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_TLS_SESSION.3
+++ b/docs/libcurl/opts/GNURLINFO_TLS_SESSION.3
@@@ -1,70 -1,0 +1,70 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_TLS_SESSION 3 "12 Sep 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_TLS_SESSION \- get TLS session info
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_TLS_SESSION,
+ struct curl_tlssessioninfo **session);
+.SH DESCRIPTION
+\fBThis option has been superseded\fP by \fICURLINFO_TLS_SSL_PTR(3)\fP which
+was added in 7.48.0. The only reason you would use this option instead is if
+you could be using a version of libcurl earlier than 7.48.0.
+
+This option is exactly the same as \fICURLINFO_TLS_SSL_PTR(3)\fP except in the
+case of OpenSSL. If the session \fIbackend\fP is CURLSSLBACKEND_OPENSSL the
+session \fIinternals\fP pointer varies depending on the option:
+
+CURLINFO_TLS_SESSION OpenSSL session \fIinternals\fP is SSL_CTX *.
+
+CURLINFO_TLS_SSL_PTR OpenSSL session \fIinternals\fP is SSL *.
+
+You can obtain an SSL_CTX pointer from an SSL pointer using OpenSSL function
+SSL_get_SSL_CTX. Therefore unless you need compatibility with older versions
of
+libcurl use \fICURLINFO_TLS_SSL_PTR(3)\fP. Refer to that document for more
+information.
+.SH PROTOCOLS
+All TLS-based
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ struct curl_tlssessioninfo *tls;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ res = curl_easy_perform(curl);
+ curl_easy_getinfo(curl, CURLINFO_TLS_SESSION, &tls);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.34.0, and supported OpenSSL, GnuTLS, NSS and gskit only up until
+7.48.0 was released.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_TLS_SSL_PTR "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_TLS_SSL_PTR.3
index c4674e75b,000000000..99129fb77
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_TLS_SSL_PTR.3
+++ b/docs/libcurl/opts/GNURLINFO_TLS_SSL_PTR.3
@@@ -1,168 -1,0 +1,168 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_TLS_SSL_PTR 3 "23 Feb 2016" "libcurl 7.48.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_TLS_SSL_PTR,
+ struct curl_tlssessioninfo **session);
+
+/* if you need compatibility with libcurl < 7.48.0 use
+ CURLINFO_TLS_SESSION instead: */
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_TLS_SESSION,
+ struct curl_tlssessioninfo **session);
+.SH DESCRIPTION
+Pass a pointer to a 'struct curl_tlssessioninfo *'. The pointer will be
+initialized to refer to a 'struct curl_tlssessioninfo *' that will contain an
+enum indicating the SSL library used for the handshake and a pointer to the
+respective internal TLS session structure of this underlying SSL library.
+
+This option may be useful for example to extract certificate information in a
+format convenient for further processing, such as manual validation. Refer to
+the \fBLIMITATIONS\fP section.
+
+.nf
+struct curl_tlssessioninfo {
+ curl_sslbackend backend;
+ void *internals;
+};
+.fi
+
+The \fIbackend\fP struct member is one of the defines in the CURLSSLBACKEND_*
+series: CURLSSLBACKEND_NONE (when built without TLS support),
+CURLSSLBACKEND_WOLFSSL, CURLSSLBACKEND_SECURETRANSPORT, CURLSSLBACKEND_GNUTLS,
+CURLSSLBACKEND_GSKIT, CURLSSLBACKEND_MBEDTLS, CURLSSLBACKEND_NSS,
+CURLSSLBACKEND_OPENSSL, CURLSSLBACKEND_SCHANNEL or
+CURLSSLBACKEND_MESALINK. (Note that the OpenSSL forks are all reported as just
+OpenSSL here.)
+
+The \fIinternals\fP struct member will point to a TLS library specific pointer
+for the active ("in use") SSL connection, with the following underlying types:
+.RS
+.IP GnuTLS
+gnutls_session_t
+.IP gskit
+gsk_handle
+.IP NSS
+PRFileDesc *
+.IP OpenSSL
+CURLINFO_TLS_SESSION: SSL_CTX *
+
+CURLINFO_TLS_SSL_PTR: SSL *
+.RE
+Since 7.48.0 the \fIinternals\fP member can point to these other SSL backends
+as well:
+.RS
+.IP mbedTLS
+mbedtls_ssl_context *
+.IP "Secure Channel"
+CtxtHandle *
+.IP "Secure Transport"
+SSLContext *
+.IP "wolfSSL"
+SSL *
+.IP "MesaLink"
+SSL *
+.RE
+
+If the \fIinternals\fP pointer is NULL then either the SSL backend is not
+supported, an SSL session has not yet been established or the connection is no
+longer associated with the easy handle (eg curl_easy_perform has returned).
+.SH LIMITATIONS
+This option has some limitations that could make it unsafe when it comes to
+the manual verification of certificates.
+
+This option only retrieves the first in-use SSL session pointer for your easy
+handle, however your easy handle may have more than one in-use SSL session if
+using FTP over SSL. That is because the FTP protocol has a control channel and
+a data channel and one or both may be over SSL. Currently there is no way to
+retrieve a second in-use SSL session associated with an easy handle.
+
+This option has not been thoroughly tested with plaintext protocols that can
+be upgraded/downgraded to/from SSL: FTP, SMTP, POP3, IMAP when used with
+\fICURLOPT_USE_SSL(3)\fP. Though you will be able to retrieve the SSL pointer,
+it's possible that before you can do that data (including auth) may have
+already been sent over a connection after it was upgraded.
+
+Renegotiation. If unsafe renegotiation or renegotiation in a way that the
+certificate is allowed to change is allowed by your SSL library this may occur
+and the certificate may change, and data may continue to be sent or received
+after renegotiation but before you are able to get the (possibly) changed SSL
+pointer, with the (possibly) changed certificate information.
+
+If you are using OpenSSL or wolfSSL then \fICURLOPT_SSL_CTX_FUNCTION(3)\fP can
+be used to set a certificate verification callback in the CTX. That is safer
+than using this option to poll for certificate changes and doesn't suffer from
+any of the problems above. There is currently no way in libcurl to set a
+verification callback for the other SSL backends.
+
+How are you using this option? Are you affected by any of these limitations?
+Please let us know by making a comment at
+https://github.com/curl/curl/issues/685
+.SH PROTOCOLS
+All TLS-based
+.SH EXAMPLE
+.nf
+#include <gnurl/curl.h>
+#include <openssl/ssl.h>
+
+CURL *curl;
+static size_t wf(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+ const struct curl_tlssessioninfo *info = NULL;
+ CURLcode res = curl_easy_getinfo(curl, CURLINFO_TLS_SSL_PTR, &info);
+ if(info && !res) {
+ if(CURLSSLBACKEND_OPENSSL == info->backend) {
+ printf("OpenSSL ver. %s\\n", SSL_get_version((SSL*)info->internals));
+ }
+ }
+ return size * nmemb;
+}
+
+int main(int argc, char** argv)
+{
+ CURLcode res;
+ curl = curl_easy_init();
+ if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wf);
+ res = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+ }
+ return res;
+}
+.fi
+.SH AVAILABILITY
+Added in 7.48.0.
+
+This option supersedes \fICURLINFO_TLS_SESSION(3)\fP which was added in
7.34.0.
+This option is exactly the same as that option except in the case of OpenSSL.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
+.BR CURLINFO_TLS_SESSION "(3), "
diff --cc docs/libcurl/opts/GNURLINFO_TOTAL_TIME.3
index bab982cdc,000000000..54d334b2a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_TOTAL_TIME.3
+++ b/docs/libcurl/opts/GNURLINFO_TOTAL_TIME.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_TOTAL_TIME 3 "28 Aug 2015" "libcurl 7.44.0" "curl_easy_getinfo
options"
+.SH NAME
+CURLINFO_TOTAL_TIME \- get total time of previous transfer
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_TOTAL_TIME, double *timep);
+.SH DESCRIPTION
+Pass a pointer to a double to receive the total time in seconds for the
+previous transfer, including name resolving, TCP connect etc. The double
+represents the time in seconds, including fractions.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ double total;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total);
+ if(CURLE_OK == res) {
+ printf("Time: %.1f", total);
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.4.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), " CURLINFO_TOTAL_TIME_T
"(3)"
diff --cc docs/libcurl/opts/GNURLINFO_TOTAL_TIME_T.3
index 70cd7e567,000000000..330cd34ca
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLINFO_TOTAL_TIME_T.3
+++ b/docs/libcurl/opts/GNURLINFO_TOTAL_TIME_T.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLINFO_TOTAL_TIME_T 3 "28 Apr 2018" "libcurl 7.61.0"
"curl_easy_getinfo options"
+.SH NAME
+CURLINFO_TOTAL_TIME_T \- get total time of previous transfer in microseconds
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_TOTAL_TIME_T, curl_off_t
*timep);
+.SH DESCRIPTION
+Pass a pointer to a curl_off_t to receive the total time in microseconds
+for the previous transfer, including name resolving, TCP connect etc.
+The curl_off_t represents the time in microseconds.
+
+When a redirect is followed, the time from each request is added together.
+
+See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_off_t total;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME_T, &total);
+ if(CURLE_OK == res) {
+ printf("Time: %" CURL_FORMAT_CURL_OFF_T ".%06ld", total / 1000000,
+ (long)(total % 1000000));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.61.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), " CURLINFO_TOTAL_TIME
"(3)"
diff --cc docs/libcurl/opts/GNURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
index 4da4fed01,000000000..e30fd84e3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/GNURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
@@@ -1,54 -1,0 +1,54 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "4 Nov 2014" "libcurl 7.39.0"
"curl_multi_setopt options"
+.SH NAME
+CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle,
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, long size);
+.SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
+Pass a long with a \fBsize\fP in bytes. If a pipelined connection is currently
+processing a chunked (Transfer-encoding: chunked) request with a current chunk
+length larger than \fICURLMOPT_CHUNK_LENGTH_PENALTY_SIZE(3)\fP, that pipeline
+will not be considered for additional requests, even if it is shorter than
+\fICURLMOPT_MAX_PIPELINE_LENGTH(3)\fP.
+.SH DEFAULT
+The default value is 0, which means that the penalization is inactive.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURLM *m = curl_multi_init();
+long maxchunk = 10000;
+curl_multi_setopt(m, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, maxchunk);
+.fi
+.SH AVAILABILITY
+Added in 7.30.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE "(3), "
+.BR CURLMOPT_MAX_PIPELINE_LENGTH "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
index 884cb1d72,000000000..3c9201c6d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/GNURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
@@@ -1,53 -1,0 +1,53 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "4 Nov 2014" "libcurl 7.39.0"
"curl_multi_setopt options"
+.SH NAME
+CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle,
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, long size);
+.SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
+Pass a long with a \fBsize\fP in bytes. If a pipelined connection is currently
+processing a request with a Content-Length larger than this
+\fICURLMOPT_CONTENT_LENGTH_PENALTY_SIZE(3)\fP, that pipeline will then not be
+considered for additional requests, even if it is shorter than
+\fICURLMOPT_MAX_PIPELINE_LENGTH(3)\fP.
+.SH DEFAULT
+The default value is 0, which means that the size penalization is inactive.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURLM *m = curl_multi_init();
+long maxlength = 10000;
+curl_multi_setopt(m, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, maxlength);
+.fi
+.SH AVAILABILITY
+Added in 7.30.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_MAXCONNECTS.3
index 942918aca,000000000..14cc849fa
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/GNURLMOPT_MAXCONNECTS.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_MAXCONNECTS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt
options"
+.SH NAME
+CURLMOPT_MAXCONNECTS \- set size of connection cache
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAXCONNECTS, long max);
+.SH DESCRIPTION
+Pass a long indicating the \fBmax\fP. The set number will be used as the
+maximum amount of simultaneously open connections that libcurl may keep in its
+connection cache after completed use. By default libcurl will enlarge the size
+for each added easy handle to make it fit 4 times the number of added easy
+handles.
+
+By setting this option, you can prevent the cache size from growing beyond the
+limit set by you.
+
+When the cache is full, curl closes the oldest one in the cache to prevent the
+number of open connections from increasing.
+
+This option is for the multi handle's use only, when using the easy interface
+you should instead use the \fICURLOPT_MAXCONNECTS(3)\fP option.
+
+See \fICURLMOPT_MAX_TOTAL_CONNECTIONS(3)\fP for limiting the number of active
+connections.
+
+.SH DEFAULT
+See DESCRIPTION
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURLM *m = curl_multi_init();
+/* only keep 10 connections in the cache */
+curl_multi_setopt(m, CURLMOPT_MAXCONNECTS, 10L);
+.fi
+.SH AVAILABILITY
+Added in 7.16.3
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_MAX_HOST_CONNECTIONS "(3), "
+.BR CURLOPT_MAXCONNECTS "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_MAX_CONCURRENT_STREAMS.3
index 3e59209ad,000000000..ced56abfd
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_MAX_CONCURRENT_STREAMS.3
+++ b/docs/libcurl/opts/GNURLMOPT_MAX_CONCURRENT_STREAMS.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.Dd November 06, 2019
+.Dt GNURLMOPT_MAX_CONCURRENT_STREAMS 3
+.Os
+.Sh NAME
+.Nm CURLMOPT_MAX_CONCURRENT_STREAMS ,
+.Nm curl_multi_setopt
+.Nd set max concurrent streams for http2
+.Sh LIBRARY
+.Lb libgnurl
+.Sh SYNOPSIS
+.In gnurl/curl.h
+.Ft CURLMcode
+.Fn curl_multi_setopt "CURLM *handle" "CURLMOPT_MAX_CONCURRENT_STREAMS" "long
max"
+.Sh DESCRIPTION
+Pass a long indicating the
+.Fa max .
+The set number will be used as the
+maximum number of concurrent streams for a connections that libcurl should
+support on connections done using HTTP/2.
+Valid values range from 1 to 2147483647 (2^31 - 1) and defaults to 100. The
+value passed here would be honoured based on other system resources
+properties.
+.Sh DEFAULT
+100
+.Sh PROTOCOLS
+All
+.Sh EXAMPLES
+.Bd -literal -offset indent
+CURLM *m = curl_multi_init();
+/* max concurrent streams 200 */
+curl_multi_setopt(m, CURLMOPT_MAX_CONCURRENT_STREAMS, 200L);
+.Ed
+.Sh HISTORY
+.Nm
+first appeared in in curl 7.67.0.
+.Sh RETURN VALUES
+Returns
+.Va CURLM_OK
+if the option is supported, and
+.Va CURLM_UNKNOWN_OPTION
+if not.
+.Sh SEE ALSO
+.Xr GNURLOPT_MAXCONNECTS 3 ,
+.Xr GNURLMOPT_MAXCONNECTS 3
diff --cc docs/libcurl/opts/GNURLMOPT_MAX_HOST_CONNECTIONS.3
index 13455c71b,000000000..d2b9290c7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_MAX_HOST_CONNECTIONS.3
+++ b/docs/libcurl/opts/GNURLMOPT_MAX_HOST_CONNECTIONS.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_MAX_HOST_CONNECTIONS 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_multi_setopt options"
+.SH NAME
+CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single
host
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_HOST_CONNECTIONS,
long max);
+.SH DESCRIPTION
+Pass a long to indicate \fBmax\fP. The set number will be used as the maximum
+amount of simultaneously open connections to a single host (a host being the
+same as a host name + port number pair). For each new session to a host,
+libcurl will open a new connection up to the limit set by
+\fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP. When the limit is reached, the
+sessions will be pending until a connection becomes available. If
+\fICURLMOPT_PIPELINING(3)\fP is enabled, libcurl will try to pipeline if the
+host is capable of it.
+
+The default \fBmax\fP value is 0, unlimited. However, for backwards
+compatibility, setting it to 0 when \fICURLMOPT_PIPELINING(3)\fP is 1 will not
+be treated as unlimited. Instead it will open only 1 connection and try to
+pipeline on it.
+
+This set limit is also used for proxy connections, and then the proxy is
+considered to be the host for which this limit counts.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURLM *m = curl_multi_init();
+/* do no more than 2 connections per host */
+curl_multi_setopt(m, CURLMOPT_MAX_HOST_CONNECTIONS, 2L);
+.fi
+.SH AVAILABILITY
+Added in 7.30.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_MAXCONNECTS "(3), " CURLMOPT_MAX_TOTAL_CONNECTIONS "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_MAX_PIPELINE_LENGTH.3
index 63a856a3b,000000000..de0d7095f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_MAX_PIPELINE_LENGTH.3
+++ b/docs/libcurl/opts/GNURLMOPT_MAX_PIPELINE_LENGTH.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_MAX_PIPELINE_LENGTH 3 "4 Nov 2014" "libcurl 7.39.0"
"curl_multi_setopt options"
+.SH NAME
+CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_PIPELINE_LENGTH, long
max);
+.SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
+Pass a long. The set \fBmax\fP number will be used as the maximum amount of
+outstanding requests in an HTTP/1.1 pipelined connection. This option is only
+used for HTTP/1.1 pipelining, not for HTTP/2 multiplexing.
+
+When this limit is reached, libcurl will use another connection to the same
+host (see \fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP), or queue the request until
+one of the pipelines to the host is ready to accept a request. Thus, the
+total number of requests in-flight is \fICURLMOPT_MAX_HOST_CONNECTIONS(3)\fP *
+\fICURLMOPT_MAX_PIPELINE_LENGTH(3)\fP.
+.SH DEFAULT
+5
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURLM *m = curl_multi_init();
+/* set a more conservative pipe length */
+curl_multi_setopt(m, CURLMOPT_MAX_PIPELINE_LENGTH, 3L);
+.fi
+.SH AVAILABILITY
+Added in 7.30.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_MAX_HOST_CONNECTIONS "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_MAX_TOTAL_CONNECTIONS.3
index 733ba0293,000000000..45733cd6f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_MAX_TOTAL_CONNECTIONS.3
+++ b/docs/libcurl/opts/GNURLMOPT_MAX_TOTAL_CONNECTIONS.3
@@@ -1,54 -1,0 +1,54 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_MAX_TOTAL_CONNECTIONS 3 "4 Nov 2014" "libcurl 7.39.0"
"curl_multi_setopt options"
+.SH NAME
+CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_TOTAL_CONNECTIONS,
long amount);
+.SH DESCRIPTION
+Pass a long for the \fBamount\fP. The set number will be used as the maximum
+number of simultaneously open connections in total using this multi
+handle. For each new session, libcurl will open a new connection up to the
+limit set by \fICURLMOPT_MAX_TOTAL_CONNECTIONS(3)\fP. When the limit is
+reached, the sessions will be pending until there are available
+connections. If \fICURLMOPT_PIPELINING(3)\fP is enabled, libcurl will try to
+pipeline or use multiplexing if the host is capable of it.
+.SH DEFAULT
+The default value is 0, which means that there is no limit. It is then simply
+controlled by the number of easy handles added.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURLM *m = curl_multi_init();
+/* never do more than 15 connections */
+curl_multi_setopt(m, CURLMOPT_MAX_TOTAL_CONNECTIONS, 15L);
+.fi
+.SH AVAILABILITY
+Added in 7.30.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_MAXCONNECTS "(3), " CURLMOPT_MAX_HOST_CONNECTIONS "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_PIPELINING.3
index 95d0aad05,000000000..3e71a23e4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_PIPELINING.3
+++ b/docs/libcurl/opts/GNURLMOPT_PIPELINING.3
@@@ -1,89 -1,0 +1,89 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_PIPELINING 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt
options"
+.SH NAME
+CURLMOPT_PIPELINING \- enable HTTP pipelining and multiplexing
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING, long bitmask);
+.SH DESCRIPTION
+Pass in the \fBbitmask\fP parameter to instruct libcurl to enable HTTP
+pipelining and/or HTTP/2 multiplexing for this multi handle.
+
+When enabled, libcurl will attempt to use those protocol features when doing
+parallel requests to the same hosts.
+
+For pipelining, this means that if you add a second request that can use an
+already existing connection, the second request will be \&"piped" on the same
+connection rather than being executed in parallel.
+
+For multiplexing, this means that follow-up requests can re-use an existing
+connection and send the new request multiplexed over that at the same time as
+other transfers are already using that single connection.
+
+There are several other related options that are interesting to tweak and
+adjust to alter how libcurl spreads out requests on different connections or
+not etc.
+
+Before 7.43.0, this option was set to 1 and 0 to enable and disable HTTP/1.1
+pipelining.
+
+Starting in 7.43.0, \fBbitmask\fP's second bit also has a meaning, and you can
+ask for pipelining and multiplexing independently of each other by toggling
+the correct bits.
+.IP CURLPIPE_NOTHING (0)
+Default, which means doing no attempts at pipelining or multiplexing.
+.IP CURLPIPE_HTTP1 (1)
+If this bit is set, libcurl will try to pipeline HTTP/1.1 requests on
+connections that are already established and in use to hosts.
+
+This bit is deprecated and has no effect since version 7.62.0.
+.IP CURLPIPE_MULTIPLEX (2)
+If this bit is set, libcurl will try to multiplex the new transfer over an
+existing connection if possible. This requires HTTP/2.
+.SH DEFAULT
+Since 7.62.0, \fBCURLPIPE_MULTIPLEX\fP is enabled by default.
+
+Before that, default was \fBCURLPIPE_NOTHING\fP.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURLM *m = curl_multi_init();
+/* try HTTP/2 multiplexing */
+curl_multi_setopt(m, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+.fi
+.SH AVAILABILITY
+Added in 7.16.0. Multiplex support bit added in 7.43.0. HTTP/1 Pipelining
+support was disabled in 7.62.0.
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_MAX_PIPELINE_LENGTH "(3), "
+.BR CURLMOPT_PIPELINING_SITE_BL "(3), "
+.BR CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE "(3), "
+.BR CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE "(3), "
+.BR CURLMOPT_MAX_HOST_CONNECTIONS "(3), "
+.BR CURLMOPT_MAXCONNECTS "(3), "
+.BR CURLMOPT_MAX_HOST_CONNECTIONS "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_PIPELINING_SERVER_BL.3
index 46bce5f63,000000000..47c142854
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_PIPELINING_SERVER_BL.3
+++ b/docs/libcurl/opts/GNURLMOPT_PIPELINING_SERVER_BL.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_PIPELINING_SERVER_BL 3 "4 Nov 2014" "libcurl 7.39.0"
"curl_multi_setopt options"
+.SH NAME
+CURLMOPT_PIPELINING_SERVER_BL \- pipelining server block list
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SERVER_BL,
char **servers);
+.SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
+Pass a \fBservers\fP array of char *, ending with a NULL entry. This is a list
+of server types prefixes (in the Server: HTTP header) that are blocked from
+pipelining, i.e server types that are known to not support HTTP
+pipelining. The array is copied by libcurl.
+
+Note that the comparison matches if the Server: header begins with the string
+in the block list, i.e "Server: Ninja 1.2.3" and "Server: Ninja 1.4.0" can
+both be blocked by having "Ninja" in the list.
+
+Pass a NULL pointer to clear the block list.
+.SH DEFAULT
+The default value is NULL, which means that there is no block list.
+.SH PROTOCOLS
+.SH EXAMPLE
+.nf
+ char *server_block_list[] =
+ {
+ "Microsoft-IIS/6.0",
+ "nginx/0.8.54",
+ NULL
+ };
+
+ curl_multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_block_list);
+.fi
+.SH AVAILABILITY
+Added in 7.30.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_PIPELINING_SITE_BL "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_PIPELINING_SITE_BL.3
index ab42861e3,000000000..5856d43a1
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_PIPELINING_SITE_BL.3
+++ b/docs/libcurl/opts/GNURLMOPT_PIPELINING_SITE_BL.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_PIPELINING_SITE_BL 3 "4 Nov 2014" "libcurl 7.39.0"
"curl_multi_setopt options"
+.SH NAME
+CURLMOPT_PIPELINING_SITE_BL \- pipelining host block list
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SITE_BL, char
**hosts);
+.SH DESCRIPTION
+No function since pipelining was removed in 7.62.0.
+
+Pass a \fBhosts\fP array of char *, ending with a NULL entry. This is a list
+of sites that are blocked from pipelining, i.e sites that are known to not
+support HTTP pipelining. The array is copied by libcurl.
+
+Pass a NULL pointer to clear the block list.
+.SH DEFAULT
+The default value is NULL, which means that there is no block list.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+ char *site_block_list[] =
+ {
+ "www.haxx.se",
+ "www.example.com:1234",
+ NULL
+ };
+
+ curl_multi_setopt(m, CURLMOPT_PIPELINING_SITE_BL, site_block_list);
+.fi
+.SH AVAILABILITY
+Added in 7.30.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_PIPELINING_SERVER_BL "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_PUSHDATA.3
index 82ec928ae,000000000..5f6586a5c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_PUSHDATA.3
+++ b/docs/libcurl/opts/GNURLMOPT_PUSHDATA.3
@@@ -1,79 -1,0 +1,79 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_PUSHDATA 3 "1 Jun 2015" "libcurl 7.44.0" "curl_multi_setopt
options"
+.SH NAME
+CURLMOPT_PUSHDATA \- pointer to pass to push callback
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PUSHDATA, void *pointer);
+.fi
+.SH DESCRIPTION
+Set \fIpointer\fP to pass as the last argument to the
+\fICURLMOPT_PUSHFUNCTION(3)\fP callback. The pointer will not be touched or
+used by libcurl itself, only passed on to the callback function.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+/* only allow pushes for file names starting with "push-" */
+int push_callback(CURL *parent,
+ CURL *easy,
+ size_t num_headers,
+ struct curl_pushheaders *headers,
+ void *userp)
+{
+ char *headp;
+ int *transfers = (int *)userp;
+ FILE *out;
+ headp = curl_pushheader_byname(headers, ":path");
+ if(headp && !strncmp(headp, "/push-", 6)) {
+ fprintf(stderr, "The PATH is %s\\n", headp);
+
+ /* save the push here */
+ out = fopen("pushed-stream", "wb");
+
+ /* write to this file */
+ curl_easy_setopt(easy, CURLOPT_WRITEDATA, out);
+
+ (*transfers)++; /* one more */
+
+ return CURL_PUSH_OK;
+ }
+ return CURL_PUSH_DENY;
+}
+
+curl_multi_setopt(multi, CURLMOPT_PUSHFUNCTION, push_callback);
+curl_multi_setopt(multi, CURLMOPT_PUSHDATA, &counter);
+.fi
+.SH AVAILABILITY
+Added in 7.44.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_PUSHFUNCTION "(3), " CURLMOPT_PIPELINING "(3), "
+.BR CURLOPT_PIPEWAIT "(3), "
+.BR RFC 7540
diff --cc docs/libcurl/opts/GNURLMOPT_PUSHFUNCTION.3
index b9d5efcdc,000000000..5c15f9973
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_PUSHFUNCTION.3
+++ b/docs/libcurl/opts/GNURLMOPT_PUSHFUNCTION.3
@@@ -1,136 -1,0 +1,136 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_PUSHFUNCTION 3 "1 Jun 2015" "libcurl 7.44.0" "curl_multi_setopt
options"
+.SH NAME
+CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+char *curl_pushheader_bynum(struct curl_pushheaders *h, size_t num);
+char *curl_pushheader_byname(struct curl_pushheaders *h, const char *name);
+
+int curl_push_callback(CURL *parent,
+ CURL *easy,
+ size_t num_headers,
+ struct curl_pushheaders *headers,
+ void *userp);
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PUSHFUNCTION,
+ curl_push_callback func);
+.fi
+.SH DESCRIPTION
+This callback gets called when a new HTTP/2 stream is being pushed by the
+server (using the PUSH_PROMISE frame). If no push callback is set, all offered
+pushes will be denied automatically.
+.SH CALLBACK DESCRIPTION
+The callback gets its arguments like this:
+
+\fIparent\fP is the handle of the stream on which this push arrives. The new
+handle has been duphandle()d from the parent, meaning that it has gotten all
+its options inherited. It is then up to the application to alter any options
+if desired.
+
+\fIeasy\fP is a newly created handle that represents this upcoming transfer.
+
+\fInum_headers\fP is the number of name+value pairs that was received and can
+be accessed
+
+\fIheaders\fP is a handle used to access push headers using the accessor
+functions described below. This only accesses and provides the PUSH_PROMISE
+headers, the normal response headers will be provided in the header callback
+as usual.
+
+\fIuserp\fP is the pointer set with \fICURLMOPT_PUSHDATA(3)\fP
+
+If the callback returns CURL_PUSH_OK, the 'easy' handle will be added to the
+multi handle, the callback must not do that by itself.
+
+The callback can access PUSH_PROMISE headers with two accessor
+functions. These functions can only be used from within this callback and they
+can only access the PUSH_PROMISE headers. The normal response headers will be
+passed to the header callback for pushed streams just as for normal streams.
+.IP curl_pushheader_bynum
+Returns the header at index 'num' (or NULL). The returned pointer points to a
+"name:value" string that will be freed when this callback returns.
+.IP curl_pushheader_byname
+Returns the value for the given header name (or NULL). This is a shortcut so
+that the application doesn't have to loop through all headers to find the one
+it is interested in. The data pointed will be freed when this callback
+returns. If more than one header field use the same name, this returns only
+the first one.
+.SH CALLBACK RETURN VALUE
+.IP "CURL_PUSH_OK (0)"
+The application has accepted the stream and it can now start receiving data,
+the ownership of the CURL handle has been taken over by the application.
+.IP "CURL_PUSH_DENY (1)"
+The callback denies the stream and no data for this will reach the
+application, the easy handle will be destroyed by libcurl.
+.IP "CURL_PUSH_ERROROUT (2)"
+Returning this will reject the pushed stream and return an error back on the
+parent stream making it get closed with an error. (Added in curl 7.72.0)
+.IP *
+All other return codes are reserved for future use.
+.SH DEFAULT
+NULL, no callback
+.SH PROTOCOLS
+HTTP(S) (HTTP/2 only)
+.SH EXAMPLE
+.nf
+/* only allow pushes for file names starting with "push-" */
+int push_callback(CURL *parent,
+ CURL *easy,
+ size_t num_headers,
+ struct curl_pushheaders *headers,
+ void *userp)
+{
+ char *headp;
+ int *transfers = (int *)userp;
+ FILE *out;
+ headp = curl_pushheader_byname(headers, ":path");
+ if(headp && !strncmp(headp, "/push-", 6)) {
+ fprintf(stderr, "The PATH is %s\\n", headp);
+
+ /* save the push here */
+ out = fopen("pushed-stream", "wb");
+
+ /* write to this file */
+ curl_easy_setopt(easy, CURLOPT_WRITEDATA, out);
+
+ (*transfers)++; /* one more */
+
+ return CURL_PUSH_OK;
+ }
+ return CURL_PUSH_DENY;
+}
+
+curl_multi_setopt(multi, CURLMOPT_PUSHFUNCTION, push_callback);
+curl_multi_setopt(multi, CURLMOPT_PUSHDATA, &counter);
+.fi
+.SH AVAILABILITY
+Added in 7.44.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_PUSHDATA "(3), " CURLMOPT_PIPELINING "(3), " CURLOPT_PIPEWAIT
"(3), "
+.BR RFC 7540
diff --cc docs/libcurl/opts/GNURLMOPT_SOCKETDATA.3
index 10bff8bd7,000000000..2f1a9a1cc
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_SOCKETDATA.3
+++ b/docs/libcurl/opts/GNURLMOPT_SOCKETDATA.3
@@@ -1,76 -1,0 +1,76 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_SOCKETDATA 3 "3 Nov 2014" "libcurl 7.39.0" "curl_multi_setopt
options"
+.SH NAME
+CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_SOCKETDATA, void
*pointer);
+.SH DESCRIPTION
+A data \fIpointer\fP to pass to the socket callback set with the
+\fICURLMOPT_SOCKETFUNCTION(3)\fP option.
+
+This pointer will not be touched by libcurl but will only be passed in to the
+socket callbacks's \fBuserp\fP argument.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
+{
+ GlobalInfo *g = (GlobalInfo*) cbp;
+ SockInfo *fdp = (SockInfo*) sockp;
+
+ if(what == CURL_POLL_REMOVE) {
+ remsock(fdp);
+ }
+ else {
+ if(!fdp) {
+ addsock(s, e, what, g);
+ }
+ else {
+ setsock(fdp, s, e, what, g);
+ }
+ }
+ return 0;
+}
+
+main()
+{
+ GlobalInfo setup;
+ /* ... use socket callback and custom pointer */
+ curl_multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+ curl_multi_setopt(multi, CURLMOPT_SOCKETDATA, &setup);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.4
+.SH RETURN VALUE
+Returns CURLM_OK.
+.SH "SEE ALSO"
+.BR CURLMOPT_SOCKETFUNCTION "(3), " curl_multi_socket_action "(3), "
+.BR CURLMOPT_TIMERFUNCTION "(3) "
diff --cc docs/libcurl/opts/GNURLMOPT_SOCKETFUNCTION.3
index cd7b49dce,000000000..dd70220b4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_SOCKETFUNCTION.3
+++ b/docs/libcurl/opts/GNURLMOPT_SOCKETFUNCTION.3
@@@ -1,110 -1,0 +1,110 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_SOCKETFUNCTION 3 "3 Nov 2016" "libcurl 7.39.0"
"curl_multi_setopt options"
+.SH NAME
+CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+int socket_callback(CURL *easy, /* easy handle */
+ curl_socket_t s, /* socket */
+ int what, /* describes the socket */
+ void *userp, /* private callback pointer */
+ void *socketp); /* private socket pointer */
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_SOCKETFUNCTION,
socket_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+When the \fIcurl_multi_socket_action(3)\fP function is called, it informs the
+application about updates in the socket (file descriptor) status by doing
+none, one, or multiple calls to the \fBsocket_callback\fP. The callback
+function gets status updates with changes since the previous time the callback
+was called. If the given callback pointer is set to NULL, no callback will be
+called.
+.SH "CALLBACK ARGUMENTS"
+\fIeasy\fP identifies the specific transfer for which this update is related.
+
+\fIs\fP is the specific socket this function invocation concerns. If the
+\fBwhat\fP argument is not CURL_POLL_REMOVE then it holds information about
+what activity on this socket the application is supposed to
+monitor. Subsequent calls to this callback might update the \fBwhat\fP bits
+for a socket that is already monitored.
+
+\fBuserp\fP is set with \fICURLMOPT_SOCKETDATA(3)\fP.
+
+\fBsocketp\fP is set with \fIcurl_multi_assign(3)\fP or will be NULL.
+
+The \fBwhat\fP parameter informs the callback on the status of the given
+socket. It can hold one of these values:
+.IP CURL_POLL_IN
+Wait for incoming data. For the socket to become readable.
+.IP CURL_POLL_OUT
+Wait for outgoing data. For the socket to become writable.
+.IP CURL_POLL_INOUT
+Wait for incoming and outgoing data. For the socket to become readable or
+writable.
+.IP CURL_POLL_REMOVE
+The specified socket/file descriptor is no longer used by libcurl.
+.SH DEFAULT
+NULL (no callback)
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
+{
+ GlobalInfo *g = (GlobalInfo*) cbp;
+ SockInfo *fdp = (SockInfo*) sockp;
+
+ if(what == CURL_POLL_REMOVE) {
+ remsock(fdp);
+ }
+ else {
+ if(!fdp) {
+ addsock(s, e, what, g);
+ }
+ else {
+ setsock(fdp, s, e, what, g);
+ }
+ }
+ return 0;
+}
+
+main()
+{
+ GlobalInfo setup;
+ /* ... use socket callback and custom pointer */
+ curl_multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+ curl_multi_setopt(multi, CURLMOPT_SOCKETDATA, &setup);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.4
+.SH RETURN VALUE
+Returns CURLM_OK.
+.SH "SEE ALSO"
+.BR CURLMOPT_SOCKETDATA "(3), " curl_multi_socket_action "(3), "
+.BR CURLMOPT_TIMERFUNCTION "(3) "
diff --cc docs/libcurl/opts/GNURLMOPT_TIMERDATA.3
index 29ad19160,000000000..0e54ed23c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_TIMERDATA.3
+++ b/docs/libcurl/opts/GNURLMOPT_TIMERDATA.3
@@@ -1,82 -1,0 +1,82 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_TIMERDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_multi_setopt
options"
+.SH NAME
+CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_TIMERDATA, void *pointer);
+.SH DESCRIPTION
+A data \fBpointer\fP to pass to the timer callback set with the
+\fICURLMOPT_TIMERFUNCTION(3)\fP option.
+
+This pointer will not be touched by libcurl but will only be passed in to the
+timer callbacks's \fBuserp\fP argument.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+static gboolean timeout_cb(gpointer user_data)
+{
+ int running;
+ if(user_data) {
+ g_free(user_data);
+ curl_multi_setopt(curl_handle, CURLMOPT_TIMERDATA, NULL);
+ }
+ curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
+ return G_SOURCE_REMOVE;
+}
+
+static int timerfunc(CURLM *multi, long timeout_ms, void *userp)
+{
+ guint *id = userp;
+
+ if(id)
+ g_source_remove(*id);
+
+ /* -1 means we should just delete our timer. */
+ if(timeout_ms == -1) {
+ g_free(id);
+ id = NULL;
+ }
+ else {
+ if(!id)
+ id = g_new(guint, 1);
+ *id = g_timeout_add(timeout_ms, timeout_cb, id);
+ }
+ curl_multi_setopt(multi, CURLMOPT_TIMERDATA, id);
+ return 0;
+}
+
+curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, timerfunc);
+.fi
+.SH AVAILABILITY
+Added in 7.16.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_TIMERFUNCTION "(3), " CURLMOPT_SOCKETFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLMOPT_TIMERFUNCTION.3
index 1e2d64862,000000000..46d5b5157
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLMOPT_TIMERFUNCTION.3
+++ b/docs/libcurl/opts/GNURLMOPT_TIMERFUNCTION.3
@@@ -1,107 -1,0 +1,107 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLMOPT_TIMERFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_multi_setopt options"
+.SH NAME
+CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+int timer_callback(CURLM *multi, /* multi handle */
+ long timeout_ms, /* timeout in number of ms */
+ void *userp); /* private callback pointer */
+
+CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_TIMERFUNCTION,
timer_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+Certain features, such as timeouts and retries, require you to call libcurl
+even when there is no activity on the file descriptors.
+
+Your callback function \fBtimer_callback\fP should install a non-repeating
+timer with an interval of \fBtimeout_ms\fP. When time that timer fires, call
+either \fIcurl_multi_socket_action(3)\fP or \fIcurl_multi_perform(3)\fP,
+depending on which interface you use.
+
+A \fBtimeout_ms\fP value of -1 passed to this callback means you should delete
+the timer. All other values are valid expire times in number of milliseconds.
+
+The \fBtimer_callback\fP will only be called when the timeout expire time is
+changed.
+
+The \fBuserp\fP pointer is set with \fICURLMOPT_TIMERDATA(3)\fP.
+
+The timer callback should return 0 on success, and -1 on error. This callback
+can be used instead of, or in addition to, \fIcurl_multi_timeout(3)\fP.
+
+\fBWARNING:\fP even if it feels tempting, avoid calling libcurl directly from
+within the callback itself when the \fBtimeout_ms\fP value is zero, since it
+risks triggering an unpleasant recursive behavior that immediately calls
+another call to the callback with a zero timeout...
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+static gboolean timeout_cb(gpointer user_data)
+{
+ int running;
+ if(user_data) {
+ g_free(user_data);
+ curl_multi_setopt(curl_handle, CURLMOPT_TIMERDATA, NULL);
+ }
+ curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
+ return G_SOURCE_REMOVE;
+}
+
+static int timerfunc(CURLM *multi, long timeout_ms, void *userp)
+{
+ guint *id = userp;
+
+ if(id)
+ g_source_remove(*id);
+
+ /* -1 means we should just delete our timer. */
+ if(timeout_ms == -1) {
+ g_free(id);
+ id = NULL;
+ }
+ else {
+ if(!id)
+ id = g_new(guint, 1);
+ *id = g_timeout_add(timeout_ms, timeout_cb, id);
+ }
+ curl_multi_setopt(multi, CURLMOPT_TIMERDATA, id);
+ return 0;
+}
+
+curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, timerfunc);
+.fi
+.SH AVAILABILITY
+Added in 7.16.0
+.SH RETURN VALUE
+Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLMOPT_TIMERDATA "(3), " CURLMOPT_SOCKETFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_ABSTRACT_UNIX_SOCKET.3
index fbb25c4f6,000000000..ccb644a16
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_ABSTRACT_UNIX_SOCKET.3
+++ b/docs/libcurl/opts/GNURLOPT_ABSTRACT_UNIX_SOCKET.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_ABSTRACT_UNIX_SOCKET 3 "08 Jan 2017" "libcurl 7.53.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ABSTRACT_UNIX_SOCKET, char
*path);
+.SH DESCRIPTION
+Enables the use of an abstract Unix domain socket instead of establishing a
TCP
+connection to a host. The parameter should be a char * to a null-terminated
string
+holding the path of the socket. The path will be set to \fIpath\fP prefixed
by a
+NULL byte (this is the convention for abstract sockets, however it should be
stressed
+that the path passed to this function should not contain a leading NULL).
+
+On non-supporting platforms, the abstract address will be interpreted as an
empty
+string and fail gracefully, generating a run-time error.
+
+This option shares the same semantics as
+.BR CURLOPT_UNIX_SOCKET_PATH "(3)
+in which documentation more details can be found. Internally, these two
options share
+the same storage and therefore only one of them can be set per handle.
+
+.SH DEFAULT
+Default is NULL.
+.SH EXAMPLE
+.nf
+ curl_easy_setopt(curl_handle, CURLOPT_ABSTRACT_UNIX_SOCKET,
"/tmp/foo.sock");
+ curl_easy_setopt(curl_handle, CURLOPT_URL, "http://localhost/");
+.fi
+
+.SH AVAILABILITY
+Since 7.53.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_UNIX_SOCKET_PATH "(3), " unix "(7), "
diff --cc docs/libcurl/opts/GNURLOPT_ACCEPTTIMEOUT_MS.3
index d74e14960,000000000..2c1e09df4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_ACCEPTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/GNURLOPT_ACCEPTTIMEOUT_MS.3
@@@ -1,54 -1,0 +1,54 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_ACCEPTTIMEOUT_MS 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPTTIMEOUT_MS, long ms);
+.SH DESCRIPTION
+Pass a long telling libcurl the maximum number of milliseconds to wait for a
+server to connect back to libcurl when an active FTP connection is used.
+.SH DEFAULT
+60000 milliseconds
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/path/file");
+
+ /* wait no more than 5 seconds for FTP server responses */
+ curl_easy_setopt(curl, CURLOPT_ACCEPTTIMEOUT_MS, 5000L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.24.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_ACCEPT_ENCODING.3
index 2586b013d,000000000..f2be9198d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_ACCEPT_ENCODING.3
+++ b/docs/libcurl/opts/GNURLOPT_ACCEPT_ENCODING.3
@@@ -1,106 -1,0 +1,106 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_ACCEPT_ENCODING 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPT_ENCODING, char *enc);
+.SH DESCRIPTION
+Pass a char * argument specifying what encoding you'd like.
+
+Sets the contents of the Accept-Encoding: header sent in an HTTP request, and
+enables decoding of a response when a Content-Encoding: header is received.
+
+libcurl potentially supports several different compressed encodings depending
+on what support that has been built-in.
+
+To aid applications not having to bother about what specific algorithms this
+particular libcurl build supports, libcurl allows a zero-length string to be
+set ("") to ask for an Accept-Encoding: header to be used that contains all
+built-in supported encodings.
+
+Alternatively, you can specify exactly the encoding or list of encodings you
+want in the response. Four encodings are supported: \fIidentity\fP, meaning
+non-compressed, \fIdeflate\fP which requests the server to compress its
+response using the zlib algorithm, \fIgzip\fP which requests the gzip
+algorithm, (since curl 7.57.0) \fIbr\fP which is brotli and (since curl
+7.72.0) \fIzstd\fP which is zstd. Provide them in the string as a
+comma-separated list of accepted encodings, like:
+
+ "br, gzip, deflate".
+
+Set \fICURLOPT_ACCEPT_ENCODING(3)\fP to NULL to explicitly disable it, which
+makes libcurl not send an Accept-Encoding: header and not decompress received
+contents automatically.
+
+You can also opt to just include the Accept-Encoding: header in your request
+with \fICURLOPT_HTTPHEADER(3)\fP but then there will be no automatic
+decompressing when receiving data.
+
+This is a request, not an order; the server may or may not do it. This option
+must be set (to any non-NULL value) or else any unsolicited encoding done by
+the server is ignored.
+
+Servers might respond with Content-Encoding even without getting a
+Accept-Encoding: in the request. Servers might respond with a different
+Content-Encoding than what was asked for in the request.
+
+The Content-Length: servers send for a compressed response is supposed to
+indicate the length of the compressed content so when auto decoding is enabled
+it may not match the sum of bytes reported by the write callbacks (although,
+sending the length of the non-compressed content is a common server mistake).
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* enable all supported built-in compressions */
+ curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "");
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+This option was called CURLOPT_ENCODING before 7.21.6
+
+The specific libcurl you're using must have been built with zlib to be able to
+decompress gzip and deflate responses, with the brotli library to
+decompress brotli responses and with the zstd library to decompress zstd
+responses.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_TRANSFER_ENCODING "(3), " CURLOPT_HTTPHEADER "(3), "
+.BR CURLOPT_HTTP_CONTENT_DECODING "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_ADDRESS_SCOPE.3
index 75467fe20,000000000..706a24e4e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_ADDRESS_SCOPE.3
+++ b/docs/libcurl/opts/GNURLOPT_ADDRESS_SCOPE.3
@@@ -1,55 -1,0 +1,55 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_ADDRESS_SCOPE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_ADDRESS_SCOPE \- set scope id for IPv6 addresses
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ADDRESS_SCOPE, long scope);
+.SH DESCRIPTION
+Pass a long specifying the scope id value to use when connecting to IPv6
addresses.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All, when using IPv6
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ long my_scope_id;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ my_scope_id = if_nametoindex("eth0");
+ curl_easy_setopt(curl, CURLOPT_ADDRESS_SCOPE, my_scope_id);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+Returns CURLE_BAD_FUNCTION_ARGUMENT if set to a negative value.
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_ALTSVC.3
index d1d44629e,000000000..9ba1e7ef0
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_ALTSVC.3
+++ b/docs/libcurl/opts/GNURLOPT_ALTSVC.3
@@@ -1,63 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_ALTSVC 3 "5 Feb 2019" "libcurl 7.64.1" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_ALTSVC \- set alt-svc cache file name
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC, char *filename);
+.fi
- .SH EXPERIMENTAL
- Warning: this feature is early code and is marked as experimental. It can only
- be enabled by explicitly telling configure with \fB--enable-alt-svc\fP. You
are
- advised to not ship this in production before the experimental label is
- removed.
+.SH DESCRIPTION
+Pass in a pointer to a \fIfilename\fP to instruct libcurl to use that file as
+the Alt-Svc cache to read existing cache contents from and possibly also write
+it back to a after a transfer, unless \fBCURLALTSVC_READONLYFILE\fP is set in
+\fICURLOPT_ALTSVC_CTRL(3)\fP.
+
+Specify a blank file name ("") to make libcurl not load from a file at all.
+.SH DEFAULT
+NULL. The alt-svc cache is not read nor written to file.
+.SH PROTOCOLS
+HTTPS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_ALTSVC_CTRL, CURLALTSVC_H1);
+ curl_easy_setopt(curl, CURLOPT_ALTSVC, "altsvc-cache.txt");
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.64.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_ALTSVC_CTRL "(3), " CURLOPT_CONNECT_TO "(3), " CURLOPT_RESOLVE
"(3), "
+.BR CURLOPT_COOKIEFILE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_ALTSVC_CTRL.3
index 287da646e,000000000..6dc10bbc1
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_ALTSVC_CTRL.3
+++ b/docs/libcurl/opts/GNURLOPT_ALTSVC_CTRL.3
@@@ -1,92 -1,0 +1,82 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_ALTSVC_CTRL 3 "5 Feb 2019" "libcurl 7.64.1" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_ALTSVC_CTRL \- control alt-svc behavior
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
- #define CURLALTSVC_IMMEDIATELY (1<<0)
+#define CURLALTSVC_READONLYFILE (1<<2)
+#define CURLALTSVC_H1 (1<<3)
+#define CURLALTSVC_H2 (1<<4)
+#define CURLALTSVC_H3 (1<<5)
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC_CTRL, long bitmask);
+.fi
- .SH EXPERIMENTAL
- Warning: this feature is early code and is marked as experimental. It can only
- be enabled by explicitly telling configure with \fB--enable-alt-svc\fP. You
are
- advised to not ship this in production before the experimental label is
- removed.
+.SH DESCRIPTION
+Populate the long \fIbitmask\fP with the correct set of features to instruct
+libcurl how to handle Alt-Svc for the transfers using this handle.
+
+libcurl will only accept Alt-Svc headers over a secure transport, meaning
+HTTPS. It will also only complete a request to an alternative origin if that
+origin is properly hosted over HTTPS. These requirements are there to make
+sure both the source and the destination are legitimate.
+
+Setting any bit will enable the alt-svc engine.
- .IP "CURLALTSVC_IMMEDIATELY"
- If an Alt-Svc: header is received, this instructs libcurl to switch to one of
- those alternatives asap rather than to save it and use for the next
- request. (Not currently supported).
+.IP "CURLALTSVC_READONLYFILE"
+Do not write the alt-svc cache back to the file specified with
+\fICURLOPT_ALTSVC(3)\fP even if it gets updated. By default a file specified
+with that option will be read and written to as deemed necessary.
+.IP "CURLALTSVC_H1"
+Accept alternative services offered over HTTP/1.1.
+.IP "CURLALTSVC_H2"
+Accept alternative services offered over HTTP/2. This will only be used if
+libcurl was also built to actually support HTTP/2, otherwise this bit will be
+ignored.
+.IP "CURLALTSVC_H3"
+Accept alternative services offered over HTTP/3. This will only be used if
+libcurl was also built to actually support HTTP/3, otherwise this bit will be
+ignored.
+.SH DEFAULT
+Alt-Svc handling is disabled by default. If \fICURLOPT_ALTSVC(3)\fP is set,
+\fICURLOPT_ALTSVC_CTRL(3)\fP has a default value corresponding to
+CURLALTSVC_H1 | CURLALTSVC_H2 | CURLALTSVC_H3 - the HTTP/2 and HTTP/3 bits are
+only set if libcurl was built with support for those versions.
+.SH PROTOCOLS
+HTTPS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_ALTSVC_CTRL, CURLALTSVC_H1);
+ curl_easy_setopt(curl, CURLOPT_ALTSVC, "altsvc-cache.txt");
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.64.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_ALTSVC "(3), " CURLOPT_CONNECT_TO "(3), " CURLOPT_RESOLVE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_APPEND.3
index 69e293191,000000000..65eee1ea1
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_APPEND.3
+++ b/docs/libcurl/opts/GNURLOPT_APPEND.3
@@@ -1,55 -1,0 +1,55 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_APPEND 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_APPEND \- enable appending to the remote file
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_APPEND, long append);
+.SH DESCRIPTION
+A long parameter set to 1 tells the library to append to the remote file
+instead of overwrite it. This is only useful when uploading to an FTP site.
+.SH DEFAULT
+0 (disabled)
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/dir/to/newfile");
+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+ curl_easy_setopt(curl, CURLOPT_APPEND, 1L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+This option was known as CURLOPT_FTPAPPEND up to 7.16.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_DIRLISTONLY "(3), " CURLOPT_RESUME_FROM "(3), "
+.BR CURLOPT_UPLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_AUTOREFERER.3
index 9f0f2f527,000000000..77ab5ec1f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_AUTOREFERER.3
+++ b/docs/libcurl/opts/GNURLOPT_AUTOREFERER.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_AUTOREFERER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_AUTOREFERER \- automatically update the referer header
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_AUTOREFERER, long autorefer);
+.SH DESCRIPTION
+Pass a parameter set to 1 to enable this. When enabled, libcurl will
+automatically set the Referer: header field in HTTP requests where it follows
+a Location: redirect.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ /* follow redirects */
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+
+ /* set Referer: automatically when following redirects */
+ curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_REFERER "(3), " CURLOPT_FOLLOWLOCATION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_BUFFERSIZE.3
index 1607d02de,000000000..240fd5d02
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_BUFFERSIZE.3
+++ b/docs/libcurl/opts/GNURLOPT_BUFFERSIZE.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_BUFFERSIZE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_BUFFERSIZE \- set preferred receive buffer size
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_BUFFERSIZE, long size);
+.SH DESCRIPTION
+Pass a long specifying your preferred \fIsize\fP (in bytes) for the receive
+buffer in libcurl. The main point of this would be that the write callback
+gets called more often and with smaller chunks. Secondly, for some protocols,
+there's a benefit of having a larger buffer for performance.
+
+This is just treated as a request, not an order. You cannot be guaranteed to
+actually get the given size.
+
+This buffer size is by default \fICURL_MAX_WRITE_SIZE\fP (16kB). The maximum
+buffer size allowed to be set is \fICURL_MAX_READ_SIZE\fP (512kB). The minimum
+buffer size allowed to be set is 1024.
+.SH DEFAULT
+CURL_MAX_WRITE_SIZE (16kB)
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/foo.bin");
+
+ /* ask libcurl to allocate a larger receive buffer */
+ curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 120000L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10. Growing the buffer was added in 7.53.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAX_RECV_SPEED_LARGE "(3), " CURLOPT_WRITEFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CAINFO.3
index 83a86a643,000000000..44ae70232
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CAINFO.3
+++ b/docs/libcurl/opts/GNURLOPT_CAINFO.3
@@@ -1,83 -1,0 +1,83 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CAINFO 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAINFO, char *path);
+.SH DESCRIPTION
+Pass a char * to a null-terminated string naming a file holding one or more
+certificates to verify the peer with.
+
+If \fICURLOPT_SSL_VERIFYPEER(3)\fP is zero and you avoid verifying the
+server's certificate, \fICURLOPT_CAINFO(3)\fP need not even indicate an
+accessible file.
+
+This option is by default set to the system path where libcurl's cacert bundle
+is assumed to be stored, as established at build time.
+
+If curl is built against the NSS SSL library, the NSS PEM PKCS#11 module
+(libnsspem.so) needs to be available for this option to work properly.
+Starting with curl-7.55.0, if both \fICURLOPT_CAINFO(3)\fP and
+\fICURLOPT_CAPATH(3)\fP are unset, NSS-linked libcurl tries to load
+libnssckbi.so, which contains a more comprehensive set of trust information
+than supported by nss-pem, because libnssckbi.so also includes information
+about distrusted certificates.
+
+(iOS and macOS) When curl uses Secure Transport this option is supported. If
+the option is not set, then curl will use the certificates in the system and
+user Keychain to verify the peer.
+
+(Schannel) This option is supported for Schannel in Windows 7 or later but we
+recommend not using it until Windows 8 since it works better starting then.
+If the option is not set, then curl will use the certificates in the Windows'
+store of root certificates (the default for Schannel).
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+Built-in system specific. When curl is built with Secure Transport or
+Schannel, this option is not set by default.
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/certs/cabundle.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+For the SSL engines that don't support certificate files the CURLOPT_CAINFO
+option is ignored. Schannel support added in libcurl 7.60.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_CAPATH "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CAPATH.3
index 17ff2fb47,000000000..bf089b109
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CAPATH.3
+++ b/docs/libcurl/opts/GNURLOPT_CAPATH.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CAPATH 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_CAPATH \- specify directory holding CA certificates
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAPATH, char *capath);
+.SH DESCRIPTION
+Pass a char * to a null-terminated string naming a directory holding multiple
+CA certificates to verify the peer with. If libcurl is built against OpenSSL,
+the certificate directory must be prepared using the openssl c_rehash utility.
+This makes sense only when used in combination with the
+\fICURLOPT_SSL_VERIFYPEER(3)\fP option.
+
+The \fICURLOPT_CAPATH(3)\fP function apparently does not work in Windows due
+to some limitation in openssl.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CAPATH, "/etc/cert-dir");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+This option is supported by the OpenSSL, GnuTLS and mbedTLS (since 7.56.0)
+backends. The NSS backend provides the option only for backward compatibility.
+.SH RETURN VALUE
+CURLE_OK if supported; or an error such as:
+
+CURLE_NOT_BUILT_IN - Not supported by the SSL backend
+
+CURLE_UNKNOWN_OPTION
+
+CURLE_OUT_OF_MEMORY
+.SH "SEE ALSO"
+.BR CURLOPT_CAINFO "(3), "
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CERTINFO.3
index 0aba17e7c,000000000..a3d074616
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CERTINFO.3
+++ b/docs/libcurl/opts/GNURLOPT_CERTINFO.3
@@@ -1,78 -1,0 +1,78 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CERTINFO 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_CERTINFO \- request SSL certificate information
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CERTINFO, long certinfo);
+.SH DESCRIPTION
+Pass a long set to 1 to enable libcurl's certificate chain info gatherer. With
+this enabled, libcurl will extract lots of information and data about the
+certificates in the certificate chain used in the SSL connection. This data
+may then be retrieved after a transfer using \fIcurl_easy_getinfo(3)\fP and
+its option \fICURLINFO_CERTINFO(3)\fP.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All TLS-based
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
+
+ /* connect to any HTTPS site, trusted or not */
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+
+ curl_easy_setopt(curl, CURLOPT_CERTINFO, 1L);
+
+ res = curl_easy_perform(curl);
+
+ if (!res) {
+ struct curl_certinfo *ci;
+ res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &ci);
+
+ if (!res) {
+ printf("%d certs!\\n", ci->num_of_certs);
+
+ for(i = 0; i < ci->num_of_certs; i++) {
+ struct curl_slist *slist;
+
+ for(slist = ci->certinfo[i]; slist; slist = slist->next)
+ printf("%s\\n", slist->data);
+ }
+ }
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+This option is supported by the OpenSSL, GnuTLS, Schannel, NSS and GSKit
+backends.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CAINFO "(3), " CURLOPT_SSL_VERIFYPEER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CHUNK_BGN_FUNCTION.3
index a4ca84936,000000000..6f14562ea
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CHUNK_BGN_FUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_CHUNK_BGN_FUNCTION.3
@@@ -1,141 -1,0 +1,141 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CHUNK_BGN_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP
wildcardmatch
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+struct curl_fileinfo {
+ char *filename;
+ curlfiletype filetype;
+ time_t time; /* always zero! */
+ unsigned int perm;
+ int uid;
+ int gid;
+ curl_off_t size;
+ long int hardlinks;
+
+ struct {
+ /* If some of these fields is not NULL, it is a pointer to b_data. */
+ char *time;
+ char *perm;
+ char *user;
+ char *group;
+ char *target; /* pointer to the target filename of a symlink */
+ } strings;
+
+ unsigned int flags;
+
+ /* used internally */
+ char *b_data;
+ size_t b_size;
+ size_t b_used;
+};
+
+long chunk_bgn_callback(const void *transfer_info, void *ptr,
+ int remains);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_BGN_FUNCTION,
+ chunk_bgn_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This callback function gets called by libcurl before a part of the stream is
+going to be transferred (if the transfer supports chunks).
+
+The \fItransfer_info\fP pointer will point to a struct curl_fileinfo with
+details about the file that is about to get transferred.
+
+This callback makes sense only when using the \fICURLOPT_WILDCARDMATCH(3)\fP
+option for now.
+
+The target of transfer_info parameter is a "feature depended" structure. For
+the FTP wildcard download, the target is curl_fileinfo structure (see
+\fIgnurl/curl.h\fP). The parameter \fIptr\fP is a pointer given by
+\fICURLOPT_CHUNK_DATA(3)\fP. The parameter remains contains number of chunks
+remaining per the transfer. If the feature is not available, the parameter has
+zero value.
+
+Return \fICURL_CHUNK_BGN_FUNC_OK\fP if everything is fine,
+\fICURL_CHUNK_BGN_FUNC_SKIP\fP if you want to skip the concrete chunk or
+\fICURL_CHUNK_BGN_FUNC_FAIL\fP to tell libcurl to stop if some error occurred.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+static long file_is_coming(struct curl_fileinfo *finfo,
+ struct callback_data *data,
+ int remains)
+{
+ printf("%3d %40s %10luB ", remains, finfo->filename,
+ (unsigned long)finfo->size);
+
+ switch(finfo->filetype) {
+ case CURLFILETYPE_DIRECTORY:
+ printf(" DIR\\n");
+ break;
+ case CURLFILETYPE_FILE:
+ printf("FILE ");
+ break;
+ default:
+ printf("OTHER\\n");
+ break;
+ }
+
+ if(finfo->filetype == CURLFILETYPE_FILE) {
+ /* do not transfer files >= 50B */
+ if(finfo->size > 50) {
+ printf("SKIPPED\\n");
+ return CURL_CHUNK_BGN_FUNC_SKIP;
+ }
+
+ data->output = fopen(finfo->filename, "wb");
+ if(!data->output) {
+ return CURL_CHUNK_BGN_FUNC_FAIL;
+ }
+ }
+
+ return CURL_CHUNK_BGN_FUNC_OK;
+}
+
+int main()
+{
+ /* data for callback */
+ struct callback_data callback_info;
+
+ /* callback is called before download of concrete file started */
+ curl_easy_setopt(curl, CURLOPT_CHUNK_BGN_FUNCTION, file_is_coming);
+ curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, &callback_info);
+}
+.fi
+.SH AVAILABILITY
+This was added in 7.21.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CHUNK_END_FUNCTION "(3), " CURLOPT_WILDCARDMATCH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CHUNK_DATA.3
index 04572f405,000000000..3fdc26bf0
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CHUNK_DATA.3
+++ b/docs/libcurl/opts/GNURLOPT_CHUNK_DATA.3
@@@ -1,90 -1,0 +1,90 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CHUNK_DATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_DATA, void *pointer);
+.SH DESCRIPTION
+Pass a \fIpointer\fP that will be untouched by libcurl and passed as the ptr
+argument to the \fICURLOPT_CHUNK_BGN_FUNCTION(3)\fP and
+\fICURLOPT_CHUNK_END_FUNCTION(3)\fP.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+static long file_is_coming(struct curl_fileinfo *finfo,
+ struct callback_data *data,
+ int remains)
+{
+ printf("%3d %40s %10luB ", remains, finfo->filename,
+ (unsigned long)finfo->size);
+
+ switch(finfo->filetype) {
+ case CURLFILETYPE_DIRECTORY:
+ printf(" DIR\\n");
+ break;
+ case CURLFILETYPE_FILE:
+ printf("FILE ");
+ break;
+ default:
+ printf("OTHER\\n");
+ break;
+ }
+
+ if(finfo->filetype == CURLFILETYPE_FILE) {
+ /* do not transfer files >= 50B */
+ if(finfo->size > 50) {
+ printf("SKIPPED\\n");
+ return CURL_CHUNK_BGN_FUNC_SKIP;
+ }
+
+ data->output = fopen(finfo->filename, "wb");
+ if(!data->output) {
+ return CURL_CHUNK_BGN_FUNC_FAIL;
+ }
+ }
+
+ return CURL_CHUNK_BGN_FUNC_OK;
+}
+
+int main()
+{
+ /* data for callback */
+ struct callback_data callback_info;
+
+ /* callback is called before download of concrete file started */
+ curl_easy_setopt(curl, CURLOPT_CHUNK_BGN_FUNCTION, file_is_coming);
+ curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, &callback_info);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CHUNK_BGN_FUNCTION "(3), " CURLOPT_WILDCARDMATCH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CHUNK_END_FUNCTION.3
index d99d53e2e,000000000..69322bf68
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CHUNK_END_FUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_CHUNK_END_FUNCTION.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CHUNK_END_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+long chunk_end_callback(void *ptr);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_END_FUNCTION,
+ chunk_end_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This function gets called by libcurl as soon as a part of the stream has been
+transferred (or skipped).
+
+Return \fICURL_CHUNK_END_FUNC_OK\fP if everything is fine or
+\fBCURL_CHUNK_END_FUNC_FAIL\fP to tell the lib to stop if some error occurred.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+static long file_is_downloaded(struct callback_data *data)
+{
+ if(data->output) {
+ fclose(data->output);
+ data->output = 0x0;
+ }
+ return CURL_CHUNK_END_FUNC_OK;
+}
+
+int main()
+{
+ /* data for callback */
+ struct callback_data callback_info;
+ curl_easy_setopt(curl, CURLOPT_CHUNK_END_FUNCTION, file_is_downloaded);
+ curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, &callback_info);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_WILDCARDMATCH "(3), " CURLOPT_CHUNK_BGN_FUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CLOSESOCKETDATA.3
index dd9e69594,000000000..7772996d6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CLOSESOCKETDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_CLOSESOCKETDATA.3
@@@ -1,55 -1,0 +1,55 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CLOSESOCKETDATA 3 "16 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CLOSESOCKETDATA, void
*pointer);
+.SH DESCRIPTION
+Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first
+argument in the closesocket callback set with
+\fICURLOPT_CLOSESOCKETFUNCTION(3)\fP.
+.SH DEFAULT
+The default value of this parameter is NULL.
+.SH PROTOCOLS
+All except file:
+.SH EXAMPLE
+.nf
+static int closesocket(void *clientp, curl_socket_t item)
+{
+ printf("libcurl wants to close %d now\\n", (int)item);
+ return 0;
+}
+
+/* call this function to close sockets */
+curl_easy_setopt(curl, CURLOPT_CLOSESOCKETFUNCTION, closesocket);
+curl_easy_setopt(curl, CURLOPT_CLOSESOCKETDATA, &sockfd);
+.fi
+.SH AVAILABILITY
+Added in 7.21.7
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CLOSESOCKETFUNCTION "(3), " CURLOPT_OPENSOCKETFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CLOSESOCKETFUNCTION.3
index f7d8d45b4,000000000..41b0fdd97
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CLOSESOCKETFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_CLOSESOCKETFUNCTION.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CLOSESOCKETFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+int closesocket_callback(void *clientp, curl_socket_t item);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CLOSESOCKETFUNCTION,
closesocket_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This callback function gets called by libcurl instead of the \fIclose(3)\fP or
+\fIclosesocket(3)\fP call when sockets are closed (not for any other file
+descriptors). This is pretty much the reverse to the
+\fICURLOPT_OPENSOCKETFUNCTION(3)\fP option. Return 0 to signal success and 1
+if there was an error.
+
+The \fIclientp\fP pointer is set with
+\fICURLOPT_CLOSESOCKETDATA(3)\fP. \fIitem\fP is the socket libcurl wants to be
+closed.
+.SH DEFAULT
+By default libcurl uses the standard socket close function.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+static int closesocket(void *clientp, curl_socket_t item)
+{
+ printf("libcurl wants to close %d now\\n", (int)item);
+ return 0;
+}
+
+/* call this function to close sockets */
+curl_easy_setopt(curl, CURLOPT_CLOSESOCKETFUNCTION, closesocket);
+curl_easy_setopt(curl, CURLOPT_CLOSESOCKETDATA, &sockfd);
+.fi
+.SH AVAILABILITY
+Added in 7.21.7
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CLOSESOCKETDATA "(3), " CURLOPT_OPENSOCKETFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CONNECTTIMEOUT.3
index 60ee364f7,000000000..ca8d6f00c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CONNECTTIMEOUT.3
+++ b/docs/libcurl/opts/GNURLOPT_CONNECTTIMEOUT.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CONNECTTIMEOUT 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT, long timeout);
+.SH DESCRIPTION
+Pass a long. It should contain the maximum time in seconds that you allow the
+connection phase to the server to take. This only limits the connection
+phase, it has no impact once it has connected. Set to zero to switch to the
+default built-in connection timeout - 300 seconds. See also the
+\fICURLOPT_TIMEOUT(3)\fP option.
+
+In unix-like systems, this might cause signals to be used unless
+\fICURLOPT_NOSIGNAL(3)\fP is set.
+
+If both \fICURLOPT_CONNECTTIMEOUT(3)\fP and \fICURLOPT_CONNECTTIMEOUT_MS(3)\fP
+are set, the value set last will be used.
+.SH DEFAULT
+300
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* complete connection within 10 seconds */
+ curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK. Returns CURLE_BAD_FUNCTION_ARGUMENT if set to a negative
+value or a value that when converted to milliseconds is too large.
+.SH "SEE ALSO"
+.BR CURLOPT_CONNECTTIMEOUT_MS "(3), "
+.BR CURLOPT_TIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CONNECTTIMEOUT_MS.3
index da836e0c8,000000000..d8a0ac58e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CONNECTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/GNURLOPT_CONNECTTIMEOUT_MS.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CONNECTTIMEOUT_MS 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT_MS, long
timeout);
+.SH DESCRIPTION
+Pass a long. It should contain the maximum time in milliseconds that you allow
+the connection phase to the server to take. This only limits the connection
+phase, it has no impact once it has connected. Set to zero to switch to the
+default built-in connection timeout - 300 seconds. See also the
+\fICURLOPT_TIMEOUT_MS(3)\fP option.
+
+In unix-like systems, this might cause signals to be used unless
+\fICURLOPT_NOSIGNAL(3)\fP is set.
+
+If both \fICURLOPT_CONNECTTIMEOUT(3)\fP and \fICURLOPT_CONNECTTIMEOUT_MS(3)\fP
+are set, the value set last will be used.
+.SH DEFAULT
+300000
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* complete connection within 10000 milliseconds */
+ curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 10000L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_CONNECTTIMEOUT "(3), "
+.BR CURLOPT_TIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CONNECT_ONLY.3
index 6e7962760,000000000..9ee9654e2
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CONNECT_ONLY.3
+++ b/docs/libcurl/opts/GNURLOPT_CONNECT_ONLY.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CONNECT_ONLY 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_CONNECT_ONLY \- stop when connected to target server
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECT_ONLY, long only);
+.SH DESCRIPTION
+Pass a long. If the parameter equals 1, it tells the library to perform all
+the required proxy authentication and connection setup, but no data transfer,
+and then return.
+
+The option can be used to simply test a connection to a server, but is more
+useful when used with the \fICURLINFO_ACTIVESOCKET(3)\fP option to
+\fIcurl_easy_getinfo(3)\fP as the library can set up the connection and then
+the application can obtain the most recently used socket for special data
+transfers.
+
+Transfers marked connect only will not reuse any existing connections and
+connections marked connect only will not be allowed to get reused.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP, SMTP, POP3 and IMAP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
+ ret = curl_easy_perform(curl);
+ if(ret == CURLE_OK) {
+ /* only connected! */
+ }
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_VERBOSE "(3), " CURLOPT_HTTPPROXYTUNNEL "(3), "
+.BR curl_easy_recv "(3), " curl_easy_send "(3) "
diff --cc docs/libcurl/opts/GNURLOPT_CONNECT_TO.3
index a54121001,000000000..63532347a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CONNECT_TO.3
+++ b/docs/libcurl/opts/GNURLOPT_CONNECT_TO.3
@@@ -1,111 -1,0 +1,111 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CONNECT_TO 3 "10 April 2016" "libcurl 7.49.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_CONNECT_TO \- Connect to a specific host and port instead of the
URL's host and port
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECT_TO,
+ struct curl_slist *connect_to);
+.fi
+.SH DESCRIPTION
+Pass a pointer to a linked list of strings with "connect to" information to
+use for establishing network connections with this handle. The linked list
+should be a fully valid list of \fBstruct curl_slist\fP structs properly
+filled in. Use \fIcurl_slist_append(3)\fP to create the list and
+\fIcurl_slist_free_all(3)\fP to clean up an entire list.
+
+Each single string should be written using the format
+HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT where HOST is the host of the
+request, PORT is the port of the request, CONNECT-TO-HOST is the host name to
+connect to, and CONNECT-TO-PORT is the port to connect to.
+
+The first string that matches the request's host and port is used.
+
+Dotted numerical IP addresses are supported for HOST and CONNECT-TO-HOST.
+A numerical IPv6 address must be written within [brackets].
+
+Any of the four values may be empty. When the HOST or PORT is empty, the host
+or port will always match (the request's host or port is ignored).
+When CONNECT-TO-HOST or CONNECT-TO-PORT is empty, the "connect to" feature
+will be disabled for the host or port, and the request's host or port will be
+used to establish the network connection.
+
+This option is suitable to direct the request at a specific server, e.g. at a
+specific cluster node in a cluster of servers.
+
+The "connect to" host and port are only used to establish the network
+connection. They do NOT affect the host and port that are used for TLS/SSL
+(e.g. SNI, certificate verification) or for the application protocols.
+
+In contrast to \fICURLOPT_RESOLVE(3)\fP, the option
+\fICURLOPT_CONNECT_TO(3)\fP does not pre-populate the DNS cache and therefore
+it does not affect future transfers of other easy handles that have been added
+to the same multi handle.
+
+The "connect to" host and port are ignored if they are equal to the host and
+the port in the request URL, because connecting to the host and the port in
+the request URL is the default behavior.
+
+If an HTTP proxy is used for a request having a special "connect to" host or
+port, and the "connect to" host or port differs from the request's host and
+port, the HTTP proxy is automatically switched to tunnel mode for this
+specific request. This is necessary because it is not possible to connect to a
+specific host or port in normal (non-tunnel) mode.
+
+When this option is passed to \fIcurl_easy_setopt(3)\fP, libcurl will not copy
+the entire list so you \fBmust\fP keep it around until you no longer use this
+\fIhandle\fP for a transfer before you call \fIcurl_slist_free_all(3)\fP on
+the list.
+
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl;
+struct curl_slist *connect_to = NULL;
+connect_to = curl_slist_append(NULL, "example.com::server1.example.com:");
+
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_CONNECT_TO, connect_to);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_perform(curl);
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+
+curl_slist_free_all(connect_to);
+.fi
+.SH AVAILABILITY
+Added in 7.49.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_URL "(3), " CURLOPT_RESOLVE "(3), " CURLOPT_FOLLOWLOCATION "(3),
" CURLOPT_HTTPPROXYTUNNEL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CONV_FROM_NETWORK_FUNCTION.3
index 783395aec,000000000..dd1f32ad7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CONV_FROM_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_CONV_FROM_NETWORK_FUNCTION.3
@@@ -1,101 -1,0 +1,101 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host
encoding
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode conv_callback(char *ptr, size_t length);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_FROM_NETWORK_FUNCTION,
+ conv_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+Applies to non-ASCII platforms. \fIcurl_version_info(3)\fP will return the
+CURL_VERSION_CONV feature bit set if this option is provided.
+
+The data to be converted is in a buffer pointed to by the \fIptr\fP parameter.
+The amount of data to convert is indicated by the \fIlength\fP parameter. The
+converted data overlays the input data in the buffer pointed to by the ptr
+parameter. \fICURLE_OK\fP must be returned upon successful conversion. A
+CURLcode return value defined by curl.h, such as \fICURLE_CONV_FAILED\fP,
+should be returned if an error was encountered.
+
+\fBCURLOPT_CONV_FROM_NETWORK_FUNCTION\fP converts to host encoding from the
+network encoding. It is used when commands or ASCII data are received over
+the network.
+
+If you set a callback pointer to NULL, or don't set it at all, the built-in
+libcurl iconv functions will be used. If HAVE_ICONV was not defined when
+libcurl was built, and no callback has been established, conversion will
+return the CURLE_CONV_REQD error code.
+
+If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined.
+For example:
+
+ \&#define CURL_ICONV_CODESET_OF_HOST "IBM-1047"
+
+The iconv code in libcurl will default the network and UTF8 codeset names as
+follows:
+
+ \&#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1"
+
+ \&#define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8"
+
+You will need to override these definitions if they are different on your
+system.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP, SMTP, IMAP, POP3
+.SH EXAMPLE
+.nf
+static CURLcode my_conv_from_ascii_to_ebcdic(char *buffer, size_t length)
+{
+ char *tempptrin, *tempptrout;
+ size_t bytes = length;
+ int rc;
+ tempptrin = tempptrout = buffer;
+ rc = platform_a2e(&tempptrin, &bytes, &tempptrout, &bytes);
+ if(rc == PLATFORM_CONV_OK) {
+ return CURLE_OK;
+ }
+ else {
+ return CURLE_CONV_FAILED;
+ }
+}
+
+/* use platform-specific functions for codeset conversions */
+curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION,
+ my_conv_from_ascii_to_ebcdic);
+.fi
+.SH AVAILABILITY
+Available only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was
built.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CONV_TO_NETWORK_FUNCTION "(3), " CURLOPT_CONV_FROM_UTF8_FUNCTION
"(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CONV_FROM_UTF8_FUNCTION.3
index 42c0a976a,000000000..64ce846b5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CONV_FROM_UTF8_FUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_CONV_FROM_UTF8_FUNCTION.3
@@@ -1,99 -1,0 +1,99 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CONV_FROM_UTF8_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode conv_callback(char *ptr, size_t length);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_FROM_UTF8_FUNCTION,
+ conv_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+Applies to non-ASCII platforms. \fIcurl_version_info(3)\fP will return the
+CURL_VERSION_CONV feature bit set if this option is provided.
+
+The data to be converted is in a buffer pointed to by the \fIptr\fP parameter.
+The amount of data to convert is indicated by the \fIlength\fP parameter. The
+converted data overlays the input data in the buffer pointed to by the ptr
+parameter. \fICURLE_OK\fP must be returned upon successful conversion. A
+CURLcode return value defined by curl.h, such as \fICURLE_CONV_FAILED\fP,
+should be returned if an error was encountered.
+
+\fBCURLOPT_CONV_FROM_UTF8_FUNCTION\fP converts to host encoding from UTF8
+encoding. It is required only for SSL processing.
+
+If you set a callback pointer to NULL, or don't set it at all, the built-in
+libcurl iconv functions will be used. If HAVE_ICONV was not defined when
+libcurl was built, and no callback has been established, conversion will
+return the CURLE_CONV_REQD error code.
+
+If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined.
+For example:
+
+ \&#define CURL_ICONV_CODESET_OF_HOST "IBM-1047"
+
+The iconv code in libcurl will default the network and UTF8 codeset names as
+follows:
+
+ \&#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1"
+
+ \&#define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8"
+
+You will need to override these definitions if they are different on your
+system.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+TLS-based protocols.
+.SH EXAMPLE
+.nf
+static CURLcode my_conv_from_utf8_to_ebcdic(char *buffer, size_t length)
+{
+ char *tempptrin, *tempptrout;
+ size_t bytes = length;
+ int rc;
+ tempptrin = tempptrout = buffer;
+ rc = platform_u2e(&tempptrin, &bytes, &tempptrout, &bytes);
+ if(rc == PLATFORM_CONV_OK) {
+ return CURLE_OK;
+ }
+ else {
+ return CURLE_CONV_FAILED;
+ }
+}
+
+curl_easy_setopt(curl, CURLOPT_CONV_FROM_UTF8_FUNCTION,
+ my_conv_from_utf8_to_ebcdic);
+.fi
+.SH AVAILABILITY
+Available only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was
built.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CONV_TO_NETWORK_FUNCTION "(3), "
CURLOPT_CONV_FROM_NETWORK_FUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CONV_TO_NETWORK_FUNCTION.3
index b2a0629b4,000000000..5e81d8f41
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CONV_TO_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_CONV_TO_NETWORK_FUNCTION.3
@@@ -1,100 -1,0 +1,100 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CONV_TO_NETWORK_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode conv_callback(char *ptr, size_t length);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_TO_NETWORK_FUNCTION,
+ conv_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+Applies to non-ASCII platforms. \fIcurl_version_info(3)\fP will return the
+CURL_VERSION_CONV feature bit set if this option is provided.
+
+The data to be converted is in a buffer pointed to by the \fIptr\fP parameter.
+The amount of data to convert is indicated by the \fIlength\fP parameter. The
+converted data overlays the input data in the buffer pointed to by the ptr
+parameter. \fICURLE_OK\fP must be returned upon successful conversion. A
+CURLcode return value defined by curl.h, such as \fICURLE_CONV_FAILED\fP,
+should be returned if an error was encountered.
+
+\fBCURLOPT_CONV_TO_NETWORK_FUNCTION\fP converts from host encoding to the
+network encoding. It is used when commands or ASCII data are sent over the
+network.
+
+If you set a callback pointer to NULL, or don't set it at all, the built-in
+libcurl iconv functions will be used. If HAVE_ICONV was not defined when
+libcurl was built, and no callback has been established, conversion will
+return the CURLE_CONV_REQD error code.
+
+If HAVE_ICONV is defined, CURL_ICONV_CODESET_OF_HOST must also be defined.
+For example:
+
+ \&#define CURL_ICONV_CODESET_OF_HOST "IBM-1047"
+
+The iconv code in libcurl will default the network and UTF8 codeset names as
+follows:
+
+ \&#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1"
+
+ \&#define CURL_ICONV_CODESET_FOR_UTF8 "UTF-8"
+
+You will need to override these definitions if they are different on your
+system.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP, SMTP, IMAP, POP3
+.SH EXAMPLE
+.nf
+static CURLcode my_conv_from_ebcdic_to_ascii(char *buffer, size_t length)
+{
+ char *tempptrin, *tempptrout;
+ size_t bytes = length;
+ int rc;
+ tempptrin = tempptrout = buffer;
+ rc = platform_e2a(&tempptrin, &bytes, &tempptrout, &bytes);
+ if(rc == PLATFORM_CONV_OK) {
+ return CURLE_OK;
+ }
+ else {
+ return CURLE_CONV_FAILED;
+ }
+}
+
+curl_easy_setopt(curl, CURLOPT_CONV_TO_NETWORK_FUNCTION,
+ my_conv_from_ebcdic_to_ascii);
+.fi
+.SH AVAILABILITY
+Available only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was
built.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CONV_FROM_NETWORK_FUNCTION "(3), "
CURLOPT_CONV_FROM_UTF8_FUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_COOKIE.3
index 3a2a1967e,000000000..49937b430
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_COOKIE.3
+++ b/docs/libcurl/opts/GNURLOPT_COOKIE.3
@@@ -1,83 -1,0 +1,83 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_COOKIE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_COOKIE \- set contents of HTTP Cookie header
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIE, char *cookie);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. It will be used to
+set a cookie in the HTTP request. The format of the string should be
+NAME=CONTENTS, where NAME is the cookie name and CONTENTS is what the cookie
+should contain.
+
+If you need to set multiple cookies, set them all using a single option
+concatenated like this: "name1=content1; name2=content2;" etc.
+
+This option sets the cookie header explicitly in the outgoing request(s). If
+multiple requests are done due to authentication, followed redirections or
+similar, they will all get this cookie passed on.
+
+The cookies set by this option are separate from the internal cookie storage
+held by the cookie engine and will not be modified by it. If you enable the
+cookie engine and either you've imported a cookie of the same name (e.g.
'foo')
+or the server has set one, it will have no effect on the cookies you set here.
+A request to the server will send both the 'foo' held by the cookie engine and
+the 'foo' held by this option. To set a cookie that is instead held by the
+cookie engine and can be modified by the server use
+\fICURLOPT_COOKIELIST(3)\fP.
+
+Using this option multiple times will only make the latest string override the
+previous ones.
+
+This option will not enable the cookie engine. Use \fICURLOPT_COOKIEFILE(3)\fP
+or \fICURLOPT_COOKIEJAR(3)\fP to enable parsing and sending cookies
+automatically.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL, no cookies
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_COOKIE, "tool=curl; fun=yes;");
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+If HTTP is enabled
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_COOKIEFILE "(3), " CURLOPT_COOKIEJAR "(3), " CURLOPT_COOKIELIST
"(3), "
+.BR CURLOPT_HTTPHEADER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_COOKIEFILE.3
index 50298e550,000000000..369037b91
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_COOKIEFILE.3
+++ b/docs/libcurl/opts/GNURLOPT_COOKIEFILE.3
@@@ -1,87 -1,0 +1,87 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_COOKIEFILE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_COOKIEFILE \- file name to read cookies from
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEFILE, char *filename);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. It should point to
+the file name of your file holding cookie data to read. The cookie data can be
+in either the old Netscape / Mozilla cookie data format or just regular HTTP
+headers (Set-Cookie style) dumped to a file.
+
+It also enables the cookie engine, making libcurl parse and send cookies on
+subsequent requests with this handle.
+
+Given an empty or non-existing file or by passing the empty string ("") to
+this option, you can enable the cookie engine without reading any initial
+cookies. If you tell libcurl the file name is "-" (just a single minus sign),
+libcurl will instead read from stdin.
+
+This option only \fBreads\fP cookies. To make libcurl write cookies to file,
+see \fICURLOPT_COOKIEJAR(3)\fP.
+
+Exercise caution if you are using this option and multiple transfers may
occur.
+If you use the Set-Cookie format and don't specify a domain then the cookie is
+sent for any domain (even after redirects are followed) and cannot be modified
+by a server-set cookie. If a server sets a cookie of the same name then both
+will be sent on a future transfer to that server, likely not what you
intended.
+To address these issues set a domain in Set-Cookie (doing that will include
+sub-domains) or use the Netscape format.
+
+If you use this option multiple times, you just add more files to read.
+Subsequent files will add more cookies.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ /* get cookies from an existing file */
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH "Cookie file format"
+The cookie file format and general cookie concepts in curl are described in
+the HTTP-COOKIES.md file, also hosted online here:
- https://curl.haxx.se/docs/http-cookies.html
++https://curl.se/docs/http-cookies.html
+.SH AVAILABILITY
+As long as HTTP is supported
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_COOKIE "(3), " CURLOPT_COOKIEJAR "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_COOKIEJAR.3
index 0a6f60ba0,000000000..849a09630
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_COOKIEJAR.3
+++ b/docs/libcurl/opts/GNURLOPT_COOKIEJAR.3
@@@ -1,78 -1,0 +1,78 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_COOKIEJAR 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_COOKIEJAR \- file name to store cookies to
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEJAR, char *filename);
+.SH DESCRIPTION
+Pass a \fIfilename\fP as char *, null-terminated. This will make libcurl write
+all internally known cookies to the specified file when
+\fIcurl_easy_cleanup(3)\fP is called. If no cookies are known, no file will be
+created. Specify "-" as filename to instead have the cookies written to
+stdout. Using this option also enables cookies for this session, so if you for
+example follow a location it will make matching cookies get sent accordingly.
+
+Note that libcurl doesn't read any cookies from the cookie jar. If you want to
+read cookies from a file, use \fICURLOPT_COOKIEFILE(3)\fP.
+
+If the cookie jar file can't be created or written to (when the
+\fIcurl_easy_cleanup(3)\fP is called), libcurl will not and cannot report an
+error for this. Using \fICURLOPT_VERBOSE(3)\fP or
+\fICURLOPT_DEBUGFUNCTION(3)\fP will get a warning to display, but that is the
+only visible feedback you get about this possibly lethal situation.
+
+Since 7.43.0 cookies that were imported in the Set-Cookie format without a
+domain name are not exported by this option.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ /* export cookies to this file when closing the handle */
+ curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");
+
+ ret = curl_easy_perform(curl);
+
+ /* close the handle, write the cookies! */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_COOKIEFILE "(3), " CURLOPT_COOKIE "(3), "
+.BR CURLOPT_COOKIELIST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_COOKIELIST.3
index fe0c19380,000000000..45902351e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_COOKIELIST.3
+++ b/docs/libcurl/opts/GNURLOPT_COOKIELIST.3
@@@ -1,124 -1,0 +1,124 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_COOKIELIST 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIELIST,
+ char *cookie);
+.SH DESCRIPTION
+Pass a char * to a \fIcookie\fP string.
+
+Such a cookie can be either a single line in Netscape / Mozilla format or just
+regular HTTP-style header (Set-Cookie: ...) format. This will also enable the
+cookie engine. This adds that single cookie to the internal cookie store.
+
+Exercise caution if you are using this option and multiple transfers may
occur.
+If you use the Set-Cookie format and don't specify a domain then the cookie is
+sent for any domain (even after redirects are followed) and cannot be modified
+by a server-set cookie. If a server sets a cookie of the same name (or maybe
+you've imported one) then both will be sent on a future transfer to that
+server, likely not what you intended. To address these issues set a domain in
+Set-Cookie (doing that will include sub-domains) or use the Netscape format as
+shown in EXAMPLE.
+
+Additionally, there are commands available that perform actions if you pass in
+these exact strings:
+.IP ALL
+erases all cookies held in memory
+
+.IP SESS
+erases all session cookies held in memory
+
+.IP FLUSH
+writes all known cookies to the file specified by \fICURLOPT_COOKIEJAR(3)\fP
+
+.IP RELOAD
+loads all cookies from the files specified by \fICURLOPT_COOKIEFILE(3)\fP
+
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+/* This example shows an inline import of a cookie in Netscape format.
+You can set the cookie as HttpOnly to prevent XSS attacks by prepending
+#HttpOnly_ to the hostname. That may be useful if the cookie will later
+be imported by a browser.
+*/
+
+#define SEP "\\t" /* Tab separates the fields */
+
+char *my_cookie =
+ "example.com" /* Hostname */
+ SEP "FALSE" /* Include subdomains */
+ SEP "/" /* Path */
+ SEP "FALSE" /* Secure */
+ SEP "0" /* Expiry in epoch time format. 0 == Session */
+ SEP "foo" /* Name */
+ SEP "bar"; /* Value */
+
+/* my_cookie is imported immediately via CURLOPT_COOKIELIST.
+*/
+curl_easy_setopt(curl, CURLOPT_COOKIELIST, my_cookie);
+
+/* The list of cookies in cookies.txt will not be imported until right
+before a transfer is performed. Cookies in the list that have the same
+hostname, path and name as in my_cookie are skipped. That is because
+libcurl has already imported my_cookie and it's considered a "live"
+cookie. A live cookie won't be replaced by one read from a file.
+*/
+curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt"); /* import */
+
+/* Cookies are exported after curl_easy_cleanup is called. The server
+may have added, deleted or modified cookies by then. The cookies that
+were skipped on import are not exported.
+*/
+curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt"); /* export */
+
+curl_easy_perform(curl); /* cookies imported from cookies.txt */
+
+curl_easy_cleanup(curl); /* cookies exported to cookies.txt */
+.fi
+.SH "Cookie file format"
+The cookie file format and general cookie concepts in curl are described in
+the HTTP-COOKIES.md file, also hosted online here:
- https://curl.haxx.se/docs/http-cookies.html
++https://curl.se/docs/http-cookies.html
+.SH AVAILABILITY
+ALL was added in 7.14.1
+
+SESS was added in 7.15.4
+
+FLUSH was added in 7.17.1
+
+RELOAD was added in 7.39.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_COOKIEFILE "(3), " CURLOPT_COOKIEJAR "(3), " CURLOPT_COOKIE "(3),
"
+.BR CURLINFO_COOKIELIST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_COOKIESESSION.3
index 5911c949d,000000000..8725f3691
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_COOKIESESSION.3
+++ b/docs/libcurl/opts/GNURLOPT_COOKIESESSION.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_COOKIESESSION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_COOKIESESSION \- start a new cookie session
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIESESSION, long init);
+.SH DESCRIPTION
+Pass a long set to 1 to mark this as a new cookie "session". It will force
+libcurl to ignore all cookies it is about to load that are "session cookies"
+from the previous session. By default, libcurl always stores and loads all
+cookies, independent if they are session cookies or not. Session cookies are
+cookies without expiry date and they are meant to be alive and existing for
+this "session" only.
+
+A "session" is usually defined in browser land for as long as you have your
+browser up, more or less.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ /* new "session", don't load session cookies */
+ curl_easy_setopt(curl, CURLOPT_COOKIESESSION, 1L);
+
+ /* get the (non session) cookies from this file */
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_COOKIEFILE "(3), " CURLOPT_COOKIE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_COPYPOSTFIELDS.3
index 9a6940663,000000000..057354b44
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_COPYPOSTFIELDS.3
+++ b/docs/libcurl/opts/GNURLOPT_COPYPOSTFIELDS.3
@@@ -1,70 -1,0 +1,70 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_COPYPOSTFIELDS 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COPYPOSTFIELDS, char *data);
+.SH DESCRIPTION
+Pass a char * as parameter, which should be the full \fIdata\fP to post in a
+HTTP POST operation. It behaves as the \fICURLOPT_POSTFIELDS(3)\fP option, but
+the original data is instead copied by the library, allowing the application
+to overwrite the original data after setting this option.
+
+Because data are copied, care must be taken when using this option in
+conjunction with \fICURLOPT_POSTFIELDSIZE(3)\fP or
+\fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP: If the size has not been set prior to
+\fICURLOPT_COPYPOSTFIELDS(3)\fP, the data is assumed to be a null-terminated
+string; else the stored size informs the library about the byte count to
+copy. In any case, the size must not be changed after
+\fICURLOPT_COPYPOSTFIELDS(3)\fP, unless another \fICURLOPT_POSTFIELDS(3)\fP or
+\fICURLOPT_COPYPOSTFIELDS(3)\fP option is issued.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ char local_buffer[1024]="data to send";
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* size of the data to copy from the buffer and send in the request */
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L);
+
+ /* send data from the local stack */
+ curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, local_buffer);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.17.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_POSTFIELDSIZE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CRLF.3
index 461a295df,000000000..1b030b941
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CRLF.3
+++ b/docs/libcurl/opts/GNURLOPT_CRLF.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CRLF 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_CRLF \- enable/disable CRLF conversion
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLF, long conv);
+.SH DESCRIPTION
+Pass a long. If the value is set to 1 (one), libcurl converts Unix newlines to
+CRLF newlines on transfers. Disable this option again by setting the value to
+0 (zero).
+
+This is a legacy option of questionable use.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CRLF, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+SMTP since 7.40.0, other protocols since they were introduced
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_CONV_FROM_NETWORK_FUNCTION "(3), "
CURLOPT_CONV_TO_NETWORK_FUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CRLFILE.3
index bffc55b8a,000000000..49a56c53e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CRLFILE.3
+++ b/docs/libcurl/opts/GNURLOPT_CRLFILE.3
@@@ -1,75 -1,0 +1,75 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CRLFILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_CRLFILE \- specify a Certificate Revocation List file
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLFILE, char *file);
+.SH DESCRIPTION
+Pass a char * to a null-terminated string naming a \fIfile\fP with the
+concatenation of CRL (in PEM format) to use in the certificate validation that
+occurs during the SSL exchange.
+
+When curl is built to use NSS or GnuTLS, there is no way to influence the use
+of CRL passed to help in the verification process.
+
+When libcurl is built with OpenSSL support, X509_V_FLAG_CRL_CHECK and
+X509_V_FLAG_CRL_CHECK_ALL are both set, requiring CRL check against all the
+elements of the certificate chain if a CRL file is passed. Also note that
+\fICURLOPT_CRLFILE(3)\fP will imply \fBCURLSSLOPT_NO_PARTIALCHAIN\fP (see
+\fICURLOPT_SSL_OPTIONS(3)\fP) since curl 7.71.0 due to an OpenSSL bug.
+
+This option makes sense only when used in combination with the
+\fICURLOPT_SSL_VERIFYPEER(3)\fP option.
+
+A specific error code (\fICURLE_SSL_CRL_BADFILE\fP) is defined with the
+option. It is returned when the SSL exchange fails because the CRL file cannot
+be loaded. A failure in certificate verification due to a revocation
+information found in the CRL does not trigger this specific error.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_CRLFILE, "/etc/certs/crl.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_PROXY_CRLFILE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CURLU.3
index 4721ed6ac,000000000..f673d003d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CURLU.3
+++ b/docs/libcurl/opts/GNURLOPT_CURLU.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CURLU 3 "28 Oct 2018" "libcurl 7.63.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_CURLU \- set URL with CURLU *
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CURLU, void *pointer);
+.SH DESCRIPTION
+Pass in a pointer to the \fIURL\fP to work with. The parameter should be a
+CURLU *. Setting \fICURLOPT_CURLU(3)\fP will explicitly override
+\fICURLOPT_URL(3)\fP.
+
+\fICURLOPT_URL(3)\fP or \fICURLOPT_CURLU(3)\fP \fBmust\fP be set before a
+transfer is started.
+
+libcurl will use this handle and its contents read-only and will not change
+its contents. An application can very well update the contents of the URL
+handle after a transfer is done and if the same handle is then used in a
+subsequent request the updated contents will then be used.
+.SH DEFAULT
+The default value of this parameter is NULL.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *handle = curl_easy_init();
+CURLU *urlp = curl_url();
+int res = 0;
+if(curl) {
+
- res = curl_url_set(urlp, CURLUPART_URL, "http://example.com", 0);
++ res = curl_url_set(urlp, CURLUPART_URL, "https://example.com", 0);
+
+ curl_easy_setopt(handle, CURLOPT_CURLU, urlp);
+
+ ret = curl_easy_perform(handle);
+
+ curl_url_cleanup(urlp);
+ curl_easy_cleanup(handle);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.63.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_URL "(3), "
+.BR curl_url "(3), " curl_url_get "(3), " curl_url_set "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_CUSTOMREQUEST.3
index 1bd5020c5,000000000..133ae9286
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_CUSTOMREQUEST.3
+++ b/docs/libcurl/opts/GNURLOPT_CUSTOMREQUEST.3
@@@ -1,111 -1,0 +1,111 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_CUSTOMREQUEST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_CUSTOMREQUEST \- custom string for request
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CUSTOMREQUEST, char *request);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter.
+
+When you change the request method by setting \fICURLOPT_CUSTOMREQUEST(3)\fP
+to something, you don't actually change how libcurl behaves or acts in regards
+to the particular request method, it will only change the actual string sent
+in the request.
+
+Restore to the internal default by setting this to NULL.
+
+This option can be used to specify the request:
+.IP HTTP
+Instead of GET or HEAD when performing HTTP based requests. This is
+particularly useful, for example, for performing an HTTP DELETE request.
+
+For example:
+
+When you tell libcurl to do a HEAD request, but then specify a GET though a
+custom request libcurl will still act as if it sent a HEAD. To switch to a
+proper HEAD use \fICURLOPT_NOBODY(3)\fP, to switch to a proper POST use
+\fICURLOPT_POST(3)\fP or \fICURLOPT_POSTFIELDS(3)\fP and to switch to a proper
+GET use \fICURLOPT_HTTPGET(3)\fP.
+
+Many people have wrongly used this option to replace the entire request with
+their own, including multiple headers and POST contents. While that might work
+in many cases, it will cause libcurl to send invalid requests and it could
+possibly confuse the remote server badly. Use \fICURLOPT_POST(3)\fP and
+\fICURLOPT_POSTFIELDS(3)\fP to set POST data. Use \fICURLOPT_HTTPHEADER(3)\fP
+to replace or extend the set of headers sent by libcurl. Use
+\fICURLOPT_HTTP_VERSION(3)\fP to change HTTP version.
+
+.IP FTP
+Instead of LIST and NLST when performing FTP directory listings.
+.IP IMAP
+Instead of LIST when issuing IMAP based requests.
+.IP POP3
+Instead of LIST and RETR when issuing POP3 based requests.
+
+For example:
+
+When you tell libcurl to use a custom request it will behave like a LIST or
+RETR command was sent where it expects data to be returned by the server. As
+such \fICURLOPT_NOBODY(3)\fP should be used when specifying commands such as
+DELE and NOOP for example.
+.IP SMTP
+Instead of a HELP or VRFY when issuing SMTP based requests.
+
+For example:
+
+Normally a multiline response is returned which can be used, in conjunction
+with \fICURLOPT_MAIL_RCPT(3)\fP, to specify an EXPN request. If the
+\fICURLOPT_NOBODY(3)\fP option is specified then the request can be used to
+issue NOOP and RSET commands.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP, FTP, IMAP, POP3 and SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ /* DELETE the given path */
+ curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+IMAP is supported since 7.30.0, POP3 since 7.26.0 and SMTP since 7.34.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_HTTPHEADER "(3), " CURLOPT_NOBODY "(3), "
+.BR CURLOPT_REQUEST_TARGET "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DEBUGDATA.3
index 1435ee039,000000000..a4746f51c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DEBUGDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_DEBUGDATA.3
@@@ -1,45 -1,0 +1,45 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DEBUGDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_DEBUGDATA \- custom pointer for debug callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGDATA, void *pointer);
+.SH DESCRIPTION
+Pass a \fIpointer\fP to whatever you want passed in to your
+\fICURLOPT_DEBUGFUNCTION(3)\fP in the last void * argument. This pointer is
+not used by libcurl, it is only passed to the callback.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
- https://curl.haxx.se/libcurl/c/debug.html
++https://curl.se/libcurl/c/debug.html
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DEBUGFUNCTION.3
index c470cdac1,000000000..c20a9ed8b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DEBUGFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_DEBUGFUNCTION.3
@@@ -1,187 -1,0 +1,187 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DEBUGFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_DEBUGFUNCTION \- debug callback
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+typedef enum {
+ CURLINFO_TEXT = 0,
+ CURLINFO_HEADER_IN, /* 1 */
+ CURLINFO_HEADER_OUT, /* 2 */
+ CURLINFO_DATA_IN, /* 3 */
+ CURLINFO_DATA_OUT, /* 4 */
+ CURLINFO_SSL_DATA_IN, /* 5 */
+ CURLINFO_SSL_DATA_OUT, /* 6 */
+ CURLINFO_END
+} curl_infotype;
+
+int debug_callback(CURL *handle,
+ curl_infotype type,
+ char *data,
+ size_t size,
+ void *userptr);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGFUNCTION,
+ debug_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+\fICURLOPT_DEBUGFUNCTION(3)\fP replaces the standard debug function used when
+\fICURLOPT_VERBOSE(3)\fP is in effect. This callback receives debug
+information, as specified in the \fItype\fP argument. This function must
+return 0. The \fIdata\fP pointed to by the char * passed to this function WILL
+NOT be null-terminated, but will be exactly of the \fIsize\fP as told by the
+\fIsize\fP argument.
+
+The \fIuserptr\fP argument is the pointer set with \fICURLOPT_DEBUGDATA(3)\fP.
+
+Available curl_infotype values:
+.IP CURLINFO_TEXT
+The data is informational text.
+.IP CURLINFO_HEADER_IN
+The data is header (or header-like) data received from the peer.
+.IP CURLINFO_HEADER_OUT
+The data is header (or header-like) data sent to the peer.
+.IP CURLINFO_DATA_IN
+The data is protocol data received from the peer.
+.IP CURLINFO_DATA_OUT
+The data is protocol data sent to the peer.
+.IP CURLINFO_SSL_DATA_OUT
+The data is SSL/TLS (binary) data sent to the peer.
+.IP CURLINFO_SSL_DATA_IN
+The data is SSL/TLS (binary) data received from the peer.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+static
+void dump(const char *text,
+ FILE *stream, unsigned char *ptr, size_t size)
+{
+ size_t i;
+ size_t c;
+ unsigned int width=0x10;
+
+ fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\\n",
+ text, (long)size, (long)size);
+
+ for(i=0; i<size; i+= width) {
+ fprintf(stream, "%4.4lx: ", (long)i);
+
+ /* show hex to the left */
+ for(c = 0; c < width; c++) {
+ if(i+c < size)
+ fprintf(stream, "%02x ", ptr[i+c]);
+ else
+ fputs(" ", stream);
+ }
+
+ /* show data on the right */
+ for(c = 0; (c < width) && (i+c < size); c++) {
+ char x = (ptr[i+c] >= 0x20 && ptr[i+c] < 0x80) ? ptr[i+c] : '.';
+ fputc(x, stream);
+ }
+
+ fputc('\\n', stream); /* newline */
+ }
+}
+
+static
+int my_trace(CURL *handle, curl_infotype type,
+ char *data, size_t size,
+ void *userp)
+{
+ const char *text;
+ (void)handle; /* prevent compiler warning */
+ (void)userp;
+
+ switch (type) {
+ case CURLINFO_TEXT:
+ fprintf(stderr, "== Info: %s", data);
+ default: /* in case a new one is introduced to shock us */
+ return 0;
+
+ case CURLINFO_HEADER_OUT:
+ text = "=> Send header";
+ break;
+ case CURLINFO_DATA_OUT:
+ text = "=> Send data";
+ break;
+ case CURLINFO_SSL_DATA_OUT:
+ text = "=> Send SSL data";
+ break;
+ case CURLINFO_HEADER_IN:
+ text = "<= Recv header";
+ break;
+ case CURLINFO_DATA_IN:
+ text = "<= Recv data";
+ break;
+ case CURLINFO_SSL_DATA_IN:
+ text = "<= Recv SSL data";
+ break;
+ }
+
+ dump(text, stderr, (unsigned char *)data, size);
+ return 0;
+}
+
+int main(void)
+{
+ CURL *curl;
+ CURLcode res;
+
+ curl = curl_easy_init();
+ if(curl) {
+ curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
+
+ /* the DEBUGFUNCTION has no effect until we enable VERBOSE */
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ /* example.com is redirected, so we tell libcurl to follow redirection */
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ res = curl_easy_perform(curl);
+ /* Check for errors */
+ if(res != CURLE_OK)
+ fprintf(stderr, "curl_easy_perform() failed: %s\\n",
+ curl_easy_strerror(res));
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+ }
+ return 0;
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_VERBOSE "(3), " CURLOPT_DEBUGDATA "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DEFAULT_PROTOCOL.3
index 92f4fc253,000000000..760b180bf
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DEFAULT_PROTOCOL.3
+++ b/docs/libcurl/opts/GNURLOPT_DEFAULT_PROTOCOL.3
@@@ -1,82 -1,0 +1,82 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DEFAULT_PROTOCOL 3 "18 Aug 2015" "libcurl 7.45.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_DEFAULT_PROTOCOL \- default protocol to use if the URL is missing a
+scheme name
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEFAULT_PROTOCOL, char
+*protocol);
+.SH DESCRIPTION
+This option tells libcurl to use \fIprotocol\fP if the URL is missing a scheme
+name.
+
+Use one of these protocol (scheme) names:
+
+dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, pop3,
+pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp
+
+An unknown or unsupported protocol causes error
+\fICURLE_UNSUPPORTED_PROTOCOL\fP when libcurl parses a schemeless URL. Parsing
+happens when \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP is
+called. The protocols supported by libcurl will vary depending on how it was
+built. Use \fIcurl_version_info(3)\fP if you need a list of protocol names
+supported by the build of libcurl that you are using.
+
+This option does not change the default proxy protocol (http).
+
+Without this option libcurl would make a guess based on the host, see
+\fICURLOPT_URL(3)\fP for details.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL (make a guess based on the host)
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ /* set a URL without a scheme */
+ curl_easy_setopt(curl, CURLOPT_URL, "example.com");
+
+ /* set the default protocol (scheme) for schemeless URLs */
+ curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.45.0
+.SH RETURN VALUE
+CURLE_OK if the option is supported.
+
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+
+CURLE_UNKNOWN_OPTION if the option is not supported.
+.SH "SEE ALSO"
+.BR CURLOPT_URL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DIRLISTONLY.3
index 8ecb04fe2,000000000..81722df09
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DIRLISTONLY.3
+++ b/docs/libcurl/opts/GNURLOPT_DIRLISTONLY.3
@@@ -1,73 -1,0 +1,73 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DIRLISTONLY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_DIRLISTONLY \- ask for names only in a directory listing
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DIRLISTONLY, long listonly);
+.SH DESCRIPTION
+For FTP and SFTP based URLs a parameter set to 1 tells the library to list the
+names of files in a directory, rather than performing a full directory listing
+that would normally include file sizes, dates etc.
+
+For POP3 a parameter of 1 tells the library to list the email message or
+messages on the POP3 server. This can be used to change the default behaviour
+of libcurl, when combined with a URL that contains a message ID, to perform a
+"scan listing" which can then be used to determine the size of an email.
+
+Note: For FTP this causes a NLST command to be sent to the FTP server. Beware
+that some FTP servers list only files in their response to NLST; they might
not
+include subdirectories and symbolic links.
+
+Setting this option to 1 also implies a directory listing even if the URL
+doesn't end with a slash, which otherwise is necessary.
+
+Do NOT use this option if you also use \fICURLOPT_WILDCARDMATCH(3)\fP as it
+will effectively break that feature then.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+FTP, SFTP and POP3
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/dir/");
+
+ /* list only */
+ curl_easy_setopt(curl, CURLOPT_DIRLISTONLY, 1L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+This option was known as CURLOPT_FTPLISTONLY up to 7.16.4. POP3 is supported
+since 7.21.5.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CUSTOMREQUEST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DISALLOW_USERNAME_IN_URL.3
index a70e95d1a,000000000..46e1ffba4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DISALLOW_USERNAME_IN_URL.3
+++ b/docs/libcurl/opts/GNURLOPT_DISALLOW_USERNAME_IN_URL.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DISALLOW_USERNAME_IN_URL 3 "30 May 2018" "libcurl 7.61.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_DISALLOW_USERNAME_IN_URL \- disallow specifying username in the url
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DISALLOW_USERNAME_IN_URL,
long disallow);
+.SH DESCRIPTION
+A long parameter set to 1 tells the library to not allow URLs that include a
+username.
+.SH DEFAULT
+0 (disabled) - user names are allowed by default.
+.SH PROTOCOLS
+Several
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_DISALLOW_USERNAME_IN_URL, 1L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.61.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+
+curl_easy_perform() will return CURLE_LOGIN_DENIED if this option is enabled
+and a URL containing a username is specified.
+.SH "SEE ALSO"
+.BR libcurl-security "(3), ", CURLOPT_PROTOCOLS "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_DNS_CACHE_TIMEOUT.3
index a05134089,000000000..9f41a67dd
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DNS_CACHE_TIMEOUT.3
+++ b/docs/libcurl/opts/GNURLOPT_DNS_CACHE_TIMEOUT.3
@@@ -1,73 -1,0 +1,73 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DNS_CACHE_TIMEOUT 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_CACHE_TIMEOUT, long age);
+.SH DESCRIPTION
+Pass a long, this sets the timeout in seconds. Name resolves will be kept in
+memory and used for this number of seconds. Set to zero to completely disable
+caching, or set to -1 to make the cached entries remain forever. By default,
+libcurl caches this info for 60 seconds.
+
+The name resolve functions of various libc implementations don't re-read name
+server information unless explicitly told so (for example, by calling
+\fIres_init(3)\fP). This may cause libcurl to keep using the older server even
+if DHCP has updated the server info, and this may look like a DNS cache issue
+to the casual libcurl-app user.
+
+Note that DNS entries have a "TTL" property but libcurl doesn't use that. This
+DNS cache timeout is entirely speculative that a name will resolve to the same
+address for a certain small amount of time into the future.
+.SH DEFAULT
+60
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ /* only reuse addresses for a very short time */
+ curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, 2L);
+
+ ret = curl_easy_perform(curl);
+
+ /* in this second request, the cache will not be used if more than
+ two seconds have passed since the previous name resolve */
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_DNS_USE_GLOBAL_CACHE "(3), " CURLOPT_DNS_SERVERS "(3), "
+.BR CURLOPT_RESOLVE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DNS_INTERFACE.3
index 9d3426326,000000000..5ab359014
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DNS_INTERFACE.3
+++ b/docs/libcurl/opts/GNURLOPT_DNS_INTERFACE.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DNS_INTERFACE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_INTERFACE, char *ifname);
+.SH DESCRIPTION
+Pass a char * as parameter. Set the name of the network interface that the DNS
+resolver should bind to. This must be an interface name (not an address). Set
+this option to NULL to use the default setting (don't bind to a specific
+interface).
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_DNS_INTERFACE, "eth0");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.33.0. This option also requires that libcurl was built with a
+resolver backend that supports this operation. The c-ares backend is the only
+such one.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not,
+or CURLE_NOT_BUILT_IN if support was disabled at compile-time.
+.SH "SEE ALSO"
+.BR CURLOPT_DNS_SERVERS "(3), " CURLOPT_DNS_LOCAL_IP4 "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DNS_LOCAL_IP4.3
index df1578f9b,000000000..def010fee
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DNS_LOCAL_IP4.3
+++ b/docs/libcurl/opts/GNURLOPT_DNS_LOCAL_IP4.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DNS_LOCAL_IP4 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP4, char *address);
+.SH DESCRIPTION
+Set the local IPv4 \fIaddress\fP that the resolver should bind to. The
+argument should be of type char * and contain a single numerical IPv4 address
+as a string. Set this option to NULL to use the default setting (don't bind
+to a specific IP address).
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP4, "192.168.0.14");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+This option requires that libcurl was built with a resolver backend that
+supports this operation. The c-ares backend is the only such one.
+
+Added in 7.33.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not,
+CURLE_NOT_BUILT_IN if support was disabled at compile-time, or
+CURLE_BAD_FUNCTION_ARGUMENT when given a bad address.
+.SH "SEE ALSO"
+.BR CURLOPT_DNS_INTERFACE "(3), " CURLOPT_DNS_LOCAL_IP6 "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DNS_LOCAL_IP6.3
index 3e11d2a68,000000000..6bf9d6590
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DNS_LOCAL_IP6.3
+++ b/docs/libcurl/opts/GNURLOPT_DNS_LOCAL_IP6.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DNS_LOCAL_IP6 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP6, char *address);
+.SH DESCRIPTION
+Set the local IPv6 \fIaddress\fP that the resolver should bind to. The
+argument should be of type char * and contain a single IPv6 address as a
+string. Set this option to NULL to use the default setting (don't bind to a
+specific IP address).
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP6, "fe80::a9ff:fe46:b619");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+This option requires that libcurl was built with a resolver backend that
+supports this operation. The c-ares backend is the only such one.
+
+Added in 7.33.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not,
+CURLE_NOT_BUILT_IN if support was disabled at compile-time, or
+CURLE_BAD_FUNCTION_ARGUMENT when given a bad address.
+.SH "SEE ALSO"
+.BR CURLOPT_DNS_INTERFACE "(3), " CURLOPT_DNS_LOCAL_IP4 "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DNS_SERVERS.3
index 51cc3e7b3,000000000..4c21b40fd
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DNS_SERVERS.3
+++ b/docs/libcurl/opts/GNURLOPT_DNS_SERVERS.3
@@@ -1,67 -1,0 +1,67 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DNS_SERVERS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_DNS_SERVERS \- set preferred DNS servers
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_SERVERS, char *servers);
+.SH DESCRIPTION
+Pass a char * that is the list of DNS servers to be used instead of the system
+default. The format of the dns servers option is:
+
+host[:port][,host[:port]]...
+
+For example:
+
+192.168.1.100,192.168.1.101,3.4.5.6
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL - use system default
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_DNS_SERVERS,
"192.168.1.100:53,192.168.1.101");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+This option requires that libcurl was built with a resolver backend that
+supports this operation. The c-ares backend is the only such one.
+
+Added in 7.24.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not,
+CURLE_NOT_BUILT_IN if support was disabled at compile-time,
+CURLE_BAD_FUNCTION_ARGUMENT when given an invalid server list, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_DNS_LOCAL_IP4 "(3), " CURLOPT_DNS_CACHE_TIMEOUT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DNS_SHUFFLE_ADDRESSES.3
index c8528fe2a,000000000..f729ed397
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DNS_SHUFFLE_ADDRESSES.3
+++ b/docs/libcurl/opts/GNURLOPT_DNS_SHUFFLE_ADDRESSES.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DNS_SHUFFLE_ADDRESSES 3 "3 March 2018" "libcurl 7.60.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_DNS_SHUFFLE_ADDRESSES \- Shuffle addresses when a hostname returns
more than one
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_SHUFFLE_ADDRESSES, long
onoff);
+.fi
+.SH DESCRIPTION
+When a name is resolved and more than one IP address is returned, shuffle the
+order of all returned addresses so that they will be used in a random order.
+This is similar to the ordering behavior of gethostbyname which is no longer
+used on most platforms.
+
+Addresses will not be reshuffled if a name resolution is completed using the
+DNS cache. \fICURLOPT_DNS_CACHE_TIMEOUT(3)\fP can be used together with this
+option to reduce DNS cache timeout or disable caching entirely if frequent
+reshuffling is needed.
+
+Since the addresses returned will be reordered randomly, their order will not
+be in accordance with RFC 3484 or any other deterministic order that may be
+generated by the system's name resolution implementation. This may have
+performance impacts and may cause IPv4 to be used before IPv6 or vice versa.
+.SH DEFAULT
+0 (disabled)
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_DNS_SHUFFLE_ADDRESSES, 1L);
+
+ curl_easy_perform(curl);
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.60.0
+.SH RETURN VALUE
+CURLE_OK or an error such as CURLE_UNKNOWN_OPTION.
+.SH "SEE ALSO"
+.BR CURLOPT_DNS_CACHE_TIMEOUT "(3), " CURLOPT_IPRESOLVE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DNS_USE_GLOBAL_CACHE.3
index 6b81d42cd,000000000..25ce68d8e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DNS_USE_GLOBAL_CACHE.3
+++ b/docs/libcurl/opts/GNURLOPT_DNS_USE_GLOBAL_CACHE.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DNS_USE_GLOBAL_CACHE 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_USE_GLOBAL_CACHE,
+ long enable);
+.SH DESCRIPTION
- Has no function since 7.62.0. Do note use!
++Has no function since 7.62.0. Do not use!
+
+Pass a long. If the \fIenable\fP value is 1, it tells curl to use a global DNS
+cache that will survive between easy handle creations and deletions. This is
+not thread-safe and this will use a global variable.
+
+\fBWARNING:\fP this option is considered obsolete. Stop using it. Switch over
+to using the share interface instead! See \fICURLOPT_SHARE(3)\fP and
+\fIcurl_share_init(3)\fP.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* switch off the use of a global, thread unsafe, cache */
+ curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE, 0L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Deprecated since 7.62.0. Has no function.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SHARE "(3), " CURLOPT_DNS_CACHE_TIMEOUT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_DOH_URL.3
index 2af19959c,000000000..ffbddad1c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_DOH_URL.3
+++ b/docs/libcurl/opts/GNURLOPT_DOH_URL.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_DOH_URL 3 "18 Jun 2018" "libcurl 7.62.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_DOH_URL \- provide the DNS-over-HTTPS URL
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DOH_URL, char *URL);
+.SH DESCRIPTION
+Pass in a pointer to a \fIURL\fP for the DOH server to use for name
+resolving. The parameter should be a char * to a null-terminated string which
+must be URL-encoded in the following format: "https://host:port/path". It MUST
+specify a HTTPS URL.
+
+libcurl doesn't validate the syntax or use this variable until the transfer is
+issued. Even if you set a crazy value here, \fIcurl_easy_setopt(3)\fP will
+still return \fICURLE_OK\fP.
+
+curl sends POST requests to the given DNS-over-HTTPS URL.
+
+To find the DOH server itself, which might be specified using a name, libcurl
+will use the default name lookup function. You can bootstrap that by providing
+the address for the DOH server with \fICURLOPT_RESOLVE(3)\fP.
+
+Disable DOH use again by setting this option to NULL.
+.SH DEFAULT
+NULL - there is no default DOH URL. If this option isn't set, libcurl will use
+the default name resolver.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_DOH_URL, "https://dns.example.com");
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.62.0
+.SH RETURN VALUE
+Returns CURLE_OK on success or CURLE_OUT_OF_MEMORY if there was insufficient
+heap space.
+
+Note that \fIcurl_easy_setopt(3)\fP won't actually parse the given string so
+given a bad DOH URL, curl will not detect a problem until it tries to resolve
+a name with it.
+.SH "SEE ALSO"
+.BR CURLOPT_VERBOSE "(3), " CURLOPT_RESOLVE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_EGDSOCKET.3
index 466091c5c,000000000..d5cbf870e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_EGDSOCKET.3
+++ b/docs/libcurl/opts/GNURLOPT_EGDSOCKET.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_EGDSOCKET 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_EGDSOCKET \- set EGD socket path
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EGDSOCKET, char *path);
+.SH DESCRIPTION
+Pass a char * to the null-terminated path name to the Entropy Gathering Daemon
+socket. It will be used to seed the random engine for SSL.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_EGDSOCKET, "/var/egd.socket");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+If built TLS enabled. Only the OpenSSL and GnuTLS backends will use this.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_RANDOM_FILE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_ERRORBUFFER.3
index caf21ba21,000000000..b8a7523f7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_ERRORBUFFER.3
+++ b/docs/libcurl/opts/GNURLOPT_ERRORBUFFER.3
@@@ -1,92 -1,0 +1,92 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_ERRORBUFFER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_ERRORBUFFER \- set error buffer for error messages
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ERRORBUFFER, char *buf);
+.SH DESCRIPTION
+Pass a char * to a buffer that libcurl \fBmay\fP store human readable error
+messages on failures or problems. This may be more helpful than just the
+return code from \fIcurl_easy_perform(3)\fP and related functions. The buffer
+\fBmust be at least CURL_ERROR_SIZE bytes big\fP.
+
+You must keep the associated buffer available until libcurl no longer needs
+it. Failing to do so will cause very odd behavior or even crashes. libcurl
+will need it until you call \fIcurl_easy_cleanup(3)\fP or you set the same
+option again to use a different pointer.
+
+Do not rely on the contents of the buffer unless an error code was returned.
+Since 7.60.0 libcurl will initialize the contents of the error buffer to an
+empty string before performing the transfer. For earlier versions if an error
+code was returned but there was no error detail then the buffer is untouched.
+
+Consider \fICURLOPT_VERBOSE(3)\fP and \fICURLOPT_DEBUGFUNCTION(3)\fP to better
+debug and trace why errors happen.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ char errbuf[CURL_ERROR_SIZE];
+
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* provide a buffer to store errors in */
+ curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
+
+ /* set the error buffer as empty before performing a request */
+ errbuf[0] = 0;
+
+ /* perform the request */
+ res = curl_easy_perform(curl);
+
+ /* if the request did not complete correctly, show the error
+ information. if no detailed error information was written to errbuf
+ show the more generic information from curl_easy_strerror instead.
+ */
+ if(res != CURLE_OK) {
+ size_t len = strlen(errbuf);
+ fprintf(stderr, "\\nlibcurl: (%d) ", res);
+ if(len)
+ fprintf(stderr, "%s%s", errbuf,
+ ((errbuf[len - 1] != '\\n') ? "\\n" : ""));
+ else
+ fprintf(stderr, "%s\\n", curl_easy_strerror(res));
+ }
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_DEBUGFUNCTION "(3), " CURLOPT_VERBOSE "(3), "
+.BR curl_easy_strerror "(3), " curl_multi_strerror "(3), "
+.BR curl_share_strerror "(3) "
diff --cc docs/libcurl/opts/GNURLOPT_EXPECT_100_TIMEOUT_MS.3
index ce0dbcf64,000000000..596f44c92
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_EXPECT_100_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/GNURLOPT_EXPECT_100_TIMEOUT_MS.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_EXPECT_100_TIMEOUT_MS 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EXPECT_100_TIMEOUT_MS,
+ long milliseconds);
+.SH DESCRIPTION
+Pass a long to tell libcurl the number of \fImilliseconds\fP to wait for a
+server response with the HTTP status 100 (Continue), 417 (Expectation Failed)
+or similar after sending an HTTP request containing an Expect: 100-continue
+header. If this times out before a response is received, the request body is
+sent anyway.
+.SH DEFAULT
+1000 milliseconds
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* wait 3 seconds for 100-continue */
+ curl_easy_setopt(curl, CURLOPT_EXPECT_100_TIMEOUT_MS, 3000L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.36.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_POST "(3), " CURLOPT_HTTPPOST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FAILONERROR.3
index 2e9662c0e,000000000..241f1f37f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FAILONERROR.3
+++ b/docs/libcurl/opts/GNURLOPT_FAILONERROR.3
@@@ -1,67 -1,0 +1,67 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FAILONERROR 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FAILONERROR \- request failure on HTTP response >= 400
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FAILONERROR, long fail);
+.SH DESCRIPTION
+A long parameter set to 1 tells the library to fail the request if the HTTP
+code returned is equal to or larger than 400. The default action would be to
+return the page normally, ignoring that code.
+
+This method is not fail-safe and there are occasions where non-successful
+response codes will slip through, especially when authentication is involved
+(response codes 401 and 407).
+
+You might get some amounts of headers transferred before this situation is
+detected, like when a "100-continue" is received as a response to a POST/PUT
+and a 401 or 407 is received immediately afterwards.
+
+When this option is used and an error is detected, it will cause the
+connection to get closed and \fICURLE_HTTP_RETURNED_ERROR\fP is returned.
+.SH DEFAULT
+0, do not fail on error
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);
+ ret = curl_easy_perform(curl);
+ if(ret == CURLE_HTTP_RETURNED_ERROR) {
+ /* an HTTP response error problem */
+ }
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP.
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_HTTP200ALIASES "(3), " CURLOPT_KEEP_SENDING_ON_ERROR "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FILETIME.3
index fa74147fc,000000000..bdb5a1b7f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FILETIME.3
+++ b/docs/libcurl/opts/GNURLOPT_FILETIME.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FILETIME 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FILETIME \- get the modification time of the remote resource
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FILETIME, long gettime);
+.SH DESCRIPTION
+Pass a long. If it is 1, libcurl will attempt to get the modification time of
+the remote document in this operation. This requires that the remote server
+sends the time or replies to a time querying command. The
+\fIcurl_easy_getinfo(3)\fP function with the \fICURLINFO_FILETIME(3)\fP
+argument can be used after a transfer to extract the received time (if any).
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP, FTP, SFTP, FILE
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* Ask for filetime */
+ curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
+ res = curl_easy_perform(curl);
+ if(CURLE_OK == res) {
+ res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
+ if((CURLE_OK == res) && (filetime >= 0)) {
+ time_t file_time = (time_t)filetime;
+ printf("filetime %s: %s", filename, ctime(&file_time));
+ }
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always, for SFTP since 7.49.0
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FNMATCH_DATA.3
index 37c5db51d,000000000..eb1b8bf48
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FNMATCH_DATA.3
+++ b/docs/libcurl/opts/GNURLOPT_FNMATCH_DATA.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FNMATCH_DATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FNMATCH_DATA,
+ void *pointer);
+.SH DESCRIPTION
+Pass a pointer that will be untouched by libcurl and passed as the ptr
+argument to the \fICURLOPT_FNMATCH_FUNCTION(3)\fP.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+static int my_fnmatch(void *clientp,
+ const char *pattern, const char *string)
+{
+ struct local_stuff *data = (struct local_stuff *)clientp;
+ if(string_match(pattern, string))
+ return CURL_FNMATCHFUNC_MATCH;
+ else
+ return CURL_FNMATCHFUNC_NOMATCH;
+}
+
+{
+ struct local_stuff local_data;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/file*");
+ curl_easy_setopt(curl, CURLOPT_WILDCARDMATCH, 1L);
+ curl_easy_setopt(curl, CURLOPT_FNMATCH_FUNCTION, my_fnmatch);
+ curl_easy_setopt(curl, CURLOPT_FNMATCH_DATA, &local_data);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FNMATCH_FUNCTION "(3), " CURLOPT_WILDCARDMATCH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FNMATCH_FUNCTION.3
index 1783f8c3f,000000000..99f3d0a00
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FNMATCH_FUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_FNMATCH_FUNCTION.3
@@@ -1,74 -1,0 +1,74 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FNMATCH_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+int fnmatch_callback(void *ptr,
+ const char *pattern,
+ const char *string);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FNMATCH_FUNCTION,
+ fnmatch_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This callback is used for wildcard matching.
+
+Return \fICURL_FNMATCHFUNC_MATCH\fP if pattern matches the string,
+\fICURL_FNMATCHFUNC_NOMATCH\fP if not or \fICURL_FNMATCHFUNC_FAIL\fP if an
+error occurred.
+.SH DEFAULT
+NULL == an internal function for wildcard matching.
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+static int my_fnmatch(void *clientp,
+ const char *pattern, const char *string)
+{
+ struct local_stuff *data = (struct local_stuff *)clientp;
+ if(string_match(pattern, string))
+ return CURL_FNMATCHFUNC_MATCH;
+ else
+ return CURL_FNMATCHFUNC_NOMATCH;
+}
+
+{
+ struct local_stuff local_data;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/file*");
+ curl_easy_setopt(curl, CURLOPT_WILDCARDMATCH, 1L);
+ curl_easy_setopt(curl, CURLOPT_FNMATCH_FUNCTION, my_fnmatch);
+ curl_easy_setopt(curl, CURLOPT_FNMATCH_DATA, &local_data);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FNMATCH_DATA "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FOLLOWLOCATION.3
index bc7d76ae5,000000000..0b2f60338
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FOLLOWLOCATION.3
+++ b/docs/libcurl/opts/GNURLOPT_FOLLOWLOCATION.3
@@@ -1,81 -1,0 +1,81 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FOLLOWLOCATION 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long enable);
+.SH DESCRIPTION
+A long parameter set to 1 tells the library to follow any Location: header
+that the server sends as part of an HTTP header in a 3xx response. The
+Location: header can specify a relative or an absolute URL to follow.
+
+libcurl will issue another request for the new URL and follow new Location:
+headers all the way until no more such headers are returned.
+\fICURLOPT_MAXREDIRS(3)\fP can be used to limit the number of redirects
+libcurl will follow.
+
+libcurl limits what protocols it automatically follows to. The accepted
+protocols are set with \fICURLOPT_REDIR_PROTOCOLS(3)\fP. By default libcurl
+will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2). Older versions of
+libcurl allowed all protocols on redirect except those disabled for security
+reasons: Since 7.19.4 FILE and SCP are disabled, and since 7.40.0 SMB and SMBS
+are also disabled.
+
+When following a Location:, the 3xx response code that redirected it also
+dictates which request method it will use in the subsequent request: For 301,
+302 and 303 responses libcurl will switch method from POST to GET unless
+\fICURLOPT_POSTREDIR(3)\fP instructs libcurl otherwise. All other 3xx codes
+will make libcurl send the same method again.
+
+For users who think the existing location following is too naive, too simple
+or just lacks features, it is very easy to instead implement your own redirect
+follow logic with the use of \fIcurl_easy_getinfo(3)\fP's
+\fICURLINFO_REDIRECT_URL(3)\fP option instead of using
+\fICURLOPT_FOLLOWLOCATION(3)\fP.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* example.com is redirected, so we tell libcurl to follow redirection */
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_REDIR_PROTOCOLS "(3), " CURLOPT_PROTOCOLS "(3), "
+.BR CURLOPT_POSTREDIR "(3), "
+.BR CURLINFO_REDIRECT_URL "(3), " CURLINFO_REDIRECT_COUNT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FORBID_REUSE.3
index 6135d29ed,000000000..4bc0c2715
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FORBID_REUSE.3
+++ b/docs/libcurl/opts/GNURLOPT_FORBID_REUSE.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FORBID_REUSE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FORBID_REUSE \- make connection get closed at once after use
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FORBID_REUSE, long close);
+.SH DESCRIPTION
+Pass a long. Set \fIclose\fP to 1 to make libcurl explicitly close the
+connection when done with the transfer. Normally, libcurl keeps all
+connections alive when done with one transfer in case a succeeding one follows
+that can re-use them. This option should be used with caution and only if you
+understand what it does as it can seriously impact performance.
+
+Set to 0 to have libcurl keep the connection open for possible later re-use
+(default behavior).
+.SH DEFAULT
+0
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+{
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1L);
+ curl_easy_perform(curl);
+
+ /* this second transfer may not reuse the same connection */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_FRESH_CONNECT "(3), " CURLOPT_MAXCONNECTS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FRESH_CONNECT.3
index e84d7db8f,000000000..5aad37d3f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FRESH_CONNECT.3
+++ b/docs/libcurl/opts/GNURLOPT_FRESH_CONNECT.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FRESH_CONNECT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FRESH_CONNECT \- force a new connection to be used
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FRESH_CONNECT, long fresh);
+.SH DESCRIPTION
+Pass a long. Set to 1 to make the next transfer use a new (fresh) connection
+by force instead of trying to re-use an existing one. This option should be
+used with caution and only if you understand what it does as it may seriously
+impact performance.
+
+Related functionality is \fICURLOPT_FORBID_REUSE(3)\fP which makes sure the
+connection is closed after use so that it won't be re-used.
+
+Set \fIfresh\fP to 0 to have libcurl attempt re-using an existing connection
+(default behavior).
+.SH DEFAULT
+0
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+{
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, 1L);
+ /* this transfer must use a new connection, not reuse an existing */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_FORBID_REUSE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTPPORT.3
index e217fcde4,000000000..e228d30e0
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTPPORT.3
+++ b/docs/libcurl/opts/GNURLOPT_FTPPORT.3
@@@ -1,83 -1,0 +1,83 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTPPORT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FTPPORT \- make FTP transfer active
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPPORT, char *spec);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. It specifies that the
+FTP transfer will be made actively and the given string will be used to get
+the IP address to use for the FTP PORT instruction.
+
+The PORT instruction tells the remote server to connect to our specified IP
+address. The string may be a plain IP address, a host name, a network
+interface name (under Unix) or just a '-' symbol to let the library use your
+system's default IP address. Default FTP operations are passive, and thus
+won't use PORT.
+
+The address can be followed by a ':' to specify a port, optionally followed by
+a '-' to specify a port range. If the port specified is 0, the operating
+system will pick a free port. If a range is provided and all ports in the
+range are not available, libcurl will report CURLE_FTP_PORT_FAILED for the
+handle. Invalid port/range settings are ignored. IPv6 addresses followed by
+a port or portrange have to be in brackets. IPv6 addresses without port/range
+specifier can be in brackets.
+
+Examples with specified ports:
+
+.nf
+ eth0:0
+ 192.168.1.2:32000-33000
+ curl.se:32123
+ [::1]:1234-4567
+.fi
+
+You disable PORT again and go back to using the passive version by setting
+this option to NULL.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL,
"ftp://example.com/old-server/file.txt");
+ curl_easy_setopt(curl, CURLOPT_FTPPORT, "-");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Port range support was added in 7.19.5
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_FTP_USE_EPRT "(3), " CURLOPT_FTP_USE_EPSV "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTPSSLAUTH.3
index ee161143d,000000000..f625a714e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTPSSLAUTH.3
+++ b/docs/libcurl/opts/GNURLOPT_FTPSSLAUTH.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTPSSLAUTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPSSLAUTH, long order);
+.SH DESCRIPTION
+Pass a long using one of the values from below, to alter how libcurl issues
+\&"AUTH TLS" or "AUTH SSL" when FTP over SSL is activated. This is only
+interesting if \fICURLOPT_USE_SSL(3)\fP is also set.
+
+Possible \fIorder\fP values:
+.IP CURLFTPAUTH_DEFAULT
+Allow libcurl to decide.
+.IP CURLFTPAUTH_SSL
+Try "AUTH SSL" first, and only if that fails try "AUTH TLS".
+.IP CURLFTPAUTH_TLS
+Try "AUTH TLS" first, and only if that fails try "AUTH SSL".
+.SH DEFAULT
+CURLFTPAUTH_DEFAULT
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_TRY);
+ /* funny server, ask for SSL before TLS */
+ curl_easy_setopt(curl, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_SSL);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.12.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_USE_SSL "(3), " CURLOPT_FTP_SSL_CCC "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_ACCOUNT.3
index d3b16a6ef,000000000..b05577ea0
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_ACCOUNT.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_ACCOUNT.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_ACCOUNT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FTP_ACCOUNT \- set account info for FTP
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ACCOUNT, char *account);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string (or NULL to disable). When an FTP
+server asks for "account data" after user name and password has been provided,
+this data is sent off using the ACCT command.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, "human-resources");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.13.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_ALTERNATIVE_TO_USER.3
index b3f1addac,000000000..cef286aa0
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_ALTERNATIVE_TO_USER.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_ALTERNATIVE_TO_USER.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_ALTERNATIVE_TO_USER 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ALTERNATIVE_TO_USER,
+ char *cmd);
+.SH DESCRIPTION
+Pass a char * as parameter, pointing to a string which will be used to
+authenticate if the usual FTP "USER user" and "PASS password" negotiation
+fails. This is currently only known to be required when connecting to
+Tumbleweed's Secure Transport FTPS server using client certificates for
+authentication.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_FTP_ALTERNATIVE_TO_USER, "two users");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.5
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_FTP_SKIP_PASV_IP "(3), " CURLOPT_FTP_RESPONSE_TIMEOUT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_CREATE_MISSING_DIRS.3
index a112447f9,000000000..7215affd6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_CREATE_MISSING_DIRS.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_CREATE_MISSING_DIRS.3
@@@ -1,81 -1,0 +1,81 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_CREATE_MISSING_DIRS 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+typedef enum {
+ CURLFTP_CREATE_DIR_NONE,
+ CURLFTP_CREATE_DIR,
+ CURLFTP_CREATE_DIR_RETRY
+} curl_ftpcreatedir;
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_CREATE_MISSING_DIRS,
+ long create);
+.SH DESCRIPTION
+Pass a long telling libcurl to \fIcreate\fP the dir. If the value is
+\fICURLFTP_CREATE_DIR\fP (1), libcurl will attempt to create any remote
+directory that it fails to "move" into.
+
+For FTP requests, that means a CWD command fails. CWD being the command that
+changes working directory.
+
+For SFTP requests, libcurl will attempt to create the remote directory if it
+can't obtain a handle to the target-location. The creation will fail if a file
+of the same name as the directory to create already exists or lack of
+permissions prevents creation.
+
+Setting \fIcreate\fP to \fICURLFTP_CREATE_DIR_RETRY\fP (2), tells libcurl to
+retry the CWD command again if the subsequent MKD command fails. This is
+especially useful if you're doing many simultaneous connections against the
+same server and they all have this option enabled, as then CWD may first fail
+but then another connection does MKD before this connection and thus MKD fails
+but trying CWD works!
+.SH DEFAULT
+CURLFTP_CREATE_DIR_NONE (0)
+.SH PROTOCOLS
+FTP and SFTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL,
"ftp://example.com/non-existing/new.txt");
+ curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS,
+ CURLFTP_CREATE_DIR_RETRY);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10.7. SFTP support added in 7.16.3. The retry option was added in
+7.19.4.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if the
+create value is not.
+.SH "SEE ALSO"
+.BR CURLOPT_FTP_FILEMETHOD "(3), " CURLOPT_FTP_USE_EPSV "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_FILEMETHOD.3
index 9c616e629,000000000..7df3fa9a6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_FILEMETHOD.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_FILEMETHOD.3
@@@ -1,73 -1,0 +1,73 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_FILEMETHOD 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_FILEMETHOD,
+ long method);
+.SH DESCRIPTION
+Pass a long telling libcurl which \fImethod\fP to use to reach a file on a
+FTP(S) server.
+
+This option exists because some server implementations aren't compliant to
+what the standards say should work.
+
+The argument should be one of the following alternatives:
+.IP CURLFTPMETHOD_MULTICWD
+libcurl does a single CWD operation for each path part in the given URL. For
+deep hierarchies this means many commands. This is how RFC1738 says it should
+be done. This is the default but the slowest behavior.
+.IP CURLFTPMETHOD_NOCWD
+libcurl does no CWD at all. libcurl will do SIZE, RETR, STOR etc and give a
+full path to the server for all these commands. This is the fastest behavior.
+.IP CURLFTPMETHOD_SINGLECWD
+libcurl does one CWD with the full target directory and then operates on the
+file \&"normally" (like in the multicwd case). This is somewhat more standards
+compliant than 'nocwd' but without the full penalty of 'multicwd'.
+.SH DEFAULT
+CURLFTPMETHOD_MULTICWD
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/1/2/3/4/new.txt");
+ curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD,
+ CURLFTPMETHOD_SINGLECWD);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_DIRLISTONLY "(3), " CURLOPT_FTP_SKIP_PASV_IP "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_RESPONSE_TIMEOUT.3
index b87e0b522,000000000..1ded77eb1
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_RESPONSE_TIMEOUT.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_RESPONSE_TIMEOUT.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_RESPONSE_TIMEOUT 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_RESPONSE_TIMEOUT, long
timeout);
+.SH DESCRIPTION
+Pass a long. Causes libcurl to set a \fItimeout\fP period (in seconds) on the
+amount of time that the server is allowed to take in order to send a response
+message for a command before the session is considered dead. While libcurl is
+waiting for a response, this value overrides \fICURLOPT_TIMEOUT(3)\fP. It is
+recommended that if used in conjunction with \fICURLOPT_TIMEOUT(3)\fP, you set
+\fICURLOPT_FTP_RESPONSE_TIMEOUT(3)\fP to a value smaller than
+\fICURLOPT_TIMEOUT(3)\fP.
+.SH DEFAULT
+None
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/slow.txt");
+ /* wait no more than 23 seconds */
+ curl_easy_setopt(curl, CURLOPT_FTP_RESPONSE_TIMEOUT, 23L);
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10.8
+.SH RETURN VALUE
+Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not. Returns
+CURLE_BAD_FUNCTION_ARGUMENT if set to a negative value or a value that when
+converted to milliseconds is too large.
+.SH "SEE ALSO"
+.BR CURLOPT_TIMEOUT "(3), " CURLOPT_CONNECTTIMEOUT "(3), "
+.BR CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_SKIP_PASV_IP.3
index a8b8eeeef,000000000..08307d9d6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_SKIP_PASV_IP.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_SKIP_PASV_IP.3
@@@ -1,63 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_SKIP_PASV_IP 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SKIP_PASV_IP, long skip);
+.SH DESCRIPTION
+Pass a long. If \fIskip\fP is set to 1, it instructs libcurl to not use the IP
+address the server suggests in its 227-response to libcurl's PASV command when
+libcurl connects the data connection. Instead libcurl will re-use the same IP
+address it already uses for the control connection. But it will use the port
+number from the 227-response.
+
+This option thus allows libcurl to work around broken server installations
- that due to NATs, firewalls or incompetence report the wrong IP address back.
++that due to NATs, firewalls or incompetence report the wrong IP address
++back. Setting the option also reduces the risk for various sorts of client
++abuse by malicious servers.
+
+This option has no effect if PORT, EPRT or EPSV is used instead of PASV.
+.SH DEFAULT
- 0
++1 since 7.74.0, was 0 before then.
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/file.txt");
+
+ /* please ignore the IP in the PASV response */
+ curl_easy_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, 1L);
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.14.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FTPPORT "(3), " CURLOPT_FTP_USE_EPRT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_SSL_CCC.3
index d1d243c18,000000000..d88abdf60
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_SSL_CCC.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_SSL_CCC.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_SSL_CCC 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SSL_CCC,
+ long how);
+.SH DESCRIPTION
+If enabled, this option makes libcurl use CCC (Clear Command Channel). It
+shuts down the SSL/TLS layer after authenticating. The rest of the control
+channel communication will be unencrypted. This allows NAT routers to follow
+the FTP transaction. Pass a long using one of the values below
+.IP CURLFTPSSL_CCC_NONE
+Don't attempt to use CCC.
+.IP CURLFTPSSL_CCC_PASSIVE
+Do not initiate the shutdown, but wait for the server to do it. Do not send a
+reply.
+.IP CURLFTPSSL_CCC_ACTIVE
+Initiate the shutdown and wait for a reply.
+.SH DEFAULT
+CURLFTPSSL_CCC_NONE
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_CONTROL);
+ /* go back to clear-text FTP after authenticating */
+ curl_easy_setopt(curl, CURLOPT_FTP_SSL_CCC, CURLFTPSSL_CCC_ACTIVE);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.16.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_USE_SSL "(3), " CURLOPT_FTPSSLAUTH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_USE_EPRT.3
index 9c6cd6365,000000000..7b3f6cfde
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_USE_EPRT.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_USE_EPRT.3
@@@ -1,47 -1,0 +1,47 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_USE_EPRT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPRT, long enabled);
+.SH DESCRIPTION
+Pass a long. If the value is 1, it tells curl to use the EPRT command when
+doing active FTP downloads (which is enabled by
+\fICURLOPT_FTPPORT(3)\fP). Using EPRT means that it will first attempt to use
+EPRT before using PORT, but if you pass zero to this option, it will not try
+using EPRT, only plain PORT.
+
+If the server is an IPv6 host, this option will have no effect as EPRT is
+necessary then.
+.SH DEFAULT
+.SH PROTOCOLS
+.SH EXAMPLE
+.SH AVAILABILITY
+Added in 7.10.5
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_FTP_USE_EPSV "(3), " CURLOPT_FTPPORT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_USE_EPSV.3
index 7bcdb6649,000000000..ff8e9620a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_USE_EPSV.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_USE_EPSV.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_USE_EPSV 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPSV, long epsv);
+.SH DESCRIPTION
+Pass \fIepsv\fP as a long. If the value is 1, it tells curl to use the EPSV
+command when doing passive FTP downloads (which it does by default). Using
+EPSV means that it will first attempt to use EPSV before using PASV, but if
+you pass zero to this option, it will not try using EPSV, only plain PASV.
+
+If the server is an IPv6 host, this option will have no effect as of 7.12.3.
+.SH DEFAULT
+1
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL,
"ftp://example.com/old-server/file.txt");
+
+ /* let's shut off this modern feature */
+ curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, 0L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with FTP
+.SH RETURN VALUE
+Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FTP_USE_EPRT "(3), " CURLOPT_FTPPORT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_FTP_USE_PRET.3
index ded3b1f70,000000000..b7b38c8c5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_FTP_USE_PRET.3
+++ b/docs/libcurl/opts/GNURLOPT_FTP_USE_PRET.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_FTP_USE_PRET 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_FTP_USE_PRET \- enable the PRET command
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_PRET, long enable);
+.SH DESCRIPTION
+Pass a long. If the value is 1, it tells curl to send a PRET command before
+PASV (and EPSV). Certain FTP servers, mainly drftpd, require this non-standard
+command for directory listings as well as up and downloads in PASV mode. Has
+no effect when using the active FTP transfers mode.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL,
"ftp://example.com/old-server/file.txt");
+
+ /* a drftpd server, do it! */
+ curl_easy_setopt(curl, CURLOPT_FTP_USE_PRET, 1L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FTP_USE_EPRT "(3), " CURLOPT_FTP_USE_EPSV "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_GSSAPI_DELEGATION.3
index 2ee67395d,000000000..91d16bacb
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_GSSAPI_DELEGATION.3
+++ b/docs/libcurl/opts/GNURLOPT_GSSAPI_DELEGATION.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_GSSAPI_DELEGATION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_GSSAPI_DELEGATION, long
level);
+.SH DESCRIPTION
+Set the long parameter \fIlevel\fP to \fBCURLGSSAPI_DELEGATION_FLAG\fP to
+allow unconditional GSSAPI credential delegation. The delegation is disabled
+by default since 7.21.7. Set the parameter to
+\fBCURLGSSAPI_DELEGATION_POLICY_FLAG\fP to delegate only if the OK-AS-DELEGATE
+flag is set in the service ticket in case this feature is supported by the
+GSS-API implementation and the definition of GSS_C_DELEG_POLICY_FLAG was
+available at compile-time.
+.SH DEFAULT
+CURLGSSAPI_DELEGATION_NONE
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* delegate if okayed by policy */
+ curl_easy_setopt(curl, CURLOPT_GSSAPI_DELEGATION,
+ CURLGSSAPI_DELEGATION_POLICY_FLAG);
+ ret = curl_easy_perform(curl);
+}
+.fi
+
+.SH AVAILABILITY
+Added in 7.22.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
index 9c8ed42f1,000000000..d6ee0cb57
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/GNURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "1 Feb 2018" "libcurl 7.59.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS \- head start for ipv6 for happy eyeballs
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS,
long timeout);
+.SH DESCRIPTION
+Happy eyeballs is an algorithm that attempts to connect to both IPv4 and IPv6
+addresses for dual-stack hosts, preferring IPv6 first for \fItimeout\fP
+milliseconds. If the IPv6 address cannot be connected to within that time then
+a connection attempt is made to the IPv4 address in parallel. The first
+connection to be established is the one that is used.
+
+The range of suggested useful values for \fItimeout\fP is limited. Happy
+Eyeballs RFC 6555 says "It is RECOMMENDED that connection attempts be paced
+150-250 ms apart to balance human factors against network load." libcurl
+currently defaults to 200 ms. Firefox and Chrome currently default to 300 ms.
+.SH DEFAULT
+CURL_HET_DEFAULT (currently defined as 200L)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, 300L);
+
+ curl_easy_perform(curl);
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.59.0
+.SH RETURN VALUE
+Returns CURLE_OK
diff --cc docs/libcurl/opts/GNURLOPT_HAPROXYPROTOCOL.3
index 4d15b6479,000000000..4b9d7ebb5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HAPROXYPROTOCOL.3
+++ b/docs/libcurl/opts/GNURLOPT_HAPROXYPROTOCOL.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HAPROXYPROTOCOL 3 "5 Feb 2018" "libcurl 7.60.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_HAPROXYPROTOCOL \- send HAProxy PROXY protocol v1 header
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HAPROXYPROTOCOL,
+ long haproxy_protocol);
+.SH DESCRIPTION
+A long parameter set to 1 tells the library to send an HAProxy PROXY
+protocol v1 header at beginning of the connection. The default action is not
to
+send this header.
+
+This option is primarily useful when sending test requests to a service that
+expects this header.
+
+Most applications do not need this option.
+.SH DEFAULT
+0, do not send any HAProxy PROXY protocol header
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_HAPROXYPROTOCOL, 1L);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP. Added in 7.60.0.
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not.
diff --cc docs/libcurl/opts/GNURLOPT_HEADER.3
index 325014871,000000000..3cb7df200
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HEADER.3
+++ b/docs/libcurl/opts/GNURLOPT_HEADER.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HEADER 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_HEADER \- pass headers to the data stream
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADER, long onoff);
+.SH DESCRIPTION
+Pass the long value \fIonoff\fP set to 1 to ask libcurl to include the headers
+in the write callback (\fICURLOPT_WRITEFUNCTION(3)\fP). This option is
+relevant for protocols that actually have headers or other meta-data (like
+HTTP and FTP).
+
+When asking to get the headers passed to the same callback as the body, it is
+not possible to accurately separate them again without detailed knowledge
+about the protocol in use.
+
+Further: the \fICURLOPT_WRITEFUNCTION(3)\fP callback is limited to only ever
+get a maximum of \fICURL_MAX_WRITE_SIZE\fP bytes passed to it (16KB), while a
+header can be longer and the \fICURLOPT_HEADERFUNCTION(3)\fP supports getting
+called with headers up to \fICURL_MAX_HTTP_HEADER\fP bytes big (100KB).
+
+It is often better to use \fICURLOPT_HEADERFUNCTION(3)\fP to get the header
+data separately.
+
+While named confusingly similar, \fICURLOPT_HTTPHEADER(3)\fP is used to set
+custom HTTP headers!
+.SH DEFAULT
+0
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH RETURN VALUE
+Returns CURLE_OK.
+.SH "SEE ALSO"
+.BR CURLOPT_HEADERFUNCTION "(3), "
+.BR CURLOPT_HTTPHEADER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HEADERDATA.3
index 84c573498,000000000..fadf8c190
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HEADERDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_HEADERDATA.3
@@@ -1,78 -1,0 +1,78 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HEADERDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_HEADERDATA \- pointer to pass to header callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADERDATA, void *pointer);
+.SH DESCRIPTION
+Pass a \fIpointer\fP to be used to write the header part of the received data
+to.
+
+If \fICURLOPT_WRITEFUNCTION(3)\fP or \fICURLOPT_HEADERFUNCTION(3)\fP is used,
+\fIpointer\fP will be passed in to the respective callback.
+
+If neither of those options are set, \fIpointer\fP must be a valid FILE * and
+it will be used by a plain fwrite() to write headers to.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+struct my_info {
+ int shoesize;
+ char *secret;
+};
+
+static size_t header_callback(char *buffer, size_t size,
+ size_t nitems, void *userdata)
+{
+ struct my_info *i = (struct my_info *)userdata;
+
+ /* now this callback can access the my_info struct */
+
+ return nitems * size;
+}
+
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct my_info my = { 10, "the cookies are in the cupboard" };
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
+
+ /* pass in custom data to the callback */
+ curl_easy_setopt(curl, CURLOPT_HEADERDATA, &my);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_HEADERFUNCTION "(3), " CURLOPT_WRITEFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HEADERFUNCTION.3
index c62390b5d,000000000..bbd8a731e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HEADERFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_HEADERFUNCTION.3
@@@ -1,117 -1,0 +1,117 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HEADERFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_HEADERFUNCTION \- callback that receives header data
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+size_t header_callback(char *buffer,
+ size_t size,
+ size_t nitems,
+ void *userdata);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADERFUNCTION,
header_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This function gets called by libcurl as soon as it has received header
+data. The header callback will be called once for each header and only
+complete header lines are passed on to the callback. Parsing headers is very
+easy using this. \fIbuffer\fP points to the delivered data, and the size of
+that data is \fInitems\fP; \fIsize\fP is always 1. Do not assume that the
+header line is null-terminated!
+
+The pointer named \fIuserdata\fP is the one you set with the
+\fICURLOPT_HEADERDATA(3)\fP option.
+
+This callback function must return the number of bytes actually taken care of.
+If that amount differs from the amount passed in to your function, it'll
signal
+an error to the library. This will cause the transfer to get aborted and the
+libcurl function in progress will return \fICURLE_WRITE_ERROR\fP.
+
+A complete HTTP header that is passed to this function can be up to
+\fICURL_MAX_HTTP_HEADER\fP (100K) bytes and includes the final line
terminator.
+
+If this option is not set, or if it is set to NULL, but
+\fICURLOPT_HEADERDATA(3)\fP is set to anything but NULL, the function used to
+accept response data will be used instead. That is, it will be the function
+specified with \fICURLOPT_WRITEFUNCTION(3)\fP, or if it is not specified or
+NULL - the default, stream-writing function.
+
+It's important to note that the callback will be invoked for the headers of
+all responses received after initiating a request and not just the final
+response. This includes all responses which occur during authentication
+negotiation. If you need to operate on only the headers from the final
+response, you will need to collect headers in the callback yourself and use
+HTTP status lines, for example, to delimit response boundaries.
+
+For an HTTP transfer, the status line and the blank line preceding the
response
+body are both included as headers and passed to this function.
+
+When a server sends a chunked encoded transfer, it may contain a trailer. That
+trailer is identical to an HTTP header and if such a trailer is received it is
+passed to the application using this callback as well. There are several ways
+to detect it being a trailer and not an ordinary header: 1) it comes after the
+response-body. 2) it comes after the final header line (CR LF) 3) a Trailer:
+header among the regular response-headers mention what header(s) to expect in
+the trailer.
+
+For non-HTTP protocols like FTP, POP3, IMAP and SMTP this function will get
+called with the server responses to the commands that libcurl sends.
+.SH LIMITATIONS
+libcurl does not unfold HTTP "folded headers" (deprecated since RFC 7230). A
+folded header is a header that continues on a subsequent line and starts with
+a whitespace. Such folds will be passed to the header callback as a separate
+one, although strictly it is just a continuation of the previous line.
+.SH DEFAULT
+Nothing.
+.SH PROTOCOLS
+Used for all protocols with headers or meta-data concept: HTTP, FTP, POP3,
+IMAP, SMTP and more.
+.SH EXAMPLE
+.nf
+static size_t header_callback(char *buffer, size_t size,
+ size_t nitems, void *userdata)
+{
+ /* received header is nitems * size long in 'buffer' NOT ZERO TERMINATED */
+ /* 'userdata' is set with CURLOPT_HEADERDATA */
+ return nitems * size;
+}
+
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_HEADERDATA "(3), " CURLOPT_WRITEFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HEADEROPT.3
index 1171657fd,000000000..16d6521b3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HEADEROPT.3
+++ b/docs/libcurl/opts/GNURLOPT_HEADEROPT.3
@@@ -1,76 -1,0 +1,76 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HEADEROPT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_HEADEROPT \- set how to send HTTP headers
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADEROPT, long bitmask);
+.SH DESCRIPTION
+Pass a long that is a bitmask of options of how to deal with headers. The two
+mutually exclusive options are:
+
+\fBCURLHEADER_UNIFIED\fP - the headers specified in
+\fICURLOPT_HTTPHEADER(3)\fP will be used in requests both to servers and
+proxies. With this option enabled, \fICURLOPT_PROXYHEADER(3)\fP will not have
+any effect.
+
+\fBCURLHEADER_SEPARATE\fP - makes \fICURLOPT_HTTPHEADER(3)\fP headers only get
+sent to a server and not to a proxy. Proxy headers must be set with
+\fICURLOPT_PROXYHEADER(3)\fP to get used. Note that if a non-CONNECT request
+is sent to a proxy, libcurl will send both server headers and proxy
+headers. When doing CONNECT, libcurl will send \fICURLOPT_PROXYHEADER(3)\fP
+headers only to the proxy and then \fICURLOPT_HTTPHEADER(3)\fP headers only to
+the server.
+.SH DEFAULT
+CURLHEADER_SEPARATE (changed in 7.42.1, used CURLHEADER_UNIFIED before then)
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ struct curl_slist *list;
+ list = curl_slist_append(NULL, "Shoesize: 10");
+ list = curl_slist_append(list, "Accept:");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
+
+ /* HTTPS over a proxy makes a separate CONNECT to the proxy, so tell
+ libcurl to not send the custom headers to the proxy. Keep them
+ separate! */
+ curl_easy_setopt(curl, CURLOPT_HEADEROPT, CURLHEADER_SEPARATE);
+ ret = curl_easy_perform(curl);
+ curl_slist_free_all(list);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.37.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_HTTPHEADER "(3), " CURLOPT_PROXYHEADER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HTTP09_ALLOWED.3
index 8856c1a19,000000000..45c4e38c9
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTP09_ALLOWED.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTP09_ALLOWED.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTP09_ALLOWED 3 "17 Dec 2018" "libcurl 7.64.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_HTTP09 \- allow HTTP/0.9 response
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP09_ALLOWED, long allowed);
+.SH DESCRIPTION
+Pass the long argument \fIallowed\fP set to 1L to allow HTTP/0.9 responses.
+
+A HTTP/0.9 response is a server response entirely without headers and only a
+body. You can connect to lots of random TCP services and still get a response
+that curl might consider to be HTTP/0.9!
+.SH DEFAULT
+curl allowed HTTP/0.9 responses by default before 7.66.0
+
+Since 7.66.0, libcurl requires this option set to 1L to allow HTTP/0.9
+responses.
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_HTTP09_ALLOWED, 1L);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Option added in 7.64.0, present along with HTTP.
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLVERSION "(3), " CURLOPT_HTTP_VERSION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HTTP200ALIASES.3
index b0edad006,000000000..4de2797b2
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTP200ALIASES.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTP200ALIASES.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTP200ALIASES 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP200ALIASES,
+ struct curl_slist *aliases);
+.SH DESCRIPTION
+Pass a pointer to a linked list of \fIaliases\fP to be treated as valid HTTP
+200 responses. Some servers respond with a custom header response line. For
+example, SHOUTcast servers respond with "ICY 200 OK". Also some very old
+Icecast 1.3.x servers will respond like that for certain user agent headers or
+in absence of such. By including this string in your list of aliases,
+the response will be treated as a valid HTTP header line such as
+"HTTP/1.0 200 OK".
+
+The linked list should be a fully valid list of struct curl_slist structs, and
+be properly filled in. Use \fIcurl_slist_append(3)\fP to create the list and
+\fIcurl_slist_free_all(3)\fP to clean up an entire list.
+
+The alias itself is not parsed for any version strings. The protocol is
+assumed to match HTTP 1.0 when an alias match.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_slist *list;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ list = curl_slist_append(NULL, "ICY 200 OK");
+ list = curl_slist_append(list, "WEIRDO 99 FINE");
+
+ curl_easy_setopt(curl, CURLOPT_HTTP200ALIASES, list);
+ curl_easy_perform(curl);
+ curl_slist_free_all(list); /* free the list again */
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10.3
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_HTTP_VERSION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HTTPAUTH.3
index 13b7c1f52,000000000..3c5b06d8c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTPAUTH.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTPAUTH.3
@@@ -1,132 -1,0 +1,132 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTPAUTH 3 "2 Aug 2014" "libcurl 7.38.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPAUTH, long bitmask);
+.SH DESCRIPTION
+Pass a long as parameter, which is set to a bitmask, to tell libcurl which
+authentication method(s) you want it to use speaking to the remote server.
+
+The available bits are listed below. If more than one bit is set, libcurl will
+first query the site to see which authentication methods it supports and then
+pick the best one you allow it to use. For some methods, this will induce an
+extra network round-trip. Set the actual name and password with the
+\fICURLOPT_USERPWD(3)\fP option or with the \fICURLOPT_USERNAME(3)\fP and the
+\fICURLOPT_PASSWORD(3)\fP options.
+
+For authentication with a proxy, see \fICURLOPT_PROXYAUTH(3)\fP.
+
+.IP CURLAUTH_BASIC
+HTTP Basic authentication. This is the default choice, and the only method
+that is in wide-spread use and supported virtually everywhere. This sends
+the user name and password over the network in plain text, easily captured by
+others.
+.IP CURLAUTH_DIGEST
+HTTP Digest authentication. Digest authentication is defined in RFC2617 and
+is a more secure way to do authentication over public networks than the
+regular old-fashioned Basic method.
+.IP CURLAUTH_DIGEST_IE
+HTTP Digest authentication with an IE flavor. Digest authentication is
+defined in RFC2617 and is a more secure way to do authentication over public
+networks than the regular old-fashioned Basic method. The IE flavor is simply
+that libcurl will use a special "quirk" that IE is known to have used before
+version 7 and that some servers require the client to use.
+.IP CURLAUTH_BEARER
+HTTP Bearer token authentication, used primarily in OAuth 2.0 protocol.
+
+You can set the Bearer token to use with \fICURLOPT_XOAUTH2_BEARER(3)\fP.
+.IP CURLAUTH_NEGOTIATE
+HTTP Negotiate (SPNEGO) authentication. Negotiate authentication is defined
+in RFC 4559 and is the most secure way to perform authentication over HTTP.
+
+You need to build libcurl with a suitable GSS-API library or SSPI on Windows
+for this to work.
+.IP CURLAUTH_NTLM
+HTTP NTLM authentication. A proprietary protocol invented and used by
+Microsoft. It uses a challenge-response and hash concept similar to Digest, to
+prevent the password from being eavesdropped.
+
+You need to build libcurl with either OpenSSL, GnuTLS or NSS support for this
+option to work, or build libcurl on Windows with SSPI support.
+.IP CURLAUTH_NTLM_WB
+NTLM delegating to winbind helper. Authentication is performed by a separate
+binary application that is executed when needed. The name of the application
+is specified at compile time but is typically /usr/bin/ntlm_auth
+
+Note that libcurl will fork when necessary to run the winbind application and
+kill it when complete, calling waitpid() to await its exit when done. On POSIX
+operating systems, killing the process will cause a SIGCHLD signal to be
+raised (regardless of whether \fICURLOPT_NOSIGNAL(3)\fP is set), which must be
+handled intelligently by the application. In particular, the application must
+not unconditionally call wait() in its SIGCHLD signal handler to avoid being
+subject to a race condition. This behavior is subject to change in future
+versions of libcurl.
+.IP CURLAUTH_ANY
+This is a convenience macro that sets all bits and thus makes libcurl pick any
+it finds suitable. libcurl will automatically select the one it finds most
+secure.
+.IP CURLAUTH_ANYSAFE
+This is a convenience macro that sets all bits except Basic and thus makes
+libcurl pick any it finds suitable. libcurl will automatically select the one
+it finds most secure.
+.IP CURLAUTH_ONLY
+This is a meta symbol. OR this value together with a single specific auth
+value to force libcurl to probe for un-restricted auth and if not, only that
+single auth algorithm is acceptable.
+.SH DEFAULT
+CURLAUTH_BASIC
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* allow whatever auth the server speaks */
+ curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
+ curl_easy_setopt(curl, CURLOPT_USERPWD, "james:bond");
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Option Added in 7.10.6.
+
+CURLAUTH_DIGEST_IE was added in 7.19.3
+
+CURLAUTH_ONLY was added in 7.21.3
+
+CURLAUTH_NTLM_WB was added in 7.22.0
+
+CURLAUTH_BEARER was added in 7.61.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_NOT_BUILT_IN if the bitmask specified no supported authentication
+methods.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXYAUTH "(3), " CURLOPT_USERPWD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HTTPGET.3
index cb2006640,000000000..60146e448
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTPGET.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTPGET.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTPGET 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_HTTPGET \- ask for an HTTP GET request
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPGET, long useget);
+.SH DESCRIPTION
+Pass a long. If \fIuseget\fP is 1, this forces the HTTP request to get back to
+using GET. Usable if a POST, HEAD, PUT, etc has been used previously using the
+same curl \fIhandle\fP.
+
+When setting \fICURLOPT_HTTPGET(3)\fP to 1, it will automatically set
+\fICURLOPT_NOBODY(3)\fP to 0 and \fICURLOPT_UPLOAD(3)\fP to 0.
+
+Setting this option to zero has no effect. Applications need to explicitly
+select which HTTP request method to use, they cannot deselect a method. To
+reset a handle to default method, consider \fIcurl_easy_reset(3)\fP.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* use a GET to fetch this */
+ curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_NOBODY "(3), " CURLOPT_UPLOAD "(3), " CURLOPT_POST "(3), "
+.BR curl_easy_reset "(3) "
diff --cc docs/libcurl/opts/GNURLOPT_HTTPHEADER.3
index 017cb0a37,000000000..02a87fbb4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTPHEADER.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTPHEADER.3
@@@ -1,124 -1,0 +1,124 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTPHEADER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_HTTPHEADER \- set custom HTTP headers
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPHEADER, struct curl_slist
*headers);
+.SH DESCRIPTION
+Pass a pointer to a linked list of HTTP headers to pass to the server and/or
+proxy in your HTTP request. The same list can be used for both host and proxy
+requests!
+
+The linked list should be a fully valid list of \fBstruct curl_slist\fP
+structs properly filled in. Use \fIcurl_slist_append(3)\fP to create the list
+and \fIcurl_slist_free_all(3)\fP to clean up an entire list. If you add a
+header that is otherwise generated and used by libcurl internally, your added
+one will be used instead. If you add a header with no content as in 'Accept:'
+(no data on the right side of the colon), the internally used header will get
+disabled. With this option you can add new headers, replace internal headers
+and remove internal headers. To add a header with no content (nothing to the
+right side of the colon), use the form 'MyHeader;' (note the ending
+semicolon).
+
+The headers included in the linked list \fBmust not\fP be CRLF-terminated,
+because libcurl adds CRLF after each header item. Failure to comply with this
+will result in strange bugs because the server will most likely ignore part of
+the headers you specified.
+
+The first line in a request (containing the method, usually a GET or POST) is
+not a header and cannot be replaced using this option. Only the lines
+following the request-line are headers. Adding this method line in this list
+of headers will only cause your request to send an invalid header. Use
+\fICURLOPT_CUSTOMREQUEST(3)\fP to change the method.
+
+When this option is passed to \fIcurl_easy_setopt(3)\fP, libcurl will not copy
+the entire list so you \fBmust\fP keep it around until you no longer use this
+\fIhandle\fP for a transfer before you call \fIcurl_slist_free_all(3)\fP on
+the list.
+
+Pass a NULL to this option to reset back to no custom headers.
+
+The most commonly replaced headers have "shortcuts" in the options
+\fICURLOPT_COOKIE(3)\fP, \fICURLOPT_USERAGENT(3)\fP and
+\fICURLOPT_REFERER(3)\fP. We recommend using those.
+
+There's an alternative option that sets or replaces headers only for requests
+that are sent with CONNECT to a proxy: \fICURLOPT_PROXYHEADER(3)\fP. Use
+\fICURLOPT_HEADEROPT(3)\fP to control the behavior.
+.SH SECURITY CONCERNS
+By default, this option makes libcurl send the given headers in all HTTP
+requests done by this handle. You should therefore use this option with
+caution if you for example connect to the remote site using a proxy and a
+CONNECT request, you should to consider if that proxy is supposed to also get
+the headers. They may be private or otherwise sensitive to leak.
+
+Use \fICURLOPT_HEADEROPT(3)\fP to make the headers only get sent to where you
+intend them to get sent.
+
+Custom headers are sent in all requests done by the easy handles, which
+implies that if you tell libcurl to follow redirects
+(\fICURLOPT_FOLLOWLOCATION(3)\fP), the same set of custom headers will be sent
+in the subsequent request. Redirects can of course go to other hosts and thus
+those servers will get all the contents of your custom headers too.
+
+Starting in 7.58.0, libcurl will specifically prevent "Authorization:" headers
+from being sent to other hosts than the first used one, unless specifically
+permitted with the \fICURLOPT_UNRESTRICTED_AUTH(3)\fP option.
+
+Starting in 7.64.0, libcurl will specifically prevent "Cookie:" headers
+from being sent to other hosts than the first used one, unless specifically
+permitted with the \fICURLOPT_UNRESTRICTED_AUTH(3)\fP option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+
+struct curl_slist *list = NULL;
+
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ list = curl_slist_append(list, "Shoesize: 10");
+ list = curl_slist_append(list, "Accept:");
+
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
+
+ curl_easy_perform(curl);
+
+ curl_slist_free_all(list); /* free the list again */
+}
+.fi
+
+.SH AVAILABILITY
+As long as HTTP is enabled
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CUSTOMREQUEST "(3), " CURLOPT_HEADEROPT "(3), "
+.BR CURLOPT_PROXYHEADER "(3), " CURLOPT_HEADER "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_HTTPPOST.3
index 7001c7f0a,000000000..0a0f8f064
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTPPOST.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTPPOST.3
@@@ -1,82 -1,0 +1,82 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTPPOST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_HTTPPOST \- specify the multipart formpost content
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPOST,
+ struct curl_httppost *formpost);
+.SH DESCRIPTION
+Tells libcurl you want a multipart/formdata HTTP POST to be made and you
+instruct what data to pass on to the server in the \fIformpost\fP argument.
+Pass a pointer to a linked list of curl_httppost structs as parameter. The
+easiest way to create such a list, is to use \fIcurl_formadd(3)\fP as
+documented. The data in this list must remain intact as long as the curl
+transfer is alive and is using it.
+
+Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
+You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP.
+
+When setting \fICURLOPT_HTTPPOST(3)\fP, it will automatically set
+\fICURLOPT_NOBODY(3)\fP to 0.
+
+This option is deprecated! Do not use it. Use \fICURLOPT_MIMEPOST(3)\fP
+instead after having prepared mime data.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+/* Fill in the file upload field. This makes libcurl load data from
+ the given file name when curl_easy_perform() is called. */
+curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "sendfile",
+ CURLFORM_FILE, "postit2.c",
+ CURLFORM_END);
+
+/* Fill in the filename field */
+curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "filename",
+ CURLFORM_COPYCONTENTS, "postit2.c",
+ CURLFORM_END);
+
+/* Fill in the submit field too, even if this is rarely needed */
+curl_formadd(&formpost,
+ &lastptr,
+ CURLFORM_COPYNAME, "submit",
+ CURLFORM_COPYCONTENTS, "send",
+ CURLFORM_END);
+.fi
+.SH AVAILABILITY
+As long as HTTP is enabled. Deprecated in 7.56.0.
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_POST "(3), " CURLOPT_MIMEPOST "(3),"
+.BR curl_formadd "(3), " curl_formfree "(3), " curl_mime_init "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_HTTPPROXYTUNNEL.3
index d4975406f,000000000..da5a18beb
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTPPROXYTUNNEL.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTPPROXYTUNNEL.3
@@@ -1,68 -1,0 +1,68 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTPPROXYTUNNEL 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPROXYTUNNEL, long tunnel);
+.SH DESCRIPTION
+Set the \fBtunnel\fP parameter to 1L to make libcurl tunnel all operations
+through the HTTP proxy (set with \fICURLOPT_PROXY(3)\fP). There is a big
+difference between using a proxy and to tunnel through it.
+
+Tunneling means that an HTTP CONNECT request is sent to the proxy, asking it
+to connect to a remote host on a specific port number and then the traffic is
+just passed through the proxy. Proxies tend to white-list specific port
numbers
+it allows CONNECT requests to and often only port 80 and 443 are allowed.
+
+To suppress proxy CONNECT response headers from user callbacks use
+\fICURLOPT_SUPPRESS_CONNECT_HEADERS(3)\fP.
+
+HTTP proxies can generally only speak HTTP (for obvious reasons), which makes
+libcurl convert non-HTTP requests to HTTP when using an HTTP proxy without
+this tunnel option set. For example, asking for an FTP URL and specifying an
+HTTP proxy will make libcurl send an FTP URL in an HTTP GET request to the
+proxy. By instead tunneling through the proxy, you avoid that conversion (that
+rarely works through the proxy anyway).
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All network protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://127.0.0.1:80");
+ curl_easy_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), " CURLOPT_PROXYPORT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HTTP_CONTENT_DECODING.3
index 6a3f64779,000000000..386227140
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTP_CONTENT_DECODING.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTP_CONTENT_DECODING.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTP_CONTENT_DECODING 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_CONTENT_DECODING,
+ long enabled);
+.SH DESCRIPTION
+Pass a long to tell libcurl how to act on content decoding. If set to zero,
+content decoding will be disabled. If set to 1 it is enabled. Libcurl has no
+default content decoding but requires you to use
+\fICURLOPT_ACCEPT_ENCODING(3)\fP for that.
+.SH DEFAULT
+1
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_HTTP_CONTENT_DECODING, 0L);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.16.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
+.BR CURLOPT_ACCEPT_ENCODING "(3) "
diff --cc docs/libcurl/opts/GNURLOPT_HTTP_TRANSFER_DECODING.3
index 0ce86fd68,000000000..0983ecef4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTP_TRANSFER_DECODING.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTP_TRANSFER_DECODING.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTP_TRANSFER_DECODING 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_TRANSFER_DECODING,
+ long enabled);
+.SH DESCRIPTION
+Pass a long to tell libcurl how to act on transfer decoding. If set to zero,
+transfer decoding will be disabled, if set to 1 it is enabled
+(default). libcurl does chunked transfer decoding by default unless this
+option is set to zero.
+.SH DEFAULT
+1
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, 0L);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.16.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_HTTP_CONTENT_DECODING "(3), " CURLOPT_ACCEPT_ENCODING "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_HTTP_VERSION.3
index 2782e69a2,000000000..38657f6ae
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_HTTP_VERSION.3
+++ b/docs/libcurl/opts/GNURLOPT_HTTP_VERSION.3
@@@ -1,93 -1,0 +1,93 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_HTTP_VERSION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_VERSION, long version);
+.SH DESCRIPTION
+Pass \fIversion\fP a long, set to one of the values described below. They ask
+libcurl to use the specific HTTP versions.
+
+Note that the HTTP version is just a request. libcurl will still prioritize to
+re-use an existing connection so it might then re-use a connection using a
+HTTP version you haven't asked for.
+
+.IP CURL_HTTP_VERSION_NONE
+We don't care about what version the library uses. libcurl will use whatever
+it thinks fit.
+.IP CURL_HTTP_VERSION_1_0
+Enforce HTTP 1.0 requests.
+.IP CURL_HTTP_VERSION_1_1
+Enforce HTTP 1.1 requests.
+.IP CURL_HTTP_VERSION_2_0
+Attempt HTTP 2 requests. libcurl will fall back to HTTP 1.1 if HTTP 2 can't be
+negotiated with the server. (Added in 7.33.0)
+
+The alias \fICURL_HTTP_VERSION_2\fP was added in 7.43.0 to better reflect the
+actual protocol name.
+.IP CURL_HTTP_VERSION_2TLS
+Attempt HTTP 2 over TLS (HTTPS) only. libcurl will fall back to HTTP 1.1 if
+HTTP 2 can't be negotiated with the HTTPS server. For clear text HTTP servers,
+libcurl will use 1.1. (Added in 7.47.0)
+.IP CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE
+Issue non-TLS HTTP requests using HTTP/2 without HTTP/1.1 Upgrade. It requires
+prior knowledge that the server supports HTTP/2 straight away. HTTPS requests
+will still do HTTP/2 the standard way with negotiated protocol version in the
+TLS handshake. (Added in 7.49.0)
+.IP CURL_HTTP_VERSION_3
+(Added in 7.66.0) Setting this value will make libcurl attempt to use HTTP/3
+directly to server given in the URL. Note that this cannot gracefully
+downgrade to earlier HTTP version if the server doesn't support HTTP/3.
+
+For more reliably upgrading to HTTP/3, set the preferred version to something
+lower and let the server announce its HTTP/3 support via Alt-Svc:. See
+\fICURLOPT_ALTSVC(3)\fP.
+.SH DEFAULT
+Since curl 7.62.0: CURL_HTTP_VERSION_2TLS
+
+Before that: CURL_HTTP_VERSION_1_1
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
+ ret = curl_easy_perform(curl);
+ if(ret == CURLE_HTTP_RETURNED_ERROR) {
+ /* an HTTP response error problem */
+ }
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLVERSION "(3), " CURLOPT_HTTP200ALIASES "(3), "
+.BR CURLOPT_HTTP09_ALLOWED "(3), " CURLOPT_ALTSVC "(3) "
diff --cc docs/libcurl/opts/GNURLOPT_IGNORE_CONTENT_LENGTH.3
index bee16681c,000000000..97d668684
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_IGNORE_CONTENT_LENGTH.3
+++ b/docs/libcurl/opts/GNURLOPT_IGNORE_CONTENT_LENGTH.3
@@@ -1,67 -1,0 +1,67 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_IGNORE_CONTENT_LENGTH 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IGNORE_CONTENT_LENGTH,
+ long ignore);
+.SH DESCRIPTION
+If \fIignore\fP is set to 1L, ignore the Content-Length header in the HTTP
+response and ignore asking for or relying on it for FTP transfers.
+
+This is useful for HTTP with Apache 1.x (and similar servers) which will
+report incorrect content length for files over 2 gigabytes. If this option is
+used, curl will not be able to accurately report progress, and will simply
+stop the download when the server ends the connection.
+
+It is also useful with FTP when for example the file is growing while the
+transfer is in progress which otherwise will unconditionally cause libcurl to
+report error.
+
+Only use this option if strictly necessary.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* we know the server is silly, ignore content-length */
+ curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, 1L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.14.1. Support for FTP added in 7.46.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_HTTP_VERSION "(3), " CURLOPT_MAXFILESIZE_LARGE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_INFILESIZE.3
index 197f9cd46,000000000..e01995237
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_INFILESIZE.3
+++ b/docs/libcurl/opts/GNURLOPT_INFILESIZE.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_INFILESIZE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_INFILESIZE \- set size of the input file to send off
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INFILESIZE, long filesize);
+.SH DESCRIPTION
+When uploading a file to a remote site, \fIfilesize\fP should be used to tell
+libcurl what the expected size of the input file is. This value must be passed
+as a long. See also \fICURLOPT_INFILESIZE_LARGE(3)\fP for sending files larger
+than 2GB.
+
+For uploading using SCP, this option or \fICURLOPT_INFILESIZE_LARGE(3)\fP is
+mandatory.
+
+To unset this value again, set it to -1.
+
+When sending emails using SMTP, this command can be used to specify the
+optional SIZE parameter for the MAIL FROM command.
+
+This option does not limit how much data libcurl will actually send, as that
+is controlled entirely by what the read callback returns, but telling one
+value and sending a different amount may lead to errors.
+.SH DEFAULT
+Unset
+.SH PROTOCOLS
+Many
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ long uploadsize = FILE_SIZE;
+
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/destination.tar.gz");
+
+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+ curl_easy_setopt(curl, CURLOPT_INFILESIZE, uploadsize);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+SMTP support added in 7.23.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_INFILESIZE_LARGE "(3), " CURLOPT_UPLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_INFILESIZE_LARGE.3
index 8a5acfc04,000000000..d05592e93
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_INFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/GNURLOPT_INFILESIZE_LARGE.3
@@@ -1,72 -1,0 +1,72 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_INFILESIZE_LARGE 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INFILESIZE_LARGE,
+ curl_off_t filesize);
+.SH DESCRIPTION
+When uploading a file to a remote site, \fIfilesize\fP should be used to tell
+libcurl what the expected size of the input file is. This value must be passed
+as a \fBcurl_off_t\fP.
+
+For uploading using SCP, this option or \fICURLOPT_INFILESIZE(3)\fP is
+mandatory.
+
+To unset this value again, set it to -1.
+
+When sending emails using SMTP, this command can be used to specify the
+optional SIZE parameter for the MAIL FROM command.
+
+This option does not limit how much data libcurl will actually send, as that
+is controlled entirely by what the read callback returns, but telling one
+value and sending a different amount may lead to errors.
+.SH DEFAULT
+Unset
+.SH PROTOCOLS
+Many
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_off_t uploadsize = FILE_SIZE;
+
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/destination.tar.gz");
+
+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+ curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadsize);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+SMTP support added in 7.23.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_INFILESIZE "(3), " CURLOPT_UPLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_INTERFACE.3
index e93351360,000000000..ba6cfca36
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_INTERFACE.3
+++ b/docs/libcurl/opts/GNURLOPT_INTERFACE.3
@@@ -1,72 -1,0 +1,72 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_INTERFACE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_INTERFACE \- source interface for outgoing traffic
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERFACE, char *interface);
+.SH DESCRIPTION
+Pass a char * as parameter. This sets the \fIinterface\fP name to use as
+outgoing network interface. The name can be an interface name, an IP address,
+or a host name.
+
+If the parameter starts with "if!" then it is treated as only as interface
+name and no attempt will ever be named to do treat it as an IP address or to
+do name resolution on it. If the parameter starts with \&"host!" it is
+treated as either an IP address or a hostname. Hostnames are resolved
+synchronously. Using the if! format is highly recommended when using the
+multi interfaces to avoid allowing the code to block. If "if!" is specified
+but the parameter does not match an existing interface, CURLE_INTERFACE_FAILED
+is returned from the libcurl function used to perform the transfer.
+
+libcurl does not support using network interface names for this option on
+Windows.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL, use whatever the TCP stack finds suitable
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_INTERFACE, "eth0");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+The "if!" and "host!" syntax was added in 7.24.0.
+.SH RETURN VALUE
+Returns CURLE_OK on success or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SOCKOPTFUNCTION "(3), " CURLOPT_TCP_NODELAY "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_INTERLEAVEDATA.3
index 20fedbebd,000000000..53d151136
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_INTERLEAVEDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_INTERLEAVEDATA.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_INTERLEAVEDATA 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_INTERLEAVEDATA \- custom pointer passed to RTSP interleave callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERLEAVEDATA, void
*pointer);
+.SH DESCRIPTION
+This is the userdata \fIpointer\fP that will be passed to
+\fICURLOPT_INTERLEAVEFUNCTION(3)\fP when interleaved RTP data is received. If
+the interleave function callback is not set, this pointer is not used
+anywhere.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+static size_t rtp_write(void *ptr, size_t size, size_t nmemb, void *user)
+{
+ struct local *l = (struct local *)user;
+ /* take care of the packet in 'ptr', then return... */
+ return size * nmemb;
+}
+{
+ struct local rtp_data;
+ curl_easy_setopt(curl, CURLOPT_INTERLEAVEFUNCTION, rtp_write);
+ curl_easy_setopt(curl, CURLOPT_INTERLEAVEDATA, &rtp_data);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_INTERLEAVEFUNCTION "(3), " CURLOPT_RTSP_REQUEST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_INTERLEAVEFUNCTION.3
index c2c267e7f,000000000..b3e5f292c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_INTERLEAVEFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_INTERLEAVEFUNCTION.3
@@@ -1,84 -1,0 +1,84 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_INTERLEAVEFUNCTION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+size_t interleave_callback(void *ptr, size_t size, size_t nmemb,
+ void *userdata);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERLEAVEFUNCTION,
+ interleave_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This callback function gets called by libcurl as soon as it has received
+interleaved RTP data. This function gets called for each $ block and therefore
+contains exactly one upper-layer protocol unit (e.g. one RTP packet). Curl
+writes the interleaved header as well as the included data for each call. The
+first byte is always an ASCII dollar sign. The dollar sign is followed by a
+one byte channel identifier and then a 2 byte integer length in network byte
+order. See \fIRFC2326 Section 10.12\fP for more information on how RTP
+interleaving behaves. If unset or set to NULL, curl will use the default write
+function.
+
+Interleaved RTP poses some challenges for the client application. Since the
+stream data is sharing the RTSP control connection, it is critical to service
+the RTP in a timely fashion. If the RTP data is not handled quickly,
+subsequent response processing may become unreasonably delayed and the
+connection may close. The application may use \fICURL_RTSPREQ_RECEIVE\fP to
+service RTP data when no requests are desired. If the application makes a
+request, (e.g. \fICURL_RTSPREQ_PAUSE\fP) then the response handler will
+process any pending RTP data before marking the request as finished.
+
+The \fICURLOPT_INTERLEAVEDATA(3)\fP is passed in the \fIuserdata\fP argument
in
+the callback.
+.SH DEFAULT
+NULL, the interleave data is then passed to the regular write function:
+\fICURLOPT_WRITEFUNCTION(3)\fP.
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+static size_t rtp_write(void *ptr, size_t size, size_t nmemb, void *user)
+{
+ struct local *l = (struct local *)user;
+ /* take care of the packet in 'ptr', then return... */
+ return size * nmemb;
+}
+{
+ struct local rtp_data;
+ curl_easy_setopt(curl, CURLOPT_INTERLEAVEFUNCTION, rtp_write);
+ curl_easy_setopt(curl, CURLOPT_INTERLEAVEDATA, &rtp_data);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_INTERLEAVEDATA "(3), " CURLOPT_RTSP_REQUEST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_IOCTLDATA.3
index e450d86b5,000000000..10778affb
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_IOCTLDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_IOCTLDATA.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_IOCTLDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IOCTLDATA, void *pointer);
+.SH DESCRIPTION
+Pass the \fIpointer\fP that will be untouched by libcurl and passed as the 3rd
+argument in the ioctl callback set with \fICURLOPT_IOCTLFUNCTION(3)\fP.
+.SH DEFAULT
+By default, the value of this parameter is NULL.
+.SH PROTOCOLS
+Used with HTTP
+.SH EXAMPLE
+.nf
+static curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp)
+{
+ struct data *io = (struct data *)clientp;
+ if(cmd == CURLIOCMD_RESTARTREAD) {
+ lseek(fd, 0, SEEK_SET);
+ current_offset = 0;
+ return CURLIOE_OK;
+ }
+ return CURLIOE_UNKNOWNCMD;
+}
+{
+ struct data ioctl_data;
+ curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_callback);
+ curl_easy_setopt(curl, CURLOPT_IOCTLDATA, &ioctl_data);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.12.3
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_IOCTLFUNCTION "(3), " CURLOPT_SEEKFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_IOCTLFUNCTION.3
index f37f9c036,000000000..99bfd489a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_IOCTLFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_IOCTLFUNCTION.3
@@@ -1,92 -1,0 +1,92 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_IOCTLFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_IOCTLFUNCTION \- callback for I/O operations
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+typedef enum {
+ CURLIOE_OK, /* I/O operation successful */
+ CURLIOE_UNKNOWNCMD, /* command was unknown to callback */
+ CURLIOE_FAILRESTART, /* failed to restart the read */
+ CURLIOE_LAST /* never use */
+} curlioerr;
+
+typedef enum {
+ CURLIOCMD_NOP, /* no operation */
+ CURLIOCMD_RESTARTREAD, /* restart the read stream from start */
+ CURLIOCMD_LAST /* never use */
+} curliocmd;
+
+curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IOCTLFUNCTION,
ioctl_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This callback function gets called by libcurl when something special
+I/O-related needs to be done that the library can't do by itself. For now,
+rewinding the read data stream is the only action it can request. The
+rewinding of the read data stream may be necessary when doing an HTTP PUT or
+POST with a multi-pass authentication method.
+
+The callback MUST return \fICURLIOE_UNKNOWNCMD\fP if the input \fIcmd\fP is
+not \fICURLIOCMD_RESTARTREAD\fP.
+
+The \fIclientp\fP argument to the callback is set with the
+\fICURLOPT_IOCTLDATA(3)\fP option.
+
+This option is deprecated! Do not use it. Use \fICURLOPT_SEEKFUNCTION(3)\fP
+instead to provide seeking! If \fICURLOPT_SEEKFUNCTION(3)\fP is set, this
+parameter will be ignored when seeking.
+.SH DEFAULT
+By default, this parameter is set to NULL. Not used.
+.SH PROTOCOLS
+Used with HTTP
+.SH EXAMPLE
+.nf
+static curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp)
+{
+ struct data *io = (struct data *)clientp;
+ if(cmd == CURLIOCMD_RESTARTREAD) {
+ lseek(fd, 0, SEEK_SET);
+ current_offset = 0;
+ return CURLIOE_OK;
+ }
+ return CURLIOE_UNKNOWNCMD;
+}
+{
+ struct data ioctl_data;
+ curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_callback);
+ curl_easy_setopt(curl, CURLOPT_IOCTLDATA, &ioctl_data);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.12.3
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_IOCTLDATA "(3), " CURLOPT_SEEKFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_IPRESOLVE.3
index fe7a0f90d,000000000..ef040ff71
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_IPRESOLVE.3
+++ b/docs/libcurl/opts/GNURLOPT_IPRESOLVE.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_IPRESOLVE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_IPRESOLVE \- specify which IP protocol version to use
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IPRESOLVE, long resolve);
+.SH DESCRIPTION
+Allows an application to select what kind of IP addresses to use when
+resolving host names. This is only interesting when using host names that
+resolve addresses using more than one version of IP. The allowed values are:
+.IP CURL_IPRESOLVE_WHATEVER
+Default, resolves addresses to all IP versions that your system allows.
+.IP CURL_IPRESOLVE_V4
+Resolve to IPv4 addresses.
+.IP CURL_IPRESOLVE_V6
+Resolve to IPv6 addresses.
+.SH DEFAULT
+CURL_IPRESOLVE_WHATEVER
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ /* resolve host name using IPv6-names only */
+ curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_HTTP_VERSION "(3), " CURLOPT_SSLVERSION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_ISSUERCERT.3
index 30f0c756a,000000000..70ed96ef8
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_ISSUERCERT.3
+++ b/docs/libcurl/opts/GNURLOPT_ISSUERCERT.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_ISSUERCERT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_ISSUERCERT \- issuer SSL certificate filename
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ISSUERCERT, char *file);
+.SH DESCRIPTION
+Pass a char * to a null-terminated string naming a \fIfile\fP holding a CA
+certificate in PEM format. If the option is set, an additional check against
+the peer certificate is performed to verify the issuer is indeed the one
+associated with the certificate provided by the option. This additional check
+is useful in multi-level PKI where one needs to enforce that the peer
+certificate is from a specific branch of the tree.
+
+This option makes sense only when used in combination with the
+\fICURLOPT_SSL_VERIFYPEER(3)\fP option. Otherwise, the result of the check is
+not considered as failure.
+
+A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option,
+which is returned if the setup of the SSL/TLS session has failed due to a
+mismatch with the issuer of peer certificate (\fICURLOPT_SSL_VERIFYPEER(3)\fP
+has to be set too for the check to fail). (Added in 7.19.0)
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_ISSUERCERT, "/etc/certs/cacert.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+If built TLS enabled
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_CRLFILE "(3), " CURLOPT_SSL_VERIFYPEER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_ISSUERCERT_BLOB.3
index 0495b6f67,000000000..e97204af9
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_ISSUERCERT_BLOB.3
+++ b/docs/libcurl/opts/GNURLOPT_ISSUERCERT_BLOB.3
@@@ -1,79 -1,0 +1,79 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_ISSUERCERT_BLOB 3 "24 Jun 2020" "libcurl 7.71.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_ISSUERCERT_BLOB \- issuer SSL certificate from memory blob
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ISSUERCERT_BLOB, struct
curl_blob *stblob);
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure, which contains information (pointer
+and size) about a memory block with binary data of a CA certificate in PEM
+format. If the option is set, an additional check against the peer certificate
+is performed to verify the issuer is indeed the one associated with the
+certificate provided by the option. This additional check is useful in
+multi-level PKI where one needs to enforce that the peer certificate is from a
+specific branch of the tree.
+
+This option should be used in combination with the
+\fICURLOPT_SSL_VERIFYPEER(3)\fP option. Otherwise, the result of the check is
+not considered as failure.
+
+A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option,
+which is returned if the setup of the SSL/TLS session has failed due to a
+mismatch with the issuer of peer certificate (\fICURLOPT_SSL_VERIFYPEER(3)\fP
+has to be set too for the check to fail).
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_ISSUERCERT(3)\fP which instead
+expects a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_ISSUERCERT_BLOB, &blob);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_ISSUERCERT "(3),"
+.BR CURLOPT_CRLFILE "(3), " CURLOPT_SSL_VERIFYPEER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_KEEP_SENDING_ON_ERROR.3
index ec53000d4,000000000..9bea3d920
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_KEEP_SENDING_ON_ERROR.3
+++ b/docs/libcurl/opts/GNURLOPT_KEEP_SENDING_ON_ERROR.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_KEEP_SENDING_ON_ERROR 3 "22 Sep 2016" "libcurl 7.51.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_KEEP_SENDING_ON_ERROR \- keep sending on early HTTP response >= 300
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KEEP_SENDING_ON_ERROR,
+ long keep_sending);
+.SH DESCRIPTION
+A long parameter set to 1 tells the library to keep sending the request body
+if the HTTP code returned is equal to or larger than 300. The default action
+would be to stop sending and close the stream or connection.
+
+This option is suitable for manual NTLM authentication, i.e. if an application
+does not use \fICURLOPT_HTTPAUTH(3)\fP, but instead sets "Authorization: NTLM
..."
+headers manually using \fICURLOPT_HTTPHEADER(3)\fP.
+
+Most applications do not need this option.
+.SH DEFAULT
+0, stop sending on error
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "sending data");
+ curl_easy_setopt(curl, CURLOPT_KEEP_SENDING_ON_ERROR, 1L);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP. Added in 7.51.0.
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is enabled, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FAILONERROR "(3), " CURLOPT_HTTPHEADER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_KEYPASSWD.3
index 9145b0554,000000000..c54769064
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_KEYPASSWD.3
+++ b/docs/libcurl/opts/GNURLOPT_KEYPASSWD.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_KEYPASSWD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_KEYPASSWD \- set passphrase to private key
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KEYPASSWD, char *pwd);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. It will be used as
+the password required to use the \fICURLOPT_SSLKEY(3)\fP or
+\fICURLOPT_SSH_PRIVATE_KEYFILE(3)\fP private key. You never needed a pass
+phrase to load a certificate but you need one to load your private key.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "superman");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+This option was known as CURLOPT_SSLKEYPASSWD up to 7.16.4 and
+CURLOPT_SSLCERTPASSWD up to 7.9.2.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLKEY "(3), " CURLOPT_SSH_PRIVATE_KEYFILE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_KRBLEVEL.3
index 6735a09d1,000000000..0ff2ff6e5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_KRBLEVEL.3
+++ b/docs/libcurl/opts/GNURLOPT_KRBLEVEL.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_KRBLEVEL 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_KRBLEVEL \- set FTP kerberos security level
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KRBLEVEL, char *level);
+.SH DESCRIPTION
+Pass a char * as parameter. Set the kerberos security level for FTP; this also
+enables kerberos awareness. This is a string that should match one of the
+following: \&'clear', \&'safe', \&'confidential' or \&'private'. If the
+string is set but doesn't match one of these, 'private' will be used. Set the
+string to NULL to disable kerberos support for FTP.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_KRBLEVEL, "private");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+This option was known as CURLOPT_KRB4LEVEL up to 7.16.3
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_KRBLEVEL "(3), " CURLOPT_USE_SSL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_LOCALPORT.3
index 3376873e8,000000000..ca76bdfeb
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_LOCALPORT.3
+++ b/docs/libcurl/opts/GNURLOPT_LOCALPORT.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_LOCALPORT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_LOCALPORT \- set local port number to use for socket
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORT, long port);
+.SH DESCRIPTION
+Pass a long. This sets the local port number of the socket used for the
+connection. This can be used in combination with \fICURLOPT_INTERFACE(3)\fP
+and you are recommended to use \fICURLOPT_LOCALPORTRANGE(3)\fP as well when
+this option is set. Valid port numbers are 1 - 65535.
+.SH DEFAULT
+0, disabled - use whatever the system thinks is fine
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_LOCALPORT, 49152L);
+ /* and try 20 more ports following that */
+ curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.2
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_LOCALPORTRANGE "(3), " CURLOPT_INTERFACE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_LOCALPORTRANGE.3
index 20aa156ad,000000000..f4a2c13e8
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_LOCALPORTRANGE.3
+++ b/docs/libcurl/opts/GNURLOPT_LOCALPORTRANGE.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_LOCALPORTRANGE 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORTRANGE,
+ long range);
+.SH DESCRIPTION
+Pass a long. The \fIrange\fP argument is the number of attempts libcurl will
+make to find a working local port number. It starts with the given
+\fICURLOPT_LOCALPORT(3)\fP and adds one to the number for each retry. Setting
+this option to 1 or below will make libcurl do only one try for the exact port
+number. Port numbers by nature are scarce resources that will be busy at times
+so setting this value to something too low might cause unnecessary connection
+setup failures.
+.SH DEFAULT
+1
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_LOCALPORT, 49152L);
+ /* and try 20 more ports following that */
+ curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.2
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_LOCALPORT "(3), " CURLOPT_INTERFACE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_LOGIN_OPTIONS.3
index 5a41a00c1,000000000..c65131592
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_LOGIN_OPTIONS.3
+++ b/docs/libcurl/opts/GNURLOPT_LOGIN_OPTIONS.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_LOGIN_OPTIONS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_LOGIN_OPTIONS \- set login options
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOGIN_OPTIONS, char *options);
+.SH DESCRIPTION
+Pass a char * as parameter, which should be pointing to the null-terminated
+\fIoptions\fP string to use for the transfer.
+
+For more information about the login options please see RFC2384, RFC5092 and
+IETF draft draft-earhart-url-smtp-00.txt
+
+\fICURLOPT_LOGIN_OPTIONS(3)\fP can be used to set protocol specific login
+options, such as the preferred authentication mechanism via "AUTH=NTLM" or
+"AUTH=*", and should be used in conjunction with the \fICURLOPT_USERNAME(3)\fP
+option.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+Only IMAP, POP3 and SMTP support login options.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=*");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.34.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_LOW_SPEED_LIMIT.3
index 4f26e6656,000000000..05512cff3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_LOW_SPEED_LIMIT.3
+++ b/docs/libcurl/opts/GNURLOPT_LOW_SPEED_LIMIT.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_LOW_SPEED_LIMIT 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_LIMIT, long
speedlimit);
+.SH DESCRIPTION
+Pass a long as parameter. It contains the average transfer speed in bytes per
+second that the transfer should be below during
+\fICURLOPT_LOW_SPEED_TIME(3)\fP seconds for libcurl to consider it to be too
+slow and abort.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* abort if slower than 30 bytes/sec during 60 seconds */
+ curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 60L);
+ curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 30L);
+ res = curl_easy_perform(curl);
+ if(CURLE_OPERATION_TIMEDOUT == res) {
+ printf("Timeout!\\n");
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_LOW_SPEED_TIME "(3), " CURLOPT_TIMEOUT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_LOW_SPEED_TIME.3
index 2cfa9d210,000000000..9c5b4c121
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_LOW_SPEED_TIME.3
+++ b/docs/libcurl/opts/GNURLOPT_LOW_SPEED_TIME.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_LOW_SPEED_TIME 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_LOW_SPEED_TIME \- set low speed limit time period
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_TIME, long
speedtime);
+.SH DESCRIPTION
+Pass a long as parameter. It contains the time in number seconds that the
+transfer speed should be below the \fICURLOPT_LOW_SPEED_LIMIT(3)\fP for the
+library to consider it too slow and abort.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* abort if slower than 30 bytes/sec during 60 seconds */
+ curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 60L);
+ curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 30L);
+ res = curl_easy_perform(curl);
+ if(CURLE_OPERATION_TIMEDOUT == res) {
+ printf("Timeout!\\n");
+ }
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_LOW_SPEED_LIMIT "(3), " CURLOPT_TIMEOUT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAIL_AUTH.3
index cebafbcec,000000000..670e59e8d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAIL_AUTH.3
+++ b/docs/libcurl/opts/GNURLOPT_MAIL_AUTH.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAIL_AUTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_MAIL_AUTH \- SMTP authentication address
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_AUTH, char *auth);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. This will be used to
+specify the authentication address (identity) of a submitted message that is
+being relayed to another server.
+
+This optional parameter allows co-operating agents in a trusted environment to
+communicate the authentication of individual messages and should only be used
+by the application program, using libcurl, if the application is itself a mail
+server acting in such an environment. If the application is operating as such
+and the AUTH address is not known or is invalid, then an empty string should
+be used for this parameter.
+
+Unlike \fICURLOPT_MAIL_FROM(3)\fP and \fICURLOPT_MAIL_RCPT(3)\fP, the address
+should not be specified within a pair of angled brackets (<>). However, if an
+empty string is used then a pair of brackets will be sent by libcurl as
+required by RFC2554.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_MAIL_AUTH, "<secret@cave>");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.25.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_MAIL_FROM "(3), " CURLOPT_MAIL_RCPT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAIL_FROM.3
index c2d0d2851,000000000..eeac1c0b4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAIL_FROM.3
+++ b/docs/libcurl/opts/GNURLOPT_MAIL_FROM.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAIL_FROM 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_MAIL_FROM \- SMTP sender address
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_FROM, char *from);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. This should be used
+to specify the sender's email address when sending SMTP mail with libcurl.
+
+An originator email address should be specified with angled brackets (<>)
+around it, which if not specified will be added automatically.
+
+If this parameter is not specified then an empty address will be sent to the
+mail server which may cause the email to be rejected.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+blank
+.SH PROTOCOLS
+SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "president@example.com");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_MAIL_RCPT "(3), " CURLOPT_MAIL_AUTH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAIL_RCPT.3
index af43f235c,000000000..858947164
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAIL_RCPT.3
+++ b/docs/libcurl/opts/GNURLOPT_MAIL_RCPT.3
@@@ -1,73 -1,0 +1,73 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAIL_RCPT 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_MAIL_RCPT \- list of SMTP mail recipients
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_RCPT,
+ struct curl_slist *rcpts);
+.SH DESCRIPTION
+Pass a pointer to a linked list of recipients to pass to the server in your
+SMTP mail request. The linked list should be a fully valid list of
+\fBstruct curl_slist\fP structs properly filled in. Use
+\fIcurl_slist_append(3)\fP to create the list and \fIcurl_slist_free_all(3)\fP
+to clean up an entire list.
+
+When performing a mail transfer, each recipient should be specified within a
+pair of angled brackets (<>), however, should you not use an angled bracket as
+the first character libcurl will assume you provided a single email address
+and enclose that address within brackets for you.
+
+When performing an address verification (VRFY command), each recipient should
+be specified as the user name or user name and domain (as per Section 3.5 of
+RFC5321).
+
+When performing a mailing list expand (EXPN command), each recipient should be
+specified using the mailing list name, such as "Friends" or "London-Office".
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_slist *list;
+ list = curl_slist_append(NULL, "root@localhost");
+ list = curl_slist_append(list, "person@example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, list);
+ ret = curl_easy_perform(curl);
+ curl_slist_free_all(list);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0. The VRFY and EXPN logic was added in 7.34.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAIL_FROM "(3), " CURLOPT_MAIL_AUTH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAIL_RCPT_ALLLOWFAILS.3
index d2fdada77,000000000..c3b206cb3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAIL_RCPT_ALLLOWFAILS.3
+++ b/docs/libcurl/opts/GNURLOPT_MAIL_RCPT_ALLLOWFAILS.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAIL_RCPT_ALLLOWFAILS 3 "16 Jan 2020" "libcurl 7.69.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_MAIL_RCPT_ALLLOWFAILS \- allow RCPT TO command to fail for some
recipients
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_RCPT_ALLLOWFAILS,
+ long allow);
+.SH DESCRIPTION
+If \fIallow\fP is set to 1L, allow RCPT TO command to fail for some
recipients.
+
+When sending data to multiple recipients, by default curl will abort SMTP
+conversation if at least one of the recipients causes RCPT TO command to
+return an error.
+
+The default behavior can be changed by setting \fIignore\fP to 1L which will
+make curl ignore errors and proceed with the remaining valid recipients.
+
+In case when all recipients cause RCPT TO command to fail, curl will abort
SMTP
+conversation and return the error received from to the last RCPT TO command.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_slist *list;
+
+ /* Adding one valid and one invalid email address */
+ list = curl_slist_append(NULL, "person@example.com");
+ list = curl_slist_append(list, "invalidemailaddress");
+
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_MAIL_RCPT_ALLLOWFAILS, 1L);
+
+ ret = curl_easy_perform(curl);
+ curl_slist_free_all(list);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.69.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAIL_FROM "(3), " CURLOPT_MAIL_RCPT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAXAGE_CONN.3
index 61d687b56,000000000..17577250a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAXAGE_CONN.3
+++ b/docs/libcurl/opts/GNURLOPT_MAXAGE_CONN.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAXAGE_CONN 3 "18 Apr 2019" "libcurl 7.65.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_MAXAGE_CONN \- max idle time allowed for reusing a connection
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXAGE_CONN, long maxage);
+.SH DESCRIPTION
+Pass a long as parameter containing \fImaxage\fP - the maximum time in seconds
+that you allow an existing connection to have to be considered for reuse for
+this request.
+
+The "connection cache" that holds previously used connections. When a new
+request is to be done, it will consider any connection that matches for
+reuse. The \fICURLOPT_MAXAGE_CONN(3)\fP limit prevents libcurl from trying
+very old connections for reuse, since old connections have a high risk of not
+working and thus trying them is a performance loss and sometimes service loss
+due to the difficulties to figure out the situation. If a connection is found
+in the cache that is older than this set \fImaxage\fP, it will instead be
+closed.
+.SH DEFAULT
+Default maxage is 118 seconds.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* only allow 30 seconds idle time */
+ curl_easy_setopt(curl, CURLOPT_MAXAGE_CONN, 30L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.65.0
+.SH RETURN VALUE
+Returns CURLE_OK.
+.SH "SEE ALSO"
+.BR CURLOPT_TIMEOUT "(3), " CURLOPT_FORBID_REUSE "(3), "
+.BR CURLOPT_FRESH_CONNECT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAXCONNECTS.3
index 44efd5143,000000000..ba70c481d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/GNURLOPT_MAXCONNECTS.3
@@@ -1,68 -1,0 +1,68 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAXCONNECTS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_MAXCONNECTS \- maximum connection cache size
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXCONNECTS, long amount);
+.SH DESCRIPTION
+Pass a long. The set \fIamount\fP will be the maximum number of simultaneously
+open persistent connections that libcurl may cache in the pool associated with
+this handle. The default is 5, and there isn't much point in changing this
+value unless you are perfectly aware of how this works and changes libcurl's
+behaviour. This concerns connections using any of the protocols that support
+persistent connections.
+
+When reaching the maximum limit, curl closes the oldest one in the cache to
+prevent increasing the number of open connections.
+
+If you already have performed transfers with this curl handle, setting a
+smaller \fICURLOPT_MAXCONNECTS(3)\fP than before may cause open connections to
+get closed unnecessarily.
+
+If you add this easy handle to a multi handle, this setting is not
+acknowledged, and you must instead use \fIcurl_multi_setopt(3)\fP and the
+\fICURLMOPT_MAXCONNECTS(3)\fP option.
+.SH DEFAULT
+5
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* limit the connection cache for this handle to no more than 3 */
+ curl_easy_setopt(curl, CURLOPT_MAXCONNECTS, 3L);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLMOPT_MAXCONNECTS "(3), " CURLOPT_MAXREDIRS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAXFILESIZE.3
index 6624ad6a6,000000000..daad41a75
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAXFILESIZE.3
+++ b/docs/libcurl/opts/GNURLOPT_MAXFILESIZE.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAXFILESIZE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_MAXFILESIZE \- maximum file size allowed to download
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXFILESIZE, long size);
+.SH DESCRIPTION
+Pass a long as parameter. This allows you to specify the maximum \fIsize\fP
+(in bytes) of a file to download. If the file requested is found larger than
+this value, the transfer will not start and \fICURLE_FILESIZE_EXCEEDED\fP will
+be returned.
+
+The file size is not always known prior to download, and for such files this
+option has no effect even if the file transfer ends up being larger than this
+given limit. This concerns both FTP and HTTP transfers.
+
+If you want a limit above 2GB, use \fICURLOPT_MAXFILESIZE_LARGE(3)\fP.
+.SH DEFAULT
+None
+.SH PROTOCOLS
+FTP and HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* refuse to download if larger than 1000 bytes! */
+ curl_easy_setopt(curl, CURLOPT_MAXFILESIZE, 1000L);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_MAXFILESIZE_LARGE "(3), " CURLOPT_MAX_RECV_SPEED_LARGE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAXFILESIZE_LARGE.3
index 2ca01851f,000000000..0d958d247
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAXFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/GNURLOPT_MAXFILESIZE_LARGE.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAXFILESIZE_LARGE 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXFILESIZE_LARGE,
+ curl_off_t size);
+.SH DESCRIPTION
+Pass a curl_off_t as parameter. This allows you to specify the maximum
+\fIsize\fP (in bytes) of a file to download. If the file requested is found
+larger than this value, the transfer will not start and
+\fICURLE_FILESIZE_EXCEEDED\fP will be returned.
+
+The file size is not always known prior to download, and for such files this
+option has no effect even if the file transfer ends up being larger than this
+given limit. This concerns both FTP and HTTP transfers.
+.SH DEFAULT
+None
+.SH PROTOCOLS
+FTP and HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_off_t ridiculous = 1 << 48;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* refuse to download if larger than ridiculous */
+ curl_easy_setopt(curl, CURLOPT_MAXFILESIZE_LARGE, ridiculous);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.11.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAXFILESIZE "(3), " CURLOPT_MAX_RECV_SPEED_LARGE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAXREDIRS.3
index 159bf7b71,000000000..b9f11e0fc
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAXREDIRS.3
+++ b/docs/libcurl/opts/GNURLOPT_MAXREDIRS.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAXREDIRS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_MAXREDIRS \- maximum number of redirects allowed
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXREDIRS, long amount);
+.SH DESCRIPTION
+Pass a long. The set number will be the redirection limit \fIamount\fP. If
+that many redirections have been followed, the next redirect will cause an
+error (\fICURLE_TOO_MANY_REDIRECTS\fP). This option only makes sense if the
+\fICURLOPT_FOLLOWLOCATION(3)\fP is used at the same time.
+
+Setting the limit to 0 will make libcurl refuse any redirect.
+
+Set it to -1 for an infinite number of redirects.
+.SH DEFAULT
+-1, unlimited
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+
+ /* enable redirect following */
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+
+ /* allow three redirects */
+ curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 3L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FOLLOWLOCATION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAX_RECV_SPEED_LARGE.3
index 3aa78a890,000000000..3f5ef76c6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAX_RECV_SPEED_LARGE.3
+++ b/docs/libcurl/opts/GNURLOPT_MAX_RECV_SPEED_LARGE.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAX_RECV_SPEED_LARGE 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAX_RECV_SPEED_LARGE,
+ curl_off_t maxspeed);
+.SH DESCRIPTION
+Pass a curl_off_t as parameter. If a download exceeds this \fImaxspeed\fP
+(counted in bytes per second) the transfer will pause to keep the speed less
+than or equal to the parameter value. Defaults to unlimited speed.
+
+This is not an exact science. libcurl attempts to keep the average speed below
+the given threshold over a period time.
+
+If you set \fImaxspeed\fP to a value lower than \fICURLOPT_BUFFERSIZE(3)\fP,
+libcurl might download faster than the set limit initially.
+
+This option doesn't affect transfer speeds done with FILE:// URLs.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+All but file://
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* cap the download speed to 31415 bytes/sec */
+ curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t)31415);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.5
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAX_SEND_SPEED_LARGE "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MAX_SEND_SPEED_LARGE.3
index cbdcb52c0,000000000..e155a49c0
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MAX_SEND_SPEED_LARGE.3
+++ b/docs/libcurl/opts/GNURLOPT_MAX_SEND_SPEED_LARGE.3
@@@ -1,67 -1,0 +1,67 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MAX_SEND_SPEED_LARGE 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAX_SEND_SPEED_LARGE,
+ curl_off_t maxspeed);
+.SH DESCRIPTION
+Pass a curl_off_t as parameter with the \fImaxspeed\fP. If an upload exceeds
+this speed (counted in bytes per second) the transfer will pause to keep the
+speed less than or equal to the parameter value. Defaults to unlimited
+speed.
+
+This is not an exact science. libcurl attempts to keep the average speed below
+the given threshold over a period time.
+
+If you set \fImaxspeed\fP to a value lower than
+\fICURLOPT_UPLOAD_BUFFERSIZE(3)\fP, libcurl might "shoot over" the limit on
+its first send and still send off a full buffer.
+
+This option doesn't affect transfer speeds done with FILE:// URLs.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+All except file://
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* cap the upload speed to 1000 bytes/sec */
+ curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, (curl_off_t)1000);
+ /* (set some upload options as well!) */
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.15.5
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAX_RECV_SPEED_LARGE "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_MIMEPOST.3
index 9a71961d3,000000000..351b98573
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_MIMEPOST.3
+++ b/docs/libcurl/opts/GNURLOPT_MIMEPOST.3
@@@ -1,52 -1,0 +1,52 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_MIMEPOST 3 "22 Aug 2017" "libcurl 7.56.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_MIMEPOST \- set post/send data from mime structure
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+curl_mime *mime;
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MIMEPOST, mime);
+.SH DESCRIPTION
+Pass a mime handle previously obtained from \fIcurl_mime_init(3)\fP.
+
+This setting is supported by the HTTP protocol to post forms and by the
+SMTP and IMAP protocols to provide the e-mail data to send/upload.
+
+This option is the preferred way of posting an HTTP form, replacing and
+extending the deprecated \fICURLOPT_HTTPPOST(3)\fP option.
+.SH PROTOCOLS
+HTTP, SMTP, IMAP.
+.SH AVAILABILITY
+Since 7.56.0.
+.SH RETURN VALUE
+This will return CURLE_OK.
+.SH EXAMPLE
+Using this option implies the use of several mime structure building
- functions: see https://curl.haxx.se/libcurl/c/smtp-mime.html for a complete
++functions: see https://curl.se/libcurl/c/smtp-mime.html for a complete
+example.
+.SH "SEE ALSO"
+.BR curl_mime_init "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_NETRC.3
index 67b1772bf,000000000..c154458d5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_NETRC.3
+++ b/docs/libcurl/opts/GNURLOPT_NETRC.3
@@@ -1,84 -1,0 +1,84 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_NETRC 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_NETRC \- request that .netrc is used
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC, long level);
+.SH DESCRIPTION
+This parameter controls the preference \fIlevel\fP of libcurl between using
+user names and passwords from your \fI~/.netrc\fP file, relative to user names
+and passwords in the URL supplied with \fICURLOPT_URL(3)\fP. On Windows,
+libcurl will use the file as \fI%HOME%/_netrc\fP, but you can also tell
+libcurl a different file name to use with \fICURLOPT_NETRC_FILE(3)\fP.
+
+libcurl uses a user name (and supplied or prompted password) supplied with
+\fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP in preference to any of
+the options controlled by this parameter.
+
+Only machine name, user name and password are taken into account (init macros
+and similar things aren't supported).
+
+libcurl does not verify that the file has the correct properties set (as the
+standard Unix ftp client does). It should only be readable by user.
+
+\fIlevel\fP should be set to one of the values described below.
+
+.IP CURL_NETRC_OPTIONAL
+The use of the \fI~/.netrc\fP file is optional, and information in the URL is
+to be preferred. The file will be scanned for the host and user name (to find
+the password only) or for the host only, to find the first user name and
+password after that \fImachine\fP, which ever information is not specified.
+
+Undefined values of the option will have this effect.
+.IP CURL_NETRC_IGNORED
+The library will ignore the \fI~/.netrc\fP file.
+
+This is the default.
+.IP CURL_NETRC_REQUIRED
+The use of the \fI~/.netrc\fP file is required, and information in the URL is
+to be ignored. The file will be scanned for the host and user name (to find
+the password only) or for the host only, to find the first user name and
+password after that \fImachine\fP, which ever information is not specified.
+.SH DEFAULT
+CURL_NETRC_IGNORED
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_USERPWD "(3), " CURLOPT_USERNAME "(3), " CURLOPT_NETRC_FILE "(3),
"
diff --cc docs/libcurl/opts/GNURLOPT_NETRC_FILE.3
index d2a89da87,000000000..16a5ab9c4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_NETRC_FILE.3
+++ b/docs/libcurl/opts/GNURLOPT_NETRC_FILE.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_NETRC_FILE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_NETRC_FILE \- file name to read .netrc info from
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC_FILE, char *file);
+.SH DESCRIPTION
+Pass a char * as parameter, pointing to a null-terminated string containing
+the full path name to the \fIfile\fP you want libcurl to use as .netrc
+file. If this option is omitted, and \fICURLOPT_NETRC(3)\fP is set, libcurl
+will attempt to find a .netrc file in the current user's home
+directory.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL);
+ curl_easy_setopt(curl, CURLOPT_NETRC_FILE, "/tmp/magic-netrc");
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10.9
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_NETRC "(3), " CURLOPT_USERNAME "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_NEW_DIRECTORY_PERMS.3
index 70512839a,000000000..a0f5be21b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_NEW_DIRECTORY_PERMS.3
+++ b/docs/libcurl/opts/GNURLOPT_NEW_DIRECTORY_PERMS.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_NEW_DIRECTORY_PERMS 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NEW_DIRECTORY_PERMS,
+ long mode);
+.SH DESCRIPTION
+Pass a long as a parameter, containing the value of the permissions that will
+be assigned to newly created directories on the remote server. The default
value is
+\fI0755\fP, but any valid value can be used. The only protocols that can use
+this are \fIsftp://\fP, \fIscp://\fP, and \fIfile://\fP.
+.SH DEFAULT
+0755
+.SH PROTOCOLS
+SFTP, SCP and FILE
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL,
"sftp://upload.example.com/newdir/file.zip");
+ curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
+ curl_easy_setopt(curl, CURLOPT_NEW_DIRECTORY_PERMS, 0644L);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.16.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_NEW_FILE_PERMS "(3), " CURLOPT_UPLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_NEW_FILE_PERMS.3
index 69af0a378,000000000..5af010957
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_NEW_FILE_PERMS.3
+++ b/docs/libcurl/opts/GNURLOPT_NEW_FILE_PERMS.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_NEW_FILE_PERMS 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NEW_FILE_PERMS,
+ long mode);
+.SH DESCRIPTION
+Pass a long as a parameter, containing the value of the permissions that will
+be assigned to newly created files on the remote server. The default value is
+\fI0644\fP, but any valid value can be used. The only protocols that can use
+this are \fIsftp://\fP, \fIscp://\fP, and \fIfile://\fP.
+.SH DEFAULT
+0644
+.SH PROTOCOLS
+SFTP, SCP and FILE
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://upload.example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_NEW_FILE_PERMS, 0664L);
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.16.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_NEW_DIRECTORY_PERMS "(3), " CURLOPT_UPLOAD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_NOBODY.3
index 7a0060e87,000000000..d44ff6620
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_NOBODY.3
+++ b/docs/libcurl/opts/GNURLOPT_NOBODY.3
@@@ -1,70 -1,0 +1,70 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_NOBODY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_NOBODY \- do the download request without getting the body
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOBODY, long opt);
+.SH DESCRIPTION
+A long parameter set to 1 tells libcurl to not include the body-part in the
+output when doing what would otherwise be a download. For HTTP(S), this makes
+libcurl do a HEAD request. For most other protocols it means just not asking
+to transfer the body data.
+
+For HTTP operations when \fICURLOPT_NOBODY(3)\fP has been set, unsetting the
+option (with 0) will make it a GET again - only if the method is still set to
+be HEAD. The proper way to get back to a GET request is to set
- \fICURLOPT_HTTPGET(3)\fP and for other methods, use the POST ur UPLOAD
++\fICURLOPT_HTTPGET(3)\fP and for other methods, use the POST or UPLOAD
+options.
+
+Enabling \fICURLOPT_NOBODY(3)\fP means asking for a download without a body.
+
+If you do a transfer with HTTP that involves a method other than HEAD, you
+will get a body (unless the resource and server sends a zero byte body for the
+specific URL you request).
+.SH DEFAULT
+0, the body is transferred
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* get us the resource without a body - use HEAD! */
+ curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_HTTPGET "(3), " CURLOPT_POSTFIELDS "(3), " CURLOPT_UPLOAD "(3), "
+.BR CURLOPT_REQUEST_TARGET "(3), " CURLOPT_MIMEPOST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_NOPROGRESS.3
index 4f0635677,000000000..da733d4d5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_NOPROGRESS.3
+++ b/docs/libcurl/opts/GNURLOPT_NOPROGRESS.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_NOPROGRESS 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_NOPROGRESS \- switch off the progress meter
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROGRESS, long onoff);
+.SH DESCRIPTION
+If \fIonoff\fP is to 1, it tells the library to shut off the progress meter
+completely for requests done with this \fIhandle\fP. It will also prevent the
+\fICURLOPT_XFERINFOFUNCTION(3)\fP or \fICURLOPT_PROGRESSFUNCTION(3)\fP from
+getting called.
+.SH DEFAULT
+1, meaning it normally runs without a progress meter.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* enable progress meter */
+ curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK.
+.SH "SEE ALSO"
+.BR CURLOPT_XFERINFOFUNCTION "(3), "
+.BR CURLOPT_PROGRESSFUNCTION "(3), "
+.BR CURLOPT_VERBOSE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_NOPROXY.3
index bf46a839b,000000000..fe0c78d61
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_NOPROXY.3
+++ b/docs/libcurl/opts/GNURLOPT_NOPROXY.3
@@@ -1,81 -1,0 +1,85 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_NOPROXY 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_NOPROXY \- disable proxy use for specific hosts
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROXY, char *noproxy);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string. The string consists of a comma
+separated list of host names that do not require a proxy to get reached, even
+if one is specified. The only wildcard available is a single * character,
+which matches all hosts, and effectively disables the proxy. Each name in this
+list is matched as either a domain which contains the hostname, or the
+hostname itself. For example, example.com would match example.com,
+example.com:80, and www.example.com, but not www.notanexample.com or
+example.com.othertld.
+
+If the name in the noproxy list has a leading period, it is a domain match
+against the provided host name. This way ".example.com" will switch off proxy
+use for both "www.example.com" as well as for "foo.example.com".
+
+Setting the noproxy string to "" (an empty string) will explicitly enable the
+proxy for all host names, even if there is an environment variable set for it.
+
+Enter IPv6 numerical addresses in the list of host names without enclosing
+brackets:
+
+ "example.com,::1,localhost"
+
++IPv6 numerical addresses are compared as strings, so they will only match if
++the representations are the same: "::1" is the same as "::0:1" but they don't
++match.
++
+The application does not have to keep the string around after setting this
+option.
+.SH "Environment variables"
+If there's an environment variable called \fBno_proxy\fP (or \fBNO_PROXY\fP),
+it will be used if the \fIGNURLOPT_NOPROXY(3)\fP option is not set. It works
+exactly the same way.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ /* accept various URLs */
+ curl_easy_setopt(curl, CURLOPT_URL, input);
+ /* use this proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
+ /* ... but make sure this host name is not proxied */
+ curl_easy_setopt(curl, CURLOPT_NOPROXY, "www.example.com");
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR GNURLOPT_PROXY "(3), " GNURLOPT_PROXYAUTH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_NOSIGNAL.3
index 8a38d8f34,000000000..b9b66b1aa
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_NOSIGNAL.3
+++ b/docs/libcurl/opts/GNURLOPT_NOSIGNAL.3
@@@ -1,55 -1,0 +1,55 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_NOSIGNAL 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_NOSIGNAL \- skip all signal handling
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOSIGNAL, long onoff);
+.SH DESCRIPTION
+If \fIonoff\fP is 1, libcurl will not use any functions that install signal
+handlers or any functions that cause signals to be sent to the process. This
+option is here to allow multi-threaded unix applications to still set/use all
+timeout options etc, without risking getting signals.
+
+If this option is set and libcurl has been built with the standard name
+resolver, timeouts will not occur while the name resolve takes place.
+Consider building libcurl with the c-ares or threaded resolver backends to
+enable asynchronous DNS lookups, to enable timeouts for name resolves without
+the use of signals.
+
+Setting \fICURLOPT_NOSIGNAL(3)\fP to 1 makes libcurl NOT ask the system to
+ignore SIGPIPE signals, which otherwise are sent by the system when trying to
+send data to a socket which is closed in the other end. libcurl makes an
+effort to never cause such SIGPIPEs to trigger, but some operating systems
+have no way to avoid them and even on those that have there are some corner
+cases when they may still happen, contrary to our desire. In addition, using
+\fICURLAUTH_NTLM_WB\fP authentication could cause a SIGCHLD signal to be
+raised.
+.SH DEFAULT
+0
+.SH AVAILABILITY
+Added in 7.10
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
diff --cc docs/libcurl/opts/GNURLOPT_OPENSOCKETDATA.3
index be3bf94b9,000000000..e8d66c9de
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_OPENSOCKETDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_OPENSOCKETDATA.3
@@@ -1,81 -1,0 +1,81 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_OPENSOCKETDATA 3 "16 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_OPENSOCKETDATA, void
*pointer);
+.SH DESCRIPTION
+Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first
+argument in the opensocket callback set with
\fICURLOPT_OPENSOCKETFUNCTION(3)\fP.
+.SH DEFAULT
+The default value of this parameter is NULL.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+/* make libcurl use the already established socket 'sockfd' */
+
+static curl_socket_t opensocket(void *clientp,
+ curlsocktype purpose,
+ struct curl_sockaddr *address)
+{
+ curl_socket_t sockfd;
+ sockfd = *(curl_socket_t *)clientp;
+ /* the actual externally set socket is passed in via the OPENSOCKETDATA
+ option */
+ return sockfd;
+}
+
+static int sockopt_callback(void *clientp, curl_socket_t curlfd,
+ curlsocktype purpose)
+{
+ /* This return code was added in libcurl 7.21.5 */
+ return CURL_SOCKOPT_ALREADY_CONNECTED;
+}
+
+curl = curl_easy_init();
+if(curl) {
+ /* libcurl will internally think that you connect to the host
+ * and port that you specify in the URL option. */
+ curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
+ /* call this function to get a socket */
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd);
+
+ /* call this function to set options for the socket */
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+
+ res = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.17.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_OPENSOCKETFUNCTION "(3), " CURLOPT_SOCKOPTFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_OPENSOCKETFUNCTION.3
index 32e75b79b,000000000..48b4ea002
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_OPENSOCKETFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_OPENSOCKETFUNCTION.3
@@@ -1,125 -1,0 +1,125 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_OPENSOCKETFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+typedef enum {
+ CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */
+} curlsocktype;
+
+struct curl_sockaddr {
+ int family;
+ int socktype;
+ int protocol;
+ unsigned int addrlen;
+ struct sockaddr addr;
+};
+
+curl_socket_t opensocket_callback(void *clientp,
+ curlsocktype purpose,
+ struct curl_sockaddr *address);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_OPENSOCKETFUNCTION,
opensocket_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This callback function gets called by libcurl instead of the \fIsocket(2)\fP
+call. The callback's \fIpurpose\fP argument identifies the exact purpose for
+this particular socket. \fICURLSOCKTYPE_IPCXN\fP is for IP based connections
+and is the only purpose currently used in libcurl. Future versions of libcurl
+may support more purposes.
+
+The \fIclientp\fP pointer contains whatever user-defined value set using the
+\fICURLOPT_OPENSOCKETDATA(3)\fP function.
+
+The callback gets the resolved peer address as the \fIaddress\fP argument and
+is allowed to modify the address or refuse to connect completely. The callback
+function should return the newly created socket or \fICURL_SOCKET_BAD\fP in
+case no connection could be established or another error was detected. Any
+additional \fIsetsockopt(2)\fP calls can of course be done on the socket at
+the user's discretion. A \fICURL_SOCKET_BAD\fP return value from the callback
+function will signal an unrecoverable error to libcurl and it will return
+\fICURLE_COULDNT_CONNECT\fP from the function that triggered this callback.
+This return code can be used for IP address block listing.
+
+If you want to pass in a socket with an already established connection, pass
+the socket back with this callback and then use
+\fICURLOPT_SOCKOPTFUNCTION(3)\fP to signal that it already is connected.
+.SH DEFAULT
+The default behavior is the equivalent of this:
+.nf
+ return socket(addr->family, addr->socktype, addr->protocol);
+.fi
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+/* make libcurl use the already established socket 'sockfd' */
+
+static curl_socket_t opensocket(void *clientp,
+ curlsocktype purpose,
+ struct curl_sockaddr *address)
+{
+ curl_socket_t sockfd;
+ sockfd = *(curl_socket_t *)clientp;
+ /* the actual externally set socket is passed in via the OPENSOCKETDATA
+ option */
+ return sockfd;
+}
+
+static int sockopt_callback(void *clientp, curl_socket_t curlfd,
+ curlsocktype purpose)
+{
+ /* This return code was added in libcurl 7.21.5 */
+ return CURL_SOCKOPT_ALREADY_CONNECTED;
+}
+
+curl = curl_easy_init();
+if(curl) {
+ /* libcurl will internally think that you connect to the host
+ * and port that you specify in the URL option. */
+ curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
+ /* call this function to get a socket */
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd);
+
+ /* call this function to set options for the socket */
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+
+ res = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.17.1.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_OPENSOCKETDATA "(3), " CURLOPT_SOCKOPTFUNCTION "(3), "
+.BR CURLOPT_CLOSESOCKETFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PASSWORD.3
index 928903f0a,000000000..e9e1045e2
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PASSWORD.3
+++ b/docs/libcurl/opts/GNURLOPT_PASSWORD.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PASSWORD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PASSWORD \- password to use in authentication
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PASSWORD, char *pwd);
+.SH DESCRIPTION
+Pass a char * as parameter, which should be pointing to the null-terminated
+password to use for the transfer.
+
+The \fICURLOPT_PASSWORD(3)\fP option should be used in conjunction with the
+\fICURLOPT_USERNAME(3)\fP option.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+blank
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_PASSWORD, "qwerty");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_USERPWD "(3), " CURLOPT_USERNAME "(3), "
+.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_PATH_AS_IS.3
index eb03d0ed1,000000000..09051f81b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PATH_AS_IS.3
+++ b/docs/libcurl/opts/GNURLOPT_PATH_AS_IS.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PATH_AS_IS 3 "17 Jun 2014" "libcurl 7.42.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PATH_AS_IS, long leaveit);
+.SH DESCRIPTION
+Set the long \fIleaveit\fP to 1, to explicitly tell libcurl to not alter the
+given path before passing it on to the server.
+
+This instructs libcurl to NOT squash sequences of "/../" or "/./" that may
+exist in the URL's path part and that is supposed to be removed according to
+RFC 3986 section 5.2.4.
+
+Some server implementations are known to (erroneously) require the dot dot
+sequences to remain in the path and some clients want to pass these on in
+order to try out server implementations.
+
+By default libcurl will merge such sequences before using the path.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL,
"http://example.com/../../etc/password");
++ curl_easy_setopt(curl, CURLOPT_URL,
"https://example.com/../../etc/password");
+
+ curl_easy_setopt(curl, CURLOPT_PATH_AS_IS, 1L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.42.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
+.BR CURLOPT_URL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PINNEDPUBLICKEY.3
index da2d3b581,000000000..bec202d1f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/GNURLOPT_PINNEDPUBLICKEY.3
@@@ -1,128 -1,0 +1,128 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PINNEDPUBLICKEY 3 "27 Aug 2014" "libcurl 7.38.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PINNEDPUBLICKEY \- set pinned public key
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PINNEDPUBLICKEY, char
*pinnedpubkey);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string can be the
+file name of your pinned public key. The file format expected is "PEM" or
"DER".
+The string can also be any number of base64 encoded sha256 hashes preceded by
+"sha256//" and separated by ";"
+
+When negotiating a TLS or SSL connection, the server sends a certificate
+indicating its identity. A public key is extracted from this certificate and
+if it does not exactly match the public key provided to this option, curl will
+abort the connection before sending or receiving any data.
+
+On mismatch, \fICURLE_SSL_PINNEDPUBKEYNOTMATCH\fP is returned.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_PINNEDPUBLICKEY, "/etc/publickey.der");
+ /* OR
+ curl_easy_setopt(curl, CURLOPT_PINNEDPUBLICKEY,
"sha256//YhKJKSzoTt2b5FP18fvpHo7fJYqQCjAa3HWY3tvRMwE=;sha256//t62CeU2tQiqkexU74Gxa2eg7fRbEgoChTociMee9wno=");
+ */
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH PUBLIC KEY EXTRACTION
+If you do not have the server's public key file you can extract it from the
+server's certificate.
+.nf
+# retrieve the server's certificate if you don't already have it
+#
+# be sure to examine the certificate to see if it is what you expected
+#
+# Windows-specific:
+# - Use NUL instead of /dev/null.
+# - OpenSSL may wait for input instead of disconnecting. Hit enter.
+# - If you don't have sed, then just copy the certificate into a file:
+# Lines from -----BEGIN CERTIFICATE----- to -----END CERTIFICATE-----.
+#
+openssl s_client -servername www.example.com -connect www.example.com:443 <
/dev/null | sed -n "/-----BEGIN/,/-----END/p" > www.example.com.pem
+
+# extract public key in pem format from certificate
+openssl x509 -in www.example.com.pem -pubkey -noout >
www.example.com.pubkey.pem
+
+# convert public key from pem to der
+openssl asn1parse -noout -inform pem -in www.example.com.pubkey.pem -out
www.example.com.pubkey.der
+
+# sha256 hash and base64 encode der to string for use
+openssl dgst -sha256 -binary www.example.com.pubkey.der | openssl base64
+.fi
+The public key in PEM format contains a header, base64 data and a
+footer:
+.nf
+-----BEGIN PUBLIC KEY-----
+[BASE 64 DATA]
+-----END PUBLIC KEY-----
+.fi
+.SH AVAILABILITY
+PEM/DER support:
+
+ 7.39.0: OpenSSL, GnuTLS
+
+ 7.39.0-7.48.0,7.58.1+: GSKit
+
+ 7.43.0: NSS and wolfSSL
+
+ 7.47.0: mbedtls
+
+ 7.54.1: SecureTransport on macOS 10.7+/iOS 10+
+
+ 7.58.1: SChannel
+
+sha256 support:
+
+ 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL
+
+ 7.47.0: mbedtls
+
+ 7.54.1: SecureTransport on macOS 10.7+/iOS 10+
+
+ 7.58.1: SChannel Windows XP SP3+
+
+Other SSL backends not supported.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_VERIFYPEER "(3), "
+.BR CURLOPT_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_CAINFO "(3), "
+.BR CURLOPT_CAPATH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PIPEWAIT.3
index 5d68c99c7,000000000..4eeece977
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PIPEWAIT.3
+++ b/docs/libcurl/opts/GNURLOPT_PIPEWAIT.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PIPEWAIT 3 "12 May 2015" "libcurl 7.43.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PIPEWAIT \- wait for pipelining/multiplexing
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PIPEWAIT, long wait);
+.SH DESCRIPTION
+Set \fIwait\fP to 1L to tell libcurl to prefer to wait for a connection to
+confirm or deny that it can do pipelining or multiplexing before continuing.
+
+When about to perform a new transfer that allows pipelining or multiplexing,
+libcurl will check for existing connections to re-use and pipeline on. If no
+such connection exists it will immediately continue and create a fresh new
+connection to use.
+
+By setting this option to 1 - and having \fICURLMOPT_PIPELINING(3)\fP enabled
+for the multi handle this transfer is associated with - libcurl will instead
+wait for the connection to reveal if it is possible to pipeline/multiplex on
+before it continues. This enables libcurl to much better keep the number of
+connections to a minimum when using pipelining or multiplexing protocols.
+
+The effect thus becomes that with this option set, libcurl prefers to wait and
+re-use an existing connection for pipelining rather than the opposite: prefer
+to open a new connection rather than waiting.
+
+The waiting time is as long as it takes for the connection to get up and for
+libcurl to get the necessary response back that informs it about its protocol
+and support level.
+.SH DEFAULT
+0 (off)
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.SH AVAILABILITY
+Added in 7.43.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FORBID_REUSE "(3), " CURLOPT_FRESH_CONNECT "(3), "
+.BR CURLMOPT_PIPELINING "(3), " CURLMOPT_MAX_HOST_CONNECTIONS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PORT.3
index 978d21d1f,000000000..836fdafb0
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PORT.3
+++ b/docs/libcurl/opts/GNURLOPT_PORT.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PORT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_PORT \- set remote port number to work with
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PORT, long number);
+.SH DESCRIPTION
+This option sets \fInumber\fP to be the remote port number to connect to,
+instead of the one specified in the URL or the default port for the used
+protocol.
+
+Usually, you just let the URL decide which port to use but this allows the
+application to override that.
+
+While this option accepts a 'long', a port number is usually a 16 bit number
+and therefore using a port number over 65535 will cause a run-time error.
+.SH DEFAULT
+By default this is 0 which makes it not used.
+.SH PROTOCOLS
+Used for all protocols that speak to a port number.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PORT, 8080L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_POST.3
index 0b3080e0d,000000000..39f70d2eb
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_POST.3
+++ b/docs/libcurl/opts/GNURLOPT_POST.3
@@@ -1,90 -1,0 +1,90 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_POST 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_POST \- request an HTTP POST
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POST, long post);
+.SH DESCRIPTION
+A parameter set to 1 tells libcurl to do a regular HTTP post. This will also
+make the library use a "Content-Type: application/x-www-form-urlencoded"
+header. (This is by far the most commonly used POST method).
+
+Use one of \fICURLOPT_POSTFIELDS(3)\fP or \fICURLOPT_COPYPOSTFIELDS(3)\fP
+options to specify what data to post and \fICURLOPT_POSTFIELDSIZE(3)\fP or
+\fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP to set the data size.
+
+Optionally, you can provide data to POST using the
+\fICURLOPT_READFUNCTION(3)\fP and \fICURLOPT_READDATA(3)\fP options but then
+you must make sure to not set \fICURLOPT_POSTFIELDS(3)\fP to anything but
+NULL. When providing data with a callback, you must transmit it using chunked
+transfer-encoding or you must set the size of the data with the
+\fICURLOPT_POSTFIELDSIZE(3)\fP or \fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP
+options. To enable chunked encoding, you simply pass in the appropriate
+Transfer-Encoding header, see the post-callback.c example.
+
+You can override the default POST Content-Type: header by setting your own
+with \fICURLOPT_HTTPHEADER(3)\fP.
+
+Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
+You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual.
+
+If you use POST to an HTTP 1.1 server, you can send data without knowing the
+size before starting the POST if you use chunked encoding. You enable this by
+adding a header like "Transfer-Encoding: chunked" with
+\fICURLOPT_HTTPHEADER(3)\fP. With HTTP 1.0 or without chunked transfer, you
+must specify the size in the request. (Since 7.66.0, libcurl will
+automatically use chunked encoding for POSTs if the size is unknown.)
+
+When setting \fICURLOPT_POST(3)\fP to 1, libcurl will automatically set
+\fICURLOPT_NOBODY(3)\fP and \fICURLOPT_HTTPGET(3)\fP to 0.
+
+If you issue a POST request and then want to make a HEAD or GET using the same
+re-used handle, you must explicitly set the new request type using
+\fICURLOPT_NOBODY(3)\fP or \fICURLOPT_HTTPGET(3)\fP or similar.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_POST, 1L);
+
+ /* set up the read callback with CURLOPT_READFUNCTION */
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_HTTPPOST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_POSTFIELDS.3
index 88b16a302,000000000..d6b36c8ec
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_POSTFIELDS.3
+++ b/docs/libcurl/opts/GNURLOPT_POSTFIELDS.3
@@@ -1,88 -1,0 +1,88 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_POSTFIELDS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_POSTFIELDS \- specify data to POST to server
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDS, char *postdata);
+.SH DESCRIPTION
+Pass a char * as parameter, pointing to the full data to send in an HTTP POST
+operation. You must make sure that the data is formatted the way you want the
+server to receive it. libcurl will not convert or encode it for you in any
+way. For example, the web server may assume that this data is url-encoded.
+
+The data pointed to is NOT copied by the library: as a consequence, it must be
+preserved by the calling application until the associated transfer finishes.
+This behaviour can be changed (so libcurl does copy the data) by setting the
+\fICURLOPT_COPYPOSTFIELDS(3)\fP option.
+
+This POST is a normal application/x-www-form-urlencoded kind (and libcurl will
+set that Content-Type by default when this option is used), which is commonly
+used by HTML forms. Change Content-Type with \fICURLOPT_HTTPHEADER(3)\fP.
+
+You can use \fIcurl_easy_escape(3)\fP to url-encode your data, if necessary.
It
+returns a pointer to an encoded string that can be passed as \fIpostdata\fP.
+
+Using \fICURLOPT_POSTFIELDS(3)\fP implies setting \fICURLOPT_POST(3)\fP to 1.
+
+If \fICURLOPT_POSTFIELDS(3)\fP is explicitly set to NULL then libcurl will get
+the POST data from the read callback. If you want to send a zero-byte POST set
+\fICURLOPT_POSTFIELDS(3)\fP to an empty string, or set \fICURLOPT_POST(3)\fP
to
+1 and \fICURLOPT_POSTFIELDSIZE(3)\fP to 0.
+
+Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header,
+and libcurl will add that header automatically if the POST is either known to
+be larger than 1MB or if the expected size is unknown. You can disable this
+header with \fICURLOPT_HTTPHEADER(3)\fP as usual.
+
+To make multipart/formdata posts (aka RFC2388-posts), check out the
+\fICURLOPT_HTTPPOST(3)\fP option combined with \fIcurl_formadd(3)\fP.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ const char *data = "data to send";
+
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* size of the POST data */
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L);
+
+ /* pass in a pointer to the data - libcurl will not copy */
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_POSTFIELDSIZE "(3), " CURLOPT_READFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_POSTFIELDSIZE.3
index c3603e00e,000000000..37a3bf419
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_POSTFIELDSIZE.3
+++ b/docs/libcurl/opts/GNURLOPT_POSTFIELDSIZE.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_POSTFIELDSIZE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE, long size);
+.SH DESCRIPTION
+If you want to post data to the server without having libcurl do a strlen() to
+measure the data size, this option must be used. When this option is used you
+can post fully binary data, which otherwise is likely to fail. If this size is
+set to -1, the library will use strlen() to get the size.
+
+If you post more than 2GB, use \fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP.
+.SH DEFAULT
+-1
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ const char *data = "data to send";
+
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* size of the POST data */
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) strlen(data));
+
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_POSTFIELDSIZE_LARGE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_POSTFIELDSIZE_LARGE.3
index 8d4750a20,000000000..3e7c86010
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_POSTFIELDSIZE_LARGE.3
+++ b/docs/libcurl/opts/GNURLOPT_POSTFIELDSIZE_LARGE.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_POSTFIELDSIZE_LARGE 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE_LARGE,
+ curl_off_t size);
+.SH DESCRIPTION
+If you want to post data to the server without having libcurl do a strlen() to
+measure the data size, this option must be used. When this option is used you
+can post fully binary data, which otherwise is likely to fail. If this size is
+set to -1, the library will use strlen() to get the size.
+.SH DEFAULT
+-1
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ const char *data = large_chunk;
+ curl_off_t length_of_data; /* set somehow */
+
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* size of the POST data */
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, length_of_data);
+
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_POSTFIELDS "(3), " CURLOPT_COPYPOSTFIELDS "(3), "
+.BR CURLOPT_POSTFIELDSIZE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_POSTQUOTE.3
index 1e82453be,000000000..ea914dec3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_POSTQUOTE.3
+++ b/docs/libcurl/opts/GNURLOPT_POSTQUOTE.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_POSTQUOTE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTQUOTE, struct curl_slist
*cmds);
+.SH DESCRIPTION
+Pass a pointer to a linked list of FTP or SFTP commands to pass to the server
+after your FTP transfer request. The commands will only be run if no error
+occurred. The linked list should be a fully valid list of struct curl_slist
+structs properly filled in as described for \fICURLOPT_QUOTE(3)\fP.
+
+Disable this operation again by setting a NULL to this option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+SFTP and FTP
+.SH EXAMPLE
+.nf
+struct curl_slist *cmdlist = NULL;
+cmdlist = curl_slist_append(cmdlist, "RNFR source-name");
+cmdlist = curl_slist_append(cmdlist, "RNTO new-name");
+
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
+
+ /* pass in the FTP commands to run after the transfer */
+ curl_easy_setopt(curl, CURLOPT_POSTQUOTE, cmdlist);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+If support for the protocols are built-in.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_QUOTE "(3), " CURLOPT_PREQUOTE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_POSTREDIR.3
index 1729c843f,000000000..c4da6bd8d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_POSTREDIR.3
+++ b/docs/libcurl/opts/GNURLOPT_POSTREDIR.3
@@@ -1,73 -1,0 +1,73 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_POSTREDIR 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_POSTREDIR \- how to act on an HTTP POST redirect
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTREDIR,
+ long bitmask);
+.SH DESCRIPTION
+Pass a bitmask to control how libcurl acts on redirects after POSTs that get a
+301, 302 or 303 response back. A parameter with bit 0 set (value
+\fBCURL_REDIR_POST_301\fP) tells the library to respect RFC 7231 (section
+6.4.2 to 6.4.4) and not convert POST requests into GET requests when following
+a 301 redirection. Setting bit 1 (value \fBCURL_REDIR_POST_302\fP) makes
+libcurl maintain the request method after a 302 redirect whilst setting bit 2
+(value \fBCURL_REDIR_POST_303\fP) makes libcurl maintain the request method
+after a 303 redirect. The value \fBCURL_REDIR_POST_ALL\fP is a convenience
+define that sets all three bits.
+
+The non-RFC behaviour is ubiquitous in web browsers, so the library does the
+conversion by default to maintain consistency. However, a server may require a
+POST to remain a POST after such a redirection. This option is meaningful only
+when setting \fICURLOPT_FOLLOWLOCATION(3)\fP.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* a silly POST example */
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data=true");
+
+ /* example.com is redirected, so we tell libcurl to send POST on 301, 302
and
+ 303 HTTP response codes */
+ curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.17.1. This option was known as CURLOPT_POST301 up to 7.19.0 as it
+only supported the 301 then. CURL_REDIR_POST_303 was added in 7.26.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FOLLOWLOCATION "(3), " CURLOPT_POSTFIELDS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PREQUOTE.3
index 16d3cc0b6,000000000..1ec5510ee
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PREQUOTE.3
+++ b/docs/libcurl/opts/GNURLOPT_PREQUOTE.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PREQUOTE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PREQUOTE \- commands to run before an FTP transfer
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PREQUOTE,
+ struct curl_slist *cmds);
+.SH DESCRIPTION
+Pass a pointer to a linked list of FTP commands to pass to the server after
+the transfer type is set. The linked list should be a fully valid list of
+struct curl_slist structs properly filled in as described for
+\fICURLOPT_QUOTE(3)\fP. Disable this operation again by setting a NULL to this
+option.
+
+While \fICURLOPT_QUOTE(3)\fP and \fICURLOPT_POSTQUOTE(3)\fP work for SFTP,
+this option does not.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+struct curl_slist *cmdlist = NULL;
+cmdlist = curl_slist_append(cmdlist, "SYST");
+
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
+
+ /* pass in the FTP commands to run */
+ curl_easy_setopt(curl, CURLOPT_PREQUOTE, cmdlist);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with the protocol support
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_QUOTE "(3), " CURLOPT_POSTQUOTE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PRE_PROXY.3
index 28a3b2be7,000000000..c66df04a4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PRE_PROXY.3
+++ b/docs/libcurl/opts/GNURLOPT_PRE_PROXY.3
@@@ -1,79 -1,0 +1,79 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PRE_PROXY 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PRE_PROXY \- set pre-proxy to use
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PRE_PROXY, char *preproxy);
+.SH DESCRIPTION
+Set the \fIpreproxy\fP to use for the upcoming request. The parameter
+should be a char * to a null-terminated string holding the host name or dotted
+numerical IP address. A numerical IPv6 address must be written within
+[brackets].
+
+To specify port number in this string, append :[port] to the end of the host
+name. The proxy's port number may optionally be specified with the separate
+option \fICURLOPT_PROXYPORT(3)\fP. If not specified, libcurl will default to
+using port 1080 for proxies.
+
+A pre proxy is a SOCKS proxy that curl connects to before it connects to the
+HTTP(S) proxy specified in the \fICURLOPT_PROXY\fP option. The pre proxy can
+only be a SOCKS proxy.
+
+The pre proxy string should be prefixed with [scheme]:// to specify which kind
+of socks is used. Use socks4://, socks4a://, socks5:// or socks5h:// (the last
+one to enable socks5 and asking the proxy to do the resolving, also known as
+\fICURLPROXY_SOCKS5_HOSTNAME\fP type) to request the specific SOCKS version to
+be used. Otherwise SOCKS4 is used as default.
+
+Setting the pre proxy string to "" (an empty string) will explicitly disable
+the use of a pre proxy.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+Default is NULL, meaning no pre proxy is used.
+
+When you set a host name to use, do not assume that there's any particular
+single port number used widely for proxies. Specify it!
+.SH PROTOCOLS
+All except file://. Note that some protocols don't do very well over proxy.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_PREPROXY, "socks4://socks-proxy:1080");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if proxies are supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_HTTPPROXYTUNNEL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PRIVATE.3
index 7074cb8a1,000000000..29c5dffb7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PRIVATE.3
+++ b/docs/libcurl/opts/GNURLOPT_PRIVATE.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PRIVATE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PRIVATE \- store a private pointer
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PRIVATE, void *pointer);
+.SH DESCRIPTION
+Pass a void * as parameter, pointing to data that should be associated with
+this curl handle. The pointer can subsequently be retrieved using
+\fIcurl_easy_getinfo(3)\fP with the CURLINFO_PRIVATE option. libcurl itself
+never does anything with this data.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+struct private secrets;
+if(curl) {
+ struct private *extracted;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* store a pointer to our private struct */
+ curl_easy_setopt(curl, CURLOPT_PRIVATE, &secrets);
+
+ curl_easy_perform(curl);
+
+ /* we can extract the private pointer again too */
+ curl_easy_getinfo(curl, CURLINFO_PRIVATE, &extracted);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10.3
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_VERBOSE "(3), " CURLOPT_STDERR "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROGRESSDATA.3
index 8156eaa38,000000000..28c228bc6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROGRESSDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_PROGRESSDATA.3
@@@ -1,44 -1,0 +1,44 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROGRESSDATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSDATA, void *pointer);
+.SH DESCRIPTION
+Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first
+argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION(3)\fP.
+.SH DEFAULT
+The default value of this parameter is NULL.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
- https://curl.haxx.se/libcurl/c/progressfunc.html
++https://curl.se/libcurl/c/progressfunc.html
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_PROGRESSFUNCTION "(3), " CURLOPT_XFERINFOFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROGRESSFUNCTION.3
index bfa566ec6,000000000..a6151f1fa
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROGRESSFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_PROGRESSFUNCTION.3
@@@ -1,87 -1,0 +1,87 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROGRESSFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+int progress_callback(void *clientp,
+ double dltotal,
+ double dlnow,
+ double ultotal,
+ double ulnow);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSFUNCTION,
progress_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+We encourage users to use the newer \fICURLOPT_XFERINFOFUNCTION(3)\fP instead,
+if you can.
+
+This function gets called by libcurl instead of its internal equivalent with a
+frequent interval. While data is being transferred it will be called very
+frequently, and during slow periods like when nothing is being transferred it
+can slow down to about one call per second.
+
+\fIclientp\fP is the pointer set with \fICURLOPT_PROGRESSDATA(3)\fP, it is not
+used by libcurl but is only passed along from the application to the callback.
+
+The callback gets told how much data libcurl will transfer and has
+transferred, in number of bytes. \fIdltotal\fP is the total number of bytes
+libcurl expects to download in this transfer. \fIdlnow\fP is the number of
+bytes downloaded so far. \fIultotal\fP is the total number of bytes libcurl
+expects to upload in this transfer. \fIulnow\fP is the number of bytes
+uploaded so far.
+
+Unknown/unused argument values passed to the callback will be set to zero
+(like if you only download data, the upload size will remain 0). Many times
+the callback will be called one or more times first, before it knows the data
+sizes so a program must be made to handle that.
+
+If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
+libcurl to continue executing the default progress function.
+
+Returning any other non-zero value from this callback will cause libcurl to
+abort the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
+
+If you transfer data with the multi interface, this function will not be
+called during periods of idleness unless you call the appropriate libcurl
+function that performs transfers.
+
+\fICURLOPT_NOPROGRESS(3)\fP must be set to 0 to make this function actually
+get called.
+.SH DEFAULT
+By default, libcurl has an internal progress meter. That's rarely wanted by
+users.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
- https://curl.haxx.se/libcurl/c/progressfunc.html
++https://curl.se/libcurl/c/progressfunc.html
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK.
+.SH "SEE ALSO"
+.BR CURLOPT_VERBOSE "(3), " CURLOPT_NOPROGRESS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROTOCOLS.3
index fe540720f,000000000..417d11958
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROTOCOLS.3
+++ b/docs/libcurl/opts/GNURLOPT_PROTOCOLS.3
@@@ -1,93 -1,0 +1,93 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROTOCOLS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROTOCOLS \- set allowed protocols
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROTOCOLS, long bitmask);
+.SH DESCRIPTION
+Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask
+limits what protocols libcurl may use in the transfer. This allows you to have
+a libcurl built to support a wide range of protocols but still limit specific
+transfers to only be allowed to use a subset of them. By default libcurl will
+accept all protocols it supports (\fICURLPROTO_ALL\fP). See also
+\fICURLOPT_REDIR_PROTOCOLS(3)\fP.
+
+These are the available protocol defines:
+.nf
+CURLPROTO_DICT
+CURLPROTO_FILE
+CURLPROTO_FTP
+CURLPROTO_FTPS
+CURLPROTO_GOPHER
+CURLPROTO_HTTP
+CURLPROTO_HTTPS
+CURLPROTO_IMAP
+CURLPROTO_IMAPS
+CURLPROTO_LDAP
+CURLPROTO_LDAPS
+CURLPROTO_POP3
+CURLPROTO_POP3S
+CURLPROTO_RTMP
+CURLPROTO_RTMPE
+CURLPROTO_RTMPS
+CURLPROTO_RTMPT
+CURLPROTO_RTMPTE
+CURLPROTO_RTMPTS
+CURLPROTO_RTSP
+CURLPROTO_SCP
+CURLPROTO_SFTP
+CURLPROTO_SMB
+CURLPROTO_SMBS
+CURLPROTO_SMTP
+CURLPROTO_SMTPS
+CURLPROTO_TELNET
+CURLPROTO_TFTP
+.fi
+.SH DEFAULT
+All protocols built-in
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ /* pass in the URL from an external source */
+ curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
+
+ /* only allow HTTP, TFTP and SFTP */
+ curl_easy_setopt(curl, CURLOPT_PROTOCOLS,
+ CURLPROTO_HTTP | CURLPROTO_TFTP | CURLPROTO_SFTP);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_REDIR_PROTOCOLS "(3), " CURLOPT_URL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY.3
index 677b038d0,000000000..30d1ad47f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY.3
@@@ -1,116 -1,0 +1,116 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY \- set proxy to use
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY, char *proxy);
+.SH DESCRIPTION
+Set the \fIproxy\fP to use for the upcoming request. The parameter should be a
+char * to a null-terminated string holding the host name or dotted numerical
+IP address. A numerical IPv6 address must be written within [brackets].
+
+To specify port number in this string, append :[port] to the end of the host
+name. The proxy's port number may optionally be specified with the separate
+option \fICURLOPT_PROXYPORT(3)\fP. If not specified, libcurl will default to
+using port 1080 for proxies.
+
+The proxy string may be prefixed with [scheme]:// to specify which kind of
+proxy is used.
+
+.RS
+.IP http://
+HTTP Proxy. Default when no scheme or proxy type is specified.
+.IP https://
+HTTPS Proxy. (Added in 7.52.0 for OpenSSL, GnuTLS and NSS)
+.IP socks4://
+SOCKS4 Proxy.
+.IP socks4a://
+SOCKS4a Proxy. Proxy resolves URL hostname.
+.IP socks5://
+SOCKS5 Proxy.
+.IP socks5h://
+SOCKS5 Proxy. Proxy resolves URL hostname.
+.RE
+
+Without a scheme prefix, \fICURLOPT_PROXYTYPE(3)\fP can be used to specify
+which kind of proxy the string identifies.
+
+When you tell the library to use an HTTP proxy, libcurl will transparently
+convert operations to HTTP even if you specify an FTP URL etc. This may have
+an impact on what other features of the library you can use, such as
+\fICURLOPT_QUOTE(3)\fP and similar FTP specifics that don't work unless you
+tunnel through the HTTP proxy. Such tunneling is activated with
+\fICURLOPT_HTTPPROXYTUNNEL(3)\fP.
+
+Setting the proxy string to "" (an empty string) will explicitly disable the
+use of a proxy, even if there is an environment variable set for it.
+
+A proxy host string can also include protocol scheme (http://) and embedded
+user + password.
+
+The application does not have to keep the string around after setting this
+option.
+.SH "Environment variables"
+libcurl respects the proxy environment variables named \fBhttp_proxy\fP,
+\fBftp_proxy\fP, \fBsftp_proxy\fP etc. If set, libcurl will use the specified
+proxy for that URL scheme. So for a "FTP://" URL, the \fBftp_proxy\fP is
+considered. \fBall_proxy\fP is used if no protocol specific proxy was set.
+
+If \fBno_proxy\fP (or \fBNO_PROXY\fP) is set, it is the exact equivalent of
+setting the \fICURLOPT_NOPROXY(3)\fP option.
+
+The \fICURLOPT_PROXY(3)\fP and \fICURLOPT_NOPROXY(3)\fP options override
+environment variables.
+.SH DEFAULT
+Default is NULL, meaning no proxy is used.
+
+When you set a host name to use, do not assume that there's any particular
+single port number used widely for proxies. Specify it!
+.SH PROTOCOLS
+All except file://. Note that some protocols don't do very well over proxy.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Since 7.14.1 the proxy environment variable names can include the protocol
+scheme.
+
+Since 7.21.7 the proxy string supports the socks protocols as "schemes".
+
+Since 7.50.2, unsupported schemes in proxy strings cause libcurl to return
+error.
+.SH RETURN VALUE
+Returns CURLE_OK if proxies are supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXYPORT "(3), " CURLOPT_HTTPPROXYTUNNEL "(3), "
+.BR CURLOPT_PROXYTYPE "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_PROXYAUTH.3
index 6439eb62a,000000000..0be2f299d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXYAUTH.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXYAUTH.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXYAUTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYAUTH, long bitmask);
+.SH DESCRIPTION
+Pass a long as parameter, which is set to a bitmask, to tell libcurl which
+HTTP authentication method(s) you want it to use for your proxy
+authentication. If more than one bit is set, libcurl will first query the
+site to see what authentication methods it supports and then pick the best one
+you allow it to use. For some methods, this will induce an extra network
+round-trip. Set the actual name and password with the
+\fICURLOPT_PROXYUSERPWD(3)\fP option.
+
+The bitmask can be constructed by or'ing together the bits fully listed and
+described in the \fICURLOPT_HTTPAUTH(3)\fP man page.
+.SH DEFAULT
+CURLAUTH_BASIC
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* use this proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://local.example.com:1080");
+ /* allow whatever auth the proxy speaks */
+ curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
+ /* set the proxy credentials */
+ curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "james:007");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.10.7
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_NOT_BUILT_IN if the bitmask specified no supported authentication
+methods.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), "
+.BR CURLOPT_PROXYUSERPWD "(3), " CURLOPT_PROXYPORT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXYHEADER.3
index 08f610baa,000000000..a4e50e018
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXYHEADER.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXYHEADER.3
@@@ -1,75 -1,0 +1,75 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXYHEADER 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYHEADER,
+ struct curl_slist *headers);
+.SH DESCRIPTION
+Pass a pointer to a linked list of HTTP headers to pass in your HTTP request
+sent to a proxy. The rules for this list is identical to the
+\fICURLOPT_HTTPHEADER(3)\fP option's.
+
+The headers set with this option is only ever used in requests sent to a proxy
+- when there's also a request sent to a host.
+
+The first line in a request (containing the method, usually a GET or POST) is
+NOT a header and cannot be replaced using this option. Only the lines
+following the request-line are headers. Adding this method line in this list
+of headers will only cause your request to send an invalid header.
+
+Pass a NULL to this to reset back to no custom headers.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+
+struct curl_slist *list;
+
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy.example.com:80");
+
+ list = curl_slist_append(NULL, "Shoesize: 10");
+ list = curl_slist_append(list, "Accept:");
+
+ curl_easy_setopt(curl, CURLOPT_PROXYHEADER, list);
+
+ curl_easy_perform(curl);
+
+ curl_slist_free_all(list); /* free the list again */
+}
+.fi
+.SH AVAILABILITY
+Added in 7.37.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_HEADEROPT "(3), " CURLOPT_HTTPHEADER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXYPASSWORD.3
index 04dfbbc96,000000000..9159787cf
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXYPASSWORD.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXYPASSWORD.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXYPASSWORD 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPASSWORD, char *pwd);
+.SH DESCRIPTION
+Pass a char * as parameter, which should be pointing to the null-terminated
+password to use for authentication with the proxy.
+
+The \fICURLOPT_PROXYPASSWORD(3)\fP option should be used in conjunction with
+the \fICURLOPT_PROXYUSERNAME(3)\fP option.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+blank
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
+ curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, "mrsmith");
+ curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, "qwerty");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PASSWORD "(3), " CURLOPT_PROXYUSERNAME "(3), "
+.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_PROXYPORT.3
index 75afbbe9e,000000000..49274387f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXYPORT.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXYPORT.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXYPORT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXYPORT \- port number the proxy listens on
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPORT, long port);
+.SH DESCRIPTION
+Pass a long with this option to set the proxy port to connect to unless it is
+specified in the proxy string \fICURLOPT_PROXY(3)\fP or uses 443 for https
+proxies and 1080 for all others as default.
+
+While this accepts a 'long', the port number is 16 bit so it can't be larger
+than 65535.
+.SH DEFAULT
+0, not specified which makes it use the default port
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "localhost");
+ curl_easy_setopt(curl, CURLOPT_PROXYPORT, 8080L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXYTYPE.3
index 60df0143b,000000000..e67977d1c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXYTYPE.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXYTYPE.3
@@@ -1,76 -1,0 +1,76 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXYTYPE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXYTYPE \- proxy protocol type
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYTYPE, long type);
+.SH DESCRIPTION
+Pass one of the values below to set the type of the proxy.
+
+.RS
+.IP CURLPROXY_HTTP
+HTTP Proxy. Default.
+.IP CURLPROXY_HTTPS
+HTTPS Proxy. (Added in 7.52.0 for OpenSSL, GnuTLS and NSS)
+.IP CURLPROXY_HTTP_1_0
+HTTP 1.0 Proxy. This is very similar to CURLPROXY_HTTP except it uses HTTP/1.0
+for any CONNECT tunnelling. It does not change the HTTP version of the actual
+HTTP requests, controlled by \fICURLOPT_HTTP_VERSION(3)\fP.
+.IP CURLPROXY_SOCKS4
+SOCKS4 Proxy.
+.IP CURLPROXY_SOCKS4A
+SOCKS4a Proxy. Proxy resolves URL hostname.
+.IP CURLPROXY_SOCKS5
+SOCKS5 Proxy.
+.IP CURLPROXY_SOCKS5_HOSTNAME
+SOCKS5 Proxy. Proxy resolves URL hostname.
+.RE
+
+Often it is more convenient to specify the proxy type with the scheme part of
+the \fICURLOPT_PROXY(3)\fP string.
+.SH DEFAULT
+CURLPROXY_HTTP
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "local.example.com:1080");
+ /* set the proxy type */
+ curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYPORT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXYUSERNAME.3
index 4d85aaa63,000000000..0414c368a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXYUSERNAME.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXYUSERNAME.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXYUSERNAME 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYUSERNAME,
+ char *username);
+.SH DESCRIPTION
+Pass a char * as parameter, which should be pointing to the null-terminated
+user name to use for the transfer.
+
+\fICURLOPT_PROXYUSERNAME(3)\fP sets the user name to be used in protocol
+authentication with the proxy.
+
+To specify the proxy password use the \fICURLOPT_PROXYPASSWORD(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+blank
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
+ curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, "mrsmith");
+ curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, "qwerty");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXYPASSWORD "(3), " CURLOPT_USERNAME "(3), "
+.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_PROXYUSERPWD.3
index 87cdda544,000000000..46e9a26e3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXYUSERPWD.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXYUSERPWD.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXYUSERPWD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYUSERPWD, char *userpwd);
+.SH DESCRIPTION
+Pass a char * as parameter, which should be [user name]:[password] to use for
+the connection to the HTTP proxy. Both the name and the password will be URL
+decoded before use, so to include for example a colon in the user name you
+should encode it as %3A. (This is different to how \fICURLOPT_USERPWD(3)\fP is
+used - beware.)
+
+Use \fICURLOPT_PROXYAUTH(3)\fP to specify the authentication method.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+This is NULL by default.
+.SH PROTOCOLS
+Used with all protocols that can use a proxy
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
+ curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "clark%20kent:superman");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK if proxies are supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_CAINFO.3
index 1fb4ca30d,000000000..22f2d6b2d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_CAINFO.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_CAINFO.3
@@@ -1,83 -1,0 +1,83 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_CAINFO 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CAINFO, char *path);
+.SH DESCRIPTION
+This option is for connecting to an HTTPS proxy, not an HTTPS server.
+
+Pass a char * to a null-terminated string naming a file holding one or more
+certificates to verify the HTTPS proxy with.
+
+If \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP is zero and you avoid verifying the
+server's certificate, \fICURLOPT_PROXY_CAINFO(3)\fP need not even indicate an
+accessible file.
+
+This option is by default set to the system path where libcurl's cacert bundle
+is assumed to be stored, as established at build time.
+
+If curl is built against the NSS SSL library, the NSS PEM PKCS#11 module
+(libnsspem.so) needs to be available for this option to work properly.
+
+(iOS and macOS only) If curl is built against Secure Transport, then this
+option is supported for backward compatibility with other SSL engines, but it
+should not be set. If the option is not set, then curl will use the
+certificates in the system and user Keychain to verify the peer, which is the
+preferred method of verifying the peer's certificate chain.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+Built-in system specific
+.SH PROTOCOLS
+Used with HTTPS proxy
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* using an HTTPS proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_CAINFO, "/etc/certs/cabundle.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+
+For TLS backends that don't support certificate files, the
+\fICURLOPT_PROXY_CAINFO(3)\fP option is ignored. Refer to
- https://curl.haxx.se/docs/ssl-compared.html
++https://curl.se/docs/ssl-compared.html
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_CAPATH "(3), "
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_CAPATH "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_CAPATH.3
index aed464146,000000000..50bc2e10f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_CAPATH.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_CAPATH.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_CAPATH 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CAPATH, char *capath);
+.SH DESCRIPTION
+Pass a char * to a null-terminated string naming a directory holding multiple
+CA certificates to verify the HTTPS proxy with. If libcurl is built against
+OpenSSL, the certificate directory must be prepared using the openssl c_rehash
+utility. This makes sense only when \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP is
+enabled (which it is by default).
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+Everything used over an HTTPS proxy
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* using an HTTPS proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_CAPATH, "/etc/cert-dir");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+
+This option is supported by the OpenSSL, GnuTLS, and mbedTLS (since 7.56.0)
+backends. The NSS backend provides the option only for backward compatibility.
+.SH RETURN VALUE
+CURLE_OK if supported; or an error such as:
+
+CURLE_NOT_BUILT_IN - Not supported by the SSL backend
+
+CURLE_UNKNOWN_OPTION
+
+CURLE_OUT_OF_MEMORY
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_CAINFO "(3), "
- .Br CURLOPT_CAINFO "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
++.BR CURLOPT_CAINFO "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_CRLFILE.3
index 499435c58,000000000..72e09b165
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_CRLFILE.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_CRLFILE.3
@@@ -1,75 -1,0 +1,75 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_CRLFILE 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CRLFILE, char *file);
+.SH DESCRIPTION
+This option is for connecting to an HTTPS proxy, not an HTTPS server.
+
+Pass a char * to a null-terminated string naming a \fIfile\fP with the
+concatenation of CRL (in PEM format) to use in the certificate validation that
+occurs during the SSL exchange.
+
+When curl is built to use NSS or GnuTLS, there is no way to influence the use
+of CRL passed to help in the verification process. When libcurl is built with
+OpenSSL support, X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL are both
+set, requiring CRL check against all the elements of the certificate chain if
+a CRL file is passed.
+
+This option makes sense only when used in combination with the
+\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP option.
+
+A specific error code (\fICURLE_SSL_CRL_BADFILE\fP) is defined with the
+option. It is returned when the SSL exchange fails because the CRL file cannot
+be loaded. A failure in certificate verification due to a revocation
+information found in the CRL does not trigger this specific error.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+Used with HTTPS proxy.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:80");
+ curl_easy_setopt(curl, CURLOPT_PROXY_CRLFILE, "/etc/certs/crl.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_ISSUERCERT.3
index 6396dddfb,000000000..840337b62
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_ISSUERCERT.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_ISSUERCERT.3
@@@ -1,73 -1,0 +1,73 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_ISSUERCERT 3 "24 Jun 2020" "libcurl 7.71.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_ISSUERCERT \- proxy issuer SSL certificate filename
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_ISSUERCERT, char *file);
+.SH DESCRIPTION
+Pass a char * to a null-terminated string naming a \fIfile\fP holding a CA
+certificate in PEM format. If the option is set, an additional check against
+the peer certificate is performed to verify the issuer of the the HTTPS proxy
+is indeed the one associated with the certificate provided by the option.
+This additional check is useful in multi-level PKI where one needs to enforce
+that the peer certificate is from a specific branch of the tree.
+
+This option makes sense only when used in combination with the
+\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP option. Otherwise, the result of the
+check is not considered as failure.
+
+A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option,
+which is returned if the setup of the SSL/TLS session has failed due to a
+mismatch with the issuer of peer certificate
+(\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP has to be set too for the check to
+fail).
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* using an HTTPS proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_ISSUERCERT, "/etc/certs/cacert.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_ISSUERCERT_BLOB.3
index 6165bedf1,000000000..bd357da9b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_ISSUERCERT_BLOB.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_ISSUERCERT_BLOB.3
@@@ -1,85 -1,0 +1,85 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_ISSUERCERT_BLOB 3 "24 Jun 2020" "libcurl 7.71.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_ISSUERCERT_BLOB \- proxy issuer SSL certificate from memory blob
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_ISSUERCERT_BLOB,
+ struct curl_blob *blob);
+.fi
+.SH DESCRIPTION
+Pass a pointer to a curl_blob struct, which contains information (pointer and
+size) about a memory block with binary data of a CA certificate in PEM
+format. If the option is set, an additional check against the peer certificate
+is performed to verify the issuer of the the HTTPS proxy is indeed the one
+associated with the certificate provided by the option. This additional check
+is useful in multi-level PKI where one needs to enforce that the peer
+certificate is from a specific branch of the tree.
+
+This option should be used in combination with the
+\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP option. Otherwise, the result of the
+check is not considered as failure.
+
+A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option,
+which is returned if the setup of the SSL/TLS session has failed due to a
+mismatch with the issuer of peer certificate
+(\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP has to be set too for the check to
+fail).
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_PROXY_ISSUERCERT(3)\fP which
+instead expects a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* using an HTTPS proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:443");
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_PROXY_ISSUERCERT_BLOB, &blob);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_KEYPASSWD.3
index 3da1669da,000000000..d825642f4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_KEYPASSWD.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_KEYPASSWD.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_KEYPASSWD 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_KEYPASSWD, char *pwd);
+.SH DESCRIPTION
+This option is for connecting to an HTTPS proxy, not an HTTPS server.
+
+Pass a pointer to a null-terminated string as parameter. It will be used as
+the password required to use the \fICURLOPT_PROXY_SSLKEY(3)\fP private key.
+You never needed a pass phrase to load a certificate but you need one to load
+your private key.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+Used with HTTPS proxy
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "superman");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSLKEY "(3), " CURLOPT_SSH_PRIVATE_KEYFILE "(3), "
+.BR CURLOPT_SSLKEY "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_PINNEDPUBLICKEY.3
index f0b344630,000000000..0b02bac9e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_PINNEDPUBLICKEY.3
@@@ -1,111 -1,0 +1,111 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_PINNEDPUBLICKEY 3 "24 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_PINNEDPUBLICKEY, char
*pinnedpubkey);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string can be the
+file name of your pinned public key. The file format expected is "PEM" or
"DER".
+The string can also be any number of base64 encoded sha256 hashes preceded by
+"sha256//" and separated by ";"
+
+When negotiating a TLS or SSL connection, the https proxy sends a certificate
+indicating its identity. A public key is extracted from this certificate and
+if it does not exactly match the public key provided to this option, curl will
+abort the connection before sending or receiving any data.
+
+On mismatch, \fICURLE_SSL_PINNEDPUBKEYNOTMATCH\fP is returned.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_PINNEDPUBLICKEY,
+
"sha256//YhKJKSzoTt2b5FP18fvpHo7fJYqQCjAa3HWY3tvRMwE=;sha256//t62CeU2tQiqkexU74Gxa2eg7fRbEgoChTociMee9wno=");
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH PUBLIC KEY EXTRACTION
+If you do not have the https proxy server's public key file you can extract it
+from the https proxy server's certificate.
+.nf
+# retrieve the server's certificate if you don't already have it
+#
+# be sure to examine the certificate to see if it is what you expected
+#
+# Windows-specific:
+# - Use NUL instead of /dev/null.
+# - OpenSSL may wait for input instead of disconnecting. Hit enter.
+# - If you don't have sed, then just copy the certificate into a file:
+# Lines from -----BEGIN CERTIFICATE----- to -----END CERTIFICATE-----.
+#
+openssl s_client -servername www.example.com -connect www.example.com:443 <
/dev/null | sed -n "/-----BEGIN/,/-----END/p" > www.example.com.pem
+
+# extract public key in pem format from certificate
+openssl x509 -in www.example.com.pem -pubkey -noout >
www.example.com.pubkey.pem
+
+# convert public key from pem to der
+openssl asn1parse -noout -inform pem -in www.example.com.pubkey.pem -out
www.example.com.pubkey.der
+
+# sha256 hash and base64 encode der to string for use
+openssl dgst -sha256 -binary www.example.com.pubkey.der | openssl base64
+.fi
+The public key in PEM format contains a header, base64 data and a
+footer:
+.nf
+-----BEGIN PUBLIC KEY-----
+[BASE 64 DATA]
+-----END PUBLIC KEY-----
+.fi
+.SH AVAILABILITY
+PEM/DER support:
+
+ 7.52.0: GSKit, GnuTLS, NSS, OpenSSL, mbedtls, wolfSSL
+
+sha256 support:
+
+ 7.52.0: GnuTLS, NSS, OpenSSL, mbedtls, wolfSSL
+
+Other SSL backends not supported.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), "
+.BR CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_PROXY_CAINFO "(3), "
+.BR CURLOPT_PROXY_CAPATH "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SERVICE_NAME.3
index 875a90440,000000000..fc7182d4b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SERVICE_NAME.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SERVICE_NAME.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SERVICE_NAME 3 "17 Jun 2015" "libcurl 7.43.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SERVICE_NAME \- proxy authentication service name
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SERVICE_NAME, char
*name);
+.SH DESCRIPTION
+Pass a char * as parameter to a string holding the \fIname\fP of the
+service. The default service name is "HTTP" for HTTP based proxies and "rcmd"
+for SOCKS5. This option allows you to change it.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+See above
+.SH PROTOCOLS
+All network protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SERVICE_NAME, "custom");
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.43.0 for HTTP proxies, 7.49.0 for SOCKS5 proxies.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSLCERT.3
index 677225eef,000000000..f670f0070
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSLCERT.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSLCERT.3
@@@ -1,72 -1,0 +1,72 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSLCERT 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERT, char *cert);
+.SH DESCRIPTION
+This option is for connecting to an HTTPS proxy, not an HTTPS server.
+
+Pass a pointer to a null-terminated string as parameter. The string should be
+the file name of your client certificate used to connect to the HTTPS proxy.
+The default format is "P12" on Secure Transport and "PEM" on other engines,
+and can be changed with \fICURLOPT_PROXY_SSLCERTTYPE(3)\fP.
+
+With NSS or Secure Transport, this can also be the nickname of the certificate
+you wish to authenticate with as it is named in the security database. If you
+want to use a file from the current directory, please precede it with "./"
+prefix, in order to avoid confusion with a nickname.
+
+When using a client certificate, you most likely also need to provide a
+private key with \fICURLOPT_PROXY_SSLKEY(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+Used with HTTPS proxy
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSLCERTTYPE "(3), " CURLOPT_PROXY_SSLKEY "(3), "
+.BR CURLOPT_SSLCERT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSLCERTTYPE.3
index b0ecc2b15,000000000..8f3525c7f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSLCERTTYPE.3
@@@ -1,67 -1,0 +1,67 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSLCERTTYPE 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERTTYPE, char
*type);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string should be
+the format of your client certificate used when connecting to an HTTPS proxy.
+
+Supported formats are "PEM" and "DER", except with Secure Transport. OpenSSL
+(versions 0.9.3 and later) and Secure Transport (on iOS 5 or later, or OS X
+10.7 or later) also support "P12" for PKCS#12-encoded files.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+"PEM"
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERTTYPE, "PEM");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSLCERT "(3), " CURLOPT_PROXY_SSLKEY "(3), "
+.BR CURLOPT_SSLCERTTYPE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSLCERT_BLOB.3
index 4e7fc427b,000000000..76c9f6b7b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSLCERT_BLOB.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSLCERT_BLOB.3
@@@ -1,72 -1,0 +1,72 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSLCERT_BLOB 3 "24 Jun 2020" "libcurl 7.71.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSLCERT_BLOB \- SSL proxy client certificate from memory blob
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERT_BLOB, struct
curl_blob *blob);
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure, which contains information (pointer
+and size) about a memory block with binary data of the certificate used to
+connect to the HTTPS proxy. The format must be "P12" on Secure Transport or
+Schannel. The format must be "P12" or "PEM" on OpenSSL. The string "P12" or
+"PEM" must be specified with \fICURLOPT_PROXY_SSLCERTTYPE(3)\fP.
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_PROXY_SSLCERT(3)\fP which instead
+expects a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT_BLOB, &blob);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL, Secure
+Transport and Schannel backends.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSLCERTTYPE "(3), " CURLOPT_PROXY_SSLKEY "(3), "
+.BR CURLOPT_PROXY_SSLCERT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSLKEY.3
index e8bcaab66,000000000..3cff36a5f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSLKEY.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSLKEY.3
@@@ -1,68 -1,0 +1,68 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSLKEY 3 "16 Nov 2016" "libcurl 7.52.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client
cert
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEY, char *keyfile);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string should be
+the file name of your private key used for connecting to the HTTPS proxy. The
+default format is "PEM" and can be changed with
+\fICURLOPT_PROXY_SSLKEYTYPE(3)\fP.
+
+(iOS and Mac OS X only) This option is ignored if curl was built against
+Secure Transport. Secure Transport expects the private key to be already
+present in the keychain or PKCS#12 file containing the certificate.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSLKEYTYPE "(3), " CURLOPT_PROXY_SSLCERT "(3), "
+.BR CURLOPT_SSLKEYTYPE "(3), " CURLOPT_SSLCERT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSLKEYTYPE.3
index 344db1223,000000000..c72dbb9e1
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSLKEYTYPE.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSLKEYTYPE 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEYTYPE, char *type);
+.SH DESCRIPTION
+This option is for connecting to an HTTPS proxy, not an HTTPS server.
+
+Pass a pointer to a null-terminated string as parameter. The string should be
+the format of your private key. Supported formats are "PEM", "DER" and "ENG".
+
+The application does not have to keep the string around after setting this
+option.
+.SH PROTOCOLS
+Used with HTTPS proxy
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEYTYPE, "PEM");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSLKEY "(3), " CURLOPT_PROXY_SSLCERT "(3), "
+.BR CURLOPT_SSLKEYTYPE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSLKEY_BLOB.3
index 7431f3261,000000000..7ad093712
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSLKEY_BLOB.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSLKEY_BLOB.3
@@@ -1,73 -1,0 +1,73 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSLKEY_BLOB 3 "24 Jun 2020" "libcurl 7.71.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSLKEY_BLOB \- private key for proxy cert from memory blob
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEY_BLOB,
+ struct curl_blob *blob);
+.fi
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure that contains information (pointer and
+size) about the private key for connecting to the HTTPS proxy. Compatible with
+OpenSSL. The format (like "PEM") must be specified with
+\fICURLOPT_PROXY_SSLKEYTYPE(3)\fP.
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT_BLOB, &blob);
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERTTYPE, "PEM");
+
+ blob.data = privateKeyData;
+ blob.len = privateKeySize;
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY_BLOB, &blob);
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLKEYTYPE "(3), " CURLOPT_SSLKEY "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSLVERSION.3
index 7d3b0f5aa,000000000..d7f914d0b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSLVERSION.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSLVERSION.3
@@@ -1,100 -1,0 +1,100 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, 2018, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSLVERSION 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSLVERSION \- set preferred proxy TLS/SSL version
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLVERSION, long
version);
+.SH DESCRIPTION
+Pass a long as parameter to control which version of SSL/TLS to attempt to use
+when connecting to an HTTPS proxy.
+
+Use one of the available defines for this purpose. The available options are:
+.RS
+.IP CURL_SSLVERSION_DEFAULT
+The default action. This will attempt to figure out the remote SSL protocol
+version.
+.IP CURL_SSLVERSION_TLSv1
+TLSv1.x
+.IP CURL_SSLVERSION_TLSv1_0
+TLSv1.0
+.IP CURL_SSLVERSION_TLSv1_1
+TLSv1.1
+.IP CURL_SSLVERSION_TLSv1_2
+TLSv1.2
+.IP CURL_SSLVERSION_TLSv1_3
+TLSv1.3
+.RE
+The maximum TLS version can be set by using \fIone\fP of the
+CURL_SSLVERSION_MAX_ macros below. It is also possible to OR \fIone\fP of the
+CURL_SSLVERSION_ macros with \fIone\fP of the CURL_SSLVERSION_MAX_ macros.
+The MAX macros are not supported for WolfSSL.
+.RS
+.IP CURL_SSLVERSION_MAX_DEFAULT
+The flag defines the maximum supported TLS version as TLSv1.2, or the default
+value from the SSL library.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_0
+The flag defines maximum supported TLS version as TLSv1.0.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_1
+The flag defines maximum supported TLS version as TLSv1.1.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_2
+The flag defines maximum supported TLS version as TLSv1.2.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_3
+The flag defines maximum supported TLS version as TLSv1.3.
+(Added in 7.54.0)
+.RE
+
+In versions of curl prior to 7.54 the CURL_SSLVERSION_TLS options were
+documented to allow \fIonly\fP the specified TLS version, but behavior was
+inconsistent depending on the TLS library.
+
+.SH DEFAULT
+CURL_SSLVERSION_DEFAULT
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* ask libcurl to use TLS version 1.0 or later */
+ curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_USE_SSL "(3), " CURLOPT_HTTP_VERSION "(3), "
+.BR CURLOPT_IPRESOLVE "(3) " CURLOPT_SSLVERSION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSL_CIPHER_LIST.3
index bf40f318a,000000000..06b72625c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSL_CIPHER_LIST.3
@@@ -1,81 -1,0 +1,81 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSL_CIPHER_LIST 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_CIPHER_LIST, char
*list);
+.SH DESCRIPTION
+Pass a char *, pointing to a null-terminated string holding the list of
+ciphers to use for the connection to the HTTPS proxy. The list must be
+syntactically correct, it consists of one or more cipher strings separated by
+colons. Commas or spaces are also acceptable separators but colons are
+normally used, \&!, \&- and \&+ can be used as operators.
+
+For OpenSSL and GnuTLS valid examples of cipher lists include 'RC4-SHA',
+\'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you
+compile OpenSSL.
+
+You'll find more details about cipher lists on this URL:
+
+ https://www.openssl.org/docs/apps/ciphers.html
+
+For NSS, valid examples of cipher lists include 'rsa_rc4_128_md5',
+\'rsa_aes_128_sha\', etc. With NSS you don't add/remove ciphers. If one uses
+this option then all known ciphers are disabled and only those passed in are
+enabled.
+
+You'll find more details about the NSS cipher lists on this URL:
+
+
http://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL, use internal default
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSL_CIPHER_LIST, "TLSv1");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_TLS13_CIPHERS "(3), " CURLOPT_PROXY_SSLVERSION "(3), "
+.BR CURLOPT_SSL_CIPHER_LIST "(3), " CURLOPT_TLS13_CIPHERS "(3), "
+.BR CURLOPT_SSLVERSION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSL_OPTIONS.3
index 2f40b6bbb,000000000..221dee592
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSL_OPTIONS.3
@@@ -1,82 -1,0 +1,82 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSL_OPTIONS 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_OPTIONS, long
bitmask);
+.SH DESCRIPTION
+Pass a long with a bitmask to tell libcurl about specific SSL
+behaviors. Available bits:
+.IP CURLSSLOPT_ALLOW_BEAST
+Tells libcurl to not attempt to use any workarounds for a security flaw in the
+SSL3 and TLS1.0 protocols. If this option isn't used or this bit is set to 0,
+the SSL layer libcurl uses may use a work-around for this flaw although it
+might cause interoperability problems with some (older) SSL
+implementations. WARNING: avoiding this work-around lessens the security, and
+by setting this option to 1 you ask for exactly that. This option is only
+supported for Secure Transport, NSS and OpenSSL.
+.IP CURLSSLOPT_NO_REVOKE
+Tells libcurl to disable certificate revocation checks for those SSL backends
+where such behavior is present. This option is only supported for Schannel
+(the native Windows SSL library), with an exception in the case of Windows'
+Untrusted Publishers block list which it seems can't be bypassed. (Added in
+7.44.0)
+.IP CURLSSLOPT_NO_PARTIALCHAIN
+Tells libcurl to not accept "partial" certificate chains, which it otherwise
+does by default. This option is only supported for OpenSSL and will fail the
+certificate verification if the chain ends with an intermediate certificate
+and not with a root cert. (Added in 7.68.0)
+
+.IP CURLSSLOPT_REVOKE_BEST_EFFORT
+Tells libcurl to ignore certificate revocation checks in case of missing or
+offline distribution points for those SSL backends where such behavior is
+present. This option is only supported for Schannel (the native Windows SSL
+library). If combined with \fICURLSSLOPT_NO_REVOKE\fP, the latter takes
+precedence. (Added in 7.70.0)
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All TLS-based protocols
+.SH AVAILABLE
+Added in 7.52.0
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ /* weaken TLS only for use with silly proxies */
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST |
+ CURLSSLOPT_NO_REVOKE);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSLVERSION "(3), " CURLOPT_PROXY_SSL_CIPHER_LIST "(3), "
+.BR CURLOPT_SSLVERSION "(3), " CURLOPT_SSL_CIPHER_LIST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSL_VERIFYHOST.3
index afcc51413,000000000..462a33e3e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSL_VERIFYHOST.3
@@@ -1,89 -1,0 +1,89 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSL_VERIFYHOST 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSL_VERIFYHOST \- verify the proxy certificate's name against
host
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_VERIFYHOST, long
verify);
+.SH DESCRIPTION
+Pass a long set to 2L as asking curl to \fIverify\fP in the HTTPS proxy's
+certificate name fields against the proxy name.
+
+This option determines whether libcurl verifies that the proxy cert contains
+the correct name for the name it is known as.
+
+When \fICURLOPT_PROXY_SSL_VERIFYHOST(3)\fP is 2, the proxy certificate must
+indicate that the server is the proxy to which you meant to connect to, or the
+connection fails.
+
+Curl considers the proxy the intended one when the Common Name field or a
+Subject Alternate Name field in the certificate matches the host name in the
+proxy string which you told curl to use.
+
+If \fIverify\fP value is set to 1:
+
+In 7.28.0 and earlier: treated as a debug option of some sorts, not supported
+anymore due to frequently leading to programmer mistakes.
+
+From 7.28.1 to 7.65.3: setting it to 1 made curl_easy_setopt() return an error
+and leaving the flag untouched.
+
+From 7.66.0: treats 1 and 2 the same.
+
+When the \fIverify\fP value is 0L, the connection succeeds regardless of the
+names used in the certificate. Use that ability with caution!
+
+See also \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP to verify the digital signature
+of the proxy certificate. If libcurl is built against NSS and
+\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP is zero,
+\fICURLOPT_PROXY_SSL_VERIFYHOST(3)\fP is also set to zero and cannot be
+overridden.
+.SH DEFAULT
+2
+.SH PROTOCOLS
+All protocols when used over an HTTPS proxy.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Set the default value: strict name check please */
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYHOST, 2L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0.
+
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, and CURLE_UNKNOWN_OPTION if not.
+
+If 1 is set as argument, \fICURLE_BAD_FUNCTION_ARGUMENT\fP is returned.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), " CURLOPT_PROXY_CAINFO "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_CAINFO "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_SSL_VERIFYPEER.3
index 656e6d8e5,000000000..9489df35c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_SSL_VERIFYPEER.3
@@@ -1,89 -1,0 +1,89 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_SSL_VERIFYPEER 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSL_VERIFYPEER \- verify the proxy's SSL certificate
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_VERIFYPEER, long
verify);
+.SH DESCRIPTION
+Pass a long as parameter set to 1L to enable or 0L to disable.
+
+This option tells curl to verifies the authenticity of the HTTPS proxy's
+certificate. A value of 1 means curl verifies; 0 (zero) means it doesn't.
+
+This is the proxy version of \fICURLOPT_SSL_VERIFYPEER(3)\fP that's used for
+ordinary HTTPS servers.
+
+When negotiating a TLS or SSL connection, the server sends a certificate
+indicating its identity. Curl verifies whether the certificate is authentic,
+i.e. that you can trust that the server is who the certificate says it is.
+This trust is based on a chain of digital signatures, rooted in certification
+authority (CA) certificates you supply. curl uses a default bundle of CA
+certificates (the path for that is determined at build time) and you can
+specify alternate certificates with the \fICURLOPT_PROXY_CAINFO(3)\fP option
+or the \fICURLOPT_PROXY_CAPATH(3)\fP option.
+
+When \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP is enabled, and the verification
+fails to prove that the certificate is authentic, the connection fails. When
+the option is zero, the peer certificate verification succeeds regardless.
+
+Authenticating the certificate is not enough to be sure about the server. You
+typically also want to ensure that the server is the server you mean to be
+talking to. Use \fICURLOPT_PROXY_SSL_VERIFYHOST(3)\fP for that. The check
+that the host name in the certificate is valid for the host name you're
+connecting to is done independently of the
+\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP option.
+
+WARNING: disabling verification of the certificate allows bad guys to
+man-in-the-middle the communication without you knowing it. Disabling
+verification makes the communication insecure. Just having encryption on a
+transfer is not enough as you cannot be sure that you are communicating with
+the correct end-point.
+.SH DEFAULT
+1
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Set the default value: strict certificate check please */
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYPEER, 1L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), "
+.BR CURLOPT_SSL_VERIFYHOST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_TLS13_CIPHERS.3
index eb6ee937d,000000000..97714d3cd
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_TLS13_CIPHERS.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_TLS13_CIPHERS.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_TLS13_CIPHERS 3 "25 May 2018" "libcurl 7.61.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_TLS13_CIPHERS \- ciphers suites for proxy TLS 1.3
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLS13_CIPHERS, char
*list);
+.SH DESCRIPTION
+Pass a char *, pointing to a null-terminated string holding the list of cipher
+suites to use for the TLS 1.3 connection to a proxy. The list must be
+syntactically correct, it consists of one or more cipher suite strings
+separated by colons.
+
+You'll find more details about cipher lists on this URL:
+
- https://curl.haxx.se/docs/ssl-ciphers.html
++ https://curl.se/docs/ssl-ciphers.html
+
+This option is currently used only when curl is built to use OpenSSL 1.1.1 or
+later. If you are using a different SSL backend you can try setting TLS 1.3
+cipher suites by using the CURLOPT_PROXY_SSL_CIPHER_LIST option.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL, use internal default
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLS13_CIPHERS,
+ "TLS13-CHACHA20-POLY1305-SHA256");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.61.0.
+Available when built with OpenSSL >= 1.1.1.
+.SH RETURN VALUE
+Returns CURLE_OK if supported, CURLE_NOT_BUILT_IN otherwise.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSL_CIPHER_LIST "(3), " CURLOPT_PROXY_SSLVERSION "(3), "
+.BR CURLOPT_SSL_CIPHER_LIST "(3), " CURLOPT_TLS13_CIPHERS "(3), "
+.BR CURLOPT_SSLVERSION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_PASSWORD.3
index 464916e81,000000000..33991eec8
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_PASSWORD.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_TLSAUTH_PASSWORD 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_PASSWORD, char
*pwd);
+.SH DESCRIPTION
+Pass a char * as parameter, which should point to the null-terminated password
+to use for the TLS authentication method specified with the
+\fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP option. Requires that the
+\fICURLOPT_PROXY_TLSAUTH_USERNAME(3)\fP option also be set.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_TLSAUTH_TYPE "(3), " CURLOPT_PROXY_TLSAUTH_USERNAME "(3), "
+.BR CURLOPT_TLSAUTH_TYPE "(3), " CURLOPT_TLSAUTH_USERNAME "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_TYPE.3
index dc4bfa90f,000000000..a16dd1e38
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_TYPE.3
@@@ -1,70 -1,0 +1,70 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_TLSAUTH_TYPE 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_TYPE, char
*type);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string should be
+the method of the TLS authentication used for the HTTPS connection. Supported
+method is "SRP".
+
+.IP SRP
+TLS-SRP authentication. Secure Remote Password authentication for TLS is
+defined in RFC5054 and provides mutual authentication if both sides have a
+shared secret. To use TLS-SRP, you must also set the
+\fICURLOPT_PROXY_TLSAUTH_USERNAME(3)\fP and
+\fICURLOPT_PROXY_TLSAUTH_PASSWORD(3)\fP options.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+blank
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+
+You need to build libcurl with GnuTLS or OpenSSL with TLS-SRP support for this
+to work.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_TLSAUTH_USERNAME "(3), " CURLOPT_PROXY_TLSAUTH_PASSWORD
"(3), "
+.BR CURLOPT_TLSAUTH_USERNAME "(3), " CURLOPT_TLSAUTH_PASSWORD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_USERNAME.3
index 742f206c4,000000000..0bf12479c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_TLSAUTH_USERNAME.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_TLSAUTH_USERNAME 3 "16 Nov 2016" "libcurl 7.52.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS
authentication
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_USERNAME, char
*user);
+.SH DESCRIPTION
+Pass a char * as parameter, which should point to the null-terminated username
+to use for the HTTPS proxy TLS authentication method specified with the
+\fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP option. Requires that the
+\fICURLOPT_PROXY_TLSAUTH_PASSWORD(3)\fP option also be set.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.52.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_TLSAUTH_TYPE "(3), " CURLOPT_PROXY_TLSAUTH_PASSWORD "(3), "
+.BR CURLOPT_TLSAUTH_TYPE "(3), " CURLOPT_TLSAUTH_PASSWORD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PROXY_TRANSFER_MODE.3
index 66fbdcc65,000000000..0919de9b7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PROXY_TRANSFER_MODE.3
+++ b/docs/libcurl/opts/GNURLOPT_PROXY_TRANSFER_MODE.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PROXY_TRANSFER_MODE 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TRANSFER_MODE, long
enabled);
+.SH DESCRIPTION
+Pass a long. If the value is set to 1 (one), it tells libcurl to set the
+transfer mode (binary or ASCII) for FTP transfers done via an HTTP proxy, by
+appending ;type=a or ;type=i to the URL. Without this setting, or it being set
+to 0 (zero, the default), \fICURLOPT_TRANSFERTEXT(3)\fP has no effect when
+doing FTP via a proxy. Beware that not all proxies support this feature.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+FTP over proxy
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL,
"ftp://example.com/old-server/file.txt");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:80");
+ curl_easy_setopt(curl, CURLOPT_PROXY_TRANSFER_MODE, 1L);
+ curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.18.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if the
+enabled value is not supported.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_HTTPPROXYTUNNEL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_PUT.3
index 54cf0400c,000000000..8c6e367b3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_PUT.3
+++ b/docs/libcurl/opts/GNURLOPT_PUT.3
@@@ -1,46 -1,0 +1,46 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_PUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_PUT \- make an HTTP PUT request
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PUT, long put);
+.SH DESCRIPTION
+A parameter set to 1 tells the library to use HTTP PUT to transfer data. The
+data should be set with \fICURLOPT_READDATA(3)\fP and
+\fICURLOPT_INFILESIZE(3)\fP.
+
+This option is \fBdeprecated\fP since version 7.12.1. Use
+\fICURLOPT_UPLOAD(3)\fP!
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+HTTP
+.SH AVAILABILITY
+Deprecated since 7.12.1. Do not use.
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_UPLOAD "(3), " CURLOPT_HTTPGET "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_QUOTE.3
index a429b72b0,000000000..96ba48ac9
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_QUOTE.3
+++ b/docs/libcurl/opts/GNURLOPT_QUOTE.3
@@@ -1,105 -1,0 +1,113 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_QUOTE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_QUOTE \- (S)FTP commands to run before transfer
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_QUOTE, struct curl_slist
*cmds);
+.SH DESCRIPTION
+Pass a pointer to a linked list of FTP or SFTP commands to pass to the server
+prior to your request. This will be done before any other commands are issued
+(even before the CWD command for FTP). The linked list should be a fully valid
+list of 'struct curl_slist' structs properly filled in with text strings. Use
+\fIcurl_slist_append(3)\fP to append strings (commands) to the list, and clear
+the entire list afterwards with \fIcurl_slist_free_all(3)\fP. Disable this
+operation again by setting a NULL to this option. When speaking to an FTP
+server, prefix the command with an asterisk (*) to make libcurl continue even
+if the command fails as by default libcurl will stop at first failure.
+
+The set of valid FTP commands depends on the server (see RFC959 for a list of
+mandatory commands).
+
+The valid SFTP commands are:
+.RS
++.IP "atime date file"
++The atime command sets the last access time of the file named by the file
++operand. The <date expression> can be all sorts of date strings, see the
++\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
+.IP "chgrp group file"
+The chgrp command sets the group ID of the file named by the file operand to
+the group ID specified by the group operand. The group operand is a decimal
+integer group ID.
+.IP "chmod mode file"
+The chmod command modifies the file mode bits of the specified file. The
+mode operand is an octal integer mode number.
+.IP "chown user file"
+The chown command sets the owner of the file named by the file operand to the
+user ID specified by the user operand. The user operand is a decimal
+integer user ID.
+.IP "ln source_file target_file"
+The ln and symlink commands create a symbolic link at the target_file location
+pointing to the source_file location.
+.IP "mkdir directory_name"
+The mkdir command creates the directory named by the directory_name operand.
++.IP "mtime date file"
++The mtime command sets the last modification time of the file named by the
++file operand. The <date expression> can be all sorts of date strings, see the
++\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
+.IP "pwd"
+The pwd command returns the absolute pathname of the current working
directory.
+.IP "rename source target"
+The rename command renames the file or directory named by the source
+operand to the destination path named by the target operand.
+.IP "rm file"
+The rm command removes the file specified by the file operand.
+.IP "rmdir directory"
+The rmdir command removes the directory entry specified by the directory
+operand, provided it is empty.
+.IP "statvfs file"
+The statvfs command returns statistics on the file system in which specified
+file resides. (Added in 7.49.0)
+.IP "symlink source_file target_file"
+See ln.
+.RE
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+SFTP and FTP
+.SH EXAMPLE
+.nf
+struct curl_slist *cmdlist = NULL;
+cmdlist = curl_slist_append(cmdlist, "RNFR source-name");
+cmdlist = curl_slist_append(cmdlist, "RNTO new-name");
+
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
+
+ /* pass in the FTP commands to run before the transfer */
+ curl_easy_setopt(curl, CURLOPT_QUOTE, cmdlist);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+SFTP support added in 7.16.3. *-prefix for SFTP added in 7.24.0
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_POSTQUOTE "(3), " CURLOPT_PREQUOTE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RANDOM_FILE.3
index f5939d21d,000000000..54b8eac4a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RANDOM_FILE.3
+++ b/docs/libcurl/opts/GNURLOPT_RANDOM_FILE.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RANDOM_FILE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_RANDOM_FILE \- specify a source for random data
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANDOM_FILE, char *path);
+.SH DESCRIPTION
+Pass a char * to a null-terminated file name. The file might be used to read
+from to seed the random engine for SSL and more.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL, not used
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RANDOM_FILE, "junk.txt");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK on success or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_EGDSOCKET "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RANGE.3
index 4311ad1e9,000000000..6055d60ad
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RANGE.3
+++ b/docs/libcurl/opts/GNURLOPT_RANGE.3
@@@ -1,81 -1,0 +1,81 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RANGE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_RANGE \- set byte range to request
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANGE, char *range);
+.SH DESCRIPTION
+Pass a char * as parameter, which should contain the specified range you want
+to retrieve. It should be in the format "X-Y", where either X or Y may be left
+out and X and Y are byte indexes.
+
+HTTP transfers also support several intervals, separated with commas as in
+\fI"X-Y,N-M"\fP. Using this kind of multiple intervals will cause the HTTP
+server to send the response document in pieces (using standard MIME separation
+techniques). Unfortunately, the HTTP standard (RFC 7233 section 3.1) allows
+servers to ignore range requests so even when you set \fICURLOPT_RANGE(3)\fP
+for a request, you may end up getting the full response sent back.
+
+For RTSP, the formatting of a range should follow RFC2326 Section 12.29. For
+RTSP, byte ranges are \fBnot\fP permitted. Instead, ranges should be given in
+npt, utc, or smpte formats.
+
+For HTTP PUT uploads this option should not be used, since it may conflict
with
+other options. If you need to upload arbitrary parts of a file (like for
+Amazon's web services) support is limited. We suggest set resume position
using
+\fICURLOPT_RESUME_FROM(3)\fP, set end (resume+size) position using
+\fICURLOPT_INFILESIZE(3)\fP and seek to the resume position before initiating
+the transfer for each part. For more information refer to
- https://curl.haxx.se/mail/lib-2019-05/0012.html
++https://curl.se/mail/lib-2019-05/0012.html
+
+Pass a NULL to this option to disable the use of ranges.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP, FTP, FILE, RTSP and SFTP.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* get the first 200 bytes */
+ curl_easy_setopt(curl, CURLOPT_RANGE, "0-199");
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+FILE since 7.18.0, RTSP since 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK on success or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_RESUME_FROM "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_READDATA.3
index 9b532248d,000000000..c47e518c1
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_READDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_READDATA.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_READDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_READDATA \- custom pointer passed to the read callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_READDATA, void *pointer);
+.SH DESCRIPTION
+Data \fIpointer\fP to pass to the file read function. If you use the
+\fICURLOPT_READFUNCTION(3)\fP option, this is the pointer you'll get as
+input in the 4th argument to the callback.
+
+If you don't specify a read callback but instead rely on the default internal
+read function, this data must be a valid readable FILE * (cast to 'void *').
+
+If you're using libcurl as a win32 DLL, you \fBMUST\fP use a
+\fICURLOPT_READFUNCTION(3)\fP if you set this option or you will experience
+crashes.
+.SH DEFAULT
+By default, this is a FILE * to stdin.
+.SH PROTOCOLS
+This is used for all protocols when sending data.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+struct MyData this;
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* pass pointer that gets passed in to the
+ CURLOPT_READFUNCTION callback */
+ curl_easy_setopt(curl, CURLOPT_READDATA, &this);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+This option was once known by the older name CURLOPT_INFILE, the name
+\fICURLOPT_READDATA(3)\fP was introduced in 7.9.7.
+.SH RETURN VALUE
+This will return CURLE_OK.
+.SH "SEE ALSO"
+.BR CURLOPT_READFUNCTION "(3), " CURLOPT_WRITEDATA "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_READFUNCTION.3
index e0e3b255f,000000000..7b8a4ea64
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_READFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_READFUNCTION.3
@@@ -1,142 -1,0 +1,142 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.Dd June 25, 2020
+.Dt GNURLOPT_READFUNCTION 3
+.Os
+.Sh NAME
+.Nm CURLOPT_READFUNCTION
+.Nd read callback for data uploads
+.Sh SYNOPSIS
+.In gnurl/curl.h
+.Ft size_t
+.Fn read_callback "char *buffer" "size_t size" "size_t nitems" "void
*userdata"
+.Ft CURLcode
+.Fn curl_easy_setopt "CURL *handle" "CURLOPT_READFUNCTION" "read_callback"
+.Sh DESCRIPTION
+Pass a pointer to your callback function, as the prototype shows above.
+
+This callback function gets called by libcurl as soon as it needs to
+read data in order to send it to the peer - like if you ask it to
+upload or post data to the server. The data area pointed at by the
+pointer
+.Fa buffer
+should be filled up with at most
+.Fa size
+multiplied with
+.Fa nitems
+number of bytes by your function.
+
+Set the
+.Fa userdata
+argument with the
+.Xr CURLOPT_READDATA 3
+option.
+
+Your function must return the actual number of bytes that it stored in
+the data area pointed at by the pointer
+.Fa buffer .
+Returning 0 will signal end-of-file to the library and cause it to
+stop the current transfer.
+
+If you stop the current transfer by returning 0 "pre-maturely" (i.e
+before the server expected it, like when you've said you will upload N
+bytes and you upload less than N bytes), you may experience that the
+server "hangs" waiting for the rest of the data that won't come.
+
+The read callback may return
+.Dv CURL_READFUNC_ABORT
+to stop the current operation immediately, resulting in a
+.Dv CURLE_ABORTED_BY_CALLBACK
+error code from the transfer.
+
+The callback can return
+.Dv CURL_READFUNC_PAUSE
+to cause reading from this connection to pause.
+See
+.Xr curl_easy_pause 3
+for further details.
+
+.Sh BUGS
+when doing TFTP uploads, you must return the exact amount of data that
+the callback wants, or it will be considered the final packet by the
+server end and the transfer will end there.
+
+If you set this callback pointer to NULL, or don't set it at all, the
+default internal read function will be used. It is doing an fread() on
+the FILE * userdata set with
+.Xr CURLOPT_READDATA 3 .
+
+You can set the total size of the data you are sending by using
+.Xr CURLOPT_INFILESIZE_LARGE 3
+or
+.Xr CURLOPT_POSTFIELDSIZE_LARGE 3 ,
+depending on the type of transfer. For some transfer types it may be
+required and it allows for better error checking.
+.Sh DEFAULT
+The default internal read callback is fread().
+.Sh PROTOCOLS
+This is used for all protocols when doing uploads.
+.Sh EXAMPLE
+.Bd -literal
+size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
+{
+ FILE *readhere = (FILE *)userdata;
+ curl_off_t nread;
+
+ /* copy as much data as possible into the 'ptr' buffer, but no more than
+ 'size' * 'nmemb' bytes! */
+ size_t retcode = fread(ptr, size, nmemb, readhere);
+
+ nread = (curl_off_t)retcode;
+
+ fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
+ " bytes from file\\n", nread);
+ return retcode;
+}
+
+void setup(char *uploadthis)
+{
+ FILE *file = fopen(uploadthis, "rb");
+ CURLcode result;
+
+ /* set callback to use */
+ curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
+ /* pass in suitable argument to callback */
+ curl_easy_setopt(curl, CURLOPT_READDATA, (void *)file);
+
+ result = curl_easy_perform(curl);
+}
+.Ed
+.Sh AVAILABILITY
+CURL_READFUNC_PAUSE return code was added in 7.18.0 and CURL_READFUNC_ABORT
+was added in 7.12.1.
+.Sh RETURN VALUE
+This will return CURLE_OK.
+.Sh SEE ALSO
+.Xr CURLOPT_READDATA 3 ,
+.Xr CURLOPT_WRITEFUNCTION 3 ,
+.Xr CURLOPT_SEEKFUNCTION 3 ,
+.Xr CURLOPT_UPLOAD 3 ,
+.Xr CURLOPT_POST 3 ,
+.Xr CURLOPT_UPLOAD_BUFFERSIZE 3 .
diff --cc docs/libcurl/opts/GNURLOPT_REDIR_PROTOCOLS.3
index 3a9f07475,000000000..9ba8892da
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_REDIR_PROTOCOLS.3
+++ b/docs/libcurl/opts/GNURLOPT_REDIR_PROTOCOLS.3
@@@ -1,104 -1,0 +1,104 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_REDIR_PROTOCOLS 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REDIR_PROTOCOLS, long
bitmask);
+.SH DESCRIPTION
+Pass a long that holds a bitmask of CURLPROTO_* defines. If used, this bitmask
+limits what protocols libcurl may use in a transfer that it follows to in a
+redirect when \fICURLOPT_FOLLOWLOCATION(3)\fP is enabled. This allows you to
+limit specific transfers to only be allowed to use a subset of protocols in
+redirections.
+
+Protocols denied by \fICURLOPT_PROTOCOLS(3)\fP are not overridden by this
+option.
+
+By default libcurl will allow HTTP, HTTPS, FTP and FTPS on redirect (7.65.2).
+Older versions of libcurl allowed all protocols on redirect except several
+disabled for security reasons: Since 7.19.4 FILE and SCP are disabled, and
+since 7.40.0 SMB and SMBS are also disabled. \fICURLPROTO_ALL\fP enables all
+protocols on redirect, including those disabled for security.
+
+These are the available protocol defines:
+.nf
+CURLPROTO_DICT
+CURLPROTO_FILE
+CURLPROTO_FTP
+CURLPROTO_FTPS
+CURLPROTO_GOPHER
+CURLPROTO_HTTP
+CURLPROTO_HTTPS
+CURLPROTO_IMAP
+CURLPROTO_IMAPS
+CURLPROTO_LDAP
+CURLPROTO_LDAPS
+CURLPROTO_POP3
+CURLPROTO_POP3S
+CURLPROTO_RTMP
+CURLPROTO_RTMPE
+CURLPROTO_RTMPS
+CURLPROTO_RTMPT
+CURLPROTO_RTMPTE
+CURLPROTO_RTMPTS
+CURLPROTO_RTSP
+CURLPROTO_SCP
+CURLPROTO_SFTP
+CURLPROTO_SMB
+CURLPROTO_SMBS
+CURLPROTO_SMTP
+CURLPROTO_SMTPS
+CURLPROTO_TELNET
+CURLPROTO_TFTP
+.fi
+.SH DEFAULT
+HTTP, HTTPS, FTP and FTPS (Since 7.65.2).
+
+Older versions defaulted to all protocols except FILE, SCP and since 7.40.0
+SMB and SMBS.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
+ /* pass in the URL from an external source */
+ curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
+
+ /* only allow redirects to HTTP and HTTPS URLs */
+ curl_easy_setopt(curl, CURLOPT_REDIR_PROTOCOLS,
+ CURLPROTO_HTTP | CURLPROTO_HTTPS);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.4, before then it would follow all protocols.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_PROTOCOLS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_REFERER.3
index 059a9d3e4,000000000..4f9e99fcc
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_REFERER.3
+++ b/docs/libcurl/opts/GNURLOPT_REFERER.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_REFERER 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_REFERER \- set the HTTP referer header
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REFERER, char *where);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. It will be used to
+set the Referer: header in the http request sent to the remote server. This
+can be used to fool servers or scripts. You can also set any custom header
+with \fICURLOPT_HTTPHEADER(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* tell it where we found the link to this place */
- curl_easy_setopt(curl, CURLOPT_REFERER, "http://example.com/aboutme.html");
++ curl_easy_setopt(curl, CURLOPT_REFERER, "https://example.com/aboutme.html");
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+If built with HTTP support
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP support is enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_USERAGENT "(3), " CURLOPT_HTTPHEADER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_REQUEST_TARGET.3
index e7124e5aa,000000000..a30ab3370
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_REQUEST_TARGET.3
+++ b/docs/libcurl/opts/GNURLOPT_REQUEST_TARGET.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_REQUEST_TARGET 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REQUEST_TARGET, string);
+.SH DESCRIPTION
+Pass a char * to string which libcurl uses in the upcoming request instead of
+the path as extracted from the URL.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/*");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/*");
+ curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "OPTIONS");
+
+ /* issue an OPTIONS * request (no leading slash) */
+ curl_easy_setopt(curl, CURLOPT_REQUEST_TARGET, "*");
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CUSTOMREQUEST "(3), " CURLOPT_HTTPGET "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RESOLVE.3
index 5a064eca4,000000000..4a0373207
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RESOLVE.3
+++ b/docs/libcurl/opts/GNURLOPT_RESOLVE.3
@@@ -1,97 -1,0 +1,97 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RESOLVE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_RESOLVE \- provide custom host name to IP address resolves
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESOLVE,
+ struct curl_slist *hosts);
+.SH DESCRIPTION
+Pass a pointer to a linked list of strings with host name resolve information
+to use for requests with this handle. The linked list should be a fully valid
+list of \fBstruct curl_slist\fP structs properly filled in. Use
+\fIcurl_slist_append(3)\fP to create the list and \fIcurl_slist_free_all(3)\fP
+to clean up an entire list.
+
+Each single name resolve string should be written using the format
+HOST:PORT:ADDRESS[,ADDRESS]... where HOST is the name libcurl will try
+to resolve, PORT is the port number of the service where libcurl wants
+to connect to the HOST and ADDRESS is one or more numerical IP
+addresses. If you specify multiple ip addresses they need to be
+separated by comma. If libcurl is built to support IPv6, each of the
+ADDRESS entries can of course be either IPv4 or IPv6 style addressing.
+
+This option effectively pre-populates the DNS cache with entries for the
+host+port pair so redirects and everything that operations against the
+HOST+PORT will instead use your provided ADDRESS. Addresses set with
+\fICURLOPT_RESOLVE(3)\fP will not time-out from the DNS cache like ordinary
+entries.
+
+If the DNS cache already have an entry for the given host+port pair, then
+this entry will be removed and a new entry will be created. This is because
+old entry may have have different addresses or be ordinary entries with
+time-outs.
+
+The provided ADDRESS set by this option will be used even if
+\fICURLOPT_IPRESOLVE(3)\fP is set to make libcurl use another IP version.
+
+Remove names from the DNS cache again, to stop providing these fake resolves,
+by including a string in the linked list that uses the format
+\&"-HOST:PORT". The host name must be prefixed with a dash, and the host name
+and port number must exactly match what was already added previously.
+
+Support for providing the ADDRESS within [brackets] was added in 7.57.0.
+
+Support for providing multiple IP addresses per entry was added in 7.59.0.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl;
+struct curl_slist *host = NULL;
+host = curl_slist_append(NULL, "example.com:80:127.0.0.1");
+
+curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_RESOLVE, host);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_perform(curl);
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+
+curl_slist_free_all(host);
+.fi
+.SH AVAILABILITY
+Added in 7.21.3. Removal support added in 7.42.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_IPRESOLVE "(3), " CURLOPT_DNS_CACHE_TIMEOUT "(3), "
CURLOPT_CONNECT_TO "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RESOLVER_START_DATA.3
index 31ecf8e88,000000000..3bbc252dd
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RESOLVER_START_DATA.3
+++ b/docs/libcurl/opts/GNURLOPT_RESOLVER_START_DATA.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RESOLVER_START_DATA 3 "14 Feb 2018" "libcurl 7.59.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_RESOLVER_START_DATA \- custom pointer passed to the resolver start
callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESOLVER_START_DATA, void
*pointer);
+.SH DESCRIPTION
+Pass a \fIpointer\fP that will be untouched by libcurl and passed as the third
+argument in the resolver start callback set with
+\fICURLOPT_RESOLVER_START_FUNCTION(3)\fP.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+static int resolver_start_cb(void *resolver_state, void *reserved,
+ void *userdata)
+{
+ (void)reserved;
+ printf("Received resolver_state=%p userdata=%p\\n",
+ resolver_state, userdata);
+ return 0;
+}
+
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_RESOLVER_START_FUNCTION, resolver_start_cb);
+ curl_easy_setopt(curl, CURLOPT_RESOLVER_START_DATA, curl);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.59.0
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_RESOLVER_START_FUNCTION "(3) "
diff --cc docs/libcurl/opts/GNURLOPT_RESOLVER_START_FUNCTION.3
index 9adcfca89,000000000..504646d4c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RESOLVER_START_FUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_RESOLVER_START_FUNCTION.3
@@@ -1,83 -1,0 +1,83 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RESOLVER_START_FUNCTION 3 "14 Feb 2018" "libcurl 7.59.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_RESOLVER_START_FUNCTION \- set callback to be called before a new
resolve request is started
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+int resolver_start_cb(void *resolver_state, void *reserved, void *userdata);
+
+CURLcode curl_easy_setopt(CURL *handle,
+ CURLOPT_RESOLVER_START_FUNCTION,
+ resolver_start_cb);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This callback function gets called by libcurl every time before a new resolve
+request is started.
+
+\fIresolver_state\fP points to a backend-specific resolver state. Currently
+only the ares resolver backend has a resolver state. It can be used to set up
+any desired option on the ares channel before it's used, for example setting
up
+socket callback options.
+
+\fIreserved\fP is reserved.
+
+\fIuserdata\fP is the user pointer set with the
+\fICURLOPT_RESOLVER_START_DATA(3)\fP option.
+
+The callback must return 0 on success. Returning a non-zero value will cause
+the resolve to fail.
+.SH DEFAULT
+NULL (No callback)
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+static int resolver_start_cb(void *resolver_state, void *reserved,
+ void *userdata)
+{
+ (void)reserved;
+ printf("Received resolver_state=%p userdata=%p\\n",
+ resolver_state, userdata);
+ return 0;
+}
+
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_RESOLVER_START_FUNCTION, resolver_start_cb);
+ curl_easy_setopt(curl, CURLOPT_RESOLVER_START_DATA, curl);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.59.0
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_RESOLVER_START_DATA "(3) "
diff --cc docs/libcurl/opts/GNURLOPT_RESUME_FROM.3
index 4e3d06f91,000000000..c070b39ca
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RESUME_FROM.3
+++ b/docs/libcurl/opts/GNURLOPT_RESUME_FROM.3
@@@ -1,72 -1,0 +1,72 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RESUME_FROM 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_RESUME_FROM \- set a point to resume transfer from
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESUME_FROM, long from);
+.SH DESCRIPTION
+Pass a long as parameter. It contains the offset in number of bytes that you
+want the transfer to start from. Set this option to 0 to make the transfer
+start from the beginning (effectively disabling resume). For FTP, set this
+option to -1 to make the transfer start from the end of the target file
+(useful to continue an interrupted upload).
+
+When doing uploads with FTP, the resume position is where in the local/source
+file libcurl should try to resume the upload from and it will then append the
+source file to the remote target file.
+
+If you need to resume a transfer beyond the 2GB limit, use
+\fICURLOPT_RESUME_FROM_LARGE(3)\fP instead.
+.SH DEFAULT
+0, not used
+.SH PROTOCOLS
+HTTP, FTP, SFTP, FILE
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com");
+
+ /* resume upload at byte index 200 */
+ curl_easy_setopt(curl, CURLOPT_RESUME_FROM, 200L);
+
+ /* ask for upload */
+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+ /* set total data amount to expect */
+ curl_easy_setopt(curl, CURLOPT_INFILESIZE, size_of_file);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_RESUME_FROM_LARGE "(3), " CURLOPT_RANGE "(3), "
+.BR CURLOPT_INFILESIZE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RESUME_FROM_LARGE.3
index 1f38993f4,000000000..f47b64f26
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RESUME_FROM_LARGE.3
+++ b/docs/libcurl/opts/GNURLOPT_RESUME_FROM_LARGE.3
@@@ -1,74 -1,0 +1,74 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RESUME_FROM_LARGE 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESUME_FROM_LARGE,
+ curl_off_t from);
+.SH DESCRIPTION
+Pass a curl_off_t as parameter. It contains the offset in number of bytes that
+you want the transfer to start from. Set this option to 0 to make the transfer
+start from the beginning (effectively disabling resume). For FTP, set this
+option to -1 to make the transfer start from the end of the target file
+(useful to continue an interrupted upload).
+
+When doing uploads with FTP, the resume position is where in the local/source
+file libcurl should try to resume the upload from and it will then append the
+source file to the remote target file.
+.SH DEFAULT
+0, not used
+.SH PROTOCOLS
+HTTP, FTP, SFTP, FILE
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_off_t resume_position = GET_IT_SOMEHOW;
+ curl_off_t file_size = GET_IT_SOMEHOW_AS_WELL;
+
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com");
+
+ /* resuming upload at this position, possibly beyond 2GB */
+ curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, resume_position);
+
+ /* ask for upload */
+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+ /* set total data amount to expect */
+ curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_size);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.11.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_RESUME_FROM "(3), " CURLOPT_RANGE "(3), "
+.BR CURLOPT_INFILESIZE_LARGE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RTSP_CLIENT_CSEQ.3
index 2dd0a545a,000000000..99b926b4f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/GNURLOPT_RTSP_CLIENT_CSEQ.3
@@@ -1,53 -1,0 +1,53 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RTSP_CLIENT_CSEQ 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_CLIENT_CSEQ, long cseq);
+.SH DESCRIPTION
+Pass a long to set the CSEQ number to issue for the next RTSP
+request. Useful if the application is resuming a previously broken
+connection. The CSEQ will increment from this new number henceforth.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_CLIENT_CSEQ, 1234L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_RTSP_SERVER_CSEQ "(3), " CURLOPT_RTSP_REQUEST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RTSP_REQUEST.3
index 5bd47a309,000000000..973683daf
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RTSP_REQUEST.3
+++ b/docs/libcurl/opts/GNURLOPT_RTSP_REQUEST.3
@@@ -1,111 -1,0 +1,111 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RTSP_REQUEST 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_RTSP_REQUEST \- specify RTSP request
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_REQUEST, long request);
+.SH DESCRIPTION
+Tell libcurl what kind of RTSP request to make. Pass one of the following RTSP
+enum values as a long in the \fIrequest\fP argument. Unless noted otherwise,
+commands require the Session ID to be initialized.
+.IP CURL_RTSPREQ_OPTIONS
+Used to retrieve the available methods of the server. The application is
+responsible for parsing and obeying the response. The session ID is not needed
+for this method.
+.IP CURL_RTSPREQ_DESCRIBE
+Used to get the low level description of a stream. The application should note
+what formats it understands in the \fI'Accept:'\fP header. Unless set
+manually, libcurl will automatically fill in \fI'Accept: application/sdp'\fP.
+Time-condition headers will be added to Describe requests if the
+\fICURLOPT_TIMECONDITION(3)\fP option is active. \fB(The session ID is not
+needed for this method)\fP
+.IP CURL_RTSPREQ_ANNOUNCE
+When sent by a client, this method changes the description of the session. For
+example, if a client is using the server to record a meeting, the client can
+use Announce to inform the server of all the meta-information about the
+session. ANNOUNCE acts like an HTTP PUT or POST just like
+\fICURL_RTSPREQ_SET_PARAMETER\fP
+.IP CURL_RTSPREQ_SETUP
+Setup is used to initialize the transport layer for the session. The
+application must set the desired Transport options for a session by using the
+\fICURLOPT_RTSP_TRANSPORT(3)\fP option prior to calling setup. If no session
+ID is currently set with \fICURLOPT_RTSP_SESSION_ID(3)\fP, libcurl will
+extract and use the session ID in the response to this request. The session ID
+is not needed for this method.
+.IP CURL_RTSPREQ_PLAY
+Send a Play command to the server. Use the \fICURLOPT_RANGE(3)\fP option to
+modify the playback time (e.g. 'npt=10-15').
+.IP CURL_RTSPREQ_PAUSE
+Send a Pause command to the server. Use the \fICURLOPT_RANGE(3)\fP option with
+a single value to indicate when the stream should be halted. (e.g. npt='25')
+.IP CURL_RTSPREQ_TEARDOWN
+This command terminates an RTSP session. Simply closing a connection does not
+terminate the RTSP session since it is valid to control an RTSP session over
+different connections.
+.IP CURL_RTSPREQ_GET_PARAMETER
+Retrieve a parameter from the server. By default, libcurl will automatically
+include a \fIContent-Type: text/parameters\fP header on all non-empty requests
+unless a custom one is set. GET_PARAMETER acts just like an HTTP PUT or POST
+(see \fICURL_RTSPREQ_SET_PARAMETER\fP).
+Applications wishing to send a heartbeat message (e.g. in the presence of a
+server-specified timeout) should send use an empty GET_PARAMETER request.
+.IP CURL_RTSPREQ_SET_PARAMETER
+Set a parameter on the server. By default, libcurl will automatically include
+a \fIContent-Type: text/parameters\fP header unless a custom one is set. The
+interaction with SET_PARAMETER is much like an HTTP PUT or POST. An
application
+may either use \fICURLOPT_UPLOAD(3)\fP with \fICURLOPT_READDATA(3)\fP like a
+HTTP PUT, or it may use \fICURLOPT_POSTFIELDS(3)\fP like an HTTP POST. No
+chunked transfers are allowed, so the application must set the
+\fICURLOPT_INFILESIZE(3)\fP in the former and \fICURLOPT_POSTFIELDSIZE(3)\fP
+in the latter. Also, there is no use of multi-part POSTs within RTSP.
+.IP CURL_RTSPREQ_RECORD
+Used to tell the server to record a session. Use the \fICURLOPT_RANGE(3)\fP
+option to modify the record time.
+.IP CURL_RTSPREQ_RECEIVE
+This is a special request because it does not send any data to the server. The
+application may call this function in order to receive interleaved RTP
+data. It will return after processing one read buffer of data in order to give
+the application a chance to run.
+.SH DEFAULT
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ /* ask for options! */
+ curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_OPTIONS);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_RTSP_SESSION_ID "(3), " CURLOPT_RTSP_STREAM_URI "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RTSP_SERVER_CSEQ.3
index b881255f4,000000000..53a9b433e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/GNURLOPT_RTSP_SERVER_CSEQ.3
@@@ -1,53 -1,0 +1,53 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RTSP_SERVER_CSEQ 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SERVER_CSEQ, long cseq);
+.SH DESCRIPTION
+Pass a long to set the CSEQ number to expect for the next RTSP Server->Client
+request. \fBNOTE\fP: this feature (listening for Server requests) is
+unimplemented.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_SERVER_CSEQ, 1234L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_RTSP_CLIENT_CSEQ "(3), " CURLOPT_RTSP_STREAM_URI "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RTSP_SESSION_ID.3
index ee4805e05,000000000..1f5e2d596
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/GNURLOPT_RTSP_SESSION_ID.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RTSP_SESSION_ID 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_RTSP_SESSION_ID \- set RTSP session ID
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SESSION_ID, char *id);
+.SH DESCRIPTION
+Pass a char * as a parameter to set the value of the current RTSP Session ID
+for the handle. Useful for resuming an in-progress session. Once this value is
+set to any non-NULL value, libcurl will return \fICURLE_RTSP_SESSION_ERROR\fP
+if ID received from the server does not match. If unset (or set to NULL),
+libcurl will automatically set the ID the first time the server sets it in a
+response.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ char *prev_id; /* saved from before somehow */
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_SESSION_ID, prev_id);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_RTSP_REQUEST "(3), " CURLOPT_RTSP_STREAM_URI "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RTSP_STREAM_URI.3
index 9d9a00478,000000000..d91d8d4fd
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RTSP_STREAM_URI.3
+++ b/docs/libcurl/opts/GNURLOPT_RTSP_STREAM_URI.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RTSP_STREAM_URI 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_STREAM_URI, char *URI);
+.SH DESCRIPTION
+Set the stream \fIURI\fP to operate on by passing a char * . For example, a
+single session may be controlling \fIrtsp://foo/twister/audio\fP and
+\fIrtsp://foo/twister/video\fP and the application can switch to the
+appropriate stream using this option. If unset, libcurl will default to
+operating on generic server options by passing '*' in the place of the RTSP
+Stream URI. This option is distinct from \fICURLOPT_URL(3)\fP. When working
+with RTSP, the \fICURLOPT_RTSP_STREAM_URI(3)\fP indicates what URL to send to
+the server in the request header while the \fICURLOPT_URL(3)\fP indicates
+where to make the connection to. (e.g. the \fICURLOPT_URL(3)\fP for the above
+examples might be set to \fIrtsp://foo/twister\fP
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+\&'*'
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ char *prev_id; /* saved from before somehow */
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI,
+ "rtsp://foo.example.com/twister/video");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_RTSP_REQUEST "(3), " CURLOPT_RTSP_TRANSPORT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_RTSP_TRANSPORT.3
index d3efe6621,000000000..adef96a2c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_RTSP_TRANSPORT.3
+++ b/docs/libcurl/opts/GNURLOPT_RTSP_TRANSPORT.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_RTSP_TRANSPORT 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_TRANSPORT,
+ char *transport);
+.SH DESCRIPTION
+Pass a char * to tell libcurl what to pass for the Transport: header for this
+RTSP session. This is mainly a convenience method to avoid needing to set a
+custom Transport: header for every SETUP request. The application must set a
+Transport: header before issuing a SETUP request.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+RTSP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "rtsp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_SETUP);
+ curl_easy_setopt(curl, CURLOPT_RTSP_TRANSPORT,
+ "RTP/AVP;unicast;client_port=4588-4589");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.20.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_RTSP_REQUEST "(3), " CURLOPT_RTSP_SESSION_ID "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SASL_AUTHZID.3
index 86aa7901f,000000000..38422c636
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SASL_AUTHZID.3
+++ b/docs/libcurl/opts/GNURLOPT_SASL_AUTHZID.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SASL_AUTHZID 3 "11 Sep 2019" "libcurl 7.66.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SASL_AUTHZID \- authorisation identity (identity to act as)
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_AUTHZID, char *authzid);
+.SH DESCRIPTION
+Pass a char * as parameter, which should be pointing to the null-terminated
+authorisation identity (authzid) for the transfer. Only applicable to the
PLAIN
+SASL authentication mechanism where it is optional.
+
+When not specified only the authentication identity (authcid) as specified by
+the username will be sent to the server, along with the password. The server
+will derive a authzid from the authcid when not provided, which it will then
+uses internally.
+
+When the authzid is specified, the use of which is server dependent, it can be
+used to access another user's inbox, that the user has been granted access to,
+or a shared mailbox for example.
+.SH DEFAULT
+blank
+.SH PROTOCOLS
+IMAP, POP3 and SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "imap://example.com/");
+ curl_easy_setopt(curl, CURLOPT_USERNAME, "Kurt");
+ curl_easy_setopt(curl, CURLOPT_PASSWORD, "xipj3plmq");
+ curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "Ursel");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.66.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), ".BR CURLOPT_USERPWD "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_SASL_IR.3
index 51649d589,000000000..352e7d01c
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SASL_IR.3
+++ b/docs/libcurl/opts/GNURLOPT_SASL_IR.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SASL_IR 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SASL_IR \- enable sending initial response in first packet
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_IR, long enable);
+.SH DESCRIPTION
+Pass a long. If the value is 1, curl will send the initial response to the
+server in the first authentication packet in order to reduce the number of
+ping pong requests. Only applicable to the following supporting SASL
+authentication mechanisms:
+
+* Login
+* Plain
+* GSSAPI
+* NTLM
+* OAuth 2.0
+
+Note: Whilst IMAP supports this option there is no need to explicitly set it,
+as libcurl can determine the feature itself when the server supports the
+SASL-IR CAPABILITY.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+IMAP, POP3 and SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SASL_IR, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.31.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAIL_AUTH "(3), " CURLOPT_MAIL_FROM "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SEEKDATA.3
index eb73a1a01,000000000..2f0bbe4d2
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SEEKDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_SEEKDATA.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SEEKDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SEEKDATA \- custom pointer passed to the seek callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SEEKDATA, void *pointer);
+.SH DESCRIPTION
+Data \fIpointer\fP to pass to the seek callback function. If you use the
+\fICURLOPT_SEEKFUNCTION(3)\fP option, this is the pointer you'll get as
+input.
+.SH DEFAULT
+If you don't set this, NULL is passed to the callback.
+.SH PROTOCOLS
+HTTP, FTP, SFTP
+.SH EXAMPLE
+.nf
+static int seek_cb(void *userp, curl_off_t offset, int origin)
+{
+ struct data *d = (struct data *)userp;
+ lseek(d->our_fd, offset, origin);
+ return CURL_SEEKFUNC_OK;
+}
+
+{
+ struct data seek_data;
+ curl_easy_setopt(CURL *handle, CURLOPT_SEEKFUNCTION, seek_cb);
+ curl_easy_setopt(CURL *handle, CURLOPT_SEEKDATA, &seek_data);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.18.0
+.SH RETURN VALUE
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SEEKFUNCTION.3
index 3d4ad7403,000000000..83fa47b95
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SEEKFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_SEEKFUNCTION.3
@@@ -1,89 -1,0 +1,89 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SEEKFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+/* These are the return codes for the seek callbacks */
+#define CURL_SEEKFUNC_OK 0
+#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */
+#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so
+ libcurl might try other means instead */
+
+int seek_callback(void *userp, curl_off_t offset, int origin);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SEEKFUNCTION, seek_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This function gets called by libcurl to seek to a certain position in the
+input stream and can be used to fast forward a file in a resumed upload
+(instead of reading all uploaded bytes with the normal read
+function/callback). It is also called to rewind a stream when data has already
+been sent to the server and needs to be sent again. This may happen when doing
+an HTTP PUT or POST with a multi-pass authentication method, or when an
+existing HTTP connection is reused too late and the server closes the
+connection. The function shall work like fseek(3) or lseek(3) and it gets
+SEEK_SET, SEEK_CUR or SEEK_END as argument for \fIorigin\fP, although libcurl
+currently only passes SEEK_SET.
+
+\fIuserp\fP is the pointer you set with \fICURLOPT_SEEKDATA(3)\fP.
+
+The callback function must return \fICURL_SEEKFUNC_OK\fP on success,
+\fICURL_SEEKFUNC_FAIL\fP to cause the upload operation to fail or
+\fICURL_SEEKFUNC_CANTSEEK\fP to indicate that while the seek failed, libcurl
+is free to work around the problem if possible. The latter can sometimes be
+done by instead reading from the input or similar.
+
+If you forward the input arguments directly to fseek(3) or lseek(3), note that
+the data type for \fIoffset\fP is not the same as defined for curl_off_t on
+many systems!
+.SH DEFAULT
+By default, this is NULL and unused.
+.SH PROTOCOLS
+HTTP, FTP, SFTP
+.SH EXAMPLE
+.nf
+static int seek_cb(void *userp, curl_off_t offset, int origin)
+{
+ struct data *d = (struct data *)userp;
+ lseek(our_fd, offset, origin);
+ return CURL_SEEKFUNC_OK;
+}
+
+{
+ struct data seek_data;
+ curl_easy_setopt(CURL *handle, CURLOPT_SEEKFUNCTION, seek_cb);
+ curl_easy_setopt(CURL *handle, CURLOPT_SEEKDATA, &seek_data);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.18.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SEEKDATA "(3), " CURLOPT_IOCTLFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SERVICE_NAME.3
index eaed26490,000000000..979310e58
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SERVICE_NAME.3
+++ b/docs/libcurl/opts/GNURLOPT_SERVICE_NAME.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SERVICE_NAME 3 "17 Jun 2015" "libcurl 7.43.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SERVICE_NAME \- authentication service name
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SERVICE_NAME, char *name);
+.SH DESCRIPTION
+Pass a char * as parameter to a string holding the \fIname\fP of the service
+for DIGEST-MD5, SPNEGO and Kerberos 5 authentication mechanisms. The default
+service names are "ftp", "HTTP", "imap", "pop" and "smtp". This option allows
+you to change them.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+See above
+.SH PROTOCOLS
+HTTP, FTP, IMAP, POP and SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SERVICE_NAME, "custom");
+ ret = curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.43.0 for HTTP, 7.49.0 for FTP, IMAP, POP3 and SMTP.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SHARE.3
index f9f32c823,000000000..90398ed42
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SHARE.3
+++ b/docs/libcurl/opts/GNURLOPT_SHARE.3
@@@ -1,81 -1,0 +1,81 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SHARE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_SHARE \- specify share handle to use
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SHARE, CURLSH *share);
+.SH DESCRIPTION
+Pass a \fIshare\fP handle as a parameter. The share handle must have been
+created by a previous call to \fIcurl_share_init(3)\fP. Setting this option,
+will make this curl handle use the data from the shared handle instead of
+keeping the data to itself. This enables several curl handles to share
+data. If the curl handles are used simultaneously in multiple threads, you
+\fBMUST\fP use the locking methods in the share handle. See
+\fIcurl_share_setopt(3)\fP for details.
+
+If you add a share that is set to share cookies, your easy handle will use
+that cookie cache and get the cookie engine enabled. If you unshare an object
+that was using cookies (or change to another object that doesn't share
+cookies), the easy handle will get its cookie engine disabled.
+
+Data that the share object is not set to share will be dealt with the usual
+way, as if no share was used.
+
+Set this option to NULL again to stop using that share object.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+CURL *curl2 = curl_easy_init(); /* a second handle */
+if(curl) {
+ CURLSH *shobject = curl_share_init();
+ curl_share_setopt(shobject, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
+
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
+ curl_easy_setopt(curl, CURLOPT_SHARE, shobject);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+
+ /* the second handle shares cookies from the first */
+ curl_easy_setopt(curl2, CURLOPT_URL, "https://example.com/second");
+ curl_easy_setopt(curl2, CURLOPT_COOKIEFILE, "");
+ curl_easy_setopt(curl2, CURLOPT_SHARE, shobject);
+ ret = curl_easy_perform(curl2);
+ curl_easy_cleanup(curl2);
+
+ curl_share_cleanup(shobject);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_COOKIE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SOCKOPTDATA.3
index 8ccadd55f,000000000..39419f91a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SOCKOPTDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_SOCKOPTDATA.3
@@@ -1,67 -1,0 +1,67 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SOCKOPTDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKOPTDATA, void *pointer);
+.SH DESCRIPTION
+Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first
+argument in the sockopt callback set with \fICURLOPT_SOCKOPTFUNCTION(3)\fP.
+.SH DEFAULT
+The default value of this parameter is NULL.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+static int sockopt_callback(void *clientp, curl_socket_t curlfd,
+ curlsocktype purpose)
+{
+ int val = *(int *)clientp;
+ setsockopt(curldfd, SOL_SOCKET, SO_RCVBUF, (const char *)&val, sizeof(val));
+ return CURL_SOCKOPT_OK;
+}
+
+curl = curl_easy_init();
+if(curl) {
+ int recvbuffersize = 256 * 1024;
+
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+
+ /* call this function to set options for the socket */
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, &recvbuffersize);
+
+ res = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.16.0
+.SH RETURN VALUE
+Returns \fICURLE_OK\fP if the option is supported, and
\fICURLE_UNKNOWN_OPTION\fP if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SOCKOPTFUNCTION "(3), " CURLOPT_OPENSOCKETFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SOCKOPTFUNCTION.3
index be9f84285,000000000..7553690e3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SOCKOPTFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_SOCKOPTFUNCTION.3
@@@ -1,124 -1,0 +1,124 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SOCKOPTFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+typedef enum {
+ CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */
+ CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */
+ CURLSOCKTYPE_LAST /* never use */
+} curlsocktype;
+
+#define CURL_SOCKOPT_OK 0
+#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return
+ CURLE_ABORTED_BY_CALLBACK */
+#define CURL_SOCKOPT_ALREADY_CONNECTED 2
+
+int sockopt_callback(void *clientp,
+ curl_socket_t curlfd,
+ curlsocktype purpose);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKOPTFUNCTION,
sockopt_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+When set, this callback function gets called by libcurl when the socket has
+been created, but before the connect call to allow applications to change
+specific socket options. The callback's \fIpurpose\fP argument identifies the
+exact purpose for this particular socket:
+
+\fICURLSOCKTYPE_IPCXN\fP for actively created connections or since 7.28.0
+\fICURLSOCKTYPE_ACCEPT\fP for FTP when the connection was setup with PORT/EPSV
+(in earlier versions these sockets weren't passed to this callback).
+
+Future versions of libcurl may support more purposes. libcurl passes the newly
+created socket descriptor to the callback in the \fIcurlfd\fP parameter so
+additional setsockopt() calls can be done at the user's discretion.
+
+The \fIclientp\fP pointer contains whatever user-defined value set using the
+\fICURLOPT_SOCKOPTDATA(3)\fP function.
+
+Return \fICURL_SOCKOPT_OK\fP from the callback on success. Return
+\fICURL_SOCKOPT_ERROR\fP from the callback function to signal an unrecoverable
+error to the library and it will close the socket and return
+\fICURLE_COULDNT_CONNECT\fP.
+Alternatively, the callback function can return
+\fICURL_SOCKOPT_ALREADY_CONNECTED\fP, to tell libcurl that the socket is
+already connected and then libcurl will not attempt to connect it. This allows
+an application to pass in an already connected socket with
+\fICURLOPT_OPENSOCKETFUNCTION(3)\fP and then have this function make libcurl
+not attempt to connect (again).
+.SH DEFAULT
+By default, this callback is NULL and unused.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+/* make libcurl use the already established socket 'sockfd' */
+
+static curl_socket_t opensocket(void *clientp,
+ curlsocktype purpose,
+ struct curl_sockaddr *address)
+{
+ curl_socket_t sockfd;
+ sockfd = *(curl_socket_t *)clientp;
+ /* the actual externally set socket is passed in via the OPENSOCKETDATA
+ option */
+ return sockfd;
+}
+
+static int sockopt_callback(void *clientp, curl_socket_t curlfd,
+ curlsocktype purpose)
+{
+ /* This return code was added in libcurl 7.21.5 */
+ return CURL_SOCKOPT_ALREADY_CONNECTED;
+}
+
+curl = curl_easy_init();
+if(curl) {
+ /* libcurl will internally think that you connect to the host
+ * and port that you specify in the URL option. */
+ curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
+ /* call this function to get a socket */
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
+ curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd);
+
+ /* call this function to set options for the socket */
+ curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+
+ res = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+.fi
+.SH AVAILABILITY
+Added in 7.16.0. The \fICURL_SOCKOPT_ALREADY_CONNECTED\fP return code was
+added in 7.21.5.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SOCKOPTDATA "(3), " CURLOPT_OPENSOCKETFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SOCKS5_AUTH.3
index 9c9fb158f,000000000..23719f11d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SOCKS5_AUTH.3
+++ b/docs/libcurl/opts/GNURLOPT_SOCKS5_AUTH.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SOCKS5_AUTH 3 "27 April 2017" "libcurl 7.55.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SOCKS5_AUTH \- set allowed methods for SOCKS5 proxy authentication
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_AUTH, long bitmask);
+.SH DESCRIPTION
+Pass a long as parameter, which is set to a bitmask, to tell libcurl which
+authentication method(s) are allowed for SOCKS5 proxy authentication. The
only
+supported flags are \fICURLAUTH_BASIC\fP, which allows username/password
+authentication, \fICURLAUTH_GSSAPI\fP, which allows GSS-API authentication,
and
+\fICURLAUTH_NONE\fP, which allows no authentication. Set the actual user name
+and password with the \fICURLOPT_PROXYUSERPWD(3)\fP option.
+.SH DEFAULT
+CURLAUTH_BASIC|CURLAUTH_GSSAPI
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* request to use a SOCKS5 proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "socks5://user:pass@myproxy.com");
+
+ /* enable username/password authentication only */
+ curl_easy_setopt(curl, CURLOPT_SOCKS5_AUTH, CURLAUTH_BASIC);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.55.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_NOT_BUILT_IN if the bitmask contains unsupported flags.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_SOCKS5_GSSAPI_NEC.3
index b752977cb,000000000..1e5d9107f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SOCKS5_GSSAPI_NEC.3
+++ b/docs/libcurl/opts/GNURLOPT_SOCKS5_GSSAPI_NEC.3
@@@ -1,56 -1,0 +1,56 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SOCKS5_GSSAPI_NEC 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_NEC, long nec);
+.SH DESCRIPTION
+Pass a long set to 1 to enable or 0 to disable. As part of the gssapi
+negotiation a protection mode is negotiated. The RFC1961 says in section
+4.3/4.4 it should be protected, but the NEC reference implementation does not.
+If enabled, this option allows the unprotected exchange of the protection mode
+negotiation.
+.SH DEFAULT
+?
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "socks5://proxy");
+ curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_NEC, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SOCKS5_GSSAPI_SERVICE "(3), " CURLOPT_PROXY "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SOCKS5_GSSAPI_SERVICE.3
index ae16eedbd,000000000..68a05fa01
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SOCKS5_GSSAPI_SERVICE.3
+++ b/docs/libcurl/opts/GNURLOPT_SOCKS5_GSSAPI_SERVICE.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SOCKS5_GSSAPI_SERVICE 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SOCKS5_GSSAPI_SERVICE \- SOCKS5 proxy authentication service name
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_SERVICE, char
*name);
+.SH DESCRIPTION
+Deprecated since 7.49.0. Use \fICURLOPT_PROXY_SERVICE_NAME(3)\fP instead.
+
+Pass a char * as parameter to a string holding the \fIname\fP of the service.
+The default service name for a SOCKS5 server is "rcmd". This option allows you
+to change it.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+See above
+.SH PROTOCOLS
+All network protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "socks5://proxy");
+ curl_easy_setopt(curl, CURLOPT_SOCKS5_GSSAPI_SERVICE, "rcmd-special");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.4, deprecated in 7.49.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY "(3), " CURLOPT_PROXYTYPE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSH_AUTH_TYPES.3
index db943444e,000000000..22f3f0253
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSH_AUTH_TYPES.3
+++ b/docs/libcurl/opts/GNURLOPT_SSH_AUTH_TYPES.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSH_AUTH_TYPES 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_AUTH_TYPES, long bitmask);
+.SH DESCRIPTION
+Pass a long set to a bitmask consisting of one or more of
+CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST,
+CURLSSH_AUTH_KEYBOARD and CURLSSH_AUTH_AGENT.
+
+Set \fICURLSSH_AUTH_ANY\fP to let libcurl pick a suitable one. Currently
+CURLSSH_AUTH_HOST has no effect. If CURLSSH_AUTH_AGENT is used, libcurl
+attempts to connect to ssh-agent or pageant and let the agent attempt the
+authentication.
+.SH DEFAULT
+None
+.SH PROTOCOLS
+SFTP and SCP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES,
+ CURLSSH_AUTH_PUBLICKEY | CURLSSH_AUTH_KEYBOARD);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+CURLSSH_AUTH_HOST was added in 7.16.1, CURLSSH_AUTH_AGENT was added in 7.28.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 "(3), " CURLOPT_SSH_PUBLIC_KEYFILE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSH_COMPRESSION.3
index 92a80a3fd,000000000..e1d27bd69
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSH_COMPRESSION.3
+++ b/docs/libcurl/opts/GNURLOPT_SSH_COMPRESSION.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSH_COMPRESSION 3 "05 Aug 2017" "libcurl 7.56.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSH_COMPRESSION \- enables compression / decompression of SSH traffic
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_COMPRESSION, long enable);
+.SH DESCRIPTION
+Pass a long as parameter set to 1L to enable or 0L to disable.
+
+Enables built-in SSH compression. This is a request, not an order; the server
+may or may not do it.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+All SSH based protocols: SCP, SFTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com");
+
+ /* enable built-in compression */
+ curl_easy_setopt(curl, CURLOPT_SSH_COMPRESSION, 1L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.56.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_ACCEPT_ENCODING "(3), " CURLOPT_TRANSFER_ENCODING "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
index 91716423f,000000000..891752984
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
+++ b/docs/libcurl/opts/GNURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
+ char *md5);
+.SH DESCRIPTION
+Pass a char * pointing to a string containing 32 hexadecimal digits. The
+string should be the 128 bit MD5 checksum of the remote host's public key, and
+libcurl will reject the connection to the host unless the md5sums match.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+SCP and SFTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
+ "afe17cd62a0f3b61f1ab9cb22ba269a7");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.17.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSH_PUBLIC_KEYFILE "(3), " CURLOPT_SSH_AUTH_TYPES "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSH_KEYDATA.3
index 1037947e8,000000000..b088cf462
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSH_KEYDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_SSH_KEYDATA.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSH_KEYDATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KEYDATA, void *pointer);
+.SH DESCRIPTION
+Pass a void * as parameter. This \fIpointer\fP will be passed along verbatim
+to the callback set with \fICURLOPT_SSH_KEYFUNCTION(3)\fP.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+SFTP and SCP
+.SH EXAMPLE
+.nf
+static int keycb(CURL *easy,
+ const struct curl_khkey *knownkey,
+ const struct curl_khkey *foundkey,
+ enum curl_khmatch,
+ void *clientp)
+{
+ /* 'clientp' points to the callback_data struct */
+ /* investigate the situation and return the correct value */
+ return CURLKHSTAT_FINE_ADD_TO_FILE;
+}
+{
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/thisfile.txt");
+ curl_easy_setopt(curl, CURLOPT_SSH_KEYFUNCTION, keycb);
+ curl_easy_setopt(curl, CURLOPT_SSH_KEYDATA, &callback_data);
+ curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS, "/home/user/known_hosts");
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.6
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSH_KEYDATA "(3), " CURLOPT_SSH_KNOWNHOSTS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSH_KEYFUNCTION.3
index 76119c34a,000000000..144f61c1f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSH_KEYFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_SSH_KEYFUNCTION.3
@@@ -1,124 -1,0 +1,131 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
- .\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSH_KEYFUNCTION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+enum curl_khstat {
+ CURLKHSTAT_FINE_ADD_TO_FILE,
+ CURLKHSTAT_FINE,
+ CURLKHSTAT_REJECT, /* reject the connection, return an error */
+ CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right
+ now so this causes a CURLE_DEFER error but
+ otherwise the connection will be left intact
+ etc */
++ CURLKHSTAT_FINE_REPLACE
+};
+
+enum curl_khmatch {
+ CURLKHMATCH_OK, /* match */
+ CURLKHMATCH_MISMATCH, /* host found, key mismatch! */
+ CURLKHMATCH_MISSING, /* no matching host/key found */
+};
+
+struct curl_khkey {
+ const char *key; /* points to a null-terminated string encoded with
+ base64 if len is zero, otherwise to the "raw"
+ data */
+ size_t len;
+ enum curl_khtype keytype;
+};
+
+int ssh_keycallback(CURL *easy,
+ const struct curl_khkey *knownkey,
+ const struct curl_khkey *foundkey,
+ enum curl_khmatch,
+ void *clientp);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KEYFUNCTION,
+ ssh_keycallback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+It gets called when the known_host matching has been done, to allow the
+application to act and decide for libcurl how to proceed. The callback will
+only be called if \fICURLOPT_SSH_KNOWNHOSTS(3)\fP is also set.
+
+This callback function gets passed the CURL handle, the key from the
+known_hosts file \fIknownkey\fP, the key from the remote site \fIfoundkey\fP,
+info from libcurl on the matching status and a custom pointer (set with
+\fICURLOPT_SSH_KEYDATA(3)\fP). It MUST return one of the following return
+codes to tell libcurl how to act:
-
++.IP CURLKHSTAT_FINE_REPLACE
++The new host+key is accepted and libcurl will replace the old host+key into
++the known_hosts file before continuing with the connection. This will also
++add the new host+key combo to the known_host pool kept in memory if it wasn't
++already present there. The adding of data to the file is done by completely
++replacing the file with a new copy, so the permissions of the file must allow
++this. (Added in 7.73.0)
+.IP CURLKHSTAT_FINE_ADD_TO_FILE
+The host+key is accepted and libcurl will append it to the known_hosts file
+before continuing with the connection. This will also add the host+key combo
+to the known_host pool kept in memory if it wasn't already present there. The
+adding of data to the file is done by completely replacing the file with a new
+copy, so the permissions of the file must allow this.
+.IP CURLKHSTAT_FINE
+The host+key is accepted libcurl will continue with the connection. This will
+also add the host+key combo to the known_host pool kept in memory if it wasn't
+already present there.
+.IP CURLKHSTAT_REJECT
+The host+key is rejected. libcurl will deny the connection to continue and it
+will be closed.
+.IP CURLKHSTAT_DEFER
+The host+key is rejected, but the SSH connection is asked to be kept alive.
+This feature could be used when the app wants to somehow return back and act
+on the host+key situation and then retry without needing the overhead of
+setting it up from scratch again.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+SFTP and SCP
+.SH EXAMPLE
+.nf
+static int keycb(CURL *easy,
+ const struct curl_khkey *knownkey,
+ const struct curl_khkey *foundkey,
+ enum curl_khmatch,
+ void *clientp)
+{
+ /* 'clientp' points to the callback_data struct */
+ /* investigate the situation and return the correct value */
+ return CURLKHSTAT_FINE_ADD_TO_FILE;
+}
+{
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/thisfile.txt");
+ curl_easy_setopt(curl, CURLOPT_SSH_KEYFUNCTION, keycb);
+ curl_easy_setopt(curl, CURLOPT_SSH_KEYDATA, &callback_data);
+ curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS, "/home/user/known_hosts");
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.6
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSH_KEYDATA "(3), " CURLOPT_SSH_KNOWNHOSTS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSH_KNOWNHOSTS.3
index 86be0617c,000000000..f78f8630b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSH_KNOWNHOSTS.3
+++ b/docs/libcurl/opts/GNURLOPT_SSH_KNOWNHOSTS.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSH_KNOWNHOSTS 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KNOWNHOSTS, char *fname);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string holding the file name of the
+known_host file to use. The known_hosts file should use the OpenSSH file
+format as supported by libssh2. If this file is specified, libcurl will only
+accept connections with hosts that are known and present in that file, with a
+matching public key. Use \fICURLOPT_SSH_KEYFUNCTION(3)\fP to alter the default
+behavior on host and key (mis)matching.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+SFTP and SCP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS,
+ "/home/clarkkent/.ssh/known_hosts");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.6
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSH_AUTH_TYPES "(3), " CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSH_PRIVATE_KEYFILE.3
index 079519598,000000000..f9d9c66e2
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSH_PRIVATE_KEYFILE.3
+++ b/docs/libcurl/opts/GNURLOPT_SSH_PRIVATE_KEYFILE.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSH_PRIVATE_KEYFILE 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_PRIVATE_KEYFILE,
+ char *filename);
+.SH DESCRIPTION
+Pass a char * pointing to a \fIfilename\fP for your private key. If not used,
+libcurl defaults to \fB$HOME/.ssh/id_dsa\fP if the HOME environment variable
+is set, and just "id_dsa" in the current directory if HOME is not set.
+
+If the file is password-protected, set the password with
+\fICURLOPT_KEYPASSWD(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+As explained above
+.SH PROTOCOLS
+SFTP and SCP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_PRIVATE_KEYFILE,
+ "/home/clarkkent/.ssh/id_rsa");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "password");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.16.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSH_PUBLIC_KEYFILE "(3), " CURLOPT_SSH_AUTH_TYPES "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSH_PUBLIC_KEYFILE.3
index 38cae0ca8,000000000..fe0ecda60
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSH_PUBLIC_KEYFILE.3
+++ b/docs/libcurl/opts/GNURLOPT_SSH_PUBLIC_KEYFILE.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSH_PUBLIC_KEYFILE 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_PUBLIC_KEYFILE,
+ char *filename);
+.SH DESCRIPTION
+Pass a char * pointing to a \fIfilename\fP for your public key. If not used,
+libcurl defaults to \fB$HOME/.ssh/id_dsa.pub\fP if the HOME environment
+variable is set, and just "id_dsa.pub" in the current directory if HOME is not
+set.
+
+If NULL (or an empty string) is passed, libcurl will pass no public key to
+libssh2, which then tries to compute it from the private key. This is known
+to work with libssh2 1.4.0+ linked against OpenSSL.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+SFTP and SCP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/file");
+ curl_easy_setopt(curl, CURLOPT_SSH_PUBLIC_KEYFILE,
+ "/home/clarkkent/.ssh/id_rsa.pub");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+The "" trick was added in 7.26.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSH_PRIVATE_KEYFILE "(3), " CURLOPT_SSH_AUTH_TYPES "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSLCERT.3
index ce462280c,000000000..68f48e6a6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSLCERT.3
+++ b/docs/libcurl/opts/GNURLOPT_SSLCERT.3
@@@ -1,80 -1,0 +1,80 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSLCERT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSLCERT \- set SSL client certificate
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERT, char *cert);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string should be
+the file name of your client certificate. The default format is "P12" on
+Secure Transport and "PEM" on other engines, and can be changed with
+\fICURLOPT_SSLCERTTYPE(3)\fP.
+
+With NSS or Secure Transport, this can also be the nickname of the certificate
+you wish to authenticate with as it is named in the security database. If you
+want to use a file from the current directory, please precede it with "./"
+prefix, in order to avoid confusion with a nickname.
+
+(Schannel only) Client certificates can be specified by a path expression to
+a certificate store. (You can import PFX to a store first). You can use
+"<store location>\\<store name>\\<thumbprint>" to refer to a certificate
+in the system certificates store, for example,
+"CurrentUser\\MY\\934a7ac6f8a5d579285a74fa61e19f23ddfe8d7a". Thumbprint is
+usually a SHA-1 hex string which you can see in certificate details. Following
+store locations are supported: CurrentUser, LocalMachine, CurrentService,
+Services, CurrentUserGroupPolicy, LocalMachineGroupPolicy,
+LocalMachineEnterprise.
+Schannel also support P12 certificate file, with the string "P12" specified
+with \fICURLOPT_SSLCERTTYPE(3)\fP.
+
+When using a client certificate, you most likely also need to provide a
+private key with \fICURLOPT_SSLKEY(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLCERTTYPE "(3), " CURLOPT_SSLKEY "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSLCERTTYPE.3
index 3947324fa,000000000..79ff167e3
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/GNURLOPT_SSLCERTTYPE.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSLCERTTYPE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERTTYPE, char *type);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string should be
+the format of your certificate. Supported formats are "PEM" and "DER", except
+with Secure Transport. OpenSSL (versions 0.9.3 and later) and Secure Transport
+(on iOS 5 or later, or OS X 10.7 or later) also support "P12" for
+PKCS#12-encoded files.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+"PEM"
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+If built TLS enabled. Added in 7.9.3
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLCERT "(3), " CURLOPT_SSLKEY "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSLCERT_BLOB.3
index da278224f,000000000..c0ec71ec1
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSLCERT_BLOB.3
+++ b/docs/libcurl/opts/GNURLOPT_SSLCERT_BLOB.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSLCERT_BLOB 3 "24 Jun 2020" "libcurl 7.71.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSLCERT_BLOB \- SSL client certificate from memory blob
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERT_BLOB, struct
curl_blob *stblob);
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure, which contains (pointer and size) a
+client certificate. The format must be "P12" on Secure Transport or
+Schannel. The format must be "P12" or "PEM" on OpenSSL. The string "P12" or
+"PEM" must be specified with \fICURLOPT_SSLCERTTYPE(3)\fP.
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_SSLCERT(3)\fP which instead
+expects a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob stblob;
+ stblob.data = certificateData;
+ stblob.len = filesize;
+ stblob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT_BLOB, &stblob);
+ curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "P12");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL, Secure
+Transport and Schannel backends.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLCERTTYPE "(3), " CURLOPT_SSLKEY "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSLENGINE.3
index ba3e3007c,000000000..825129d5e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSLENGINE.3
+++ b/docs/libcurl/opts/GNURLOPT_SSLENGINE.3
@@@ -1,66 -1,0 +1,66 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSLENGINE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSLENGINE \- set SSL engine identifier
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE, char *id);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. It will be used as
+the identifier for the crypto engine you want to use for your private key.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLENGINE, "dynamic");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Only if the SSL backend is OpenSSL built with engine support.
+.SH RETURN VALUE
+CURLE_OK - Engine found.
+
+CURLE_SSL_ENGINE_NOTFOUND - Engine not found, or OpenSSL was not built with
+engine support.
+
+CURLE_SSL_ENGINE_INITFAILED - Engine found but initialization failed.
+
+CURLE_NOT_BUILT_IN - Option not built in, OpenSSL is not the SSL backend.
+
+CURLE_UNKNOWN_OPTION - Option not recognized.
+
+CURLE_OUT_OF_MEMORY - Insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLENGINE_DEFAULT "(3), " CURLOPT_SSLKEY "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSLENGINE_DEFAULT.3
index f45ad371d,000000000..45a4c82ce
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSLENGINE_DEFAULT.3
+++ b/docs/libcurl/opts/GNURLOPT_SSLENGINE_DEFAULT.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSLENGINE_DEFAULT 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE_DEFAULT, long val);
+.SH DESCRIPTION
+Pass a long set to 1 to make the already specified crypto engine the default
+for (asymmetric) crypto operations.
+
+This option has no effect unless set after \fICURLOPT_SSLENGINE(3)\fP.
+.SH DEFAULT
+None
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLENGINE, "dynamic");
+ curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Only if the SSL backend is OpenSSL built with engine support.
+.SH RETURN VALUE
+CURLE_OK - Engine set as default.
+
+CURLE_SSL_ENGINE_SETFAILED - Engine could not be set as default.
+
+CURLE_NOT_BUILT_IN - Option not built in, OpenSSL is not the SSL backend.
+
+CURLE_UNKNOWN_OPTION - Option not recognized.
+
+CURLE_OUT_OF_MEMORY - Insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLENGINE "(3), " CURLOPT_SSLCERT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSLKEY.3
index cc54f6b83,000000000..ac2c75560
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSLKEY.3
+++ b/docs/libcurl/opts/GNURLOPT_SSLKEY.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSLKEY 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEY, char *keyfile);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string should be
+the file name of your private key. The default format is "PEM" and can be
+changed with \fICURLOPT_SSLKEYTYPE(3)\fP.
+
+(iOS and Mac OS X only) This option is ignored if curl was built against
+Secure Transport. Secure Transport expects the private key to be already
+present in the keychain or PKCS#12 file containing the certificate.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLKEYTYPE "(3), " CURLOPT_SSLCERT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSLKEYTYPE.3
index 1ec2db1a1,000000000..1db4d314e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/GNURLOPT_SSLKEYTYPE.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSLKEYTYPE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSLKEYTYPE \- set type of the private key file
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEYTYPE, char *type);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string should be
+the format of your private key. Supported formats are "PEM", "DER" and "ENG".
+
+The format "ENG" enables you to load the private key from a crypto engine. In
+this case \fICURLOPT_SSLKEY(3)\fP is used as an identifier passed to the
+engine. You have to set the crypto engine with \fICURLOPT_SSLENGINE(3)\fP.
+\&"DER" format key file currently does not work because of a bug in OpenSSL.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+"PEM"
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLKEY "(3), " CURLOPT_SSLCERT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSLKEY_BLOB.3
index 34688f653,000000000..2f74a9cce
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSLKEY_BLOB.3
+++ b/docs/libcurl/opts/GNURLOPT_SSLKEY_BLOB.3
@@@ -1,75 -1,0 +1,75 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSLKEY_BLOB 3 "24 Jun 2020" "libcurl 7.71.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSLKEY_BLOB \- private key for client cert from memory blob
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEY_BLOB,
+ struct curl_blob *blob);
+.fi
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure, which contains information (pointer
+and size) for a private key. Compatible with OpenSSL. The format (like "PEM")
+must be specified with \fICURLOPT_SSLKEYTYPE(3)\fP.
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_SSLKEY(3)\fP which instead expects
+a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_SSLCERT_BLOB, &blob);
+ curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
+
+ blob.data = privateKeyData;
+ blob.len = privateKeySize;
+ curl_easy_setopt(curl, CURLOPT_SSLKEY_BLOB, &blob);
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLKEYTYPE "(3), " CURLOPT_SSLKEY "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSLVERSION.3
index 60629ddf6,000000000..810dcd4f4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSLVERSION.3
+++ b/docs/libcurl/opts/GNURLOPT_SSLVERSION.3
@@@ -1,113 -1,0 +1,113 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, 2018, Daniel Stenberg, <daniel@haxx.se>, et
al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSLVERSION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSLVERSION \- set preferred TLS/SSL version
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLVERSION, long version);
+.SH DESCRIPTION
+Pass a long as parameter to control which version range of SSL/TLS versions to
+use.
+
+The SSL and TLS versions have typically developed from the most insecure
+version to be more and more secure in this order through history: SSL v2,
+SSLv3, TLS v1.0, TLS v1.1, TLS v1.2 and the most recent TLS v1.3.
+
+Use one of the available defines for this purpose. The available options are:
+.RS
+.IP CURL_SSLVERSION_DEFAULT
+The default acceptable version range. The minimum acceptable version is by
+default TLS v1.0 since 7.39.0 (unless the TLS library has a stricter rule).
+.IP CURL_SSLVERSION_TLSv1
+TLS v1.0 or later
+.IP CURL_SSLVERSION_SSLv2
+SSL v2 (but not SSLv3)
+.IP CURL_SSLVERSION_SSLv3
+SSL v3 (but not SSLv2)
+.IP CURL_SSLVERSION_TLSv1_0
+TLS v1.0 or later (Added in 7.34.0)
+.IP CURL_SSLVERSION_TLSv1_1
+TLS v1.1 or later (Added in 7.34.0)
+.IP CURL_SSLVERSION_TLSv1_2
+TLS v1.2 or later (Added in 7.34.0)
+.IP CURL_SSLVERSION_TLSv1_3
+TLS v1.3 or later (Added in 7.52.0)
+.RE
+
+The maximum TLS version can be set by using \fIone\fP of the
+CURL_SSLVERSION_MAX_ macros below. It is also possible to OR \fIone\fP of the
+CURL_SSLVERSION_ macros with \fIone\fP of the CURL_SSLVERSION_MAX_ macros.
+The MAX macros are not supported for WolfSSL.
+.RS
+.IP CURL_SSLVERSION_MAX_DEFAULT
+The flag defines the maximum supported TLS version by libcurl, or the default
+value from the SSL library is used. libcurl will use a sensible default
+maximum, which was TLS v1.2 up to before 7.61.0 and is TLS v1.3 since then -
+assuming the TLS library support it. (Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_0
+The flag defines maximum supported TLS version as TLS v1.0.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_1
+The flag defines maximum supported TLS version as TLS v1.1.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_2
+The flag defines maximum supported TLS version as TLS v1.2.
+(Added in 7.54.0)
+.IP CURL_SSLVERSION_MAX_TLSv1_3
+The flag defines maximum supported TLS version as TLS v1.3.
+(Added in 7.54.0)
+.RE
+
+In versions of curl prior to 7.54 the CURL_SSLVERSION_TLS options were
+documented to allow \fIonly\fP the specified TLS version, but behavior was
+inconsistent depending on the TLS library.
+
+.SH DEFAULT
+CURL_SSLVERSION_DEFAULT
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* ask libcurl to use TLS version 1.0 or later */
+ curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+SSLv2 is disabled by default since 7.18.1. Other SSL versions availability may
+vary depending on which backend libcurl has been built to use.
+
+SSLv3 is disabled by default since 7.39.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_USE_SSL "(3), " CURLOPT_HTTP_VERSION "(3), "
+.BR CURLOPT_PROXY_SSLVERSION "(3), " CURLOPT_IPRESOLVE "(3) "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_CIPHER_LIST.3
index 2fb8a52d6,000000000..3dc883158
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_CIPHER_LIST.3
@@@ -1,77 -1,0 +1,77 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_CIPHER_LIST 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CIPHER_LIST, char *list);
+.SH DESCRIPTION
+Pass a char *, pointing to a null-terminated string holding the list of
+ciphers to use for the SSL connection. The list must be syntactically correct,
+it consists of one or more cipher strings separated by colons. Commas or
+spaces are also acceptable separators but colons are normally used, \&!, \&-
+and \&+ can be used as operators.
+
+For OpenSSL and GnuTLS valid examples of cipher lists include 'RC4-SHA',
+\'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you
+compile OpenSSL.
+
+You'll find more details about cipher lists on this URL:
+
- https://curl.haxx.se/docs/ssl-ciphers.html
++ https://curl.se/docs/ssl-ciphers.html
+
+For NSS, valid examples of cipher lists include 'rsa_rc4_128_md5',
+\'rsa_aes_128_sha\', etc. With NSS you don't add/remove ciphers. If one uses
+this option then all known ciphers are disabled and only those passed in are
+enabled.
+
+For WolfSSL, valid examples of cipher lists include
+\'ECDHE-RSA-RC4-SHA\', 'AES256-SHA:AES256-SHA256', etc.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL, use internal default
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSL_CIPHER_LIST, "TLSv1");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_TLS13_CIPHERS "(3), " CURLOPT_SSLVERSION "(3), "
+.BR CURLOPT_PROXY_SSL_CIPHER_LIST "(3), " CURLOPT_PROXY_TLS13_CIPHERS "(3), "
+.BR CURLOPT_USE_SSL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_CTX_DATA.3
index 166bb866e,000000000..5c6d16d6b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_CTX_DATA.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_CTX_DATA.3
@@@ -1,124 -1,0 +1,124 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_CTX_DATA 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_DATA, void *pointer);
+.SH DESCRIPTION
+Data \fIpointer\fP to pass to the ssl context callback set by the option
+\fICURLOPT_SSL_CTX_FUNCTION(3)\fP, this is the pointer you'll get as third
+parameter.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+/* OpenSSL specific */
+
+#include <openssl/ssl.h>
+#include <gnurl/curl.h>
+#include <stdio.h>
+
+static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
+{
+ X509_STORE *store;
+ X509 *cert=NULL;
+ BIO *bio;
+ char *mypem = (char *)parm;
+ /* get a BIO */
+ bio=BIO_new_mem_buf(mypem, -1);
+ /* use it to read the PEM formatted certificate from memory into an
+ * X509 structure that SSL can use
+ */
+ PEM_read_bio_X509(bio, &cert, 0, NULL);
+ if(cert == NULL)
+ printf("PEM_read_bio_X509 failed...\\n");
+
+ /* get a pointer to the X509 certificate store (which may be empty) */
+ store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
+
+ /* add our certificate to this store */
+ if(X509_STORE_add_cert(store, cert)==0)
+ printf("error adding certificate\\n");
+
+ /* decrease reference counts */
+ X509_free(cert);
+ BIO_free(bio);
+
+ /* all set to go */
+ return CURLE_OK;
+}
+
+int main(void)
+{
+ CURL * ch;
+ CURLcode rv;
+ char *mypem = /* example CA cert PEM - shortened */
+ "-----BEGIN CERTIFICATE-----\\n"
+ "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\\n"
+ "IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\\n"
+ "IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\\n"
+ "Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\\n"
+ "GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\\n"
+ "zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\\n"
+ "omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\\n"
+ "-----END CERTIFICATE-----\\n";
+
+ rv=curl_global_init(CURL_GLOBAL_ALL);
+ ch=curl_easy_init();
+ rv=curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+ rv=curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
+ rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+
+ /* Retrieve page using cacerts' certificate -> will succeed
+ * load the certificate by installing a function doing the necessary
+ * "modifications" to the SSL CONTEXT just before link init
+ */
+ rv=curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+ rv=curl_easy_setopt(ch, CURLOPT_SSL_CTX_DATA, mypem);
+ rv=curl_easy_perform(ch);
+ if(rv==CURLE_OK)
+ printf("*** transfer succeeded ***\\n");
+ else
+ printf("*** transfer failed ***\\n");
+
+ curl_easy_cleanup(ch);
+ curl_global_cleanup();
+ return rv;
+}
+.fi
+.SH AVAILABILITY
+Added in 7.11.0 for OpenSSL, in 7.42.0 for wolfSSL and in 7.54.0 for
+mbedTLS. Other SSL backends are not supported.
+.SH RETURN VALUE
+CURLE_OK if supported; or an error such as:
+
+CURLE_NOT_BUILT_IN - Not supported by the SSL backend
+
+CURLE_UNKNOWN_OPTION
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_CTX_FUNCTION "(3), " CURLOPT_SSLVERSION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_CTX_FUNCTION.3
index 49dd2ecf1,000000000..8162571bb
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_CTX_FUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_CTX_FUNCTION.3
@@@ -1,83 -1,0 +1,83 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_CTX_FUNCTION 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL or
mbedTLS
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode ssl_ctx_callback(CURL *curl, void *ssl_ctx, void *userptr);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_FUNCTION,
+ ssl_ctx_callback);
+.SH DESCRIPTION
+This option only works for libcurl powered by OpenSSL, wolfSSL or mbedTLS. If
+libcurl was built against another SSL library this functionality is absent.
+
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This callback function gets called by libcurl just before the initialization
+of an SSL connection after having processed all other SSL related options to
+give a last chance to an application to modify the behavior of the SSL
+initialization. The \fIssl_ctx\fP parameter is actually a pointer to the SSL
+library's \fISSL_CTX\fP for OpenSSL or wolfSSL, and a pointer to
+\fImbedtls_ssl_config\fP for mbedTLS. If an error is returned from the
+callback no attempt to establish a connection is made and the perform
+operation will return the callback's error code. Set the \fIuserptr\fP
+argument with the \fICURLOPT_SSL_CTX_DATA(3)\fP option.
+
+This function will get called on all new connections made to a server, during
+the SSL negotiation. The \fIssl_ctx\fP will point to a newly initialized
object
+each time, but note the pointer may be the same as from a prior call.
+
+To use this properly, a non-trivial amount of knowledge of your SSL library is
+necessary. For example, you can use this function to call library-specific
+callbacks to add additional validation code for certificates, and even to
+change the actual URI of an HTTPS request.
+
+WARNING: The \fICURLOPT_SSL_CTX_FUNCTION(3)\fP callback allows the application
+to reach in and modify SSL details in the connection without libcurl itself
+knowing anything about it, which then subsequently can lead to libcurl
+unknowingly reusing SSL connections with different properties. To remedy this
+you may set \fICURLOPT_FORBID_REUSE(3)\fP from the callback function.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+See cacertinmem.c in docs/examples directory for usage example.
+
- https://curl.haxx.se/libcurl/c/cacertinmem.html
++https://curl.se/libcurl/c/cacertinmem.html
+.SH AVAILABILITY
+Added in 7.11.0 for OpenSSL, in 7.42.0 for wolfSSL and in 7.54.0 for
+mbedTLS. Other SSL backends are not supported.
+.SH RETURN VALUE
+CURLE_OK if supported; or an error such as:
+
+CURLE_NOT_BUILT_IN - Not supported by the SSL backend
+
+CURLE_UNKNOWN_OPTION
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_CTX_DATA "(3), " CURLOPT_SSL_VERIFYPEER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_ENABLE_ALPN.3
index 83122beae,000000000..24aade5fa
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_ENABLE_ALPN.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_ENABLE_ALPN.3
@@@ -1,53 -1,0 +1,53 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_ENABLE_ALPN 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSL_ENABLE_ALPN \- enable ALPN
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_ALPN, long npn);
+.SH DESCRIPTION
+Pass a long as parameter, 0 or 1 where 1 is for enable and 0 for disable. This
+option enables/disables ALPN in the SSL handshake (if the SSL backend libcurl
+is built to use supports it), which can be used to negotiate http2.
+.SH DEFAULT
+1, enabled
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_ALPN, 0L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.36.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_ENABLE_NPN "(3), " CURLOPT_SSL_OPTIONS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_ENABLE_NPN.3
index 4a3c9f01e,000000000..e46de3c4a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_ENABLE_NPN.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_ENABLE_NPN.3
@@@ -1,53 -1,0 +1,53 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_ENABLE_NPN 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSL_ENABLE_NPN \- enable NPN
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_NPN, long npn);
+.SH DESCRIPTION
+Pass a long as parameter, 0 or 1 where 1 is for enable and 0 for disable. This
+option enables/disables NPN in the SSL handshake (if the SSL backend libcurl
+is built to use supports it), which can be used to negotiate http2.
+.SH DEFAULT
+1, enabled
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_NPN, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.36.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_ENABLE_ALPN "(3), " CURLOPT_SSL_OPTIONS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_FALSESTART.3
index de391ebe2,000000000..215504ca7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_FALSESTART.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_FALSESTART.3
@@@ -1,55 -1,0 +1,55 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_FALSESTART 3 "14 Feb 2015" "libcurl 7.41.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSL_FALSESTART \- enable TLS false start
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_FALSESTART, long enable);
+.SH DESCRIPTION
+Pass a long as parameter set to 1L to enable or 0 to disable.
+
+This option determines whether libcurl should use false start during the TLS
+handshake. False start is a mode where a TLS client will start sending
+application data before verifying the server's Finished message, thus saving a
+round trip when performing a full handshake.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_SSL_FALSESTART, 1L);
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.42.0. This option is currently only supported by the NSS and
+Secure Transport (on iOS 7.0 or later, or OS X 10.9 or later) TLS backends.
+.SH RETURN VALUE
+Returns CURLE_OK if false start is supported by the SSL backend, otherwise
+returns CURLE_NOT_BUILT_IN.
diff --cc docs/libcurl/opts/GNURLOPT_SSL_OPTIONS.3
index b12405033,000000000..9f2849bf2
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_OPTIONS.3
@@@ -1,84 -1,0 +1,84 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_OPTIONS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_SSL_OPTIONS \- set SSL behavior options
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_OPTIONS, long bitmask);
+.SH DESCRIPTION
+Pass a long with a bitmask to tell libcurl about specific SSL
+behaviors. Available bits:
+.IP CURLSSLOPT_ALLOW_BEAST
+Tells libcurl to not attempt to use any workarounds for a security flaw in the
+SSL3 and TLS1.0 protocols. If this option isn't used or this bit is set to 0,
+the SSL layer libcurl uses may use a work-around for this flaw although it
+might cause interoperability problems with some (older) SSL
+implementations. WARNING: avoiding this work-around lessens the security, and
+by setting this option to 1 you ask for exactly that. This option is only
+supported for Secure Transport, NSS and OpenSSL.
+.IP CURLSSLOPT_NO_REVOKE
+Tells libcurl to disable certificate revocation checks for those SSL backends
+where such behavior is present. This option is only supported for Schannel
+(the native Windows SSL library), with an exception in the case of Windows'
+Untrusted Publishers block list which it seems can't be bypassed. (Added in
+7.44.0)
+.IP CURLSSLOPT_NO_PARTIALCHAIN
+Tells libcurl to not accept "partial" certificate chains, which it otherwise
+does by default. This option is only supported for OpenSSL and will fail the
+certificate verification if the chain ends with an intermediate certificate
+and not with a root cert. (Added in 7.68.0)
+.IP CURLSSLOPT_REVOKE_BEST_EFFORT
+Tells libcurl to ignore certificate revocation checks in case of missing or
+offline distribution points for those SSL backends where such behavior is
+present. This option is only supported for Schannel (the native Windows SSL
+library). If combined with \fICURLSSLOPT_NO_REVOKE\fP, the latter takes
+precedence. (Added in 7.70.0)
+.IP CURLSSLOPT_NATIVE_CA
+Tell libcurl to use the operating system's native CA store for certificate
+verification. Works only on Windows when built to use OpenSSL. This option is
+experimental and behavior is subject to change.
+(Added in 7.71.0)
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* weaken TLS only for use with silly servers */
+ curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST |
+ CURLSSLOPT_NO_REVOKE);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.25.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLVERSION "(3), " CURLOPT_SSL_CIPHER_LIST "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_SESSIONID_CACHE.3
index d691c1020,000000000..00b38cd07
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_SESSIONID_CACHE.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_SESSIONID_CACHE.3
@@@ -1,58 -1,0 +1,58 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_SESSIONID_CACHE 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_SESSIONID_CACHE,
+ long enabled);
+.SH DESCRIPTION
+Pass a long set to 0 to disable libcurl's use of SSL session-ID caching. Set
+this to 1 to enable it. By default all transfers are done using the cache
+enabled. While nothing ever should get hurt by attempting to reuse SSL
+session-IDs, there seem to be or have been broken SSL implementations in the
+wild that may require you to disable this in order for you to succeed.
+.SH DEFAULT
+1
+.SH PROTOCOLS
+All TLS-based
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* switch off session-id use! */
+ curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.16.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_DNS_CACHE_TIMEOUT "(3), " CURLOPT_SSLVERSION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_VERIFYHOST.3
index 810c2a83f,000000000..730758715
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_VERIFYHOST.3
@@@ -1,98 -1,0 +1,98 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_VERIFYHOST 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYHOST, long verify);
+.SH DESCRIPTION
+Pass a long as parameter specifying what to \fIverify\fP.
+
+This option determines whether libcurl verifies that the server cert is for
+the server it is known as.
+
+When negotiating TLS and SSL connections, the server sends a certificate
+indicating its identity.
+
+When \fICURLOPT_SSL_VERIFYHOST(3)\fP is 2, that certificate must indicate that
+the server is the server to which you meant to connect, or the connection
+fails. Simply put, it means it has to have the same name in the certificate as
+is in the URL you operate against.
+
+Curl considers the server the intended one when the Common Name field or a
+Subject Alternate Name field in the certificate matches the host name in the
+URL to which you told Curl to connect.
+
+If \fIverify\fP value is set to 1:
+
+In 7.28.0 and earlier: treated as a debug option of some sorts, not supported
+anymore due to frequently leading to programmer mistakes.
+
+From 7.28.1 to 7.65.3: setting it to 1 made curl_easy_setopt() return an error
+and leaving the flag untouched.
+
+From 7.66.0: treats 1 and 2 the same.
+
+When the \fIverify\fP value is 0, the connection succeeds regardless of the
+names in the certificate. Use that ability with caution!
+
+The default value for this option is 2.
+
+This option controls checking the server's certificate's claimed identity.
+The server could be lying. To control lying, see
+\fICURLOPT_SSL_VERIFYPEER(3)\fP.
+.SH LIMITATIONS
+Secure Transport: If \fIverify\fP value is 0, then SNI is also disabled. SNI
is
+a TLS extension that sends the hostname to the server. The server may use that
+information to do such things as sending back a specific certificate for the
+hostname, or forwarding the request to a specific origin server. Some
hostnames
+may be inaccessible if SNI is not sent.
+
+NSS: If \fICURLOPT_SSL_VERIFYPEER(3)\fP is zero,
+\fICURLOPT_SSL_VERIFYHOST(3)\fP is also set to zero and cannot be overridden.
+.SH DEFAULT
+2
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Set the default value: strict name check please */
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS is supported, and CURLE_UNKNOWN_OPTION if not.
+
+If 1 is set as argument, \fICURLE_BAD_FUNCTION_ARGUMENT\fP is returned.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_CAINFO "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_VERIFYPEER.3
index 55636bfbb,000000000..5c2a27f41
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_VERIFYPEER.3
@@@ -1,93 -1,0 +1,93 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_VERIFYPEER 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYPEER, long verify);
+.SH DESCRIPTION
+Pass a long as parameter to enable or disable.
+
+This option determines whether curl verifies the authenticity of the peer's
+certificate. A value of 1 means curl verifies; 0 (zero) means it doesn't.
+
+When negotiating a TLS or SSL connection, the server sends a certificate
+indicating its identity. Curl verifies whether the certificate is authentic,
+i.e. that you can trust that the server is who the certificate says it is.
+This trust is based on a chain of digital signatures, rooted in certification
+authority (CA) certificates you supply. curl uses a default bundle of CA
+certificates (the path for that is determined at build time) and you can
+specify alternate certificates with the \fICURLOPT_CAINFO(3)\fP option or the
+\fICURLOPT_CAPATH(3)\fP option.
+
+When \fICURLOPT_SSL_VERIFYPEER(3)\fP is enabled, and the verification fails to
+prove that the certificate is authentic, the connection fails. When the
+option is zero, the peer certificate verification succeeds regardless.
+
+Authenticating the certificate is not enough to be sure about the server. You
+typically also want to ensure that the server is the server you mean to be
+talking to. Use \fICURLOPT_SSL_VERIFYHOST(3)\fP for that. The check that the
+host name in the certificate is valid for the host name you're connecting to
+is done independently of the \fICURLOPT_SSL_VERIFYPEER(3)\fP option.
+
+WARNING: disabling verification of the certificate allows bad guys to
+man-in-the-middle the communication without you knowing it. Disabling
+verification makes the communication insecure. Just having encryption on a
+transfer is not enough as you cannot be sure that you are communicating with
+the correct end-point.
+
+NOTE: even when this option is disabled, depending on the used TLS backend,
+curl may still load the certificate file specified in
+\fICURLOPT_CAINFO(3)\fP. curl default settings in some distributions might use
+quite a large file as a default setting for \fICURLOPT_CAINFO(3)\fP, so
+loading the file can be quite expensive, especially when dealing with many
+connections. Thus, in some situations, you might want to disable verification
+fully to save resources by setting \fICURLOPT_CAINFO(3)\fP to NULL - but
+please also consider the warning above!
+.SH DEFAULT
+By default, curl assumes a value of 1.
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Set the default value: strict certificate check please */
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+If built TLS enabled.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), "
+.BR CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_CAINFO "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SSL_VERIFYSTATUS.3
index 824c9669b,000000000..80faa038a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SSL_VERIFYSTATUS.3
+++ b/docs/libcurl/opts/GNURLOPT_SSL_VERIFYSTATUS.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SSL_VERIFYSTATUS 3 "04 Dec 2014" "libcurl 7.40.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSL_VERIFYSTATUS \- verify the certificate's status
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYSTATUS, long
verify);
+.SH DESCRIPTION
+Pass a long as parameter set to 1 to enable or 0 to disable.
+
+This option determines whether libcurl verifies the status of the server cert
+using the "Certificate Status Request" TLS extension (aka. OCSP stapling).
+
+Note that if this option is enabled but the server does not support the TLS
+extension, the verification will fail.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* ask for OCSP stapling! */
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.41.0. This option is currently only supported by the OpenSSL,
GnuTLS
+and NSS TLS backends.
+.SH RETURN VALUE
+Returns CURLE_OK if OCSP stapling is supported by the SSL backend, otherwise
+returns CURLE_NOT_BUILT_IN.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), "
+.BR CURLOPT_CAINFO "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_STDERR.3
index c2758d54a,000000000..bae91971f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_STDERR.3
+++ b/docs/libcurl/opts/GNURLOPT_STDERR.3
@@@ -1,54 -1,0 +1,54 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_STDERR 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_STDERR \- redirect stderr to another stream
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STDERR, FILE *stream);
+.SH DESCRIPTION
+Pass a FILE * as parameter. Tell libcurl to use this \fIstream\fP instead of
+stderr when showing the progress meter and displaying \fICURLOPT_VERBOSE(3)\fP
+data.
+.SH DEFAULT
+stderr
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+FILE *filep = fopen("dump", "wb");
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_STDERR, filep);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_VERBOSE "(3), " CURLOPT_NOPROGRESS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_STREAM_DEPENDS.3
index eef13ee5b,000000000..c50685067
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_STREAM_DEPENDS.3
+++ b/docs/libcurl/opts/GNURLOPT_STREAM_DEPENDS.3
@@@ -1,68 -1,0 +1,68 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_STREAM_DEPENDS 3 "13 Sep 2015" "libcurl 7.46.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_STREAM_DEPENDS \- set stream this transfer depends on
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_DEPENDS, CURL
*dephandle);
+.SH DESCRIPTION
+Pass a CURL * pointer in \fIdephandle\fP to identify the stream within the
+same connection that this stream is depending upon. This option clears the
+exclusive bit and is mutually exclusive to the
+\fICURLOPT_STREAM_DEPENDS_E(3)\fP option.
+
+The spec says "Including a dependency expresses a preference to allocate
+resources to the identified stream rather than to the dependent stream."
+
+This option can be set during transfer.
+
+\fIdephandle\fP must not be the same as \fIhandle\fP, that will cause this
+function to return an error. It must be another easy handle, and it also needs
+to be a handle of a transfer that will be sent over the same HTTP/2 connection
+for this option to have an actual effect.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP/2
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+CURL *curl2 = curl_easy_init(); /* a second handle */
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/one");
+
+ /* the second depends on the first */
+ curl_easy_setopt(curl2, CURLOPT_URL, "https://example.com/two");
+ curl_easy_setopt(curl2, CURLOPT_STREAM_DEPENDS, curl);
+
+ /* then add both to a multi handle and transfer them! */
+}
+.fi
+.SH AVAILABILITY
+Added in 7.46.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_STREAM_WEIGHT "(3), " CURLOPT_STREAM_DEPENDS_E "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_STREAM_DEPENDS_E.3
index 128ae5e65,000000000..3511b7021
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_STREAM_DEPENDS_E.3
+++ b/docs/libcurl/opts/GNURLOPT_STREAM_DEPENDS_E.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_STREAM_DEPENDS_E 3 "13 Sep 2015" "libcurl 7.46.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_STREAM_DEPENDS_E \- set stream this transfer depends on exclusively
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_DEPENDS_E, CURL
*dephandle);
+.SH DESCRIPTION
+Pass a CURL * pointer in \fIdephandle\fP to identify the stream within the
+same connection that this stream is depending upon exclusively. That means it
+depends on it and sets the Exclusive bit.
+
+The spec says "Including a dependency expresses a preference to allocate
+resources to the identified stream rather than to the dependent stream."
+
+Setting a dependency with the exclusive flag for a reprioritized stream causes
+all the dependencies of the new parent stream to become dependent on the
+reprioritized stream.
+
+This option can be set during transfer.
+
+\fIdephandle\fP must not be the same as \fIhandle\fP, that will cause this
+function to return an error. It must be another easy handle, and it also needs
+to be a handle of a transfer that will be sent over the same HTTP/2 connection
+for this option to have an actual effect.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP/2
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+CURL *curl2 = curl_easy_init(); /* a second handle */
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/one");
+
+ /* the second depends on the first */
+ curl_easy_setopt(curl2, CURLOPT_URL, "https://example.com/two");
+ curl_easy_setopt(curl2, CURLOPT_STREAM_DEPENDS_E, curl);
+
+ /* then add both to a multi handle and transfer them! */
+}
+.fi
+.SH AVAILABILITY
+Added in 7.46.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_STREAM_WEIGHT "(3), " CURLOPT_STREAM_DEPENDS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_STREAM_WEIGHT.3
index 2d4fa9f6b,000000000..cea8e7dab
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_STREAM_WEIGHT.3
+++ b/docs/libcurl/opts/GNURLOPT_STREAM_WEIGHT.3
@@@ -1,76 -1,0 +1,76 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_STREAM_WEIGHT 3 "13 Sep 2015" "libcurl 7.46.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_STREAM_WEIGHT \- set numerical stream weight
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_WEIGHT, long weight);
+.SH DESCRIPTION
+Set the long \fIweight\fP to a number between 1 and 256.
+
+When using HTTP/2, this option sets the individual weight for this particular
+stream used by the easy \fIhandle\fP. Setting and using weights only makes
+sense and is only usable when doing multiple streams over the same
+connections, which thus implies that you use \fICURLMOPT_PIPELINING(3)\fP.
+
+This option can be set during transfer and will then cause the updated weight
+info get sent to the server the next time an HTTP/2 frame is sent to the
+server.
+
+See section 5.3 of RFC 7540 for protocol details:
+https://httpwg.github.io/specs/rfc7540.html#StreamPriority
+
+Streams with the same parent should be allocated resources proportionally
+based on their weight. So if you have two streams going, stream A with weight
+16 and stream B with weight 32, stream B will get two thirds (32/48) of the
+available bandwidth (assuming the server can send off the data equally for
+both streams).
+.SH DEFAULT
+If nothing is set, the HTTP/2 protocol itself will use its own default which
+is 16.
+.SH PROTOCOLS
+HTTP/2
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+CURL *curl2 = curl_easy_init(); /* a second handle */
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/one");
+ curl_easy_setopt(curl, CURLOPT_STREAM_WEIGHT, 10L);
+
+ /* the second has twice the weight */
+ curl_easy_setopt(curl2, CURLOPT_URL, "https://example.com/two");
+ curl_easy_setopt(curl2, CURLOPT_STREAM_WEIGHT, 20L);
+
+ /* then add both to a multi handle and transfer them! */
+}
+.fi
+.SH AVAILABILITY
+Added in 7.46.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_STREAM_DEPENDS "(3), " CURLOPT_STREAM_DEPENDS_E "(3), "
+.BR CURLOPT_PIPEWAIT "(3), " CURLMOPT_PIPELINING "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_SUPPRESS_CONNECT_HEADERS.3
index 9f5eef95b,000000000..84d55ee8a
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_SUPPRESS_CONNECT_HEADERS.3
+++ b/docs/libcurl/opts/GNURLOPT_SUPPRESS_CONNECT_HEADERS.3
@@@ -1,95 -1,0 +1,95 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_SUPPRESS_CONNECT_HEADERS 3 "13 February 2017" "libcurl 7.54.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_SUPPRESS_CONNECT_HEADERS \- Suppress proxy CONNECT response headers
from user callbacks
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SUPPRESS_CONNECT_HEADERS,
long onoff);
+.fi
+.SH DESCRIPTION
+When \fICURLOPT_HTTPPROXYTUNNEL(3)\fP is used and a CONNECT request is made,
+suppress proxy CONNECT response headers from the user callback functions
+\fICURLOPT_HEADERFUNCTION(3)\fP and \fICURLOPT_WRITEFUNCTION(3)\fP.
+
+Proxy CONNECT response headers can complicate header processing since it's
+essentially a separate set of headers. You can enable this option to suppress
+those headers.
+
+For example let's assume an HTTPS URL is to be retrieved via CONNECT. On
+success there would normally be two sets of headers, and each header line sent
+to the header function and/or the write function. The data given to the
+callbacks would look like this:
+
+.nf
+HTTP/1.1 200 Connection established
+{headers}...
+
+HTTP/1.1 200 OK
+Content-Type: application/json
+{headers}...
+
+{body}...
+.fi
+
+However by enabling this option the CONNECT response headers are suppressed,
so
+the data given to the callbacks would look like this:
+
+.nf
+HTTP/1.1 200 OK
+Content-Type: application/json
+{headers}...
+
+{body}...
+.fi
+
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://foo:3128");
+ curl_easy_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, 1L);
+ curl_easy_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS, 1L);
+
+ curl_easy_perform(curl);
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.54.0
+.SH RETURN VALUE
+CURLE_OK or an error such as CURLE_UNKNOWN_OPTION.
+.SH "SEE ALSO"
+.BR CURLOPT_HEADER "(3), " CURLOPT_PROXY "(3), "
+.BR CURLOPT_HTTPPROXYTUNNEL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TCP_FASTOPEN.3
index 7dc62263c,000000000..ccaa03b15
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TCP_FASTOPEN.3
+++ b/docs/libcurl/opts/GNURLOPT_TCP_FASTOPEN.3
@@@ -1,54 -1,0 +1,54 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TCP_FASTOPEN 3 "16 Feb 2016" "libcurl 7.49.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_FASTOPEN, long enable);
+.SH DESCRIPTION
+Pass a long as parameter set to 1L to enable or 0 to disable.
+
+TCP Fast Open (RFC7413) is a mechanism that allows data to be carried in the
+SYN and SYN-ACK packets and consumed by the receiving end during the initial
+connection handshake, saving up to one full round-trip time (RTT).
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, 1L);
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.49.0. This option is currently only supported on Linux and OS X
+El Capitan.
+.SH RETURN VALUE
+Returns CURLE_OK if fast open is supported by the operating system, otherwise
+returns CURLE_NOT_BUILT_IN.
diff --cc docs/libcurl/opts/GNURLOPT_TCP_KEEPALIVE.3
index 155f5e1c5,000000000..91e86aaae
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TCP_KEEPALIVE.3
+++ b/docs/libcurl/opts/GNURLOPT_TCP_KEEPALIVE.3
@@@ -1,63 -1,0 +1,63 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TCP_KEEPALIVE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPALIVE, long probe);
+.SH DESCRIPTION
+Pass a long. If set to 1, TCP keepalive probes will be sent. The delay and
+frequency of these probes can be controlled by the
+\fICURLOPT_TCP_KEEPIDLE(3)\fP and \fICURLOPT_TCP_KEEPINTVL(3)\fP options,
+provided the operating system supports them. Set to 0 (default behavior) to
+disable keepalive probes
+.SH DEFAULT
+0
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* enable TCP keep-alive for this transfer */
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
+
+ /* keep-alive idle time to 120 seconds */
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
+
+ /* interval time between keep-alive probes: 60 seconds */
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.25.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_TCP_KEEPIDLE "(3), " CURLOPT_TCP_KEEPINTVL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TCP_KEEPIDLE.3
index 08f7934c1,000000000..f7da4c3b2
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TCP_KEEPIDLE.3
+++ b/docs/libcurl/opts/GNURLOPT_TCP_KEEPIDLE.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TCP_KEEPIDLE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPIDLE, long delay);
+.SH DESCRIPTION
+Pass a long. Sets the \fIdelay\fP, in seconds, that the operating system will
+wait while the connection is idle before sending keepalive probes. Not all
+operating systems support this option.
+.SH DEFAULT
+60
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* enable TCP keep-alive for this transfer */
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
+
+ /* set keep-alive idle time to 120 seconds */
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
+
+ /* interval time between keep-alive probes: 60 seconds */
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.25.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_TCP_KEEPALIVE "(3), " CURLOPT_TCP_KEEPINTVL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TCP_KEEPINTVL.3
index d9e23b603,000000000..b553434e6
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TCP_KEEPINTVL.3
+++ b/docs/libcurl/opts/GNURLOPT_TCP_KEEPINTVL.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TCP_KEEPINTVL 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPINTVL, long interval);
+.SH DESCRIPTION
+Pass a long. Sets the interval, in seconds, that the operating system will
+wait between sending keepalive probes. Not all operating systems support this
+option. (Added in 7.25.0)
+.SH DEFAULT
+60
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* enable TCP keep-alive for this transfer */
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
+
+ /* set keep-alive idle time to 120 seconds */
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
+
+ /* interval time between keep-alive probes: 60 seconds */
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_TCP_KEEPALIVE "(3), " CURLOPT_TCP_KEEPIDLE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TCP_NODELAY.3
index dd6fb6251,000000000..39615f8c7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TCP_NODELAY.3
+++ b/docs/libcurl/opts/GNURLOPT_TCP_NODELAY.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TCP_NODELAY 3 "30 Jun 2016" "libcurl 7.50.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_NODELAY, long nodelay);
+.SH DESCRIPTION
+Pass a long specifying whether the TCP_NODELAY option is to be set or cleared
+(1L = set, 0 = clear). The option is set by default. This will have no effect
+after the connection has been established.
+
+Setting this option to 1L will disable TCP's Nagle algorithm on this
+connection. The purpose of this algorithm is to try to minimize the number of
+small packets on the network (where "small packets" means TCP segments less
+than the Maximum Segment Size (MSS) for the network).
+
+Maximizing the amount of data sent per TCP segment is good because it
+amortizes the overhead of the send. However, in some cases small segments may
+need to be sent without delay. This is less efficient than sending larger
+amounts of data at a time, and can contribute to congestion on the network if
+overdone.
+.SH DEFAULT
+1
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
- /* disable Nagle */
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
++ /* leave Nagle enabled */
+ curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 0);
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always. The default was changed to 1 from 0 in 7.50.2.
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_SOCKOPTFUNCTION "(3), " CURLOPT_TCP_KEEPALIVE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TELNETOPTIONS.3
index 8b3751cc3,000000000..85f807872
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TELNETOPTIONS.3
+++ b/docs/libcurl/opts/GNURLOPT_TELNETOPTIONS.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TELNETOPTIONS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TELNETOPTIONS \- custom telnet options
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TELNETOPTIONS,
+ struct curl_slist *cmds);
+.SH DESCRIPTION
+Provide a pointer to a curl_slist with variables to pass to the telnet
+negotiations. The variables should be in the format <option=value>. libcurl
+supports the options 'TTYPE', 'XDISPLOC' and 'NEW_ENV'. See the TELNET
+standard for details.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+TELNET
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_slist *options;
+ options = curl_slist_append(NULL, "TTTYPE=vt100");
+ options = curl_slist_append(options, "USER=foobar");
+ curl_easy_setopt(curl, CURLOPT_URL, "telnet://example.com/");
+ curl_easy_setopt(curl, CURLOPT_TELNETOPTIONS, options);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+ curl_slist_free_all(options);
+}
+.fi
+.SH AVAILABILITY
+Along with TELNET
+.SH RETURN VALUE
+Returns CURLE_OK if TELNET is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_HTTPHEADER "(3), " CURLOPT_QUOTE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TFTP_BLKSIZE.3
index e4ae6df2b,000000000..95a2e3c18
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TFTP_BLKSIZE.3
+++ b/docs/libcurl/opts/GNURLOPT_TFTP_BLKSIZE.3
@@@ -1,57 -1,0 +1,57 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TFTP_BLKSIZE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TFTP_BLKSIZE \- TFTP block size
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_BLKSIZE, long blocksize);
+.SH DESCRIPTION
+Specify \fIblocksize\fP to use for TFTP data transmission. Valid range as per
+RFC2348 is 8-65464 bytes. The default of 512 bytes will be used if this option
+is not specified. The specified block size will only be used pending support
+by the remote server. If the server does not return an option acknowledgement
+or returns an option acknowledgement with no blksize, the default of 512 bytes
+will be used.
+.SH DEFAULT
+512
+.SH PROTOCOLS
+TFTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "tftp://example.com/bootimage");
+ /* try using larger blocks */
+ curl_easy_setopt(curl, CURLOPT_TFTP_BLKSIZE, 2048L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAXFILESIZE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TFTP_NO_OPTIONS.3
index 5107aa58e,000000000..38e306fa1
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TFTP_NO_OPTIONS.3
+++ b/docs/libcurl/opts/GNURLOPT_TFTP_NO_OPTIONS.3
@@@ -1,71 -1,0 +1,71 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TFTP_NO_OPTIONS 3 "23 Feb 2016" "libcurl 7.48.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_NO_OPTIONS, long onoff);
+.SH DESCRIPTION
+Set \fIonoff\fP to 1L to exclude all TFTP options defined in RFC2347, RFC2348
+and RFC2349 from read and write requests (RRQs/WRQs).
+
+This option improves interop with some legacy servers that do not acknowledge
+or properly implement TFTP options. When this option is used
+\fICURLOPT_TFTP_BLKSIZE(3)\fP is ignored.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+TFTP
+.SH EXAMPLE
+.nf
+size_t write_callback(char *ptr, size_t size, size_t nmemb, void *fp)
+{
+ return fwrite(ptr, size, nmemb, (FILE *)fp);
+}
+
+CURL *curl = curl_easy_init();
+if(curl) {
+ FILE *fp = fopen("foo.bin", "wb");
+ if(fp) {
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)fp);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
+
+ curl_easy_setopt(curl, CURLOPT_URL, "tftp://example.com/foo.bin");
+
+ /* do not send TFTP options requests */
+ curl_easy_setopt(curl, CURLOPT_TFTP_NO_OPTIONS, 1L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+
+ fclose(fp);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.48.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
diff --cc docs/libcurl/opts/GNURLOPT_TIMECONDITION.3
index fcfcd0846,000000000..1ddeeef53
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TIMECONDITION.3
+++ b/docs/libcurl/opts/GNURLOPT_TIMECONDITION.3
@@@ -1,65 -1,0 +1,65 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TIMECONDITION 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TIMECONDITION \- select condition for a time request
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMECONDITION, long cond);
+.SH DESCRIPTION
+Pass a long as parameter. This defines how the \fICURLOPT_TIMEVALUE(3)\fP time
+value is treated. You can set this parameter to \fICURL_TIMECOND_IFMODSINCE\fP
+or \fICURL_TIMECOND_IFUNMODSINCE\fP.
+
+The last modification time of a file is not always known and in such instances
+this feature will have no effect even if the given time condition would not
+have been met. \fIcurl_easy_getinfo(3)\fP with the
+\fICURLINFO_CONDITION_UNMET\fP option can be used after a transfer to learn if
+a zero-byte successful "transfer" was due to this condition not matching.
+.SH DEFAULT
+CURL_TIMECOND_NONE (0)
+.SH PROTOCOLS
+HTTP, FTP, RTSP, and FILE
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* January 1, 2020 is 1577833200 */
+ curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
+
+ /* If-Modified-Since the above time stamp */
+ curl_easy_setopt(curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_TIMEVALUE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TIMEOUT.3
index c6c3bc95e,000000000..8276c1989
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TIMEOUT.3
+++ b/docs/libcurl/opts/GNURLOPT_TIMEOUT.3
@@@ -1,72 -1,0 +1,72 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TIMEOUT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, long timeout);
+.SH DESCRIPTION
+Pass a long as parameter containing \fItimeout\fP - the maximum time in
+seconds that you allow the libcurl transfer operation to take. Normally, name
+lookups can take a considerable time and limiting operations risk aborting
+perfectly normal operations. This option may cause libcurl to use the SIGALRM
+signal to timeout system calls.
+
+In unix-like systems, this might cause signals to be used unless
+\fICURLOPT_NOSIGNAL(3)\fP is set.
+
+If both \fICURLOPT_TIMEOUT(3)\fP and \fICURLOPT_TIMEOUT_MS(3)\fP are set, the
+value set last will be used.
+
+Since this option puts a hard limit on how long time a request is allowed to
+take, it has limited use in dynamic use cases with varying transfer times.
That
+is especially apparent when using the multi interface, which may queue the
+transfer, and that time is included. You are advised to explore
+\fICURLOPT_LOW_SPEED_LIMIT(3)\fP, \fICURLOPT_LOW_SPEED_TIME(3)\fP or using
+\fICURLOPT_PROGRESSFUNCTION(3)\fP to implement your own timeout logic.
+.SH DEFAULT
+Default timeout is 0 (zero) which means it never times out during transfer.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* complete within 20 seconds */
+ curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK. Returns CURLE_BAD_FUNCTION_ARGUMENT if set to a negative
+value or a value that when converted to milliseconds is too large.
+.SH "SEE ALSO"
+.BR CURLOPT_TIMEOUT_MS "(3), "
+.BR CURLOPT_CONNECTTIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TIMEOUT_MS.3
index 8bd7b8651,000000000..751749933
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/GNURLOPT_TIMEOUT_MS.3
@@@ -1,74 -1,0 +1,74 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TIMEOUT_MS 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT_MS, long timeout);
+.SH DESCRIPTION
+Pass a long as parameter containing \fItimeout\fP - the maximum time in
+milliseconds that you allow the libcurl transfer operation to take. Normally,
+name lookups can take a considerable time and limiting operations to less than
+a few minutes risk aborting perfectly normal operations. This option may cause
+libcurl to use the SIGALRM signal to timeout system calls.
+
+If libcurl is built to use the standard system name resolver, that portion of
+the transfer will still use full-second resolution for timeouts with a minimum
+timeout allowed of one second.
+
+In unix-like systems, this might cause signals to be used unless
+\fICURLOPT_NOSIGNAL(3)\fP is set.
+
+If both \fICURLOPT_TIMEOUT(3)\fP and \fICURLOPT_TIMEOUT_MS(3)\fP are set, the
+value set last will be used.
+
+Since this puts a hard limit for how long time a request is allowed to take,
+it has limited use in dynamic use cases with varying transfer times. You are
+then advised to explore \fICURLOPT_LOW_SPEED_LIMIT(3)\fP,
+\fICURLOPT_LOW_SPEED_TIME(3)\fP or using \fICURLOPT_PROGRESSFUNCTION(3)\fP to
+implement your own timeout logic.
+.SH DEFAULT
+Default timeout is 0 (zero) which means it never times out during transfer.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* complete within 20000 milliseconds */
+ curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 20000L);
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_TIMEOUT "(3), "
+.BR CURLOPT_CONNECTTIMEOUT "(3), " CURLOPT_LOW_SPEED_LIMIT "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TIMEVALUE.3
index c333ca65d,000000000..a6afeaa8b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TIMEVALUE.3
+++ b/docs/libcurl/opts/GNURLOPT_TIMEVALUE.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TIMEVALUE 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TIMEVALUE \- set time value for conditional
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEVALUE, long val);
+.SH DESCRIPTION
+Pass a long \fIval\fP as parameter. This should be the time counted as seconds
+since 1 Jan 1970, and the time will be used in a condition as specified with
+\fICURLOPT_TIMECONDITION(3)\fP.
+
+On systems with 32 bit 'long' variables, this option cannot set dates beyond
+the year 2038. Consider \fICURLOPT_TIMEVALUE_LARGE(3)\fP instead.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP, FTP, RTSP, and FILE
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* January 1, 2020 is 1577833200 */
+ curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
+
+ /* If-Modified-Since the above time stamp */
+ curl_easy_setopt(curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_TIMECONDITION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TIMEVALUE_LARGE.3
index 1e13a9020,000000000..9a5c051de
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TIMEVALUE_LARGE.3
+++ b/docs/libcurl/opts/GNURLOPT_TIMEVALUE_LARGE.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TIMEVALUE_LARGE 3 "25 Jan 2018" "libcurl 7.59.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_TIMEVALUE_LARGE \- set time value for conditional
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEVALUE_LARGE, curl_off_t
val);
+.SH DESCRIPTION
+Pass a curl_off_t \fIval\fP as parameter. This should be the time counted as
+seconds since 1 Jan 1970, and the time will be used in a condition as
+specified with \fICURLOPT_TIMECONDITION(3)\fP.
+
+The difference between this option and \fICURLOPT_TIMEVALUE(3)\fP is the type
+of the argument. On systems where 'long' is only 32 bit wide, this option has
+to be used to set dates beyond the year 2038.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP, FTP, RTSP, and FILE
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* January 1, 2020 is 1577833200 */
+ curl_easy_setopt(curl, CURLOPT_TIMEVALUE_LARGE, (curl_off_t)1577833200);
+
+ /* If-Modified-Since the above time stamp */
+ curl_easy_setopt(curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.59.0.
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_TIMECONDITION "(3), "
+.BR CURLOPT_TIMEVALUE_LARGE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TLS13_CIPHERS.3
index 878e10806,000000000..11757bbc5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TLS13_CIPHERS.3
+++ b/docs/libcurl/opts/GNURLOPT_TLS13_CIPHERS.3
@@@ -1,68 -1,0 +1,68 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TLS13_CIPHERS 3 "25 May 2018" "libcurl 7.61.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TLS13_CIPHERS \- specify ciphers suites to use for TLS 1.3
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLS13_CIPHERS, char *list);
+.SH DESCRIPTION
+Pass a char *, pointing to a null-terminated string holding the list of cipher
+suites to use for the TLS 1.3 connection. The list must be syntactically
+correct, it consists of one or more cipher suite strings separated by colons.
+
+You'll find more details about cipher lists on this URL:
+
- https://curl.haxx.se/docs/ssl-ciphers.html
++ https://curl.se/docs/ssl-ciphers.html
+
+This option is currently used only when curl is built to use OpenSSL 1.1.1 or
+later. If you are using a different SSL backend you can try setting TLS 1.3
+cipher suites by using the CURLOPT_SSL_CIPHER_LIST option.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL, use internal default
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_TLS13_CIPHERS,
+ "TLS13-CHACHA20-POLY1305-SHA256");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.61.0.
+Available when built with OpenSSL >= 1.1.1.
+.SH RETURN VALUE
+Returns CURLE_OK if supported, CURLE_NOT_BUILT_IN otherwise.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_CIPHER_LIST "(3), " CURLOPT_SSLVERSION "(3), "
+.BR CURLOPT_PROXY_SSL_CIPHER_LIST "(3), " CURLOPT_PROXY_TLS13_CIPHERS "(3), "
+.BR CURLOPT_PROXY_SSLVERSION "(3), " CURLOPT_USE_SSL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TLSAUTH_PASSWORD.3
index 7e67d3ee3,000000000..153d991ad
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/GNURLOPT_TLSAUTH_PASSWORD.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TLSAUTH_PASSWORD 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_PASSWORD, char *pwd);
+.SH DESCRIPTION
+Pass a char * as parameter, which should point to the null-terminated password
+to use for the TLS authentication method specified with the
+\fICURLOPT_TLSAUTH_TYPE(3)\fP option. Requires that the
+\fICURLOPT_TLSAUTH_USERNAME(3)\fP option also be set.
+
+The application does not have to keep the string around after setting this
+option.
+
+This feature relies in TLS SRP which doesn't work with TLS 1.3.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_TLSAUTH_TYPE "(3), " CURLOPT_TLSAUTH_USERNAME "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TLSAUTH_TYPE.3
index 408c7569e,000000000..ee624d2c4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/GNURLOPT_TLSAUTH_TYPE.3
@@@ -1,67 -1,0 +1,67 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TLSAUTH_TYPE 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_TYPE, char *type);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. The string should be
+the method of the TLS authentication. Supported method is "SRP".
+
+.IP SRP
+TLS-SRP authentication. Secure Remote Password authentication for TLS is
+defined in RFC5054 and provides mutual authentication if both sides have a
+shared secret. To use TLS-SRP, you must also set the
+\fICURLOPT_TLSAUTH_USERNAME(3)\fP and \fICURLOPT_TLSAUTH_PASSWORD(3)\fP
+options.
+
+The application does not have to keep the string around after setting this
+option.
+
+TLS SRP doesn't work with TLS 1.3.
+.SH DEFAULT
+blank
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+You need to build libcurl with GnuTLS or OpenSSL with TLS-SRP support for this
+to work. Added in 7.21.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_TLSAUTH_USERNAME "(3), " CURLOPT_TLSAUTH_PASSWORD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TLSAUTH_USERNAME.3
index 1cf8d446e,000000000..29c7b9963
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/GNURLOPT_TLSAUTH_USERNAME.3
@@@ -1,62 -1,0 +1,62 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TLSAUTH_USERNAME 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_USERNAME, char *user);
+.SH DESCRIPTION
+Pass a char * as parameter, which should point to the null-terminated username
+to use for the TLS authentication method specified with the
+\fICURLOPT_TLSAUTH_TYPE(3)\fP option. Requires that the
+\fICURLOPT_TLSAUTH_PASSWORD(3)\fP option also be set.
+
+The application does not have to keep the string around after setting this
+option.
+
+This feature relies in TLS SRP which doesn't work with TLS 1.3.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_TYPE, "SRP");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, "user");
+ curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, "secret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.4
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_TLSAUTH_TYPE "(3), " CURLOPT_TLSAUTH_PASSWORD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TRAILERDATA.3
index 909f051f4,000000000..36eb8e6dc
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TRAILERDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_TRAILERDATA.3
@@@ -1,49 -1,0 +1,49 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TRAILERDATA 3 "14 Aug 2018" "libcurl 7.64.0" "curl_easy_setopt
options"
+.SH NAME:
+CURLOPT_TRAILERDATA \- Custom pointer passed to the trailing headers callback
+.SH SYNOPSIS
+#include <curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRAILERDATA, void *userdata);
+.SH DESCRIPTION:
+Data pointer to be passed to the HTTP trailer callback function.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+/* Assuming we have a CURL handle in the hndl variable. */
+
+struct MyData data;
+
+curl_easy_setopt(hndl, CURLOPT_TRAILERDATA, &data);
+.fi
+
+A more complete example can be found in examples/http_trailers.html
+.SH AVAILABILITY
+This option was added in curl 7.64.0 and is present if HTTP support is enabled
+.SH "SEE ALSO"
+.BR CURLOPT_TRAILERFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TRAILERFUNCTION.3
index a6c3cdd49,000000000..da870a857
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TRAILERFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_TRAILERFUNCTION.3
@@@ -1,101 -1,0 +1,101 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TRAILERFUNCTION 3 "14 Aug 2018" "libcurl 7.64.0"
"curl_easy_setopt options"
+.SH NAME:
+CURLOPT_TRAILERFUNCTION \- Set callback for sending trailing headers
+.SH SYNOPSIS
+#include <curl.h>
+
+int curl_trailer_callback(struct curl_slist ** list, void *userdata);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRAILERFUNCTION,
curl_trailer_callback *func);
+.SH DESCRIPTION
+Pass a pointer to a callback function.
+
+This callback function will be called once right before sending the final
+CR LF in an HTTP chunked transfer to fill a list of trailing headers to be
+sent before finishing the HTTP transfer.
+
+You can set the userdata argument with the CURLOPT_TRAILERDATA option.
+
+The trailing headers included in the linked list must not be CRLF-terminated,
+because libcurl will add the appropriate line termination characters after
+each header item.
+
+If you use curl_slist_append to add trailing headers to the curl_slist then
+libcurl will duplicate the strings, and will free the curl_slist and the
+duplicates once the trailers have been sent.
+
+If one of the trailing headers is not formatted correctly
+(i.e. HeaderName: headerdata) it will be ignored and an info message
+will be emitted.
+
+The return value can either be CURL_TRAILERFUNC_OK or CURL_TRAILERFUNC_ABORT
+which would respectively instruct libcurl to either continue with sending the
+trailers or to abort the request.
+
+If you set this option to NULL, then the transfer proceeds as usual
+without any interruptions.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+#include <gnurl/curl.h>
+
+static int trailer_cb(struct curl_slist **tr, void *data)
+{
+ /* libcurl will free the list */
+ tr = curl_slist_append(*tr, "My-super-awesome-trailer: trailer-stuff");
+ return CURL_TRAILERFUNC_OK;
+}
+
+CURL *curl = curl_easy_init();
+if(curl) {
+ /* Set the URL of the request */
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* Now set it as a put */
+ curl_easy_setopt(curl, CURLOPT_PUT, 1L);
+
+ /* Assuming we have a function that will return the data to be pushed
+ Let that function be read_cb */
+ curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
+
+ struct curl_slist *headers = NULL;
- headers = curl_slist_append(headers, "Trailer: My-super-awsome-trailer");
++ headers = curl_slist_append(headers, "Trailer: My-super-awesome-trailer");
+ res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+
+ /* Set the trailers filling callback */
+ curl_easy_setopt(curl, CURLOPT_TRAILERFUNCTION, trailer_cb);
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+
+ curl_slist_free_all(headers);
+}
+.SH AVAILABILITY
+This option was added in curl 7.64.0 and is present if HTTP support is enabled
+.SH "SEE ALSO"
+.BR CURLOPT_TRAILERDATA "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TRANSFERTEXT.3
index 0bb4dea5f,000000000..68dfd0cd7
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TRANSFERTEXT.3
+++ b/docs/libcurl/opts/GNURLOPT_TRANSFERTEXT.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TRANSFERTEXT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFERTEXT, long text);
+.SH DESCRIPTION
+A parameter set to 1 tells the library to use ASCII mode for FTP transfers,
+instead of the default binary transfer. For win32 systems it does not set the
+stdout to binary mode. This option can be usable when transferring text data
+between systems with different views on certain characters, such as newlines
+or similar.
+
+libcurl does not do a complete ASCII conversion when doing ASCII transfers
+over FTP. This is a known limitation/flaw that nobody has rectified. libcurl
+simply sets the mode to ASCII and performs a standard transfer.
+.SH DEFAULT
+0, disabled
+.SH PROTOCOLS
+FTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/textfile");
+ curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with FTP
+.SH RETURN VALUE
+Returns CURLE_OK if FTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_CRLF "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_TRANSFER_ENCODING.3
index f5f304d6a,000000000..8a54f088f
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_TRANSFER_ENCODING.3
+++ b/docs/libcurl/opts/GNURLOPT_TRANSFER_ENCODING.3
@@@ -1,61 -1,0 +1,61 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_TRANSFER_ENCODING 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFER_ENCODING, long
enable);
+.SH DESCRIPTION
+Pass a long set to 1L to \fIenable\fP or 0 to disable.
+
+Adds a request for compressed Transfer Encoding in the outgoing HTTP
+request. If the server supports this and so desires, it can respond with the
+HTTP response sent using a compressed Transfer-Encoding that will be
+automatically uncompressed by libcurl on reception.
+
+Transfer-Encoding differs slightly from the Content-Encoding you ask for with
+\fICURLOPT_ACCEPT_ENCODING(3)\fP in that a Transfer-Encoding is strictly meant
+to be for the transfer and thus MUST be decoded before the data arrives in the
+client. Traditionally, Transfer-Encoding has been much less used and supported
+by both HTTP clients and HTTP servers.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_TRANSFER_ENCODING, 1L);
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.21.6
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_ACCEPT_ENCODING "(3), " CURLOPT_HTTP_TRANSFER_DECODING "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_UNIX_SOCKET_PATH.3
index 355cf576e,000000000..3fb3b218d
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_UNIX_SOCKET_PATH.3
+++ b/docs/libcurl/opts/GNURLOPT_UNIX_SOCKET_PATH.3
@@@ -1,81 -1,0 +1,81 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_UNIX_SOCKET_PATH 3 "09 Oct 2014" "libcurl 7.40.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UNIX_SOCKET_PATH, char *path);
+.SH DESCRIPTION
+Enables the use of Unix domain sockets as connection endpoint and sets the
path
+to \fIpath\fP. If \fIpath\fP is NULL, then Unix domain sockets are disabled.
An
+empty string will result in an error at some point, it will not disable use of
+Unix domain sockets.
+
+When enabled, curl will connect to the Unix domain socket instead of
+establishing a TCP connection to a host. Since no TCP connection is created,
+curl does not need to resolve the DNS hostname in the URL.
+
+The maximum path length on Cygwin, Linux and Solaris is 107. On other
platforms
+it might be even less.
+
+Proxy and TCP options such as
+.BR CURLOPT_TCP_NODELAY "(3)
+are not supported. Proxy options such as
+.BR CURLOPT_PROXY "(3)
+have no effect either as these are TCP-oriented, and asking a proxy server to
+connect to a certain Unix domain socket is not possible.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+Default is NULL, meaning that no Unix domain sockets are used.
+.SH PROTOCOLS
+All protocols except for file:// and FTP are supported in theory. HTTP, IMAP,
+POP3 and SMTP should in particular work (including their SSL/TLS variants).
+.SH EXAMPLE
+Given that you have an nginx server running, listening on /tmp/nginx.sock, you
+can request an HTTP resource with:
+
+.nf
+ curl_easy_setopt(curl_handle, CURLOPT_UNIX_SOCKET_PATH,
"/tmp/nginx.sock");
+ curl_easy_setopt(curl_handle, CURLOPT_URL, "http://localhost/");
+.fi
+
+If you are on Linux and somehow have a need for paths larger than 107 bytes,
you
+could use the proc filesystem to bypass the limitation:
+
+.nf
+ int dirfd = open(long_directory_path_to_socket, O_DIRECTORY | O_RDONLY);
+ char path[108];
+ snprintf(path, sizeof(path), "/proc/self/fd/%d/nginx.sock", dirfd);
+ curl_easy_setopt(curl_handle, CURLOPT_UNIX_SOCKET_PATH, path);
+ /* Be sure to keep dirfd valid until you discard the handle */
+.fi
+.SH AVAILABILITY
+Since 7.40.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_OPENSOCKETFUNCTION "(3), " unix "(7), "
diff --cc docs/libcurl/opts/GNURLOPT_UNRESTRICTED_AUTH.3
index d10940137,000000000..3877e8573
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_UNRESTRICTED_AUTH.3
+++ b/docs/libcurl/opts/GNURLOPT_UNRESTRICTED_AUTH.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_UNRESTRICTED_AUTH 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UNRESTRICTED_AUTH,
+ long goahead);
+.SH DESCRIPTION
+Set the long \fIgohead\fP parameter to 1L to make libcurl continue to send
+authentication (user+password) credentials when following locations, even when
+hostname changed. This option is meaningful only when setting
+\fICURLOPT_FOLLOWLOCATION(3)\fP.
+
+By default, libcurl will only send given credentials to the initial host name
+as given in the original URL, to avoid leaking username + password to other
+sites.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1L);
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Along with HTTP
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FOLLOWLOCATION "(3), " CURLOPT_USERPWD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_UPKEEP_INTERVAL_MS.3
index 339f2c632,000000000..d4f7c8c2e
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_UPKEEP_INTERVAL_MS.3
+++ b/docs/libcurl/opts/GNURLOPT_UPKEEP_INTERVAL_MS.3
@@@ -1,73 -1,0 +1,73 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_UPKEEP_INTERVAL_MS 3 "31 Oct 2018" "libcurl 7.62.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_UPKEEP_INTERVAL_MS \- connection upkeep interval
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPKEEP_INTERVAL_MS, long
upkeep_interval_ms);
+.SH DESCRIPTION
+Some protocols have "connection upkeep" mechanisms. These mechanisms usually
+send some traffic on existing connections in order to keep them alive; this
+can prevent connections from being closed due to overzealous firewalls, for
+example.
+
+The user needs to explicitly call \fIcurl_easy_upkeep(3)\fP in order to
+perform the upkeep work.
+
+Currently the only protocol with a connection upkeep mechanism is HTTP/2: when
+the connection upkeep interval is exceeded and \fIcurl_easy_upkeep(3)\fP
+is called, an HTTP/2 PING frame is sent on the connection.
+
+.SH DEFAULT
+CURL_UPKEEP_INTERVAL_DEFAULT (currently defined as 60000L, which is 60
seconds)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ /* Make a connection to an HTTP/2 server. */
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* Set the interval to 30000ms / 30s */
+ curl_easy_setopt(curl, CURLOPT_UPKEEP_INTERVAL_MS, 30000L);
+
+ curl_easy_perform(curl);
+
+ /* Perform more work here. */
+
+ /* While the connection is being held open, curl_easy_upkeep() can be
+ called. If curl_easy_upkeep() is called and the time since the last
+ upkeep exceeds the interval, then an HTTP/2 PING is sent. */
+ curl_easy_upkeep(curl);
+
+ /* Perform more work here. */
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.62.0
+.SH RETURN VALUE
+Returns CURLE_OK
diff --cc docs/libcurl/opts/GNURLOPT_UPLOAD.3
index 970b1281c,000000000..840cf2dec
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_UPLOAD.3
+++ b/docs/libcurl/opts/GNURLOPT_UPLOAD.3
@@@ -1,78 -1,0 +1,78 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_UPLOAD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_UPLOAD \- enable data upload
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPLOAD, long upload);
+.SH DESCRIPTION
+The long parameter \fIupload\fP set to 1 tells the library to prepare for and
+perform an upload. The \fICURLOPT_READDATA(3)\fP and
+\fICURLOPT_INFILESIZE(3)\fP or \fICURLOPT_INFILESIZE_LARGE(3)\fP options are
+also interesting for uploads. If the protocol is HTTP, uploading means using
+the PUT request unless you tell libcurl otherwise.
+
+Using PUT with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
+You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual.
+
+If you use PUT to an HTTP 1.1 server, you can upload data without knowing the
+size before starting the transfer if you use chunked encoding. You enable this
+by adding a header like "Transfer-Encoding: chunked" with
+\fICURLOPT_HTTPHEADER(3)\fP. With HTTP 1.0 or without chunked transfer, you
+must specify the size.
+.SH DEFAULT
+0, default is download
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ /* we want to use our own read function */
+ curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
+ /* enable uploading */
+ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+ /* specify target */
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/dir/to/newfile");
+
+ /* now specify which pointer to pass to our callback */
+ curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
+
+ /* Set the size of the file to upload */
+ curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)fsize);
+
+ /* Now run off and do what you've been told! */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_PUT "(3), " CURLOPT_READFUNCTION "(3), "
+.BR CURLOPT_INFILESIZE_LARGE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_UPLOAD_BUFFERSIZE.3
index 9cc3f6cac,000000000..a974f3c89
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_UPLOAD_BUFFERSIZE.3
+++ b/docs/libcurl/opts/GNURLOPT_UPLOAD_BUFFERSIZE.3
@@@ -1,69 -1,0 +1,69 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_UPLOAD_BUFFERSIZE 3 "18 Aug 2018" "libcurl 7.62.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_UPLOAD_BUFFERSIZE \- set preferred upload buffer size
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPLOAD_BUFFERSIZE, long size);
+.SH DESCRIPTION
+Pass a long specifying your preferred \fIsize\fP (in bytes) for the upload
+buffer in libcurl. It makes libcurl uses a larger buffer that gets passed to
+the next layer in the stack to get sent off. In some setups and for some
+protocols, there's a huge performance benefit of having a larger upload
+buffer.
+
+This is just treated as a request, not an order. You cannot be guaranteed to
+actually get the given size.
+
+The upload buffer size is by default 64 kilobytes. The maximum buffer size
+allowed to be set is 2 megabytes. The minimum buffer size allowed to be set is
+16 kilobytes.
+
+Since curl 7.61.1 the upload buffer is allocated on-demand - so if the handle
+isn't used for upload, this buffer will not be allocated at all.
+.SH DEFAULT
+64 kB
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "sftp://example.com/foo.bin");
+
+ /* ask libcurl to allocate a larger upload buffer */
+ curl_easy_setopt(curl, CURLOPT_UPLOAD_BUFFERSIZE, 120000L);
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.62.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_BUFFERSIZE "(3), " CURLOPT_READFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_URL.3
index 580438d3a,000000000..053adaefe
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_URL.3
+++ b/docs/libcurl/opts/GNURLOPT_URL.3
@@@ -1,360 -1,0 +1,359 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_URL 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_URL \- provide the URL to use in the request
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_URL, char *URL);
+.SH DESCRIPTION
+Pass in a pointer to the \fIURL\fP to work with. The parameter should be a
+char * to a null-terminated string which must be URL-encoded in the following
+format:
+
+scheme://host:port/path
+
+For a greater explanation of the format please see RFC3986.
+
+libcurl doesn't validate the syntax or use this variable until the transfer is
+issued. Even if you set a crazy value here, \fIcurl_easy_setopt(3)\fP will
+still return \fICURLE_OK\fP.
+
+If the given URL is missing a scheme name (such as "http://" or "ftp://" etc)
+then libcurl will make a guess based on the host. If the outermost sub-domain
+name matches DICT, FTP, IMAP, LDAP, POP3 or SMTP then that protocol will be
+used, otherwise HTTP will be used. Since 7.45.0 guessing can be disabled by
+setting a default protocol, see \fICURLOPT_DEFAULT_PROTOCOL(3)\fP for details.
+
+Should the protocol, either that specified by the scheme or deduced by libcurl
+from the host name, not be supported by libcurl then
+\fICURLE_UNSUPPORTED_PROTOCOL\fP will be returned from either the
+\fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP functions when you
+call them. Use \fIcurl_version_info(3)\fP for detailed information of which
+protocols are supported by the build of libcurl you are using.
+
+\fICURLOPT_PROTOCOLS(3)\fP can be used to limit what protocols libcurl will
+use for this transfer, independent of what libcurl has been compiled to
+support. That may be useful if you accept the URL from an external source and
+want to limit the accessibility.
+
+The \fICURLOPT_URL(3)\fP string will be ignored if \fICURLOPT_CURLU(3)\fP is
+set.
+
+\fICURLOPT_URL(3)\fP or \fICURLOPT_CURLU(3)\fP \fBmust\fP be set before a
+transfer is started.
+
+The host part of the URL contains the address of the server that you want to
+connect to. This can be the fully qualified domain name of the server, the
+local network name of the machine on your network or the IP address of the
+server or machine represented by either an IPv4 or IPv6 address. For example:
+
+http://www.example.com/
+
+http://hostname/
+
+http://192.168.0.1/
+
+http://[2001:1890:1112:1::20]/
+
+It is also possible to specify the user name, password and any supported login
+options as part of the host, for the following protocols, when connecting to
+servers that require authentication:
+
+http://user:password@www.example.com
+
+ftp://user:password@ftp.example.com
+
+smb://domain%2fuser:password@server.example.com
+
+imap://user:password;options@mail.example.com
+
+pop3://user:password;options@mail.example.com
+
+smtp://user:password;options@mail.example.com
+
+At present only IMAP, POP3 and SMTP support login options as part of the host.
+For more information about the login options in URL syntax please see RFC2384,
+RFC5092 and IETF draft draft-earhart-url-smtp-00.txt (Added in 7.31.0).
+
+The port is optional and when not specified libcurl will use the default port
+based on the determined or specified protocol: 80 for HTTP, 21 for FTP and 25
+for SMTP, etc. The following examples show how to specify the port:
+
+http://www.example.com:8080/ - This will connect to a web server using port
+8080 rather than 80.
+
+smtp://mail.example.com:587/ - This will connect to a SMTP server on the
+alternative mail port.
+
+The path part of the URL is protocol specific and whilst some examples are
+given below this list is not conclusive:
+
+.IP HTTP
+The path part of an HTTP request specifies the file to retrieve and from what
+directory. If the directory is not specified then the web server's root
+directory is used. If the file is omitted then the default document will be
+retrieved for either the directory specified or the root directory. The exact
+resource returned for each URL is entirely dependent on the server's
+configuration.
+
+http://www.example.com - This gets the main page from the web server.
+
+http://www.example.com/index.html - This returns the main page by explicitly
+requesting it.
+
+http://www.example.com/contactus/ - This returns the default document from
+the contactus directory.
+
+.IP FTP
+The path part of an FTP request specifies the file to retrieve and from what
+directory. If the file part is omitted then libcurl downloads the directory
+listing for the directory specified. If the directory is omitted then
+the directory listing for the root / home directory will be returned.
+
+ftp://ftp.example.com - This retrieves the directory listing for the root
+directory.
+
+ftp://ftp.example.com/readme.txt - This downloads the file readme.txt from the
+root directory.
+
+ftp://ftp.example.com/libcurl/readme.txt - This downloads readme.txt from the
+libcurl directory.
+
+ftp://user:password@ftp.example.com/readme.txt - This retrieves the readme.txt
+file from the user's home directory. When a username and password is
+specified, everything that is specified in the path part is relative to the
+user's home directory. To retrieve files from the root directory or a
+directory underneath the root directory then the absolute path must be
+specified by prepending an additional forward slash to the beginning of the
+path.
+
+ftp://user:password@ftp.example.com//readme.txt - This retrieves the
readme.txt
+from the root directory when logging in as a specified user.
+
+.IP FILE
+When a FILE:// URL is accessed on Windows systems, it can be crafted in a way
+so that Windows attempts to connect to a (remote) machine when curl wants to
+read or write such a path.
+.IP SMTP
+The path part of a SMTP request specifies the host name to present during
+communication with the mail server. If the path is omitted then libcurl will
+attempt to resolve the local computer's host name. However, this may not
+return the fully qualified domain name that is required by some mail servers
+and specifying this path allows you to set an alternative name, such as
+your machine's fully qualified domain name, which you might have obtained
+from an external function such as gethostname or getaddrinfo.
+
+smtp://mail.example.com - This connects to the mail server at example.com and
+sends your local computer's host name in the HELO / EHLO command.
+
+smtp://mail.example.com/client.example.com - This will send
client.example.com in
+the HELO / EHLO command to the mail server at example.com.
+
+.IP POP3
+The path part of a POP3 request specifies the message ID to retrieve. If the
+ID is not specified then a list of waiting messages is returned instead.
+
+pop3://user:password@mail.example.com - This lists the available messages for
+the user
+
+pop3://user:password@mail.example.com/1 - This retrieves the first message for
+the user
+
+.IP IMAP
+The path part of an IMAP request not only specifies the mailbox to list (Added
+in 7.30.0) or select, but can also be used to check the UIDVALIDITY of the
+mailbox, to specify the UID, SECTION (Added in 7.30.0) and PARTIAL octets
+(Added in 7.37.0) of the message to fetch and to specify what messages to
+search for (Added in 7.37.0).
+
+imap://user:password@mail.example.com - Performs a top level folder list
+
+imap://user:password@mail.example.com/INBOX - Performs a folder list on the
+user's inbox
+
+imap://user:password@mail.example.com/INBOX/;UID=1 - Selects the user's inbox
+and fetches message with uid = 1
+
+imap://user:password@mail.example.com/INBOX/;MAILINDEX=1 - Selects the user's
inbox
+and fetches the first message in the mail box
+
+imap://user:password@mail.example.com/INBOX;UIDVALIDITY=50/;UID=2 - Selects
+the user's inbox, checks the UIDVALIDITY of the mailbox is 50 and fetches
+message 2 if it is
+
+imap://user:password@mail.example.com/INBOX/;UID=3/;SECTION=TEXT - Selects the
+user's inbox and fetches the text portion of message 3
+
+imap://user:password@mail.example.com/INBOX/;UID=4/;PARTIAL=0.1024 - Selects
+the user's inbox and fetches the first 1024 octets of message 4
+
+imap://user:password@mail.example.com/INBOX?NEW - Selects the user's inbox and
+checks for NEW messages
+
+imap://user:password@mail.example.com/INBOX?SUBJECT%20shadows - Selects the
+user's inbox and searches for messages containing "shadows" in the subject
+line
+
+For more information about the individual components of an IMAP URL please
+see RFC5092.
+
+.IP SCP
- The path part of a SCP request specifies the file to retrieve and from what
- directory. The file part may not be omitted. The file is taken as an absolute
++The path part of an SCP URL specifies the path and file to retrieve or
++upload. The file part may not be omitted. The file is taken as an absolute
+path from the root directory on the server. To specify a path relative to the
+user's home directory on the server, prepend ~/ to the path portion. If the
+user name is not embedded in the URL, it can be set with the
+\fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP option.
+
+scp://user@example.com/etc/issue - This specifies the file /etc/issue
+
+scp://example.com/~/my-file - This specifies the file my-file in the
+user's home directory on the server
+.IP SFTP
- The path part of a SFTP request specifies the file to retrieve and from what
- directory. If the file part is omitted then libcurl downloads the directory
- listing for the directory specified. If the path ends in a / then a directory
- listing is returned instead of a file. If the path is omitted entirely then
- the directory listing for the root / home directory will be returned. If the
- user name is not embedded in the URL, it can be set with the
- \fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP option.
++The path part of an SFTP URL specifies the file to retrieve or upload. If the
++path ends in a / then a directory listing is returned instead of a file. If
++the path is omitted entirely then the directory listing for the root / home
++directory will be returned. If the user name is not embedded in the URL, it
++can be set with the \fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP
++option.
+
+sftp://user:password@example.com/etc/issue - This specifies the file
+/etc/issue
+
+sftp://user@example.com/~/my-file - This specifies the file my-file in the
+user's home directory
+
+sftp://ssh.example.com/~/Documents/ - This requests a directory listing
+of the Documents directory under the user's home directory
+
+.IP SMB
+The path part of a SMB request specifies the file to retrieve and from what
+share and directory or the share to upload to and as such, may not be omitted.
+If the user name is not embedded in the URL, it can be set with the
+\fICURLOPT_USERPWD(3)\fP or \fICURLOPT_USERNAME(3)\fP option. If the user name
+is embedded in the URL then it must contain the domain name and as such, the
+backslash must be URL encoded as %2f.
+
+smb://server.example.com/files/issue - This specifies the file "issue" located
+in the root of the "files" share
+
+smb://server.example.com/files/ -T issue - This specifies the file "issue"
will
+be uploaded to the root of the "files" share.
+
+curl supports SMB version 1 (only)
+.IP LDAP
+The path part of a LDAP request can be used to specify the: Distinguished
+Name, Attributes, Scope, Filter and Extension for a LDAP search. Each field
+is separated by a question mark and when that field is not required an empty
+string with the question mark separator should be included.
+
+ldap://ldap.example.com/o=My%20Organisation - This will perform a LDAP search
+with the DN as My Organisation.
+
+ldap://ldap.example.com/o=My%20Organisation?postalAddress - This will perform
+the same search but will only return postalAddress attributes.
+
+ldap://ldap.example.com/?rootDomainNamingContext - This specifies an empty DN
+and requests information about the rootDomainNamingContext attribute for an
+Active Directory server.
+
+For more information about the individual components of a LDAP URL please
+see RFC4516.
+.IP RTMP
+There's no official URL spec for RTMP so libcurl uses the URL syntax supported
+by the underlying librtmp library. It has a syntax where it wants a
+traditional URL, followed by a space and a series of space-separated
+name=value pairs.
+
+While space is not typically a "legal" letter, libcurl accepts them. When a
+user wants to pass in a '#' (hash) character it will be treated as a fragment
+and get cut off by libcurl if provided literally. You will instead have to
+escape it by providing it as backslash and its ASCII value in hexadecimal:
+"\\23".
+
+.RS 0
+The application does not have to keep the string around after setting this
+option.
+.SH ENCODING
+The string pointed to in the \fICURLOPT_URL(3)\fP argument is generally
+expected to be a sequence of characters using an ASCII compatible encoding.
+
+If libcurl is built with IDN support, the server name part of the URL can use
+an "international name" by using the current encoding (according to locale) or
+UTF-8 (when winidn is used).
+
+If libcurl is built without IDN support, the server name is used exactly as
+specified when passed to the name resolver functions.
+.SH DEFAULT
+There is no default URL. If this option isn't set, no transfer can be
+performed.
+.SH SECURITY CONCERNS
+Applications may at times find it convenient to allow users to specify URLs
+for various purposes and that string would then end up fed to this option.
+
+Getting a URL from an external untrusted party will bring reasons for several
+security concerns:
+
+If you have an application that runs as or in a server application, getting an
+unfiltered URL can easily trick your application to access a local resource
+instead of a remote. Protecting yourself against localhost accesses is very
+hard when accepting user provided URLs.
+
+Such custom URLs can also access other ports than you planned as port numbers
+are part of the regular URL format. The combination of a local host and a
+custom port number can allow external users to play tricks with your local
+services.
+
+Accepting external URLs may also use other protocols than http:// or other
+common ones. Restrict what accept with \fICURLOPT_PROTOCOLS(3)\fP.
+
+User provided URLs can also be made to point to sites that redirect further on
+(possibly to other protocols too). Consider your
+\fICURLOPT_FOLLOWLOCATION(3)\fP and \fICURLOPT_REDIR_PROTOCOLS(3)\fP settings.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+POP3 and SMTP were added in 7.31.0
+.SH RETURN VALUE
+Returns CURLE_OK on success or CURLE_OUT_OF_MEMORY if there was insufficient
+heap space.
+
+Note that \fIcurl_easy_setopt(3)\fP won't actually parse the given string so
+given a bad URL, it will not be detected until \fIcurl_easy_perform(3)\fP or
+similar is called.
+.SH "SEE ALSO"
+.BR CURLOPT_VERBOSE "(3), " CURLOPT_PROTOCOLS "(3), "
+.BR CURLOPT_FORBID_REUSE "(3), " CURLOPT_FRESH_CONNECT "(3), "
+.BR curl_easy_perform "(3), "
+.BR CURLINFO_REDIRECT_URL "(3), " CURLOPT_PATH_AS_IS "(3), " CURLOPT_CURLU
"(3), "
diff --cc docs/libcurl/opts/GNURLOPT_USERAGENT.3
index 5b28bb322,000000000..13777f309
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_USERAGENT.3
+++ b/docs/libcurl/opts/GNURLOPT_USERAGENT.3
@@@ -1,59 -1,0 +1,59 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_USERAGENT 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_USERAGENT \- set HTTP user-agent header
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERAGENT, char *ua);
+.SH DESCRIPTION
+Pass a pointer to a null-terminated string as parameter. It will be used to
+set the User-Agent: header in the HTTP request sent to the remote server. This
+can be used to fool servers or scripts. You can also set any custom header
+with \fICURLOPT_HTTPHEADER(3)\fP.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL, no User-Agent: header is used by default.
+.SH PROTOCOLS
+HTTP, HTTPS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_USERAGENT, "Dark Secret Ninja/1.0");
+
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+As long as HTTP is supported
+.SH RETURN VALUE
+Returns CURLE_OK if HTTP is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_REFERER "(3), " CURLOPT_HTTPHEADER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_USERNAME.3
index b4f36423c,000000000..b79f9eccb
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_USERNAME.3
+++ b/docs/libcurl/opts/GNURLOPT_USERNAME.3
@@@ -1,85 -1,0 +1,85 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_USERNAME 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_USERNAME \- user name to use in authentication
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERNAME,
+ char *username);
+.SH DESCRIPTION
+Pass a char * as parameter, which should be pointing to the null-terminated
+user name to use for the transfer.
+
+\fICURLOPT_USERNAME(3)\fP sets the user name to be used in protocol
+authentication. You should not use this option together with the (older)
+\fICURLOPT_USERPWD(3)\fP option.
+
+When using Kerberos V5 authentication with a Windows based server, you should
+include the domain name in order for the server to successfully obtain a
+Kerberos Ticket. If you don't then the initial part of the authentication
+handshake may fail.
+
+When using NTLM, the user name can be specified simply as the user name
+without the domain name should the server be part of a single domain and
+forest.
+
+To include the domain name use either Down-Level Logon Name or UPN (User
+Principal Name) formats. For example, EXAMPLE\\user and user@example.com
+respectively.
+
+Some HTTP servers (on Windows) support inclusion of the domain for Basic
+authentication as well.
+
+To specify the password and login options, along with the user name, use the
+\fICURLOPT_PASSWORD(3)\fP and \fICURLOPT_LOGIN_OPTIONS(3)\fP options.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+blank
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_USERNAME, "clark");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.19.1
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_USERPWD "(3), " CURLOPT_PASSWORD "(3), "
+.BR CURLOPT_HTTPAUTH "(3), " CURLOPT_PROXYAUTH "(3)"
diff --cc docs/libcurl/opts/GNURLOPT_USERPWD.3
index 0fd4d394f,000000000..c8f95329b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_USERPWD.3
+++ b/docs/libcurl/opts/GNURLOPT_USERPWD.3
@@@ -1,91 -1,0 +1,91 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_USERPWD 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_USERPWD \- user name and password to use in authentication
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERPWD, char *userpwd);
+.SH DESCRIPTION
+Pass a char * as parameter, pointing to a null-terminated login details string
+for the connection. The format of which is: [user name]:[password].
+
+When using Kerberos V5 authentication with a Windows based server, you should
+specify the user name part with the domain name in order for the server to
+successfully obtain a Kerberos Ticket. If you don't then the initial part of
+the authentication handshake may fail.
+
+When using NTLM, the user name can be specified simply as the user name
+without the domain name should the server be part of a single domain and
+forest.
+
+To specify the domain name use either Down-Level Logon Name or UPN (User
+Principal Name) formats. For example, EXAMPLE\\user and user@example.com
+respectively.
+
+Some HTTP servers (on Windows) support inclusion of the domain for Basic
+authentication as well.
+
+When using HTTP and \fICURLOPT_FOLLOWLOCATION(3)\fP, libcurl might perform
+several requests to possibly different hosts. libcurl will only send this user
+and password information to hosts using the initial host name (unless
+\fICURLOPT_UNRESTRICTED_AUTH(3)\fP is set), so if libcurl follows locations to
+other hosts it will not send the user and password to those. This is enforced
+to prevent accidental information leakage.
+
+Use \fICURLOPT_HTTPAUTH(3)\fP to specify the authentication method for HTTP
+based connections or \fICURLOPT_LOGIN_OPTIONS(3)\fP to control IMAP, POP3 and
+SMTP options.
+
+The user and password strings are not URL decoded, so there's no way to send
+in a user name containing a colon using this option. Use
+\fICURLOPT_USERNAME(3)\fP for that, or include it in the URL.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+Most
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
+
+ curl_easy_setopt(curl, CURLOPT_USERPWD, "clark:kent");
+
+ ret = curl_easy_perform(curl);
+
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK on success or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), "
+.BR CURLOPT_PROXYUSERPWD "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_USE_SSL.3
index ee1f1c7e2,000000000..b39e6f53b
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_USE_SSL.3
+++ b/docs/libcurl/opts/GNURLOPT_USE_SSL.3
@@@ -1,70 -1,0 +1,70 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_USE_SSL 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_USE_SSL \- request using SSL / TLS for the transfer
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USE_SSL, long level);
+.SH DESCRIPTION
+Pass a long using one of the values from below, to make libcurl use your
+desired \fIlevel\fP of SSL for the transfer.
+
+These are all protocols that start out plain text and get "upgraded" to SSL
+using the STARTTLS command.
+
+This is for enabling SSL/TLS when you use FTP, SMTP, POP3, IMAP etc.
+.IP CURLUSESSL_NONE
+Don't attempt to use SSL.
+.IP CURLUSESSL_TRY
+Try using SSL, proceed as normal otherwise.
+.IP CURLUSESSL_CONTROL
+Require SSL for the control connection or fail with
\fICURLE_USE_SSL_FAILED\fP.
+.IP CURLUSESSL_ALL
+Require SSL for all communication or fail with \fICURLE_USE_SSL_FAILED\fP.
+.SH DEFAULT
+CURLUSESSL_NONE
+.SH PROTOCOLS
+FTP, SMTP, POP3, IMAP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/dir/file.ext");
+
+ /* require use of SSL for this, or fail */
+ curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.11.0. This option was known as CURLOPT_FTP_SSL up to 7.16.4, and
+the constants were known as CURLFTPSSL_*
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLVERSION "(3), " CURLOPT_PROXY_SSLVERSION "(3), "
+.BR CURLOPT_SSL_OPTIONS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_VERBOSE.3
index c2d6523c4,000000000..e490be032
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_VERBOSE.3
+++ b/docs/libcurl/opts/GNURLOPT_VERBOSE.3
@@@ -1,64 -1,0 +1,64 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_VERBOSE 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_VERBOSE \- set verbose mode on/off
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_VERBOSE, long onoff);
+.SH DESCRIPTION
+Set the \fIonoff\fP parameter to 1 to make the library display a lot of
+verbose information about its operations on this \fIhandle\fP. Very useful for
+libcurl and/or protocol debugging and understanding. The verbose information
+will be sent to stderr, or the stream set with \fICURLOPT_STDERR(3)\fP.
+
+You hardly ever want this set in production use, you will almost always want
+this when you debug/report problems.
+
+To also get all the protocol data sent and received, consider using the
+\fICURLOPT_DEBUGFUNCTION(3)\fP.
+.SH DEFAULT
+0, meaning disabled.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
++ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ /* ask libcurl to show us the verbose output */
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+}
+.fi
+.SH AVAILABILITY
+Always
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
+.BR CURLOPT_ERRORBUFFER "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_WILDCARDMATCH.3
index 8f15cd29d,000000000..2ec166de8
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_WILDCARDMATCH.3
+++ b/docs/libcurl/opts/GNURLOPT_WILDCARDMATCH.3
@@@ -1,87 -1,0 +1,87 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_WILDCARDMATCH 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WILDCARDMATCH, long onoff);
+.SH DESCRIPTION
+Set \fIonoff\fP to 1 if you want to transfer multiple files according to a
+file name pattern. The pattern can be specified as part of the
+\fICURLOPT_URL(3)\fP option, using an fnmatch-like pattern (Shell Pattern
+Matching) in the last part of URL (file name).
+
+By default, libcurl uses its internal wildcard matching implementation. You
+can provide your own matching function by the
+\fICURLOPT_FNMATCH_FUNCTION(3)\fP option.
+
+A brief introduction of its syntax follows:
+.RS
+.IP "* - ASTERISK"
+\&ftp://example.com/some/path/\fB*.txt\fP (for all txt's from the root
+directory). Only two asterisks are allowed within the same pattern string.
+.RE
+.RS
+.IP "? - QUESTION MARK"
+Question mark matches any (exactly one) character.
+
+\&ftp://example.com/some/path/\fBphoto?.jpeg\fP
+.RE
+.RS
+.IP "[ - BRACKET EXPRESSION"
+The left bracket opens a bracket expression. The question mark and asterisk
have
+no special meaning in a bracket expression. Each bracket expression ends by
the
+right bracket and matches exactly one character. Some examples follow:
+
+\fB[a-zA-Z0\-9]\fP or \fB[f\-gF\-G]\fP \- character interval
+
+\fB[abc]\fP - character enumeration
+
+\fB[^abc]\fP or \fB[!abc]\fP - negation
+
+\fB[[:\fP\fIname\fP\fB:]]\fP class expression. Supported classes are
+\fBalnum\fP,\fBlower\fP, \fBspace\fP, \fBalpha\fP, \fBdigit\fP, \fBprint\fP,
+\fBupper\fP, \fBblank\fP, \fBgraph\fP, \fBxdigit\fP.
+
+\fB[][-!^]\fP - special case \- matches only '\-', ']', '[', '!' or '^'. These
+characters have no special purpose.
+
+\fB[\\[\\]\\\\]\fP - escape syntax. Matches '[', ']' or '\\'.
+
+Using the rules above, a file name pattern can be constructed:
+
+\&ftp://example.com/some/path/\fB[a-z[:upper:]\\\\].jpeg\fP
+.RE
+.PP
+.SH PROTOCOLS
+This feature is only supported for FTP download.
+.SH EXAMPLE
- See https://curl.haxx.se/libcurl/c/ftp-wildcard.html
++See https://curl.se/libcurl/c/ftp-wildcard.html
+.SH AVAILABILITY
+Added in 7.21.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_FNMATCH_FUNCTION "(3), " CURLOPT_URL "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_WRITEDATA.3
index f875f40ee,000000000..55c69a0f5
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_WRITEDATA.3
+++ b/docs/libcurl/opts/GNURLOPT_WRITEDATA.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_WRITEDATA 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_WRITEDATA \- custom pointer passed to the write callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer);
+.SH DESCRIPTION
+A data \fIpointer\fP to pass to the write callback. If you use the
+\fICURLOPT_WRITEFUNCTION(3)\fP option, this is the pointer you'll get in that
+callback's 4th argument. If you don't use a write callback, you must make
+\fIpointer\fP a 'FILE *' (cast to 'void *') as libcurl will pass this to
+\fIfwrite(3)\fP when writing data.
+
+The internal \fICURLOPT_WRITEFUNCTION(3)\fP will write the data to the FILE *
+given with this option, or to stdout if this option hasn't been set.
+
+If you're using libcurl as a win32 DLL, you \fBMUST\fP use a
+\fICURLOPT_WRITEFUNCTION(3)\fP if you set this option or you will experience
+crashes.
+.SH DEFAULT
+By default, this is a FILE * to stdout.
+.SH PROTOCOLS
+Used for all protocols.
+.SH EXAMPLE
+A common technique is to use the write callback to store the incoming data
+into a dynamically growing allocated buffer, and then this
+\fICURLOPT_WRITEDATA(3)\fP is used to point to a struct or the buffer to store
+data in. Like in the getinmemory example:
- https://curl.haxx.se/libcurl/c/getinmemory.html
++https://curl.se/libcurl/c/getinmemory.html
+.SH AVAILABILITY
+Available in all libcurl versions. This option was formerly known as
+\fICURLOPT_FILE\fP, the name \fICURLOPT_WRITEDATA(3)\fP was introduced in
+7.9.7.
+.SH RETURN VALUE
+This will return CURLE_OK.
+.SH "SEE ALSO"
+.BR CURLOPT_WRITEFUNCTION "(3), " CURLOPT_READDATA "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_WRITEFUNCTION.3
index ba10cde52,000000000..48e7330e4
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_WRITEFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_WRITEFUNCTION.3
@@@ -1,112 -1,0 +1,115 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_WRITEFUNCTION 3 "16 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_WRITEFUNCTION \- set callback for writing received data
+.SH SYNOPSIS
+.nf
+#include <gnurl/curl.h>
+
+size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION,
write_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This callback function gets called by libcurl as soon as there is data
+received that needs to be saved. For most transfers, this callback gets called
+many times and each invoke delivers another chunk of data. \fIptr\fP points to
+the delivered data, and the size of that data is \fInmemb\fP; \fIsize\fP is
+always 1.
+
+The callback function will be passed as much data as possible in all invokes,
+but you must not make any assumptions. It may be one byte, it may be
+thousands. The maximum amount of body data that will be passed to the write
+callback is defined in the curl.h header file: \fICURL_MAX_WRITE_SIZE\fP (the
+usual default is 16K). If \fICURLOPT_HEADER(3)\fP is enabled, which makes
+header data get passed to the write callback, you can get up to
+\fICURL_MAX_HTTP_HEADER\fP bytes of header data passed into it. This usually
+means 100K.
+
+This function may be called with zero bytes data if the transferred file is
+empty.
+
+The data passed to this function will not be null-terminated!
+
+Set the \fIuserdata\fP argument with the \fICURLOPT_WRITEDATA(3)\fP option.
+
+Your callback should return the number of bytes actually taken care of. If
+that amount differs from the amount passed to your callback function, it'll
+signal an error condition to the library. This will cause the transfer to get
+aborted and the libcurl function used will return \fICURLE_WRITE_ERROR\fP.
+
+If your callback function returns CURL_WRITEFUNC_PAUSE it will cause this
+transfer to become paused. See \fIcurl_easy_pause(3)\fP for further details.
+
+Set this option to NULL to get the internal default function used instead of
+your callback. The internal default function will write the data to the FILE *
+given with \fICURLOPT_WRITEDATA(3)\fP.
++
++This option doesn't enable HSTS, you need to use \fICURLOPT_HSTS_CTRL(3)\fP to
++do that.
+.SH DEFAULT
+libcurl will use 'fwrite' as a callback by default.
+.SH PROTOCOLS
+For all protocols
+.SH AVAILABILITY
+Support for the CURL_WRITEFUNC_PAUSE return code was added in version 7.18.0.
+.SH RETURN VALUE
+This will return CURLE_OK.
+.SH EXAMPLE
- .NF
++.nf
+ struct memory {
+ char *response;
+ size_t size;
+ };
+
+ static size_t cb(void *data, size_t size, size_t nmemb, void *userp)
+ {
+ size_t realsize = size * nmemb;
+ struct memory *mem = (struct memory *)userp;
+
+ char *ptr = realloc(mem->response, mem->size + realsize + 1);
+ if(ptr == NULL)
+ return 0; /* out of memory! */
+
+ mem->response = ptr;
+ memcpy(&(mem->response[mem->size]), data, realsize);
+ mem->size += realsize;
+ mem->response[mem->size] = 0;
+
+ return realsize;
+ }
+
+ struct memory chunk;
+
+ /* send all data to this function */
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, cb);
+
+ /* we pass our 'chunk' struct to the callback function */
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
- .FI
++.fi
+.SH "SEE ALSO"
+.BR CURLOPT_WRITEDATA "(3), " CURLOPT_READFUNCTION "(3), "
+.BR CURLOPT_HEADERFUNCTION "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_XFERINFODATA.3
index e09b9599d,000000000..f27e944cd
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_XFERINFODATA.3
+++ b/docs/libcurl/opts/GNURLOPT_XFERINFODATA.3
@@@ -1,46 -1,0 +1,46 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_XFERINFODATA 3 "17 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt
options"
+.SH NAME
+CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XFERINFODATA, void *pointer);
+.SH DESCRIPTION
+Pass a \fIpointer\fP that will be untouched by libcurl and passed as the first
+argument in the progress callback set with \fICURLOPT_XFERINFOFUNCTION(3)\fP.
+
+This is an alias for \fICURLOPT_PROGRESSDATA(3)\fP.
+.SH DEFAULT
+The default value of this parameter is NULL.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
- https://curl.haxx.se/libcurl/c/progressfunc.html
++https://curl.se/libcurl/c/progressfunc.html
+.SH AVAILABILITY
+Added in 7.32.0
+.SH RETURN VALUE
+Returns CURLE_OK
+.SH "SEE ALSO"
+.BR CURLOPT_XFERINFOFUNCTION "(3), " CURLOPT_VERBOSE "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_XFERINFOFUNCTION.3
index 777732b21,000000000..99cf02d50
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_XFERINFOFUNCTION.3
+++ b/docs/libcurl/opts/GNURLOPT_XFERINFOFUNCTION.3
@@@ -1,84 -1,0 +1,84 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_XFERINFOFUNCTION 3 "17 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+int progress_callback(void *clientp,
+ curl_off_t dltotal,
+ curl_off_t dlnow,
+ curl_off_t ultotal,
+ curl_off_t ulnow);
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XFERINFOFUNCTION,
progress_callback);
+.SH DESCRIPTION
+Pass a pointer to your callback function, which should match the prototype
+shown above.
+
+This function gets called by libcurl instead of its internal equivalent with a
+frequent interval. While data is being transferred it will be called very
+frequently, and during slow periods like when nothing is being transferred it
+can slow down to about one call per second.
+
+\fIclientp\fP is the pointer set with \fICURLOPT_XFERINFODATA(3)\fP, it is not
+used by libcurl but is only passed along from the application to the callback.
+
+The callback gets told how much data libcurl will transfer and has
+transferred, in number of bytes. \fIdltotal\fP is the total number of bytes
+libcurl expects to download in this transfer. \fIdlnow\fP is the number of
+bytes downloaded so far. \fIultotal\fP is the total number of bytes libcurl
+expects to upload in this transfer. \fIulnow\fP is the number of bytes
+uploaded so far.
+
+Unknown/unused argument values passed to the callback will be set to zero
+(like if you only download data, the upload size will remain 0). Many times
+the callback will be called one or more times first, before it knows the data
+sizes so a program must be made to handle that.
+
+If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
+libcurl to continue executing the default progress function.
+
+Returning any other non-zero value from this callback will cause libcurl to
+abort the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
+
+If you transfer data with the multi interface, this function will not be
+called during periods of idleness unless you call the appropriate libcurl
+function that performs transfers.
+
+\fICURLOPT_NOPROGRESS(3)\fP must be set to 0 to make this function actually
+get called.
+.SH DEFAULT
+By default, libcurl has an internal progress meter. That's rarely wanted by
+users.
+.SH PROTOCOLS
+All
+.SH EXAMPLE
- https://curl.haxx.se/libcurl/c/progressfunc.html
++https://curl.se/libcurl/c/progressfunc.html
+.SH AVAILABILITY
+Added in 7.32.0. This callback replaces \fICURLOPT_PROGRESSFUNCTION(3)\fP
+.SH RETURN VALUE
+Returns CURLE_OK.
+.SH "SEE ALSO"
+.BR CURLOPT_XFERINFODATA "(3), " CURLOPT_NOPROGRESS "(3), "
diff --cc docs/libcurl/opts/GNURLOPT_XOAUTH2_BEARER.3
index d77dfa167,000000000..8f0b3a7fd
mode 100644,000000..100644
--- a/docs/libcurl/opts/GNURLOPT_XOAUTH2_BEARER.3
+++ b/docs/libcurl/opts/GNURLOPT_XOAUTH2_BEARER.3
@@@ -1,60 -1,0 +1,60 @@@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
- .\" * are also available at https://curl.haxx.se/docs/copyright.html.
++.\" * are also available at https://curl.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH GNURLOPT_XOAUTH2_BEARER 3 "19 Jun 2014" "libcurl 7.37.0"
"curl_easy_setopt options"
+.SH NAME
+CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
+.SH SYNOPSIS
+#include <gnurl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XOAUTH2_BEARER, char *token);
+.SH DESCRIPTION
+Pass a char * as parameter, which should point to the null-terminated OAuth
+2.0 Bearer Access Token for use with HTTP, IMAP, POP3 and SMTP servers
+that support the OAuth 2.0 Authorization Framework.
+
+Note: For IMAP, POP3 and SMTP, the user name used to generate the Bearer Token
+should be supplied via the \fICURLOPT_USERNAME(3)\fP option.
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+IMAP, POP3 and SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "pop3://example.com/");
+ curl_easy_setopt(curl, CURLOPT_XOAUTH2_BEARER, "1ab9cb22ba269a7");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.33.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_MAIL_AUTH "(3), " CURLOPT_USERNAME "(3), "
diff --cc docs/mk-ca-bundle.1
index d491cb914,3502ade8d..94f752d12
--- a/docs/mk-ca-bundle.1
+++ b/docs/mk-ca-bundle.1
@@@ -103,51 -78,42 +103,51 @@@ ALL, DIGITAL_SIGNATURE, NON_REPUDIATION
DATA_ENCIPHERMENT, KEY_AGREEMENT, KEY_CERT_SIGN, CRL_SIGN,
SERVER_AUTH (default), CLIENT_AUTH, CODE_SIGNING, EMAIL_PROTECTION,
IPSEC_END_SYSTEM, IPSEC_TUNNEL, IPSEC_USER, TIME_STAMPING, STEP_UP_APPROVED
-.RE
-.IP
+.Ed
+.sp
Valid trust levels are:
-.RS
+.Bd -literal -offset indent -compact
ALL, TRUSTED_DELEGATOR (default), NOT_TRUSTED, MUST_VERIFY_TRUST, TRUSTED
-.RE
-.IP -q
+.Ed
+.sp
+.It Fl q
be really quiet (no progress output at all)
-.IP -t
+.It Fl t
include plain text listing of certificates
-.IP "-s [algorithms]"
+.It Fl s\ [algorithms]
comma separated list of signature algorithms with which to hash/fingerprint
each certificate and output when run in plain text mode.
-
+.sp
(Added in version 1.21, Perl only)
-
+.sp
Valid algorithms are:
-.RS
+.Bd -literal -offset indent -compact
ALL, NONE, MD5 (default), SHA1, SHA256, SHA384, SHA512
-.RE
-.IP -u
+.Ed
+.It Fl u
unlink (remove) certdata.txt after processing
-.IP -v
+.It Fl v
be verbose and print out processed CAs
-.SH EXIT STATUS
-Returns 0 on success. Returns 1 if it fails to download data.
-.SH CERTDATA FORMAT
+.El
+.Sh EXIT STATUS
+Returns 0 on success.
+Returns 1 if it fails to download data.
+.Sh AUTHORS
+This manual page was initially written by
+.An Jan Schaumann Aq Mt jschauma@netmeister.org
+and converted to mdoc format by
- .An Nils Gillmann Aq Mt ng0@n0.is .
++.An Nikita Gillmann Aq Mt nikita@n0.is .
+.Sh SEE ALSO
+.Xr curl 1
+.Sh STANDARDS
The file format used by Mozilla for this trust information seems to be
documented here:
-.nf
-https://p11-glue.freedesktop.org/doc/storing-trust-policy/storing-trust-existing.html
-.fi
-.SH SEE ALSO
-.BR curl (1)
-.SH HISTORY
-\fBmk-ca-bundle\fP is a command line tool that is shipped as part of every
-curl and libcurl release (see https://curl.se/). It was originally based
+.Lk
https://p11-glue.freedesktop.org/doc/storing-trust-policy/storing-trust-existing.html
+.Sh HISTORY
+.Nm
+is a command line tool that is shipped as part of every
+curl and libcurl release (see
- .Lk https://curl.haxx.se/
++.Lk https://curl.se/
+).
+It was originally based
on the parse-certs script written by Roland Krikava and was later much
-improved by Guenter Knauf. This manual page was initially written by Jan
-Schaumann \&<jschauma@netmeister.org>.
+improved by Guenter Knauf.
diff --cc gnurl-config.in
index e5621da20,000000000..bec64b892
mode 100644,000000..100644
--- a/gnurl-config.in
+++ b/gnurl-config.in
@@@ -1,194 -1,0 +1,194 @@@
+#! /bin/sh
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2001 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+includedir=@includedir@
+cppflag_gnurl_staticlib=@CPPFLAG_CURL_STATICLIB@
+
+usage()
+{
+ cat <<EOF
+Usage: gnurl-config [OPTION]
+
+Available values for OPTION include:
+
+ --built-shared says 'yes' if libgnurl was built shared
+ --ca ca bundle install path
+ --cc compiler
+ --cflags pre-processor and compiler flags
+ --checkfor [version] check for (lib)gnurl of the specified version
+ --configure the arguments given to configure when building gnurl
+ --features newline separated list of enabled features
+ --help display this help and exit
+ --libs library linking information
+ --prefix gnurl install prefix
+ --protocols newline separated list of enabled protocols
+ --ssl-backends output the SSL backends libcurl was built to support
+ --static-libs static libgnurl library linking information
+ --version output version information
+ --vernum output the version information as a number (hexadecimal)
+EOF
+
+ exit $1
+}
+
+if test $# -eq 0; then
+ usage 1
+fi
+
+while test $# -gt 0; do
+ case "$1" in
+ # this deals with options in the style
+ # --option=value and extracts the value part
+ # [not currently used]
+ -*=*) value=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) value= ;;
+ esac
+
+ case "$1" in
+ --built-shared)
+ echo @ENABLE_SHARED@
+ ;;
+
+ --ca)
+ echo @CURL_CA_BUNDLE@
+ ;;
+
+ --cc)
+ echo "@CC@"
+ ;;
+
+ --prefix)
+ echo "$prefix"
+ ;;
+
+ --feature|--features)
+ for feature in @SUPPORT_FEATURES@ ""; do
+ test -n "$feature" && echo "$feature"
+ done
+ ;;
+
+ --protocols)
+ for protocol in @SUPPORT_PROTOCOLS@; do
+ echo "$protocol"
+ done
+ ;;
+
+ --version)
+ echo libgnurl @CURLVERSION@
+ exit 0
+ ;;
+
+ --checkfor)
+ checkfor=$2
+ cmajor=`echo $checkfor | cut -d. -f1`
+ cminor=`echo $checkfor | cut -d. -f2`
+ # when extracting the patch part we strip off everything after a
+ # dash as that's used for things like version 1.2.3-CVS
+ cpatch=`echo $checkfor | cut -d. -f3 | cut -d- -f1`
+
+ vmajor=`echo @CURLVERSION@ | cut -d. -f1`
+ vminor=`echo @CURLVERSION@ | cut -d. -f2`
+ # when extracting the patch part we strip off everything after a
+ # dash as that's used for things like version 1.2.3-CVS
+ vpatch=`echo @CURLVERSION@ | cut -d. -f3 | cut -d- -f1`
+
+ if test "$vmajor" -gt "$cmajor"; then
+ exit 0;
+ fi
+ if test "$vmajor" -eq "$cmajor"; then
+ if test "$vminor" -gt "$cminor"; then
+ exit 0
+ fi
+ if test "$vminor" -eq "$cminor"; then
+ if test "$cpatch" -le "$vpatch"; then
+ exit 0
+ fi
+ fi
+ fi
+
+ echo "requested version $checkfor is newer than existing
@CURLVERSION@"
+ exit 1
+ ;;
+
+ --vernum)
+ echo @VERSIONNUM@
+ exit 0
+ ;;
+
+ --help)
+ usage 0
+ ;;
+
+ --cflags)
+ if test "X$cppflag_gnurl_staticlib" = "X-DCURL_STATICLIB"; then
+ CPPFLAG_CURL_STATICLIB="-DCURL_STATICLIB "
+ else
+ CPPFLAG_CURL_STATICLIB=""
+ fi
+ if test "X@includedir@" = "X/usr/include"; then
+ echo "$CPPFLAG_CURL_STATICLIB"
+ else
+ echo "${CPPFLAG_CURL_STATICLIB}-I@includedir@"
+ fi
+ ;;
+
+ --libs)
+ if test "X@libdir@" != "X/usr/lib" -a "X@libdir@" != "X/usr/lib64";
then
+ CURLLIBDIR="-L@libdir@ "
+ else
+ CURLLIBDIR=""
+ fi
+ if test "X@ENABLE_SHARED@" = "Xno" -o "X@REQUIRE_LIB_DEPS@" = "Xyes";
then
+ echo @LDFLAGS@ ${CURLLIBDIR}-lgnurl @LIBCURL_LIBS@
+ else
+ echo @LDFLAGS@ ${CURLLIBDIR}-lgnurl
+ fi
+ ;;
+ --ssl-backends)
+ echo "@SSL_BACKENDS@"
+ ;;
+
+ --static-libs)
+ if test "X@ENABLE_STATIC@" != "Xno" ; then
+ echo @libdir@/libgnurl.@libext@ @LDFLAGS@ @LIBCURL_LIBS@
+ else
+ echo "gnurl was built with static libraries disabled" >&2
+ exit 1
+ fi
+ ;;
+
+ --configure)
+ echo @CONFIGURE_OPTIONS@
+ ;;
+
+ *)
+ echo "unknown option: $1"
+ usage 1
+ ;;
+ esac
+ shift
+done
+
+exit 0
diff --cc include/Makefile.am
index 1f722ddda,a334fdcae..01e795828
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@@ -19,8 -19,8 +19,8 @@@
# KIND, either express or implied.
#
###########################################################################
-SUBDIRS = curl
+SUBDIRS = gnurl
- EXTRA_DIST = README
+ EXTRA_DIST = README.md
AUTOMAKE_OPTIONS = foreign no-dependencies
diff --cc include/gnurl/Makefile.am
index b8298f29b,000000000..387a14461
mode 100644,000000..100644
--- a/include/gnurl/Makefile.am
+++ b/include/gnurl/Makefile.am
@@@ -1,39 -1,0 +1,39 @@@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
- # Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+pkginclude_HEADERS = \
+ curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \
- typecheck-gcc.h system.h urlapi.h
++ typecheck-gcc.h system.h urlapi.h options.h
+
+pkgincludedir= $(includedir)/gnurl
+
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo " RUN " $@;
+CS_1 =
+CS_ = $(CS_0)
+
+checksrc:
+ $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl
-D$(top_srcdir)/include/gnurl $(pkginclude_HEADERS)
+
+if CURLDEBUG
+# for debug builds, we scan the sources on all regular make invokes
+all-local: checksrc
+endif
diff --cc include/gnurl/multi.h
index 4ea8b267c,000000000..87d74144a
mode 100644,000000..100644
--- a/include/gnurl/multi.h
+++ b/include/gnurl/multi.h
@@@ -1,456 -1,0 +1,456 @@@
+#ifndef CURLINC_MULTI_H
+#define CURLINC_MULTI_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
++ * are also available at https://curl.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/*
+ This is an "external" header file. Don't give away any internals here!
+
+ GOALS
+
+ o Enable a "pull" interface. The application that uses libcurl decides where
+ and when to ask libcurl to get/send data.
+
+ o Enable multiple simultaneous transfers in the same thread without making
it
+ complicated for the application.
+
+ o Enable the application to select() on its own file descriptors and curl's
+ file descriptors simultaneous easily.
+
+*/
+
+/*
+ * This header file should not really need to include "curl.h" since curl.h
+ * itself includes this file and we expect user applications to do #include
+ * <gnurl/curl.h> without the need for especially including multi.h.
+ *
+ * For some reason we added this include here at one point, and rather than to
+ * break existing (wrongly written) libcurl applications, we leave it as-is
+ * but with this warning attached.
+ */
+#include "curl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER)
+typedef struct Curl_multi CURLM;
+#else
+typedef void CURLM;
+#endif
+
+typedef enum {
+ CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or
+ curl_multi_socket*() soon */
+ CURLM_OK,
+ CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle
*/
+ CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */
+ CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */
+ CURLM_INTERNAL_ERROR, /* this is a libcurl bug */
+ CURLM_BAD_SOCKET, /* the passed in socket argument did not match */
+ CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */
+ CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was
+ attempted to get added - again */
+ CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a
+ callback */
+ CURLM_WAKEUP_FAILURE, /* wakeup is unavailable or failed */
+ CURLM_BAD_FUNCTION_ARGUMENT, /* function called with a bad parameter */
+ CURLM_LAST
+} CURLMcode;
+
+/* just to make code nicer when using curl_multi_socket() you can now check
+ for CURLM_CALL_MULTI_SOCKET too in the same style it works for
+ curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */
+#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM
+
+/* bitmask bits for CURLMOPT_PIPELINING */
+#define CURLPIPE_NOTHING 0L
+#define CURLPIPE_HTTP1 1L
+#define CURLPIPE_MULTIPLEX 2L
+
+typedef enum {
+ CURLMSG_NONE, /* first, not used */
+ CURLMSG_DONE, /* This easy handle has completed. 'result' contains
+ the CURLcode of the transfer */
+ CURLMSG_LAST /* last, not used */
+} CURLMSG;
+
+struct CURLMsg {
+ CURLMSG msg; /* what this message means */
+ CURL *easy_handle; /* the handle it concerns */
+ union {
+ void *whatever; /* message-specific data */
+ CURLcode result; /* return code for transfer */
+ } data;
+};
+typedef struct CURLMsg CURLMsg;
+
+/* Based on poll(2) structure and values.
+ * We don't use pollfd and POLL* constants explicitly
+ * to cover platforms without poll(). */
+#define CURL_WAIT_POLLIN 0x0001
+#define CURL_WAIT_POLLPRI 0x0002
+#define CURL_WAIT_POLLOUT 0x0004
+
+struct curl_waitfd {
+ curl_socket_t fd;
+ short events;
+ short revents; /* not supported yet */
+};
+
+/*
+ * Name: curl_multi_init()
+ *
+ * Desc: inititalize multi-style curl usage
+ *
+ * Returns: a new CURLM handle to use in all 'curl_multi' functions.
+ */
+CURL_EXTERN CURLM *curl_multi_init(void);
+
+/*
+ * Name: curl_multi_add_handle()
+ *
+ * Desc: add a standard curl handle to the multi stack
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
+ CURL *curl_handle);
+
+ /*
+ * Name: curl_multi_remove_handle()
+ *
+ * Desc: removes a curl handle from the multi stack again
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
+ CURL *curl_handle);
+
+ /*
+ * Name: curl_multi_fdset()
+ *
+ * Desc: Ask curl for its fd_set sets. The app can use these to select()
or
+ * poll() on. We want curl_multi_perform() called as soon as one of
+ * them are ready.
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
+ fd_set *read_fd_set,
+ fd_set *write_fd_set,
+ fd_set *exc_fd_set,
+ int *max_fd);
+
+/*
+ * Name: curl_multi_wait()
+ *
+ * Desc: Poll on all fds within a CURLM set as well as any
+ * additional fds passed to the function.
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
+ struct curl_waitfd extra_fds[],
+ unsigned int extra_nfds,
+ int timeout_ms,
+ int *ret);
+
+/*
+ * Name: curl_multi_poll()
+ *
+ * Desc: Poll on all fds within a CURLM set as well as any
+ * additional fds passed to the function.
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
+ struct curl_waitfd extra_fds[],
+ unsigned int extra_nfds,
+ int timeout_ms,
+ int *ret);
+
+/*
+ * Name: curl_multi_wakeup()
+ *
+ * Desc: wakes up a sleeping curl_multi_poll call.
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle);
+
+ /*
+ * Name: curl_multi_perform()
+ *
+ * Desc: When the app thinks there's data available for curl it calls this
+ * function to read/write whatever there is right now. This returns
+ * as soon as the reads and writes are done. This function does not
+ * require that there actually is data available for reading or that
+ * data can be written, it can be called just in case. It returns
+ * the number of handles that still transfer data in the second
+ * argument's integer-pointer.
+ *
+ * Returns: CURLMcode type, general multi error code. *NOTE* that this only
+ * returns errors etc regarding the whole multi stack. There might
+ * still have occurred problems on individual transfers even when
+ * this returns OK.
+ */
+CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
+ int *running_handles);
+
+ /*
+ * Name: curl_multi_cleanup()
+ *
+ * Desc: Cleans up and removes a whole multi stack. It does not free or
+ * touch any individual easy handles in any way. We need to define
+ * in what state those handles will be if this function is called
+ * in the middle of a transfer.
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
+
+/*
+ * Name: curl_multi_info_read()
+ *
+ * Desc: Ask the multi handle if there's any messages/informationals from
+ * the individual transfers. Messages include informationals such as
+ * error code from the transfer or just the fact that a transfer is
+ * completed. More details on these should be written down as well.
+ *
+ * Repeated calls to this function will return a new struct each
+ * time, until a special "end of msgs" struct is returned as a signal
+ * that there is no more to get at this point.
+ *
+ * The data the returned pointer points to will not survive calling
+ * curl_multi_cleanup().
+ *
+ * The 'CURLMsg' struct is meant to be very simple and only contain
+ * very basic information. If more involved information is wanted,
+ * we will provide the particular "transfer handle" in that struct
+ * and that should/could/would be used in subsequent
+ * curl_easy_getinfo() calls (or similar). The point being that we
+ * must never expose complex structs to applications, as then we'll
+ * undoubtably get backwards compatibility problems in the future.
+ *
+ * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out
+ * of structs. It also writes the number of messages left in the
+ * queue (after this read) in the integer the second argument points
+ * to.
+ */
+CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
+ int *msgs_in_queue);
+
+/*
+ * Name: curl_multi_strerror()
+ *
+ * Desc: The curl_multi_strerror function may be used to turn a CURLMcode
+ * value into the equivalent human readable error string. This is
+ * useful for printing meaningful error messages.
+ *
+ * Returns: A pointer to a null-terminated error message.
+ */
+CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
+
+/*
+ * Name: curl_multi_socket() and
+ * curl_multi_socket_all()
+ *
+ * Desc: An alternative version of curl_multi_perform() that allows the
+ * application to pass in one of the file descriptors that have been
+ * detected to have "action" on them and let libcurl perform.
+ * See man page for details.
+ */
+#define CURL_POLL_NONE 0
+#define CURL_POLL_IN 1
+#define CURL_POLL_OUT 2
+#define CURL_POLL_INOUT 3
+#define CURL_POLL_REMOVE 4
+
+#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD
+
+#define CURL_CSELECT_IN 0x01
+#define CURL_CSELECT_OUT 0x02
+#define CURL_CSELECT_ERR 0x04
+
+typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */
+ curl_socket_t s, /* socket */
+ int what, /* see above */
+ void *userp, /* private callback
+ pointer */
+ void *socketp); /* private socket
+ pointer */
+/*
+ * Name: curl_multi_timer_callback
+ *
+ * Desc: Called by libcurl whenever the library detects a change in the
+ * maximum number of milliseconds the app is allowed to wait before
+ * curl_multi_socket() or curl_multi_perform() must be called
+ * (to allow libcurl's timed events to take place).
+ *
+ * Returns: The callback should return zero.
+ */
+typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */
+ long timeout_ms, /* see above */
+ void *userp); /* private callback
+ pointer */
+
+CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s,
+ int *running_handles);
+
+CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle,
+ curl_socket_t s,
+ int ev_bitmask,
+ int *running_handles);
+
+CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle,
+ int *running_handles);
+
+#ifndef CURL_ALLOW_OLD_MULTI_SOCKET
+/* This macro below was added in 7.16.3 to push users who recompile to use
+ the new curl_multi_socket_action() instead of the old curl_multi_socket()
+*/
+#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z)
+#endif
+
+/*
+ * Name: curl_multi_timeout()
+ *
+ * Desc: Returns the maximum number of milliseconds the app is allowed to
+ * wait before curl_multi_socket() or curl_multi_perform() must be
+ * called (to allow libcurl's timed events to take place).
+ *
+ * Returns: CURLM error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,
+ long *milliseconds);
+
+typedef enum {
+ /* This is the socket callback function pointer */
+ CURLOPT(CURLMOPT_SOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 1),
+
+ /* This is the argument passed to the socket callback */
+ CURLOPT(CURLMOPT_SOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 2),
+
+ /* set to 1 to enable pipelining for this multi handle */
+ CURLOPT(CURLMOPT_PIPELINING, CURLOPTTYPE_LONG, 3),
+
+ /* This is the timer callback function pointer */
+ CURLOPT(CURLMOPT_TIMERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 4),
+
+ /* This is the argument passed to the timer callback */
+ CURLOPT(CURLMOPT_TIMERDATA, CURLOPTTYPE_OBJECTPOINT, 5),
+
+ /* maximum number of entries in the connection cache */
+ CURLOPT(CURLMOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 6),
+
+ /* maximum number of (pipelining) connections to one host */
+ CURLOPT(CURLMOPT_MAX_HOST_CONNECTIONS, CURLOPTTYPE_LONG, 7),
+
+ /* maximum number of requests in a pipeline */
+ CURLOPT(CURLMOPT_MAX_PIPELINE_LENGTH, CURLOPTTYPE_LONG, 8),
+
+ /* a connection with a content-length longer than this
+ will not be considered for pipelining */
+ CURLOPT(CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 9),
+
+ /* a connection with a chunk length longer than this
+ will not be considered for pipelining */
+ CURLOPT(CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 10),
+
+ /* a list of site names(+port) that are blocked from pipelining */
+ CURLOPT(CURLMOPT_PIPELINING_SITE_BL, CURLOPTTYPE_OBJECTPOINT, 11),
+
+ /* a list of server types that are blocked from pipelining */
+ CURLOPT(CURLMOPT_PIPELINING_SERVER_BL, CURLOPTTYPE_OBJECTPOINT, 12),
+
+ /* maximum number of open connections in total */
+ CURLOPT(CURLMOPT_MAX_TOTAL_CONNECTIONS, CURLOPTTYPE_LONG, 13),
+
+ /* This is the server push callback function pointer */
+ CURLOPT(CURLMOPT_PUSHFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 14),
+
+ /* This is the argument passed to the server push callback */
+ CURLOPT(CURLMOPT_PUSHDATA, CURLOPTTYPE_OBJECTPOINT, 15),
+
+ /* maximum number of concurrent streams to support on a connection */
+ CURLOPT(CURLMOPT_MAX_CONCURRENT_STREAMS, CURLOPTTYPE_LONG, 16),
+
+ CURLMOPT_LASTENTRY /* the last unused */
+} CURLMoption;
+
+
+/*
+ * Name: curl_multi_setopt()
+ *
+ * Desc: Sets options for the multi handle.
+ *
+ * Returns: CURLM error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle,
+ CURLMoption option, ...);
+
+
+/*
+ * Name: curl_multi_assign()
+ *
+ * Desc: This function sets an association in the multi handle between the
+ * given socket and a private pointer of the application. This is
+ * (only) useful for curl_multi_socket uses.
+ *
+ * Returns: CURLM error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle,
+ curl_socket_t sockfd, void *sockp);
+
+
+/*
+ * Name: curl_push_callback
+ *
+ * Desc: This callback gets called when a new stream is being pushed by the
+ * server. It approves or denies the new stream. It can also decide
+ * to completely fail the connection.
+ *
+ * Returns: CURL_PUSH_OK, CURL_PUSH_DENY or CURL_PUSH_ERROROUT
+ */
+#define CURL_PUSH_OK 0
+#define CURL_PUSH_DENY 1
+#define CURL_PUSH_ERROROUT 2 /* added in 7.72.0 */
+
+struct curl_pushheaders; /* forward declaration only */
+
+CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h,
+ size_t num);
+CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h,
+ const char *name);
+
+typedef int (*curl_push_callback)(CURL *parent,
+ CURL *easy,
+ size_t num_headers,
+ struct curl_pushheaders *headers,
+ void *userp);
+
+#ifdef __cplusplus
+} /* end of extern "C" */
+#endif
+
+#endif
diff --cc include/gnurl/options.h
index 000000000,14373b551..14373b551
mode 000000,100644..100644
--- a/include/gnurl/options.h
+++ b/include/gnurl/options.h
diff --cc lib/Makefile.am
index ada137ffe,b51796f91..57d1ea4d5
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@@ -21,17 -21,18 +21,17 @@@
###########################################################################
AUTOMAKE_OPTIONS = foreign nostdinc
-CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
+ED_1 = Makefile.m32 config-win32.h config-win32ce.h
+ED_2 = config-plan9.h config-riscos.h config-mac.h curl_config.h.in
+ED_3 = makefile.dj config-dos.h libgnurl.plist libcurl.rc config-amigaos.h
+ED_4 = makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h
- ED_5 = config-os400.h setup-os400.h config-symbian.h Makefile.Watcom
++ED_5 = config-os400.h setup-os400.h
+ED_6 = config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST)
+ED_7 = firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl
setup-win32.h
-EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h \
- config-plan9.h config-riscos.h config-mac.h curl_config.h.in \
- makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
- makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h \
- config-os400.h setup-os400.h \
- config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST) \
- firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl \
- setup-win32.h
+EXTRA_DIST = $(ED_1) $(ED_2) $(ED_3) $(ED_4) $(ED_5) $(ED_6) $(ED_7)
-lib_LTLIBRARIES = libcurl.la
+lib_LTLIBRARIES = libgnurl.la
if BUILD_UNITTESTS
noinst_LTLIBRARIES = libcurlu.la
diff --cc lib/altsvc.c
index b1c5db833,4ab77fdfc..d0aa00b80
--- a/lib/altsvc.c
+++ b/lib/altsvc.c
@@@ -25,8 -25,8 +25,8 @@@
*/
#include "curl_setup.h"
- #if !defined(CURL_DISABLE_HTTP) && defined(USE_ALTSVC)
+ #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_ALTSVC)
-#include <curl/curl.h>
+#include <gnurl/curl.h>
#include "urldata.h"
#include "altsvc.h"
#include "curl_get_line.h"
diff --cc lib/altsvc.h
index cdf137aff,2ab89e705..bf368c9fa
--- a/lib/altsvc.h
+++ b/lib/altsvc.h
@@@ -23,8 -23,8 +23,8 @@@
***************************************************************************/
#include "curl_setup.h"
- #if !defined(CURL_DISABLE_HTTP) && defined(USE_ALTSVC)
+ #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_ALTSVC)
-#include <curl/curl.h>
+#include <gnurl/curl.h>
#include "llist.h"
enum alpnid {
diff --cc lib/libgnurl.plist
index 33c2fdefa,000000000..ae24a69ff
mode 100644,000000..100644
--- a/lib/libgnurl.plist
+++ b/lib/libgnurl.plist
@@@ -1,35 -1,0 +1,35 @@@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM
"file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+
+ <key>CFBundleExecutable</key>
+ <string>gnurl</string>
+
+ <key>CFBundleIdentifier</key>
- <string>se.haxx.curl.libcurl</string>
++ <string>se.curl.libcurl</string>
+
+ <key>CFBundleVersion</key>
+ <string>7.12.3</string>
+
+ <key>CFBundleName</key>
+ <string>libgnurl</string>
+
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+
+ <key>CFBundleSignature</key>
+ <string>????</string>
+
+ <key>CFBundleShortVersionString</key>
+ <string>libcurl 7.12.3</string>
+
+ <key>CFBundleGetInfoString</key>
+ <string>libgnurl.plist 7.12.3</string>
+</dict>
+</plist>
diff --cc lib/mqtt.c
index 0baffe2a7,e324ec3dd..dfcb04c88
--- a/lib/mqtt.c
+++ b/lib/mqtt.c
@@@ -23,10 -23,10 +23,10 @@@
#include "curl_setup.h"
- #ifdef CURL_ENABLE_MQTT
+ #ifndef CURL_DISABLE_MQTT
#include "urldata.h"
-#include <curl/curl.h>
+#include <gnurl/curl.h>
#include "transfer.h"
#include "sendf.h"
#include "progress.h"
diff --cc lib/sendf.c
index 8ac46db0c,04cc725f5..aefbe7bfe
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@@ -28,9 -28,11 +28,11 @@@
#ifdef HAVE_LINUX_TCP_H
#include <linux/tcp.h>
+ #elif defined(HAVE_NETINET_TCP_H)
+ #include <netinet/tcp.h>
#endif
-#include <curl/curl.h>
+#include <gnurl/curl.h>
#include "urldata.h"
#include "sendf.h"
diff --cc lib/urldata.h
index 5bfa412a2,4679c9d46..1be7ddc39
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@@ -207,12 -205,8 +205,9 @@@ struct ssl_backend_data
/* struct for data related to each SSL connection */
struct ssl_connect_data {
- /* Use ssl encrypted communications TRUE/FALSE, not necessarily using it atm
- but at least asked to or meaning to use it. See 'state' for the exact
- current state of the connection. */
ssl_connection_state state;
ssl_connect_state connecting_state;
+
#if defined(USE_SSL)
struct ssl_backend_data *backend;
#endif
diff --cc libgnurl.pc.in
index c41c73026,000000000..b7ce570db
mode 100644,000000..100644
--- a/libgnurl.pc.in
+++ b/libgnurl.pc.in
@@@ -1,39 -1,0 +1,39 @@@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# This should most probably benefit from getting a "Requires:" field added
+# dynamically by configure.
+#
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+supported_protocols="@SUPPORT_PROTOCOLS@"
+supported_features="@SUPPORT_FEATURES@"
+
+Name: libgnurl
- URL: https://gnunet.org/gnurl/
++URL: https://gnunet.org/en/gnurl.html
+Description: Library to transfer files with http or https
+Version: @CURLVERSION@
+Libs: -L${libdir} -lgnurl @LIBCURL_NO_SHARED@
+Libs.private: @LIBCURL_LIBS@
+Cflags: -I${includedir} @CPPFLAG_CURL_STATICLIB@
diff --cc src/CMakeLists.txt
index 2f4f2c5b1,0982cfe6e..d2faa8fe1
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@@ -78,20 -78,26 +78,26 @@@ if(CURL_HAS_LTO
INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE)
endif()
+ if(ENABLE_UNICODE AND MINGW)
+ target_link_libraries(${EXE_NAME} -municode)
+ # GCC doesn't know about wmain
+ set_source_files_properties(tool_main.c PROPERTIES COMPILE_FLAGS
"-Wno-missing-prototypes -Wno-missing-declarations")
+ endif()
+
-source_group("curlX source files" FILES ${CURLX_CFILES})
-source_group("curl source files" FILES ${CURL_CFILES})
-source_group("curl header files" FILES ${CURL_HFILES})
+source_group("curlX source files" FILES ${GNURLX_CFILES})
+source_group("curl source files" FILES ${GNURL_CFILES})
+source_group("curl header files" FILES ${GNURL_HFILES})
include_directories(
- ${CURL_SOURCE_DIR}/lib # To be able to reach "curl_setup_once.h"
- ${CURL_BINARY_DIR}/lib # To be able to reach "curl_config.h"
- ${CURL_BINARY_DIR}/include # To be able to reach "curl/curl.h"
+ ${GNURL_SOURCE_DIR}/lib # To be able to reach "curl_setup_once.h"
+ ${GNURL_BINARY_DIR}/lib # To be able to reach "curl_config.h"
+ ${GNURL_BINARY_DIR}/include # To be able to reach "gnurl/curl.h"
# This is needed as tool_hugehelp.c is generated in the binary dir
- ${CURL_SOURCE_DIR}/src # To be able to reach "tool_hugehelp.h"
+ ${GNURL_SOURCE_DIR}/src # To be able to reach "tool_hugehelp.h"
)
-#Build curl executable
-target_link_libraries(${EXE_NAME} libcurl ${CURL_LIBS})
+#Build gnurl executable
+target_link_libraries(${EXE_NAME} libgnurl ${GNURL_LIBS})
################################################################################
diff --cc src/Makefile.am
index 0623ba116,dff248fe3..cfe21f6e4
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@@ -84,24 -84,13 +84,24 @@@ CLEANFILES = tool_hugehelp.
# embedded text.
NROFF=env LC_ALL=C @NROFF@ @MANOPT@ # figured out by the configure script
-EXTRA_DIST = mkhelp.pl makefile.dj \
+EXTRA_DIST = mkhelp.pl.in makefile.dj \
Makefile.m32 macos/curl.mcp.xml.sit.hqx macos/MACINSTALL.TXT \
macos/src/curl_GUSIConfig.cpp macos/src/macos_main.cpp makefile.amiga \
- curl.rc Makefile.netware Makefile.inc Makefile.Watcom
+ curl.rc Makefile.netware Makefile.inc CMakeLists.txt
+do_subst_perl = $(AWK) -v perl=$(PERL) '{gsub("AWKPERL",perl,$$0); print $$0}'
+
+SUFFIXES = .pl.in .pl
+
+mkhelp.pl: mkhelp.pl.in Makefile
+ $(do_subst_perl) < $(srcdir)/mkhelp.pl.in > mkhelp.pl
+ @chmod +x mkhelp.pl
+
+noinst_SCRIPTS = mkhelp.pl
+CLEANFILES += mkhelp.pl
+
# Use absolute directory to disable VPATH
-MANPAGE=$(abs_top_builddir)/docs/curl.1
+MANPAGE=$(abs_top_builddir)/docs/gnurl.1
MKHELP=$(top_srcdir)/src/mkhelp.pl
HUGE=tool_hugehelp.c
diff --cc src/Makefile.inc
index b5a3fb2e3,329afacfa..f21be0d30
--- a/src/Makefile.inc
+++ b/src/Makefile.inc
@@@ -36,18 -36,20 +36,20 @@@ GNURLX_CFILES =
../lib/warnless.c \
../lib/curl_ctype.c \
../lib/curl_multibyte.c \
- ../lib/version_win32.c
+ ../lib/version_win32.c \
+ ../lib/dynbuf.c
-CURLX_HFILES = \
+GNURLX_HFILES = \
../lib/curl_setup.h \
../lib/strtoofft.h \
../lib/nonblock.h \
../lib/warnless.h \
../lib/curl_ctype.h \
../lib/curl_multibyte.h \
- ../lib/version_win32.h
+ ../lib/version_win32.h \
+ ../lib/dynbuf.h
-CURL_CFILES = \
+GNURL_CFILES = \
slist_wc.c \
tool_binmode.c \
tool_bname.c \
diff --cc src/Makefile.m32
index f5864ebe3,03c2b676c..f32bf9ef4
--- a/src/Makefile.m32
+++ b/src/Makefile.m32
@@@ -231,13 -248,17 +248,17 @@@ ifdef SS
CFLAGS += -DCURL_WITH_MULTI_SSL
endif
endif
+ ifdef UNICODE
+ CFLAGS += -DUNICODE -D_UNICODE
+ LDFLAGS += -municode
+ endif
ifdef DYN
- curl_DEPENDENCIES = $(PROOT)/lib/libcurldll.a $(PROOT)/lib/libcurl.dll
- curl_LDADD = -L$(PROOT)/lib -lcurldll
+ curl_DEPENDENCIES = $(PROOT)/lib/libgnurldll.a $(PROOT)/lib/libgnurl.dll
+ curl_LDADD = -L$(PROOT)/lib -lgnurldll
else
- curl_DEPENDENCIES = $(PROOT)/lib/libcurl.a
- curl_LDADD = -L$(PROOT)/lib -lcurl
+ curl_DEPENDENCIES = $(PROOT)/lib/libgnurl.a
+ curl_LDADD = -L$(PROOT)/lib -lgnurl
CFLAGS += -DCURL_STATICLIB
LDFLAGS += -static
endif
diff --cc src/mkhelp.pl.in
index 5422ee165,000000000..21be40f5b
mode 100755,000000..100755
--- a/src/mkhelp.pl.in
+++ b/src/mkhelp.pl.in
@@@ -1,235 -1,0 +1,235 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
- # Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# Yeah, I know, probably 1000 other persons already wrote a script like
+# this, but I'll tell ya:
+
+# THEY DON'T FIT ME :-)
+
+# Get readme file as parameter:
+
+if($ARGV[0] eq "-c") {
+ $c=1;
+ shift @ARGV;
+}
+
+push @out, " _ _ ____ _\n";
+push @out, " Project ___| | | | _ \\| |\n";
+push @out, " / __| | | | |_) | |\n";
+push @out, " | (__| |_| | _ <| |___\n";
+push @out, " \\___|\\___/|_| \\_\\_____|\n";
+
+my $olen=0;
+while (<STDIN>) {
+ my $line = $_;
+
+ # this should be removed:
+ $line =~ s/(.|_)//g;
+
+ # remove trailing CR from line. msysgit checks out files as line+CRLF
+ $line =~ s/\r$//;
+
+ if($line =~ /^([ \t]*\n|curl)/i) {
+ # cut off headers and empty lines
+ $wline++; # count number of cut off lines
+ next;
+ }
+
+ my $text = $line;
+ $text =~ s/^\s+//g; # cut off preceding...
+ $text =~ s/\s+$//g; # and trailing whitespaces
+
+ $tlen = length($text);
+
+ if($wline && ($olen == $tlen)) {
+ # if the previous line with contents was exactly as long as
+ # this line, then we ignore the newlines!
+
+ # We do this magic because a header may abort a paragraph at
+ # any line, but we don't want that to be noticed in the output
+ # here
+ $wline=0;
+ }
+ $olen = $tlen;
+
+ if($wline) {
+ # we only make one empty line max
+ $wline = 0;
+ push @out, "\n";
+ }
+ push @out, $line;
+}
+push @out, "\n"; # just an extra newline
+
+print <<HEAD
+/*
+ * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
+ */
+#ifdef USE_MANUAL
+#include "tool_hugehelp.h"
+HEAD
+ ;
+if($c) {
+ # If compression requested, check that the Gzip module is available
+ # or else disable compression
+ $c = eval
+ {
+ require IO::Compress::Gzip;
+ IO::Compress::Gzip->import();
+ 1;
+ };
+ print STDERR "Warning: compression requested but Gzip is not available\n"
if (!$c)
+}
+
+if($c)
+{
+ my $content = join("", @out);
+ my $gzippedContent;
+ IO::Compress::Gzip::gzip(
+ \$content, \$gzippedContent, Level => 9, TextFlag => 1, Time=>0) or
die "gzip failed:";
+ $gzip = length($content);
+ $gzipped = length($gzippedContent);
+
+ print <<HEAD
+#include <zlib.h>
+#include "memdebug.h" /* keep this as LAST include */
+static const unsigned char hugehelpgz[] = {
+ /* This mumbo-jumbo is the huge help text compressed with gzip.
+ Thanks to this operation, the size of this data shrank from $gzip
+ to $gzipped bytes. You can disable the use of compressed help
+ texts by NOT passing -c to the mkhelp.pl tool. */
+HEAD
+;
+
+ my $c=0;
+ print " ";
+ for(split(//, $gzippedContent)) {
+ my $num=ord($_);
+ printf(" 0x%02x,", 0+$num);
+ if(!(++$c % 12)) {
+ print "\n ";
+ }
+ }
+ print "\n};\n";
+
+ print <<EOF
+#define BUF_SIZE 0x10000
+static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int
size)
+{
+ (void) opaque;
+ /* not a typo, keep it calloc() */
+ return (voidpf) calloc(items, size);
+}
+static void zfree_func(voidpf opaque, voidpf ptr)
+{
+ (void) opaque;
+ free(ptr);
+}
+/* Decompress and send to stdout a gzip-compressed buffer */
+void hugehelp(void)
+{
+ unsigned char* buf;
+ int status,headerlen;
+ z_stream z;
+
+ /* Make sure no gzip options are set */
+ if (hugehelpgz[3] & 0xfe)
+ return;
+
+ headerlen = 10;
+ memset(&z, 0, sizeof(z_stream));
+ z.zalloc = (alloc_func)zalloc_func;
+ z.zfree = (free_func)zfree_func;
+ z.avail_in = (unsigned int)(sizeof(hugehelpgz) - headerlen);
+ z.next_in = (unsigned char *)hugehelpgz + headerlen;
+
+ if (inflateInit2(&z, -MAX_WBITS) != Z_OK)
+ return;
+
+ buf = malloc(BUF_SIZE);
+ if (buf) {
+ while(1) {
+ z.avail_out = BUF_SIZE;
+ z.next_out = buf;
+ status = inflate(&z, Z_SYNC_FLUSH);
+ if (status == Z_OK || status == Z_STREAM_END) {
+ fwrite(buf, BUF_SIZE - z.avail_out, 1, stdout);
+ if (status == Z_STREAM_END)
+ break;
+ }
+ else
+ break; /* Error */
+ }
+ free(buf);
+ }
+ inflateEnd(&z);
+}
+EOF
+ ;
+foot();
+exit;
+}
+else {
+ print <<HEAD
+void hugehelp(void)
+{
+ fputs(
+HEAD
+ ;
+}
+
+$outsize=0;
+for(@out) {
+ chop;
+
+ $new = $_;
+
+ $outsize += length($new)+1; # one for the newline
+
+ $new =~ s/\\/\\\\/g;
+ $new =~ s/\"/\\\"/g;
+
+ # gcc 2.96 claims ISO C89 only is required to support 509 letter strings
+ if($outsize > 500) {
+ # terminate and make another fputs() call here
+ print ", stdout);\n fputs(\n";
+ $outsize=length($new)+1;
+ }
+ printf("\"%s\\n\"\n", $new);
+
+}
+
+print ", stdout) ;\n}\n";
+
+foot();
+
+sub foot {
+ print <<FOOT
+#else /* !USE_MANUAL */
+/* built-in manual is disabled, blank function */
+#include "tool_hugehelp.h"
+void hugehelp(void) {}
+#endif /* USE_MANUAL */
+FOOT
+ ;
+}
diff --cc src/tool_easysrc.c
index e8f514fc3,246d81469..86c113b34
--- a/src/tool_easysrc.c
+++ b/src/tool_easysrc.c
@@@ -48,9 -48,9 +48,9 @@@ int easysrc_slist_count = 0
static const char *const srchead[]={
"/********* Sample code generated by the curl command line tool **********",
" * All curl_easy_setopt() options are documented at:",
- " * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html",
+ " * https://curl.se/libcurl/c/curl_easy_setopt.html",
"
************************************************************************/",
- "#include <curl/curl.h>",
+ "#include <gnurl/curl.h>",
"",
"int main(int argc, char *argv[])",
"{",
diff --cc src/tool_homedir.c
index 54c92ba6e,632bdcc4f..c232be2b3
--- a/src/tool_homedir.c
+++ b/src/tool_homedir.c
@@@ -25,7 -26,14 +26,14 @@@
# include <pwd.h>
#endif
+ #ifdef HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+ #endif
+ #ifdef HAVE_FCNTL_H
+ #include <fcntl.h>
+ #endif
+
-#include <curl/mprintf.h>
+#include <gnurl/mprintf.h>
#include "tool_homedir.h"
diff --cc src/tool_operate.c
index 97508e874,90522e1e9..90d33e5c3
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@@ -2524,12 -2560,10 +2560,12 @@@ CURLcode operate(struct GlobalConfig *g
/* Check if we were asked for the help */
if(res == PARAM_HELP_REQUESTED)
- tool_help();
+ tool_help(global->help_category);
/* Check if we were asked for the manual */
+ /*
else if(res == PARAM_MANUAL_REQUESTED)
hugehelp();
+ */
/* Check if we were asked for the version information */
else if(res == PARAM_VERSION_INFO_REQUESTED)
tool_version_info();
diff --cc tests/Makefile.am
index 1c46c3982,8f47bb017..8ca223763
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@@ -20,22 -20,19 +20,21 @@@
#
###########################################################################
-HTMLPAGES = testcurl.html runtests.html
-PDFPAGES = testcurl.pdf runtests.pdf
MANDISTPAGES = runtests.1.dist testcurl.1.dist
-EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl
\
- getpart.pm FILEFORMAT.md README.md stunnel.pem memanalyze.pl testcurl.pl
\
- valgrind.pm ftp.pm sshserver.pl sshhelp.pm pathhelp.pm testcurl.1 runtests.1
\
- serverhelp.pm tftpserver.pl rtspserver.pl directories.pm symbol-scan.pl
\
- CMakeLists.txt mem-include-scan.pl valgrind.supp extern-scan.pl
\
- manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py
\
- negtelnetserver.py smbserver.py util.py
\
- disable-scan.pl manpage-syntax.pl error-codes.pl badsymbols.pl
\
- azure.pm appveyor.pm version-scan.pl options-scan.pl
+ED_1 = ftpserver.pl.in httpserver.pl.in secureserver.pl.in runtests.pl.in
- ED_2 = getpart.pm FILEFORMAT.md README stunnel.pem memanalyze.pl.in
testcurl.pl.in
++ED_2 = getpart.pm FILEFORMAT.md README.md stunnel.pem memanalyze.pl.in
testcurl.pl.in
+ED_3 = valgrind.pm ftp.pm sshserver.pl.in sshhelp.pm pathhelp.pm testcurl.1
runtests.1
+ED_4 = serverhelp.pm tftpserver.pl.in rtspserver.pl.in directories.pm
symbol-scan.pl.in
+ED_5 = CMakeLists.txt mem-include-scan.pl.in valgrind.supp extern-scan.pl.in
+ED_6 = manpage-scan.pl.in nroff-scan.pl.in http2-server.pl.in dictserver.py.in
- ED_7 = negtelnetserver.py.in smbserver.py.in curl_test_data.py.in
- ED_8 = objnames-test08.sh objnames-test10.sh objnames.inc
- ED_9 = disable-scan.pl.in error-codes.pl.in badsymbols.pl.in
- ED_10 = azure.pm appveyor.pm version-scan.pl.in options-scan.pl
++ED_7 = negtelnetserver.py.in smbserver.py.in util.py.in
++ED_8 = disable-scan.pl.in error-codes.pl.in badsymbols.pl.in
++ED_9 = azure.pm appveyor.pm version-scan.pl.in options-scan.pl
+
- EXTRA_DIST = $(ED_1) $(ED_2) $(ED_3) $(ED_4) $(ED_5) $(ED_6) $(ED_7) $(ED_8)
$(ED_9) $(ED_10)
++EXTRA_DIST = $(ED_1) $(ED_2) $(ED_3) $(ED_4) $(ED_5) $(ED_6) $(ED_7) $(ED_8)
$(ED_9)
+
- check_SCRIPTS = smbserver.py curl_test_data.py negtelnetserver.py
dictserver.py
++check_SCRIPTS = smbserver.py util.py negtelnetserver.py dictserver.py
DISTCLEANFILES = configurehelp.pm
@@@ -57,78 -54,7 +56,78 @@@ PERLFLAGS = -I$(srcdir
CLEANFILES = .http.pid .https.pid .ftp.pid .ftps.pid $(MANDISTPAGES)
-MAN2HTML= roffit $< >$@
+do_subst = $(AWK) -v python=$(PYTHON) '{gsub("AWKPYTHON",python,$$0); print
$$0}'
+do_subst_perl = $(AWK) -v perl=$(PERL) '{gsub("AWKPERL",perl,$$0); print $$0}'
+
+SUFFIXES = .py.in .py .pl.in .pl
+
+.pl.in.pl:
+ $(do_subst_perl) < $< > $@
+ @chmod +x $@
+
+noinst_SCRIPTS = convsrctest.pl \
+ disable-scan.pl \
+ error-codes.pl \
+ extern-scan.pl \
+ ftpserver.pl \
+ http2-server.pl \
+ httpserver.pl \
+ keywords.pl \
+ manpage-scan.pl \
+ mem-include-scan.pl \
+ memanalyze.pl \
+ nroff-scan.pl \
+ rtspserver.pl \
+ runtests.pl \
+ secureserver.pl \
+ sshserver.pl \
+ symbol-scan.pl \
+ testcurl.pl \
+ tftpserver.pl \
+ badsymbols.pl \
+ version-scan.pl
+
+CLEANFILES += convsrctest.pl \
+ disable-scan.pl \
+ error-codes.pl \
+ extern-scan.pl \
+ ftpserver.pl \
+ http2-server.pl \
+ httpserver.pl \
+ keywords.pl \
+ manpage-scan.pl \
+ mem-include-scan.pl \
+ memanalyze.pl \
+ nroff-scan.pl \
+ rtspserver.pl \
+ runtests.pl \
+ secureserver.pl \
+ sshserver.pl \
+ symbol-scan.pl \
+ testcurl.pl \
+ tftpserver.pl \
+ badsymbols.pl \
+ version-scan.pl
+
+.py.in.py:
+ $(do_subst) < $< > $@
+ @chmod +x $@
+
+smbserver.py: smbserver.py.in Makefile
+ $(do_subst) < $(srcdir)/smbserver.py.in > smbserver.py
+ @chmod +x smbserver.py
+
- curl_test_data.py: curl_test_data.py.in Makefile
- $(do_subst) < $(srcdir)/curl_test_data.py.in > curl_test_data.py
- @chmod +x curl_test_data.py
++util.py: util.py.in Makefile
++ $(do_subst) < $(srcdir)/util.py.in > util.py
++ @chmod +x util.py
+
+negtelnetserver.py: negtelnetserver.py.in Makefile
+ $(do_subst) < $(srcdir)/negtelnetserver.py.in > negtelnetserver.py
+ @chmod +x negtelnetserver.py
+
+dictserver.py: dictserver.py.in Makefile
+ $(do_subst) < $(srcdir)/dictserver.py.in > dictserver.py
+ @chmod +x dictserver.py
curl:
@cd $(top_builddir) && $(MAKE)
diff --cc tests/badsymbols.pl.in
index 1ecc4f669,000000000..b8077529f
mode 100755,000000..100755
--- a/tests/badsymbols.pl.in
+++ b/tests/badsymbols.pl.in
@@@ -1,132 -1,0 +1,132 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010-2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# This script grew out of help from Przemyslaw Iskra and Balint Szilakszi
+# a late evening in the #curl IRC channel on freenode.
+#
+
+use strict;
+use warnings;
+use vars qw($Cpreprocessor);
+
+#
+# configurehelp perl module is generated by configure script
+#
+my $rc = eval {
+ require configurehelp;
+ configurehelp->import(qw(
+ $Cpreprocessor
+ ));
+ 1;
+};
+# Set default values if configure has not generated a configurehelp.pm file.
+# This is the case with cmake.
+if (!$rc) {
+ $Cpreprocessor = 'cpp';
+}
+
+# we may get the dir root pointed out
+my $root=$ARGV[0] || ".";
+
+# need an include directory when building out-of-tree
+my $i = ($ARGV[1]) ? "-I$ARGV[1] " : '';
+
+my $incdir = "$root/include/gnurl";
+
+my $verbose=0;
+my $summary=0;
+my $misses=0;
+
+my @syms;
+my %doc;
+my %rem;
+
+sub scanenums {
+ my ($file)=@_;
+ my $skipit = 0;
+
+ open H_IN, "-|", "$Cpreprocessor $i$file" || die "Cannot preprocess
$file";
+ while ( <H_IN> ) {
+ if( /^#(line|) (\d+) \"(.*)\"/) {
+ # if the included file isn't in our incdir, then we skip this
section
+ # until next #line
+ #
+ if($3 !~ /^$incdir/) {
+ $skipit = 1;
+ next;
+ }
+ # parse this!
+ $skipit = 0;
+ next;
+ }
+ if($skipit) {
+ next;
+ }
+ if ( /enum\s+(\S+\s+)?{/ .. /}/ ) {
+ s/^\s+//;
+ chomp;
+ s/[,\s].*//;
+ if(($_ !~ /\}(;|)/) &&
+ ($_ ne "typedef") &&
+ ($_ ne "enum") &&
+ ($_ !~ /^[ \t]*$/)) {
+ push @syms, $_;
+ }
+ }
+ }
+ close H_IN || die "Error preprocessing $file";
+}
+
+sub scanheader {
+ my ($f)=@_;
+ scanenums($f);
+ open H, "<$f";
+ while(<H>) {
+ if (/^#define +([^ \n]*)/) {
+ push @syms, $1;
+ }
+ }
+ close H;
+}
+
+
+opendir(my $dh, $incdir) || die "Can't opendir: $!";
+my @hfiles = grep { /\.h$/ } readdir($dh);
+closedir $dh;
+
+for(@hfiles) {
+ scanheader("$incdir/$_");
+}
+
+my $errors = 0;
+for my $s (@syms) {
+ if($s !~ /^(lib|)curl/i) {
+ print "Bad symbols in public header files:\n" if(!$errors);
+ $errors++;
+ print " $s\n";
+ }
+}
+if($errors) {
+ exit 1;
+}
+printf "%d fine symbols found\n", scalar(@syms);
diff --cc tests/convsrctest.pl.in
index 4061ff3e2,000000000..0fca802ba
mode 100755,000000..100755
--- a/tests/convsrctest.pl.in
+++ b/tests/convsrctest.pl.in
@@@ -1,255 -1,0 +1,255 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+#=======================================================================
+# Read a test definition which exercises curl's --libcurl option.
+# Generate either compilable source code for a new test tool,
+# or a new test definition which runs the tool and expects the
+# same output.
+# This should verify that the --libcurl code really does perform
+# the same actions as the original curl invocation.
+#-----------------------------------------------------------------------
+# The output of curl's --libcurl option differs in several ways from
+# the code needed to integrate with the test tool environment:
+# - #include "test.h"
+# - no call of curl_global_init & curl_global_cleanup
+# - main() function vs. test() function
+# - no checking of curl_easy_setopt calls vs. test_setopt wrapper
+# - handling of stdout
+# - variable names ret & hnd vs. res & curl
+# - URL as literal string vs. passed as argument
+#=======================================================================
+use strict;
+require "getpart.pm";
+
+# Boilerplate code for test tool
+my $head =
+'#include "test.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+ CURLcode res;
+ CURL *curl;
+';
+# Other declarations from --libcurl come here
+# e.g. curl_slist
+my $init =
+'
+ if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ if ((curl = curl_easy_init()) == NULL) {
+ fprintf(stderr, "curl_easy_init() failed\n");
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+';
+# Option setting, perform and cleanup come here
+my $exit =
+' curl_global_cleanup();
+
+ return (int)res;
+}
+';
+
+my $myname = leaf($0);
+sub usage {die "Usage: $myname -c|-test=num testfile\n";}
+
+sub main {
+ @ARGV == 2
+ or usage;
+ my($opt,$testfile) = @ARGV;
+
+ if(loadtest($testfile)) {
+ die "$myname: $testfile doesn't look like a test case\n";
+ }
+
+ my $comment = sprintf("DO NOT EDIT - generated from %s by %s",
+ leaf($testfile), $myname);
+ if($opt eq '-c') {
+ generate_c($comment);
+ }
+ elsif(my($num) = $opt =~ /^-test=(\d+)$/) {
+ generate_test($comment, $num);
+ }
+ else {
+ usage;
+ }
+}
+
+sub generate_c {
+ my($comment) = @_;
+ # Fetch the generated code, which is the output file checked by
+ # the old test.
+ my @libcurl = getpart("verify", "file")
+ or die "$myname: no <verify><file> section found\n";
+
+ # Mangle the code into a suitable form for a test tool.
+ # We want to extract the important parts (declarations,
+ # URL, setopt calls, cleanup code) from the --libcurl
+ # boilerplate and insert them into a new boilerplate.
+ my(@decl,@code);
+ # First URL passed in as argument, others as global
+ my @urlvars = ('URL', 'libtest_arg2', 'libtest_arg3');
+ my($seen_main,$seen_setopt,$seen_return);
+ foreach (@libcurl) {
+ # Check state changes first (even though it
+ # duplicates some matches) so that the other tests
+ # are in a logical order).
+ if(/^int main/) {
+ $seen_main = 1;
+ }
+ if($seen_main and /curl_easy_setopt/) {
+ # Don't match 'curl_easy_setopt' in comment!
+ $seen_setopt = 1;
+ }
+ if(/^\s*return/) {
+ $seen_return = 1;
+ }
+
+ # Now filter the code according to purpose
+ if(! $seen_main) {
+ next;
+ }
+ elsif(! $seen_setopt) {
+ if(/^\s*(int main|\{|CURLcode |CURL |hnd = curl_easy_init)/) {
+ # Initialisations handled by boilerplate
+ next;
+ }
+ else {
+ push @decl, $_;
+ }
+ }
+ elsif(! $seen_return) {
+ if(/CURLOPT_URL/) {
+ # URL is passed in as argument or by global
+ my $var = shift @urlvars;
+ s/\"[^\"]*\"/$var/;
+ }
+ s/\bhnd\b/curl/;
+ # Convert to macro wrapper
+ s/curl_easy_setopt/test_setopt/;
+ if(/curl_easy_perform/) {
+ s/\bret\b/res/;
+ push @code, $_;
+ push @code, "test_cleanup:\n";
+ }
+ else {
+ push @code, $_;
+ }
+ }
+ }
+
+ print ("/* $comment */\n",
+ $head,
+ @decl,
+ $init,
+ @code,
+ $exit);
+}
+
+# Read the original test data file and transform it
+# - add a "DO NOT EDIT comment"
+# - replace CURLOPT_URL string with URL variable
+# - remove <verify><file> section (was the --libcurl output)
+# - insert a <client><tool> section with our new C program name
+# - replace <client><command> section with the URL
+sub generate_test {
+ my($comment,$newnumber) = @_;
+ my @libcurl = getpart("verify", "file")
+ or die "$myname: no <verify><file> section found\n";
+ # Scan the --libcurl code to find the URL used.
+ my $url;
+ foreach (@libcurl) {
+ if(my($u) = /CURLOPT_URL, \"([^\"]*)\"/) {
+ $url = $u;
+ }
+ }
+ die "$myname: CURLOPT_URL not found\n"
+ unless defined $url;
+
+ # Traverse the pseudo-XML transforming as required
+ my @new;
+ my(@path,$path,$skip);
+ foreach (getall()) {
+ if(my($end) = /\s*<(\/?)testcase>/) {
+ push @new, $_;
+ push @new, "# $comment\n"
+ unless $end;
+ }
+ elsif(my($tag) = /^\s*<(\w+)/) {
+ push @path, $tag;
+ $path = join '/', @path;
+ if($path eq 'verify/file') {
+ $skip = 1;
+ }
+ push @new, $_
+ unless $skip;
+ if($path eq 'client') {
+ push @new, ("<tool>\n",
+ "lib$newnumber\n",
+ "</tool>\n");
+ }
+ elsif($path eq 'client/command') {
+ push @new, sh_quote($url)."\n";
+ }
+ }
+ elsif(my($etag) = /^\s*<\/(\w+)/) {
+ my $tag = pop @path;
+ die "$myname: mismatched </$etag>\n"
+ unless $tag eq $etag;
+ push @new, $_
+ unless $skip;
+ $skip --
+ if $path eq 'verify/file';
+ $path = join '/', @path;
+ }
+ else {
+ if($path eq 'client/command') {
+ # Replaced above
+ }
+ else {
+ push @new, $_
+ unless $skip;
+ }
+ }
+ }
+ print @new;
+}
+
+sub leaf {
+ # Works for POSIX filenames
+ (my $path = shift) =~ s!.*/!!;
+ return $path;
+}
+
+sub sh_quote {
+ my $word = shift;
+ $word =~ s/[\$\"\'\\]/\\$&/g;
+ return '"' . $word . '"';
+}
+
+main;
diff --cc tests/data/DISABLED
index eb4407a6b,1806a5dbe..0d08d33af
--- a/tests/data/DISABLED
+++ b/tests/data/DISABLED
@@@ -10,30 -23,3 +23,13 @@@
# test 1801 causes problems on Mac OS X and github
# https://github.com/curl/curl/issues/380
1801
- # test 1510 causes problems on the CI on github
- # example: https://travis-ci.org/curl/curl/builds/81633600
- 1510
- # Pipelining test that is causing false positives a little too often
- 1903
- # fnmatch differences are just too common to make testing them sensible
- 1307
- # Pipelining is deprecated
- 530
- 584
- 1900
- 1901
- 1902
- 2033
+# Unused in gnurl
+1173
+# Skip in gnurl until we fix the manpages->mdocml
+1177
+# FIXME: fails randomly
+1056
+1448
+# Uses SRP to "a server not supporting it" but modern stunnel versions
+# will silently accept it and remain happy
+323
diff --cc tests/data/test1400
index 9f6bd47a2,b7060eca5..5a910d19b
--- a/tests/data/test1400
+++ b/tests/data/test1400
@@@ -61,9 -58,9 +58,9 @@@ $_ = '' if /CURLOPT_INTERLEAVEDATA
<file name="log/test1400.c" mode="text">
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
- * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
+ * https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
-#include <curl/curl.h>
+#include <gnurl/curl.h>
int main(int argc, char *argv[])
{
diff --cc tests/data/test1401
index c414c4751,a2629683a..ad3f0c8d0
--- a/tests/data/test1401
+++ b/tests/data/test1401
@@@ -66,9 -63,9 +63,9 @@@ $_ = '' if /CURLOPT_INTERLEAVEDATA
<file name="log/test1401.c" mode="text">
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
- * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
+ * https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
-#include <curl/curl.h>
+#include <gnurl/curl.h>
int main(int argc, char *argv[])
{
diff --cc tests/data/test1402
index 56861a4ba,1bd55cb4e..40ac50af8
--- a/tests/data/test1402
+++ b/tests/data/test1402
@@@ -64,9 -61,9 +61,9 @@@ $_ = '' if /CURLOPT_INTERLEAVEDATA
<file name="log/test1402.c" mode="text">
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
- * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
+ * https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
-#include <curl/curl.h>
+#include <gnurl/curl.h>
int main(int argc, char *argv[])
{
diff --cc tests/data/test1403
index 4237c07c8,a7c9fcca3..c77f37fbf
--- a/tests/data/test1403
+++ b/tests/data/test1403
@@@ -61,9 -58,9 +58,9 @@@ $_ = '' if /CURLOPT_INTERLEAVEDATA
<file name="log/test1403.c" mode="text">
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
- * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
+ * https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
-#include <curl/curl.h>
+#include <gnurl/curl.h>
int main(int argc, char *argv[])
{
diff --cc tests/data/test1404
index 35e1ee91b,1d8e8cf77..93ab07cac
--- a/tests/data/test1404
+++ b/tests/data/test1404
@@@ -101,9 -101,9 +101,9 @@@ $_ = '' if /\/\* "value" \*\/
<file name="log/test1404.c" mode="text">
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
- * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
+ * https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
-#include <curl/curl.h>
+#include <gnurl/curl.h>
int main(int argc, char *argv[])
{
diff --cc tests/data/test1405
index a1902bb72,b4087704f..629dd2e5c
--- a/tests/data/test1405
+++ b/tests/data/test1405
@@@ -61,9 -61,9 +61,9 @@@ QUI
<file name="log/test1405.c" mode="text">
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
- * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
+ * https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
-#include <curl/curl.h>
+#include <gnurl/curl.h>
int main(int argc, char *argv[])
{
diff --cc tests/data/test1406
index dc8247dfa,38f68d11e..185eea407
--- a/tests/data/test1406
+++ b/tests/data/test1406
@@@ -60,9 -60,9 +60,9 @@@ bod
<file name="log/test1406.c" mode="text">
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
- * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
+ * https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
-#include <curl/curl.h>
+#include <gnurl/curl.h>
int main(int argc, char *argv[])
{
diff --cc tests/data/test1407
index bc25cebfb,a7e13ba75..1a50de75e
--- a/tests/data/test1407
+++ b/tests/data/test1407
@@@ -47,9 -47,9 +47,9 @@@ QUI
<file name="log/test1407.c" mode="text">
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
- * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
+ * https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
-#include <curl/curl.h>
+#include <gnurl/curl.h>
int main(int argc, char *argv[])
{
diff --cc tests/data/test1420
index 99d50c35b,4b8d7bbf4..0dcf91314
--- a/tests/data/test1420
+++ b/tests/data/test1420
@@@ -53,9 -53,9 +53,9 @@@ A005 LOGOU
<file name="log/test1420.c" mode="text">
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
- * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
+ * https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
-#include <curl/curl.h>
+#include <gnurl/curl.h>
int main(int argc, char *argv[])
{
diff --cc tests/dictserver.py.in
index e08617f5e,000000000..ea45ba80c
mode 100755,000000..100755
--- a/tests/dictserver.py.in
+++ b/tests/dictserver.py.in
@@@ -1,189 -1,0 +1,192 @@@
+#!AWKPYTHON
+# -*- coding: utf-8 -*-
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2008 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+""" DICT server """
+
+from __future__ import (absolute_import, division, print_function,
+ unicode_literals)
++
+import argparse
++import logging
+import os
+import sys
- import logging
++
++from util import ClosingFileHandler
++
+try: # Python 2
+ import SocketServer as socketserver
+except ImportError: # Python 3
+ import socketserver
+
-
+log = logging.getLogger(__name__)
+HOST = "localhost"
+
+# The strings that indicate the test framework is checking our aliveness
+VERIFIED_REQ = b"verifiedserver"
+VERIFIED_RSP = "WE ROOLZ: {pid}"
+
+
+def dictserver(options):
+ """
+ Starts up a TCP server with a DICT handler and serves DICT requests
+ forever.
+ """
+ if options.pidfile:
+ pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
+ with open(options.pidfile, "w") as f:
+ f.write(str(pid))
+
+ local_bind = (options.host, options.port)
+ log.info("[DICT] Listening on %s", local_bind)
+
+ # Need to set the allow_reuse on the class, not on the instance.
+ socketserver.TCPServer.allow_reuse_address = True
+ server = socketserver.TCPServer(local_bind, DictHandler)
+ server.serve_forever()
+
+ return ScriptRC.SUCCESS
+
+
+class DictHandler(socketserver.BaseRequestHandler):
+ """Handler class for DICT connections.
+
+ """
+ def handle(self):
+ """
+ Simple function which responds to all queries with a 552.
+ """
+ try:
+ # First, send a response to allow the server to continue.
+ rsp = "220 dictserver <xnooptions> <msgid@msgid>\n"
+ self.request.sendall(rsp.encode("utf-8"))
+
+ # Receive the request.
+ data = self.request.recv(1024).strip()
+ log.debug("[DICT] Incoming data: %r", data)
+
+ if VERIFIED_REQ in data:
+ log.debug("[DICT] Received verification request from test "
+ "framework")
+ pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
+ response_data = VERIFIED_RSP.format(pid=pid)
+ else:
+ log.debug("[DICT] Received normal request")
+ response_data = "No matches"
+
+ # Send back a failure to find.
+ response = "552 {0}\n".format(response_data)
+ log.debug("[DICT] Responding with %r", response)
+ self.request.sendall(response.encode("utf-8"))
+
+ except IOError:
+ log.exception("[DICT] IOError hit during request")
+
+
+def get_options():
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument("--port", action="store", default=9016,
+ type=int, help="port to listen on")
+ parser.add_argument("--host", action="store", default=HOST,
+ help="host to listen on")
+ parser.add_argument("--verbose", action="store", type=int, default=0,
+ help="verbose output")
+ parser.add_argument("--pidfile", action="store",
+ help="file name for the PID")
+ parser.add_argument("--logfile", action="store",
+ help="file name for the log")
+ parser.add_argument("--srcdir", action="store", help="test directory")
+ parser.add_argument("--id", action="store", help="server ID")
+ parser.add_argument("--ipv4", action="store_true", default=0,
+ help="IPv4 flag")
+
+ return parser.parse_args()
+
+
+def setup_logging(options):
+ """
+ Set up logging from the command line options
+ """
+ root_logger = logging.getLogger()
+ add_stdout = False
+
+ formatter = logging.Formatter("%(asctime)s %(levelname)-5.5s %(message)s")
+
+ # Write out to a logfile
+ if options.logfile:
- handler = logging.FileHandler(options.logfile, mode="w")
++ handler = ClosingFileHandler(options.logfile)
+ handler.setFormatter(formatter)
+ handler.setLevel(logging.DEBUG)
+ root_logger.addHandler(handler)
+ else:
+ # The logfile wasn't specified. Add a stdout logger.
+ add_stdout = True
+
+ if options.verbose:
+ # Add a stdout logger as well in verbose mode
+ root_logger.setLevel(logging.DEBUG)
+ add_stdout = True
+ else:
+ root_logger.setLevel(logging.INFO)
+
+ if add_stdout:
+ stdout_handler = logging.StreamHandler(sys.stdout)
+ stdout_handler.setFormatter(formatter)
+ stdout_handler.setLevel(logging.DEBUG)
+ root_logger.addHandler(stdout_handler)
+
+
+class ScriptRC(object):
+ """Enum for script return codes"""
+ SUCCESS = 0
+ FAILURE = 1
+ EXCEPTION = 2
+
+
+class ScriptException(Exception):
+ pass
+
+
+if __name__ == '__main__':
+ # Get the options from the user.
+ options = get_options()
+
+ # Setup logging using the user options
+ setup_logging(options)
+
+ # Run main script.
+ try:
+ rc = dictserver(options)
+ except Exception as e:
+ log.exception(e)
+ rc = ScriptRC.EXCEPTION
+
+ log.info("[DICT] Returning %d", rc)
+ sys.exit(rc)
diff --cc tests/disable-scan.pl.in
index 12600f336,000000000..41fc14056
mode 100755,000000..100755
--- a/tests/disable-scan.pl.in
+++ b/tests/disable-scan.pl.in
@@@ -1,134 -1,0 +1,134 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
- # Copyright (C) 2010-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+
+use strict;
+use warnings;
+
+# the DISABLE options that can be set by configure
+my %disable;
+# the DISABLE options that are used in C files
+my %file;
+# the DISABLE options that are documented
+my %docs;
+
+# we may get the dir root pointed out
+my $root=$ARGV[0] || ".";
+my $DOCS="CURL-DISABLE.md";
+
+sub scan_configure {
+ open S, "<$root/configure.ac";
+ while(<S>) {
+ if(/(CURL_DISABLE_[A-Z_]+)/g) {
+ my ($sym)=($1);
+ $disable{$sym} = 1;
+ }
+ }
+ close S;
+}
+
+sub scan_file {
+ my ($source)=@_;
+ open F, "<$source";
+ while(<F>) {
+ if(/(CURL_DISABLE_[A-Z_]+)/g) {
+ my ($sym)=($1);
+ $file{$sym} = $source;
+ }
+ }
+ close F;
+}
+
+sub scan_dir {
+ my ($dir)=@_;
+ opendir(my $dh, $dir) || die "Can't opendir $dir: $!";
+ my @cfiles = grep { /\.c\z/ && -f "$dir/$_" } readdir($dh);
+ closedir $dh;
+ for my $f (sort @cfiles) {
+ scan_file("$dir/$f");
+ }
+}
+
+sub scan_sources {
+ scan_dir("$root/src");
+ scan_dir("$root/lib");
+ scan_dir("$root/lib/vtls");
+ scan_dir("$root/lib/vauth");
+}
+
+sub scan_docs {
+ open F, "<$root/docs/$DOCS";
+ my $line = 0;
+ while(<F>) {
+ $line++;
+ if(/^## (CURL_DISABLE_[A-Z_]+)/g) {
+ my ($sym)=($1);
+ $docs{$sym} = $line;
+ }
+ }
+ close F;
+}
+
+scan_configure();
+scan_sources();
+scan_docs();
+
+
+my $error = 0;
+# Check the configure symbols for use in code
+for my $s (sort keys %disable) {
+ if(!$file{$s}) {
+ printf "Present in configure.ac, not used by code: %s\n", $s;
+ $error++;
+ }
+ if(!$docs{$s}) {
+ printf "Present in configure.ac, not documented in $DOCS: %s\n", $s;
+ $error++;
+ }
+}
+
+# Check the code symbols for use in configure
+for my $s (sort keys %file) {
+ if(!$disable{$s}) {
+ printf "Not set by configure: %s (%s)\n", $s, $file{$s};
+ $error++;
+ }
+ if(!$docs{$s}) {
+ printf "Used in code, not documented in $DOCS: %s\n", $s;
+ $error++;
+ }
+}
+
+# Check the documented symbols
+for my $s (sort keys %docs) {
+ if(!$disable{$s}) {
+ printf "Documented but not in configure: %s\n", $s;
+ $error++;
+ }
+ if(!$file{$s}) {
+ printf "Documented, but not used by code: %s\n", $s;
+ $error++;
+ }
+}
+
+exit $error;
diff --cc tests/error-codes.pl.in
index d9ddbcdfa,000000000..73873d393
mode 100644,000000..100644
--- a/tests/error-codes.pl.in
+++ b/tests/error-codes.pl.in
@@@ -1,80 -1,0 +1,80 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
- # Copyright (C) 2010-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
++# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+#
+
+use strict;
+use warnings;
+
+# we may get the dir root pointed out
+my $root=$ARGV[0] || ".";
+
+my %error; # from the include file
+my %docs; # from libcurl-errors.3
+
+sub getdocserrors {
+ open(F, "<$root/docs/libcurl/libcurl-errors.3");
+ while(<F>) {
+ if($_ =~ /^.IP \"(CURL[EM]_[^ \t\"]*)/) {
+ my ($symbol) = ($1);
+ if($symbol =~ /OBSOLETE/) {
+ ;
+ }
+ else {
+ $docs{$symbol}=1;
+ }
+ }
+ }
+ close(F);
+}
+
+sub getincludeerrors {
+ open(F, "<$root/docs/libcurl/symbols-in-versions");
+ while(<F>) {
+ if($_ =~ /^(CURL[EM]_[^ \t]*)[ \t]*([0-9.]+)[ \t]*(.*)/) {
+ my ($symbol, $added, $rest) = ($1,$2,$3);
+ if($rest =~ /^([0-9.]+)/) {
+ # removed!
+ }
+ else {
+ $error{$symbol}=$added;
+ }
+ }
+ }
+ close(F);
+}
+
+getincludeerrors();
+getdocserrors();
+
+for(sort keys %error) {
+ if($error{$_} && !$docs{$_}) {
+ print "$_ is not in libcurl-errors.3\n";
+ }
+}
+
+for(sort keys %docs) {
+ if($docs{$_} && !$error{$_}) {
+ print "$_ is not in symbols-in-versions\n";
+ }
+}
diff --cc tests/extern-scan.pl.in
index 53725dc9b,000000000..64282d504
mode 100755,000000..100755
--- a/tests/extern-scan.pl.in
+++ b/tests/extern-scan.pl.in
@@@ -1,62 -1,0 +1,62 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+#
+
+use strict;
+use warnings;
+
+# we may get the dir root pointed out
+my $root=$ARGV[0] || ".";
+
+my @incs = (
+ "$root/include/gnurl/curl.h",
+ "$root/include/gnurl/easy.h",
+ "$root/include/gnurl/mprintf.h",
+ "$root/include/gnurl/multi.h",
+ );
+
+my $verbose=0;
+my $summary=0;
+my $misses=0;
+
+my @syms;
+my %doc;
+my %rem;
+
+sub scanheader {
+ my ($f)=@_;
+ open H, "<$f" || die;
+ while(<H>) {
+ if (/^(CURL_EXTERN.*)/) {
+ my $decl = $1;
+ $decl =~ s/\r$//;
+ print "$decl\n";
+ }
+ }
+ close H;
+}
+
+foreach my $i (@incs) {
+ scanheader($i);
+}
diff --cc tests/ftpserver.pl.in
index ae9ac05f4,000000000..ed6868b1f
mode 100755,000000..100755
--- a/tests/ftpserver.pl.in
+++ b/tests/ftpserver.pl.in
@@@ -1,3306 -1,0 +1,3321 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# This is a server designed for the curl test suite.
+#
+# In December 2009 we started remaking the server to support more protocols
+# that are similar in spirit. Like POP3, IMAP and SMTP in addition to the FTP
+# it already supported since a long time. Note that it still only supports one
+# protocol per invoke. You need to start multiple servers to support multiple
+# protocols simultaneously.
+#
+# It is meant to exercise curl, it is not meant to be a fully working
+# or even very standard compliant server.
+#
+# You may optionally specify port on the command line, otherwise it'll
+# default to port 8921.
+#
+# All socket/network/TCP related stuff is done by the 'sockfilt' program.
+#
+
+BEGIN {
+ push(@INC, $ENV{'srcdir'}) if(defined $ENV{'srcdir'});
+ push(@INC, ".");
+ # sub second timestamping needs Time::HiRes
+ eval {
+ no warnings "all";
+ require Time::HiRes;
+ import Time::HiRes qw( gettimeofday );
+ }
+}
+
+use strict;
+use warnings;
+use IPC::Open2;
+use Digest::MD5;
+
+require "getpart.pm";
+require "ftp.pm";
+require "directories.pm";
+
+use serverhelp qw(
+ servername_str
+ server_pidfilename
+ server_logfilename
+ mainsockf_pidfilename
+ mainsockf_logfilename
+ datasockf_pidfilename
+ datasockf_logfilename
+ );
+
+use sshhelp qw(
+ exe_ext
+ );
+
+#**********************************************************************
+# global vars...
+#
+my $verbose = 0; # set to 1 for debugging
+my $idstr = ""; # server instance string
+my $idnum = 1; # server instance number
+my $ipvnum = 4; # server IPv number (4 or 6)
+my $proto = 'ftp'; # default server protocol
+my $srcdir; # directory where ftpserver.pl is located
+my $srvrname; # server name for presentation purposes
+my $cwd_testno; # test case numbers extracted from CWD command
+my $testno = 0; # test case number (read from ftpserver.cmd)
+my $path = '.';
+my $logdir = $path .'/log';
+
+#**********************************************************************
+# global vars used for server address and primary listener port
+#
+my $port = 8921; # default primary listener port
+my $listenaddr = '127.0.0.1'; # default address for listener port
+
+#**********************************************************************
+# global vars used for file names
+#
+my $pidfile; # server pid file name
+my $portfile=".ftpserver.port"; # server port file name
+my $logfile; # server log file name
+my $mainsockf_pidfile; # pid file for primary connection sockfilt process
+my $mainsockf_logfile; # log file for primary connection sockfilt process
+my $datasockf_pidfile; # pid file for secondary connection sockfilt process
+my $datasockf_logfile; # log file for secondary connection sockfilt process
+
+#**********************************************************************
+# global vars used for server logs advisor read lock handling
+#
+my $SERVERLOGS_LOCK = 'log/serverlogs.lock';
+my $serverlogslocked = 0;
+
+#**********************************************************************
+# global vars used for child processes PID tracking
+#
+my $sfpid; # PID for primary connection sockfilt process
+my $slavepid; # PID for secondary connection sockfilt process
+
+#**********************************************************************
+# global typeglob filehandle vars to read/write from/to sockfilters
+#
+local *SFREAD; # used to read from primary connection
+local *SFWRITE; # used to write to primary connection
+local *DREAD; # used to read from secondary connection
+local *DWRITE; # used to write to secondary connection
+
+my $sockfilt_timeout = 5; # default timeout for sockfilter eXsysreads
+
+#**********************************************************************
+# global vars which depend on server protocol selection
+#
+my %commandfunc; # protocol command specific function callbacks
+my %displaytext; # text returned to client before callback runs
+
+#**********************************************************************
+# global vars customized for each test from the server commands file
+#
+my $ctrldelay; # set if server should throttle ctrl stream
+my $datadelay; # set if server should throttle data stream
+my $retrweirdo; # set if ftp server should use RETRWEIRDO
+my $retrnosize; # set if ftp server should use RETRNOSIZE
+my $pasvbadip; # set if ftp server should use PASVBADIP
+my $nosave; # set if ftp server should not save uploaded data
+my $nodataconn; # set if ftp srvr doesn't establish or accepts data channel
+my $nodataconn425; # set if ftp srvr doesn't establish data ch and replies 425
+my $nodataconn421; # set if ftp srvr doesn't establish data ch and replies 421
+my $nodataconn150; # set if ftp srvr doesn't establish data ch and replies 150
++my $storeresp;
+my @capabilities; # set if server supports capability commands
+my @auth_mechs; # set if server supports authentication commands
+my %fulltextreply; #
+my %commandreply; #
+my %customcount; #
+my %delayreply; #
+
+#**********************************************************************
+# global variables for to test ftp wildcardmatching or other test that
+# need flexible LIST responses.. and corresponding files.
+# $ftptargetdir is keeping the fake "name" of LIST directory.
+#
+my $ftplistparserstate;
+my $ftptargetdir="";
+
+#**********************************************************************
+# global variables used when running a ftp server to keep state info
+# relative to the secondary or data sockfilt process. Values of these
+# variables should only be modified using datasockf_state() sub, given
+# that they are closely related and relationship is a bit awkward.
+#
+my $datasockf_state = 'STOPPED'; # see datasockf_state() sub
+my $datasockf_mode = 'none'; # ['none','active','passive']
+my $datasockf_runs = 'no'; # ['no','yes']
+my $datasockf_conn = 'no'; # ['no','yes']
+
+#**********************************************************************
+# global vars used for signal handling
+#
+my $got_exit_signal = 0; # set if program should finish execution ASAP
+my $exit_signal; # first signal handled in exit_signal_handler
+
+#**********************************************************************
+# Mail related definitions
+#
+my $TEXT_PASSWORD = "secret";
+my $POP3_TIMESTAMP = "<1972.987654321\@curl>";
+
+#**********************************************************************
+# exit_signal_handler will be triggered to indicate that the program
+# should finish its execution in a controlled way as soon as possible.
+# For now, program will also terminate from within this handler.
+#
+sub exit_signal_handler {
+ my $signame = shift;
+ # For now, simply mimic old behavior.
+ killsockfilters($proto, $ipvnum, $idnum, $verbose);
+ unlink($pidfile);
+ unlink($portfile);
+ if($serverlogslocked) {
+ $serverlogslocked = 0;
+ clear_advisor_read_lock($SERVERLOGS_LOCK);
+ }
+ exit;
+}
+
+#**********************************************************************
+# logmsg is general message logging subroutine for our test servers.
+#
+sub logmsg {
+ my $now;
+ # sub second timestamping needs Time::HiRes
+ if($Time::HiRes::VERSION) {
+ my ($seconds, $usec) = gettimeofday();
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+ localtime($seconds);
+ $now = sprintf("%02d:%02d:%02d.%06d ", $hour, $min, $sec, $usec);
+ }
+ else {
+ my $seconds = time();
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+ localtime($seconds);
+ $now = sprintf("%02d:%02d:%02d ", $hour, $min, $sec);
+ }
+ if(open(LOGFILEFH, ">>$logfile")) {
+ print LOGFILEFH $now;
+ print LOGFILEFH @_;
+ close(LOGFILEFH);
+ }
+}
+
+sub ftpmsg {
+ # append to the server.input file
+ open(INPUT, ">>log/server$idstr.input") ||
+ logmsg "failed to open log/server$idstr.input\n";
+
+ print INPUT @_;
+ close(INPUT);
+
+ # use this, open->print->close system only to make the file
+ # open as little as possible, to make the test suite run
+ # better on windows/cygwin
+}
+
+#**********************************************************************
+# eXsysread is a wrapper around perl's sysread() function. This will
+# repeat the call to sysread() until it has actually read the complete
+# number of requested bytes or an unrecoverable condition occurs.
+# On success returns a positive value, the number of bytes requested.
+# On failure or timeout returns zero.
+#
+sub eXsysread {
+ my $FH = shift;
+ my $scalar = shift;
+ my $nbytes = shift;
+ my $timeout = shift; # A zero timeout disables eXsysread() time limit
+ #
+ my $time_limited = 0;
+ my $timeout_rest = 0;
+ my $start_time = 0;
+ my $nread = 0;
+ my $rc;
+
+ $$scalar = "";
+
+ if((not defined $nbytes) || ($nbytes < 1)) {
+ logmsg "Error: eXsysread() failure: " .
+ "length argument must be positive\n";
+ return 0;
+ }
+ if((not defined $timeout) || ($timeout < 0)) {
+ logmsg "Error: eXsysread() failure: " .
+ "timeout argument must be zero or positive\n";
+ return 0;
+ }
+ if($timeout > 0) {
+ # caller sets eXsysread() time limit
+ $time_limited = 1;
+ $timeout_rest = $timeout;
+ $start_time = int(time());
+ }
+
+ while($nread < $nbytes) {
+ if($time_limited) {
+ eval {
+ local $SIG{ALRM} = sub { die "alarm\n"; };
+ alarm $timeout_rest;
+ $rc = sysread($FH, $$scalar, $nbytes - $nread, $nread);
+ alarm 0;
+ };
+ $timeout_rest = $timeout - (int(time()) - $start_time);
+ if($timeout_rest < 1) {
+ logmsg "Error: eXsysread() failure: timed out\n";
+ return 0;
+ }
+ }
+ else {
+ $rc = sysread($FH, $$scalar, $nbytes - $nread, $nread);
+ }
+ if($got_exit_signal) {
+ logmsg "Error: eXsysread() failure: signalled to die\n";
+ return 0;
+ }
+ if(not defined $rc) {
+ if($!{EINTR}) {
+ logmsg "Warning: retrying sysread() interrupted system
call\n";
+ next;
+ }
+ if($!{EAGAIN}) {
+ logmsg "Warning: retrying sysread() due to EAGAIN\n";
+ next;
+ }
+ if($!{EWOULDBLOCK}) {
+ logmsg "Warning: retrying sysread() due to EWOULDBLOCK\n";
+ next;
+ }
+ logmsg "Error: sysread() failure: $!\n";
+ return 0;
+ }
+ if($rc < 0) {
+ logmsg "Error: sysread() failure: returned negative value $rc\n";
+ return 0;
+ }
+ if($rc == 0) {
+ logmsg "Error: sysread() failure: read zero bytes\n";
+ return 0;
+ }
+ $nread += $rc;
+ }
+ return $nread;
+}
+
+#**********************************************************************
+# read_mainsockf attempts to read the given amount of output from the
+# sockfilter which is in use for the main or primary connection. This
+# reads untranslated sockfilt lingo which may hold data read from the
+# main or primary socket. On success returns 1, otherwise zero.
+#
+sub read_mainsockf {
+ my $scalar = shift;
+ my $nbytes = shift;
+ my $timeout = shift; # Optional argument, if zero blocks indefinitely
+ my $FH = \*SFREAD;
+
+ if(not defined $timeout) {
+ $timeout = $sockfilt_timeout + ($nbytes >> 12);
+ }
+ if(eXsysread($FH, $scalar, $nbytes, $timeout) != $nbytes) {
+ my ($fcaller, $lcaller) = (caller)[1,2];
+ logmsg "Error: read_mainsockf() failure at $fcaller " .
+ "line $lcaller. Due to eXsysread() failure\n";
+ return 0;
+ }
+ return 1;
+}
+
+#**********************************************************************
+# read_datasockf attempts to read the given amount of output from the
+# sockfilter which is in use for the data or secondary connection. This
+# reads untranslated sockfilt lingo which may hold data read from the
+# data or secondary socket. On success returns 1, otherwise zero.
+#
+sub read_datasockf {
+ my $scalar = shift;
+ my $nbytes = shift;
+ my $timeout = shift; # Optional argument, if zero blocks indefinitely
+ my $FH = \*DREAD;
+
+ if(not defined $timeout) {
+ $timeout = $sockfilt_timeout + ($nbytes >> 12);
+ }
+ if(eXsysread($FH, $scalar, $nbytes, $timeout) != $nbytes) {
+ my ($fcaller, $lcaller) = (caller)[1,2];
+ logmsg "Error: read_datasockf() failure at $fcaller " .
+ "line $lcaller. Due to eXsysread() failure\n";
+ return 0;
+ }
+ return 1;
+}
+
+sub sysread_or_die {
+ my $FH = shift;
+ my $scalar = shift;
+ my $length = shift;
+ my $fcaller;
+ my $lcaller;
+ my $result;
+
+ $result = sysread($$FH, $$scalar, $length);
+
+ if(not defined $result) {
+ ($fcaller, $lcaller) = (caller)[1,2];
+ logmsg "Failed to read input\n";
+ logmsg "Error: $srvrname server, sysread error: $!\n";
+ logmsg "Exited from sysread_or_die() at $fcaller " .
+ "line $lcaller. $srvrname server, sysread error: $!\n";
+ killsockfilters($proto, $ipvnum, $idnum, $verbose);
+ unlink($pidfile);
+ unlink($portfile);
+ if($serverlogslocked) {
+ $serverlogslocked = 0;
+ clear_advisor_read_lock($SERVERLOGS_LOCK);
+ }
+ exit;
+ }
+ elsif($result == 0) {
+ ($fcaller, $lcaller) = (caller)[1,2];
+ logmsg "Failed to read input\n";
+ logmsg "Error: $srvrname server, read zero\n";
+ logmsg "Exited from sysread_or_die() at $fcaller " .
+ "line $lcaller. $srvrname server, read zero\n";
+ killsockfilters($proto, $ipvnum, $idnum, $verbose);
+ unlink($pidfile);
+ unlink($portfile);
+ if($serverlogslocked) {
+ $serverlogslocked = 0;
+ clear_advisor_read_lock($SERVERLOGS_LOCK);
+ }
+ exit;
+ }
+
+ return $result;
+}
+
+sub startsf {
+ my $mainsockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
+ "--ipv$ipvnum --port $port " .
+ "--pidfile \"$mainsockf_pidfile\" " .
+ "--portfile \"$portfile\" " .
+ "--logfile \"$mainsockf_logfile\"";
+ $sfpid = open2(*SFREAD, *SFWRITE, $mainsockfcmd);
+
+ print STDERR "$mainsockfcmd\n" if($verbose);
+
+ print SFWRITE "PING\n";
+ my $pong;
+ sysread_or_die(\*SFREAD, \$pong, 5);
+
+ if($pong !~ /^PONG/) {
+ logmsg "Failed sockfilt command: $mainsockfcmd\n";
+ killsockfilters($proto, $ipvnum, $idnum, $verbose);
+ unlink($pidfile);
+ unlink($portfile);
+ if($serverlogslocked) {
+ $serverlogslocked = 0;
+ clear_advisor_read_lock($SERVERLOGS_LOCK);
+ }
+ die "Failed to start sockfilt!";
+ }
+}
+
+#**********************************************************************
+# Returns the given test's reply data
+#
+sub getreplydata {
+ my ($num) = @_;
+ my $testpart = "";
+
+ $num =~ s/^([^0-9]*)//;
+ if($num > 10000) {
+ $testpart = $num % 10000;
+ }
+
+ my @data = getpart("reply", "data$testpart");
+ if((!@data) && ($testpart ne "")) {
+ @data = getpart("reply", "data");
+ }
+
+ return @data;
+}
+
+sub sockfilt {
+ my $l;
+ foreach $l (@_) {
+ printf SFWRITE "DATA\n%04x\n", length($l);
+ print SFWRITE $l;
+ }
+}
+
+sub sockfiltsecondary {
+ my $l;
+ foreach $l (@_) {
+ printf DWRITE "DATA\n%04x\n", length($l);
+ print DWRITE $l;
+ }
+}
+
+#**********************************************************************
+# Send data to the client on the control stream, which happens to be plain
+# stdout.
+#
+sub sendcontrol {
+ if(!$ctrldelay) {
+ # spit it all out at once
+ sockfilt @_;
+ }
+ else {
+ my $a = join("", @_);
+ my @a = split("", $a);
+
+ for(@a) {
+ sockfilt $_;
+ portable_sleep(0.01);
+ }
+ }
+ my $log;
+ foreach $log (@_) {
+ my $l = $log;
+ $l =~ s/\r/[CR]/g;
+ $l =~ s/\n/[LF]/g;
+ logmsg "> \"$l\"\n";
+ }
+}
+
+#**********************************************************************
+# Send data to the FTP client on the data stream when data connection
+# is actually established. Given that this sub should only be called
+# when a data connection is supposed to be established, calling this
+# without a data connection is an indication of weak logic somewhere.
+#
+sub senddata {
+ my $l;
+ if($datasockf_conn eq 'no') {
+ logmsg "WARNING: Detected data sending attempt without DATA
channel\n";
+ foreach $l (@_) {
+ logmsg "WARNING: Data swallowed: $l\n"
+ }
+ return;
+ }
+
+ foreach $l (@_) {
+ if(!$datadelay) {
+ # spit it all out at once
+ sockfiltsecondary $l;
+ }
+ else {
+ # pause between each byte
+ for (split(//,$l)) {
+ sockfiltsecondary $_;
+ portable_sleep(0.01);
+ }
+ }
+ }
+}
+
+#**********************************************************************
+# protocolsetup initializes the 'displaytext' and 'commandfunc' hashes
+# for the given protocol. References to protocol command callbacks are
+# stored in 'commandfunc' hash, and text which will be returned to the
+# client before the command callback runs is stored in 'displaytext'.
+#
+sub protocolsetup {
+ my $proto = $_[0];
+
+ if($proto eq 'ftp') {
+ %commandfunc = (
+ 'PORT' => \&PORT_ftp,
+ 'EPRT' => \&PORT_ftp,
+ 'LIST' => \&LIST_ftp,
+ 'NLST' => \&NLST_ftp,
+ 'PASV' => \&PASV_ftp,
+ 'CWD' => \&CWD_ftp,
+ 'PWD' => \&PWD_ftp,
+ 'EPSV' => \&PASV_ftp,
+ 'RETR' => \&RETR_ftp,
+ 'SIZE' => \&SIZE_ftp,
+ 'REST' => \&REST_ftp,
+ 'STOR' => \&STOR_ftp,
+ 'APPE' => \&STOR_ftp, # append looks like upload
+ 'MDTM' => \&MDTM_ftp,
+ );
+ %displaytext = (
+ 'USER' => '331 We are happy you popped in!',
+ 'PASS' => '230 Welcome you silly person',
+ 'PORT' => '200 You said PORT - I say FINE',
+ 'TYPE' => '200 I modify TYPE as you wanted',
+ 'LIST' => '150 here comes a directory',
+ 'NLST' => '150 here comes a directory',
+ 'CWD' => '250 CWD command successful.',
+ 'SYST' => '215 UNIX Type: L8', # just fake something
+ 'QUIT' => '221 bye bye baby', # just reply something
+ 'MKD' => '257 Created your requested directory',
+ 'REST' => '350 Yeah yeah we set it there for you',
+ 'DELE' => '200 OK OK OK whatever you say',
+ 'RNFR' => '350 Received your order. Please provide more',
+ 'RNTO' => '250 Ok, thanks. File renaming completed.',
+ 'NOOP' => '200 Yes, I\'m very good at doing nothing.',
+ 'PBSZ' => '500 PBSZ not implemented',
+ 'PROT' => '500 PROT not implemented',
+ 'welcome' => join("",
+ '220- _ _ ____ _ '."\r\n",
+ '220- ___| | | | _ \| | '."\r\n",
+ '220- / __| | | | |_) | | '."\r\n",
+ '220- | (__| |_| | _ {| |___ '."\r\n",
+ '220 \___|\___/|_| \_\_____|'."\r\n")
+ );
+ }
+ elsif($proto eq 'pop3') {
+ %commandfunc = (
+ 'APOP' => \&APOP_pop3,
+ 'AUTH' => \&AUTH_pop3,
+ 'CAPA' => \&CAPA_pop3,
+ 'DELE' => \&DELE_pop3,
+ 'LIST' => \&LIST_pop3,
+ 'NOOP' => \&NOOP_pop3,
+ 'PASS' => \&PASS_pop3,
+ 'QUIT' => \&QUIT_pop3,
+ 'RETR' => \&RETR_pop3,
+ 'RSET' => \&RSET_pop3,
+ 'STAT' => \&STAT_pop3,
+ 'TOP' => \&TOP_pop3,
+ 'UIDL' => \&UIDL_pop3,
+ 'USER' => \&USER_pop3,
+ );
+ %displaytext = (
+ 'welcome' => join("",
+ ' _ _ ____ _ '."\r\n",
+ ' ___| | | | _ \| | '."\r\n",
+ ' / __| | | | |_) | | '."\r\n",
+ ' | (__| |_| | _ {| |___ '."\r\n",
+ ' \___|\___/|_| \_\_____|'."\r\n",
+ '+OK curl POP3 server ready to serve '."\r\n")
+ );
+ }
+ elsif($proto eq 'imap') {
+ %commandfunc = (
+ 'APPEND' => \&APPEND_imap,
+ 'CAPABILITY' => \&CAPABILITY_imap,
+ 'CHECK' => \&CHECK_imap,
+ 'CLOSE' => \&CLOSE_imap,
+ 'COPY' => \©_imap,
+ 'CREATE' => \&CREATE_imap,
+ 'DELETE' => \&DELETE_imap,
+ 'EXAMINE' => \&EXAMINE_imap,
+ 'EXPUNGE' => \&EXPUNGE_imap,
+ 'FETCH' => \&FETCH_imap,
+ 'LIST' => \&LIST_imap,
+ 'LSUB' => \&LSUB_imap,
+ 'LOGIN' => \&LOGIN_imap,
+ 'LOGOUT' => \&LOGOUT_imap,
+ 'NOOP' => \&NOOP_imap,
+ 'RENAME' => \&RENAME_imap,
+ 'SEARCH' => \&SEARCH_imap,
+ 'SELECT' => \&SELECT_imap,
+ 'STATUS' => \&STATUS_imap,
+ 'STORE' => \&STORE_imap,
+ 'UID' => \&UID_imap,
+ );
+ %displaytext = (
+ 'welcome' => join("",
+ ' _ _ ____ _ '."\r\n",
+ ' ___| | | | _ \| | '."\r\n",
+ ' / __| | | | |_) | | '."\r\n",
+ ' | (__| |_| | _ {| |___ '."\r\n",
+ ' \___|\___/|_| \_\_____|'."\r\n",
+ '* OK curl IMAP server ready to serve'."\r\n")
+ );
+ }
+ elsif($proto eq 'smtp') {
+ %commandfunc = (
+ 'DATA' => \&DATA_smtp,
+ 'EHLO' => \&EHLO_smtp,
+ 'EXPN' => \&EXPN_smtp,
+ 'HELO' => \&HELO_smtp,
+ 'HELP' => \&HELP_smtp,
+ 'MAIL' => \&MAIL_smtp,
+ 'NOOP' => \&NOOP_smtp,
+ 'RSET' => \&RSET_smtp,
+ 'RCPT' => \&RCPT_smtp,
+ 'VRFY' => \&VRFY_smtp,
+ 'QUIT' => \&QUIT_smtp,
+ );
+ %displaytext = (
+ 'welcome' => join("",
+ '220- _ _ ____ _ '."\r\n",
+ '220- ___| | | | _ \| | '."\r\n",
+ '220- / __| | | | |_) | | '."\r\n",
+ '220- | (__| |_| | _ {| |___ '."\r\n",
+ '220 \___|\___/|_| \_\_____|'."\r\n")
+ );
+ }
+}
+
+sub close_dataconn {
+ my ($closed)=@_; # non-zero if already disconnected
+
+ my $datapid = processexists($datasockf_pidfile);
+
+ logmsg "=====> Closing $datasockf_mode DATA connection...\n";
+
+ if(!$closed) {
+ if($datapid > 0) {
+ logmsg "Server disconnects $datasockf_mode DATA connection\n";
+ print DWRITE "DISC\n";
+ my $i;
+ sysread DREAD, $i, 5;
+ logmsg "Server disconnected $datasockf_mode DATA connection\n";
+ }
+ else {
+ logmsg "Server finds $datasockf_mode DATA connection already ".
+ "disconnected\n";
+ }
+ }
+ else {
+ logmsg "Server knows $datasockf_mode DATA connection is already ".
+ "disconnected\n";
+ }
+
+ if($datapid > 0) {
+ logmsg "DATA sockfilt for $datasockf_mode data channel quits ".
+ "(pid $datapid)\n";
+ print DWRITE "QUIT\n";
+ pidwait($datapid, 0);
+ unlink($datasockf_pidfile) if(-f $datasockf_pidfile);
+ logmsg "DATA sockfilt for $datasockf_mode data channel quit ".
+ "(pid $datapid)\n";
+ }
+ else {
+ logmsg "DATA sockfilt for $datasockf_mode data channel already ".
+ "dead\n";
+ }
+
+ logmsg "=====> Closed $datasockf_mode DATA connection\n";
+
+ datasockf_state('STOPPED');
+}
+
+################
+################ SMTP commands
+################
+
+# The type of server (SMTP or ESMTP)
+my $smtp_type;
+
+# The client (which normally contains the test number)
+my $smtp_client;
+
+sub EHLO_smtp {
+ my ($client) = @_;
+ my @data;
+
+ # TODO: Get the IP address of the client connection to use in the
+ # EHLO response when the client doesn't specify one but for now use
+ # 127.0.0.1
+ if(!$client) {
+ $client = "[127.0.0.1]";
+ }
+
+ # Set the server type to ESMTP
+ $smtp_type = "ESMTP";
+
+ # Calculate the EHLO response
+ push @data, "$smtp_type pingpong test server Hello $client";
+
+ if((@capabilities) || (@auth_mechs)) {
+ my $mechs;
+
+ for my $c (@capabilities) {
+ push @data, $c;
+ }
+
+ for my $am (@auth_mechs) {
+ if(!$mechs) {
+ $mechs = "$am";
+ }
+ else {
+ $mechs .= " $am";
+ }
+ }
+
+ if($mechs) {
+ push @data, "AUTH $mechs";
+ }
+ }
+
+ # Send the EHLO response
+ for(my $i = 0; $i < @data; $i++) {
+ my $d = $data[$i];
+
+ if($i < @data - 1) {
+ sendcontrol "250-$d\r\n";
+ }
+ else {
+ sendcontrol "250 $d\r\n";
+ }
+ }
+
+ # Store the client (as it may contain the test number)
+ $smtp_client = $client;
+
+ return 0;
+}
+
+sub HELO_smtp {
+ my ($client) = @_;
+
+ # TODO: Get the IP address of the client connection to use in the HELO
+ # response when the client doesn't specify one but for now use 127.0.0.1
+ if(!$client) {
+ $client = "[127.0.0.1]";
+ }
+
+ # Set the server type to SMTP
+ $smtp_type = "SMTP";
+
+ # Send the HELO response
+ sendcontrol "250 $smtp_type pingpong test server Hello $client\r\n";
+
+ # Store the client (as it may contain the test number)
+ $smtp_client = $client;
+
+ return 0;
+}
+
+sub MAIL_smtp {
+ my ($args) = @_;
+
+ logmsg "MAIL_smtp got $args\n";
+
+ if (!$args) {
+ sendcontrol "501 Unrecognized parameter\r\n";
+ }
+ else {
+ my $from;
+ my $size;
+ my $smtputf8 = grep /^SMTPUTF8$/, @capabilities;
+ my @elements = split(/ /, $args);
+
+ # Get the FROM and SIZE parameters
+ for my $e (@elements) {
+ if($e =~ /^FROM:(.*)$/) {
+ $from = $1;
+ }
+ elsif($e =~ /^SIZE=(\d+)$/) {
+ $size = $1;
+ }
+ }
+
+ # this server doesn't "validate" MAIL FROM addresses
+ if (length($from)) {
+ my @found;
+ my $valid = 1;
+
+ # Check the capabilities for SIZE and if the specified size is
+ # greater than the message size then reject it
+ if (@found = grep /^SIZE (\d+)$/, @capabilities) {
+ if ($found[0] =~ /^SIZE (\d+)$/) {
+ if ($size > $1) {
+ $valid = 0;
+ }
+ }
+ }
+
+ if(!$valid) {
+ sendcontrol "552 Message size too large\r\n";
+ }
+ else {
+ sendcontrol "250 Sender OK\r\n";
+ }
+ }
+ else {
+ sendcontrol "501 Invalid address\r\n";
+ }
+ }
+
+ return 0;
+}
+
+sub RCPT_smtp {
+ my ($args) = @_;
+
+ logmsg "RCPT_smtp got $args\n";
+
+ # Get the TO parameter
+ if($args !~ /^TO:(.*)/) {
+ sendcontrol "501 Unrecognized parameter\r\n";
+ }
+ else {
+ my $smtputf8 = grep /^SMTPUTF8$/, @capabilities;
+ my $to = $1;
+
+ # Validate the to address (only a valid email address inside <> is
+ # allowed, such as <user@example.com>)
+ if ((!$smtputf8 && $to =~
+ /^<([a-zA-Z0-9._%+-]+)\@(([a-zA-Z0-9-]+)\.)+([a-zA-Z]{2,4})>$/)
||
+ ($smtputf8 && $to =~
+
/^<([a-zA-Z0-9\x{80}-\x{ff}._%+-]+)\@(([a-zA-Z0-9\x{80}-\x{ff}-]+)\.)+([a-zA-Z]{2,4})>$/))
{
+ sendcontrol "250 Recipient OK\r\n";
+ }
+ else {
+ sendcontrol "501 Invalid address\r\n";
+ }
+ }
+
+ return 0;
+}
+
+sub DATA_smtp {
+ my ($args) = @_;
+
+ if ($args) {
+ sendcontrol "501 Unrecognized parameter\r\n";
+ }
+ elsif ($smtp_client !~ /^(\d*)$/) {
+ sendcontrol "501 Invalid arguments\r\n";
+ }
+ else {
+ sendcontrol "354 Show me the mail\r\n";
+
+ my $testno = $smtp_client;
+ my $filename = "log/upload.$testno";
+
+ logmsg "Store test number $testno in $filename\n";
+
+ open(FILE, ">$filename") ||
+ return 0; # failed to open output
+
+ my $line;
+ my $ulsize=0;
+ my $disc=0;
+ my $raw;
+ while (5 == (sysread \*SFREAD, $line, 5)) {
+ if($line eq "DATA\n") {
+ my $i;
+ my $eob;
+ sysread \*SFREAD, $i, 5;
+
+ my $size = 0;
+ if($i =~ /^([0-9a-fA-F]{4})\n/) {
+ $size = hex($1);
+ }
+
+ read_mainsockf(\$line, $size);
+
+ $ulsize += $size;
+ print FILE $line if(!$nosave);
+
+ $raw .= $line;
+ if($raw =~ /(?:^|\x0d\x0a)\x2e\x0d\x0a/) {
+ # end of data marker!
+ $eob = 1;
+ }
+
+ logmsg "> Appending $size bytes to file\n";
+
+ if($eob) {
+ logmsg "Found SMTP EOB marker\n";
+ last;
+ }
+ }
+ elsif($line eq "DISC\n") {
+ # disconnect!
+ $disc=1;
+ last;
+ }
+ else {
+ logmsg "No support for: $line";
+ last;
+ }
+ }
+
+ if($nosave) {
+ print FILE "$ulsize bytes would've been stored here\n";
+ }
+
+ close(FILE);
+
+ logmsg "received $ulsize bytes upload\n";
+
+ sendcontrol "250 OK, data received!\r\n";
+ }
+
+ return 0;
+}
+
+sub NOOP_smtp {
+ my ($args) = @_;
+
+ if($args) {
+ sendcontrol "501 Unrecognized parameter\r\n";
+ }
+ else {
+ sendcontrol "250 OK\r\n";
+ }
+
+ return 0;
+}
+
+sub RSET_smtp {
+ my ($args) = @_;
+
+ if($args) {
+ sendcontrol "501 Unrecognized parameter\r\n";
+ }
+ else {
+ sendcontrol "250 Resetting\r\n";
+ }
+
+ return 0;
+}
+
+sub HELP_smtp {
+ my ($args) = @_;
+
+ # One argument is optional
+ if($args) {
+ logmsg "HELP_smtp got $args\n";
+ }
+
+ if($smtp_client eq "verifiedserver") {
+ # This is the secret command that verifies that this actually is
+ # the curl test server
+ sendcontrol "214 WE ROOLZ: $$\r\n";
+
+ if($verbose) {
+ print STDERR "FTPD: We returned proof we are the test server\n";
+ }
+
+ logmsg "return proof we are we\n";
+ }
+ else {
+ sendcontrol "214-This server supports the following commands:\r\n";
+
+ if(@auth_mechs) {
+ sendcontrol "214 HELO EHLO RCPT DATA RSET MAIL VRFY EXPN QUIT
HELP AUTH\r\n";
+ }
+ else {
+ sendcontrol "214 HELO EHLO RCPT DATA RSET MAIL VRFY EXPN QUIT
HELP\r\n";
+ }
+ }
+
+ return 0;
+}
+
+sub VRFY_smtp {
+ my ($args) = @_;
+ my ($username, $address) = split(/ /, $args, 2);
+
+ logmsg "VRFY_smtp got $args\n";
+
+ if($username eq "") {
+ sendcontrol "501 Unrecognized parameter\r\n";
+ }
+ else {
+ my $smtputf8 = grep /^SMTPUTF8$/, @capabilities;
+
+ # Validate the username (only a valid local or external username is
+ # allowed, such as user or user@example.com)
+ if ((!$smtputf8 && $username =~
+ /^([a-zA-Z0-9._%+-]+)(\@(([a-zA-Z0-9-]+)\.)+([a-zA-Z]{2,4}))?$/)
||
+ ($smtputf8 && $username =~
+
/^([a-zA-Z0-9\x{80}-\x{ff}._%+-]+)(\@(([a-zA-Z0-9\x{80}-\x{ff}-]+)\.)+([a-zA-Z]{2,4}))?$/))
{
+
+ my @data = getreplydata($smtp_client);
+
+ if(!@data) {
+ if ($username !~
+
/^([a-zA-Z0-9._%+-]+)\@(([a-zA-Z0-9-]+)\.)+([a-zA-Z]{2,4})$/) {
+ push @data, "250 <$username\@example.com>\r\n"
+ }
+ else {
+ push @data, "250 <$username>\r\n"
+ }
+ }
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+ }
+ else {
+ sendcontrol "501 Invalid address\r\n";
+ }
+ }
+
+ return 0;
+}
+
+sub EXPN_smtp {
+ my ($list_name) = @_;
+
+ logmsg "EXPN_smtp got $list_name\n";
+
+ if(!$list_name) {
+ sendcontrol "501 Unrecognized parameter\r\n";
+ }
+ else {
+ my @data = getreplydata($smtp_client);
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+ }
+
+ return 0;
+}
+
+sub QUIT_smtp {
+ sendcontrol "221 curl $smtp_type server signing off\r\n";
+
+ return 0;
+}
+
+# What was deleted by IMAP STORE / POP3 DELE commands
+my @deleted;
+
+################
+################ IMAP commands
+################
+
+# global to allow the command functions to read it
+my $cmdid;
+
+# what was picked by SELECT
+my $selected;
+
+# Any IMAP parameter can come in escaped and in double quotes.
+# This function is dumb (so far) and just removes the quotes if present.
+sub fix_imap_params {
+ foreach (@_) {
+ $_ = $1 if /^"(.*)"$/;
+ }
+}
+
+sub CAPABILITY_imap {
+ if((!@capabilities) && (!@auth_mechs)) {
+ sendcontrol "$cmdid BAD Command\r\n";
+ }
+ else {
+ my $data;
+
+ # Calculate the CAPABILITY response
+ $data = "* CAPABILITY IMAP4";
+
+ for my $c (@capabilities) {
+ $data .= " $c";
+ }
+
+ for my $am (@auth_mechs) {
+ $data .= " AUTH=$am";
+ }
+
+ $data .= " pingpong test server\r\n";
+
+ # Send the CAPABILITY response
+ sendcontrol $data;
+ sendcontrol "$cmdid OK CAPABILITY completed\r\n";
+ }
+
+ return 0;
+}
+
+sub LOGIN_imap {
+ my ($args) = @_;
+ my ($user, $password) = split(/ /, $args, 2);
+ fix_imap_params($user, $password);
+
+ logmsg "LOGIN_imap got $args\n";
+
+ if ($user eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ sendcontrol "$cmdid OK LOGIN completed\r\n";
+ }
+
+ return 0;
+}
+
+sub SELECT_imap {
+ my ($mailbox) = @_;
+ fix_imap_params($mailbox);
+
+ logmsg "SELECT_imap got test $mailbox\n";
+
+ if($mailbox eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ # Example from RFC 3501, 6.3.1. SELECT Command
+ sendcontrol "* 172 EXISTS\r\n";
+ sendcontrol "* 1 RECENT\r\n";
+ sendcontrol "* OK [UNSEEN 12] Message 12 is first unseen\r\n";
+ sendcontrol "* OK [UIDVALIDITY 3857529045] UIDs valid\r\n";
+ sendcontrol "* OK [UIDNEXT 4392] Predicted next UID\r\n";
+ sendcontrol "* FLAGS (\\Answered \\Flagged \\Deleted \\Seen
\\Draft)\r\n";
+ sendcontrol "* OK [PERMANENTFLAGS (\\Deleted \\Seen \\*)]
Limited\r\n";
+ sendcontrol "$cmdid OK [READ-WRITE] SELECT completed\r\n";
+
+ $selected = $mailbox;
+ }
+
+ return 0;
+}
+
+sub FETCH_imap {
+ my ($args) = @_;
+ my ($uid, $how) = split(/ /, $args, 2);
+ fix_imap_params($uid, $how);
+
+ logmsg "FETCH_imap got $args\n";
+
+ if ($selected eq "") {
+ sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
+ }
+ else {
+ my @data;
+ my $size;
+
+ if($selected eq "verifiedserver") {
+ # this is the secret command that verifies that this actually is
+ # the curl test server
+ my $response = "WE ROOLZ: $$\r\n";
+ if($verbose) {
+ print STDERR "FTPD: We returned proof we are the test
server\n";
+ }
+ $data[0] = $response;
+ logmsg "return proof we are we\n";
+ }
+ else {
+ # send mail content
+ logmsg "retrieve a mail\n";
+
+ @data = getreplydata($selected);
+ }
+
+ for (@data) {
+ $size += length($_);
+ }
+
+ sendcontrol "* $uid FETCH ($how {$size}\r\n";
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ sendcontrol ")\r\n";
+ sendcontrol "$cmdid OK FETCH completed\r\n";
+ }
+
+ return 0;
+}
+
+sub APPEND_imap {
+ my ($args) = @_;
+
+ logmsg "APPEND_imap got $args\r\n";
+
+ $args =~ /^([^ ]+) [^{]*\{(\d+)\}$/;
+ my ($mailbox, $size) = ($1, $2);
+ fix_imap_params($mailbox);
+
+ if($mailbox eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ sendcontrol "+ Ready for literal data\r\n";
+
+ my $testno = $mailbox;
+ my $filename = "log/upload.$testno";
+
+ logmsg "Store test number $testno in $filename\n";
+
+ open(FILE, ">$filename") ||
+ return 0; # failed to open output
+
+ my $received = 0;
+ my $line;
+ while(5 == (sysread \*SFREAD, $line, 5)) {
+ if($line eq "DATA\n") {
+ sysread \*SFREAD, $line, 5;
+
+ my $chunksize = 0;
+ if($line =~ /^([0-9a-fA-F]{4})\n/) {
+ $chunksize = hex($1);
+ }
+
+ read_mainsockf(\$line, $chunksize);
+
+ my $left = $size - $received;
+ my $datasize = ($left > $chunksize) ? $chunksize : $left;
+
+ if($datasize > 0) {
+ logmsg "> Appending $datasize bytes to file\n";
+ print FILE substr($line, 0, $datasize) if(!$nosave);
+ $line = substr($line, $datasize);
+
+ $received += $datasize;
+ if($received == $size) {
+ logmsg "Received all data, waiting for final CRLF.\n";
+ }
+ }
+
+ if($received == $size && $line eq "\r\n") {
+ last;
+ }
+ }
+ elsif($line eq "DISC\n") {
+ logmsg "Unexpected disconnect!\n";
+ last;
+ }
+ else {
+ logmsg "No support for: $line";
+ last;
+ }
+ }
+
+ if($nosave) {
+ print FILE "$size bytes would've been stored here\n";
+ }
+
+ close(FILE);
+
+ logmsg "received $size bytes upload\n";
+
+ sendcontrol "$cmdid OK APPEND completed\r\n";
+ }
+
+ return 0;
+}
+
+sub STORE_imap {
+ my ($args) = @_;
+ my ($uid, $what, $value) = split(/ /, $args, 3);
+ fix_imap_params($uid);
+
+ logmsg "STORE_imap got $args\n";
+
+ if ($selected eq "") {
+ sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
+ }
+ elsif (($uid eq "") || ($what ne "+Flags") || ($value eq "")) {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ if($value eq "\\Deleted") {
+ push(@deleted, $uid);
+ }
+
+ sendcontrol "* $uid FETCH (FLAGS (\\Seen $value))\r\n";
+ sendcontrol "$cmdid OK STORE completed\r\n";
+ }
+
+ return 0;
+}
+
+sub LIST_imap {
+ my ($args) = @_;
+ my ($reference, $mailbox) = split(/ /, $args, 2);
+ fix_imap_params($reference, $mailbox);
+
+ logmsg "LIST_imap got $args\n";
+
+ if ($reference eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ elsif ($reference eq "verifiedserver") {
+ # this is the secret command that verifies that this actually is
+ # the curl test server
+ sendcontrol "* LIST () \"/\" \"WE ROOLZ: $$\"\r\n";
+ sendcontrol "$cmdid OK LIST Completed\r\n";
+
+ if($verbose) {
+ print STDERR "FTPD: We returned proof we are the test server\n";
+ }
+
+ logmsg "return proof we are we\n";
+ }
+ else {
+ my @data = getreplydata($reference);
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ sendcontrol "$cmdid OK LIST Completed\r\n";
+ }
+
+ return 0;
+}
+
+sub LSUB_imap {
+ my ($args) = @_;
+ my ($reference, $mailbox) = split(/ /, $args, 2);
+ fix_imap_params($reference, $mailbox);
+
+ logmsg "LSUB_imap got $args\n";
+
+ if ($reference eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ my @data = getreplydata($reference);
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ sendcontrol "$cmdid OK LSUB Completed\r\n";
+ }
+
+ return 0;
+}
+
+sub EXAMINE_imap {
+ my ($mailbox) = @_;
+ fix_imap_params($mailbox);
+
+ logmsg "EXAMINE_imap got $mailbox\n";
+
+ if ($mailbox eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ my @data = getreplydata($mailbox);
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ sendcontrol "$cmdid OK [READ-ONLY] EXAMINE completed\r\n";
+ }
+
+ return 0;
+}
+
+sub STATUS_imap {
+ my ($args) = @_;
+ my ($mailbox, $what) = split(/ /, $args, 2);
+ fix_imap_params($mailbox);
+
+ logmsg "STATUS_imap got $args\n";
+
+ if ($mailbox eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ my @data = getreplydata($mailbox);
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ sendcontrol "$cmdid OK STATUS completed\r\n";
+ }
+
+ return 0;
+}
+
+sub SEARCH_imap {
+ my ($what) = @_;
+ fix_imap_params($what);
+
+ logmsg "SEARCH_imap got $what\n";
+
+ if ($selected eq "") {
+ sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
+ }
+ elsif ($what eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ my @data = getreplydata($selected);
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ sendcontrol "$cmdid OK SEARCH completed\r\n";
+ }
+
+ return 0;
+}
+
+sub CREATE_imap {
+ my ($args) = @_;
+ fix_imap_params($args);
+
+ logmsg "CREATE_imap got $args\n";
+
+ if ($args eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ sendcontrol "$cmdid OK CREATE completed\r\n";
+ }
+
+ return 0;
+}
+
+sub DELETE_imap {
+ my ($args) = @_;
+ fix_imap_params($args);
+
+ logmsg "DELETE_imap got $args\n";
+
+ if ($args eq "") {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ sendcontrol "$cmdid OK DELETE completed\r\n";
+ }
+
+ return 0;
+}
+
+sub RENAME_imap {
+ my ($args) = @_;
+ my ($from_mailbox, $to_mailbox) = split(/ /, $args, 2);
+ fix_imap_params($from_mailbox, $to_mailbox);
+
+ logmsg "RENAME_imap got $args\n";
+
+ if (($from_mailbox eq "") || ($to_mailbox eq "")) {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ sendcontrol "$cmdid OK RENAME completed\r\n";
+ }
+
+ return 0;
+}
+
+sub CHECK_imap {
+ if ($selected eq "") {
+ sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
+ }
+ else {
+ sendcontrol "$cmdid OK CHECK completed\r\n";
+ }
+
+ return 0;
+}
+
+sub CLOSE_imap {
+ if ($selected eq "") {
+ sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
+ }
+ elsif (!@deleted) {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ sendcontrol "$cmdid OK CLOSE completed\r\n";
+
+ @deleted = ();
+ }
+
+ return 0;
+}
+
+sub EXPUNGE_imap {
+ if ($selected eq "") {
+ sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
+ }
+ else {
+ if (!@deleted) {
+ # Report the number of existing messages as per the SELECT
+ # command
+ sendcontrol "* 172 EXISTS\r\n";
+ }
+ else {
+ # Report the message UIDs being deleted
+ for my $d (@deleted) {
+ sendcontrol "* $d EXPUNGE\r\n";
+ }
+
+ @deleted = ();
+ }
+
+ sendcontrol "$cmdid OK EXPUNGE completed\r\n";
+ }
+
+ return 0;
+}
+
+sub COPY_imap {
+ my ($args) = @_;
+ my ($uid, $mailbox) = split(/ /, $args, 2);
+ fix_imap_params($uid, $mailbox);
+
+ logmsg "COPY_imap got $args\n";
+
+ if (($uid eq "") || ($mailbox eq "")) {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ sendcontrol "$cmdid OK COPY completed\r\n";
+ }
+
+ return 0;
+}
+
+sub UID_imap {
+ my ($args) = @_;
+ my ($command) = split(/ /, $args, 1);
+ fix_imap_params($command);
+
+ logmsg "UID_imap got $args\n";
+
+ if ($selected eq "") {
+ sendcontrol "$cmdid BAD Command received in Invalid state\r\n";
+ }
+ elsif (substr($command, 0, 5) eq "FETCH"){
+ my $func = $commandfunc{"FETCH"};
+ if($func) {
+ &$func($args, $command);
+ }
+ }
+ elsif (($command ne "COPY") &&
+ ($command ne "STORE") && ($command ne "SEARCH")) {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ my @data = getreplydata($selected);
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ sendcontrol "$cmdid OK $command completed\r\n";
+ }
+
+ return 0;
+}
+
+sub NOOP_imap {
+ my ($args) = @_;
+ my @data = (
+ "* 22 EXPUNGE\r\n",
+ "* 23 EXISTS\r\n",
+ "* 3 RECENT\r\n",
+ "* 14 FETCH (FLAGS (\\Seen \\Deleted))\r\n",
+ );
+
+ if ($args) {
+ sendcontrol "$cmdid BAD Command Argument\r\n";
+ }
+ else {
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ sendcontrol "$cmdid OK NOOP completed\r\n";
+ }
+
+ return 0;
+}
+
+sub LOGOUT_imap {
+ sendcontrol "* BYE curl IMAP server signing off\r\n";
+ sendcontrol "$cmdid OK LOGOUT completed\r\n";
+
+ return 0;
+}
+
+################
+################ POP3 commands
+################
+
+# Who is attempting to log in
+my $username;
+
+sub CAPA_pop3 {
+ my @list = ();
+ my $mechs;
+
+ # Calculate the capability list based on the specified capabilities
+ # (except APOP) and any authentication mechanisms
+ for my $c (@capabilities) {
+ push @list, "$c\r\n" unless $c eq "APOP";
+ }
+
+ for my $am (@auth_mechs) {
+ if(!$mechs) {
+ $mechs = "$am";
+ }
+ else {
+ $mechs .= " $am";
+ }
+ }
+
+ if($mechs) {
+ push @list, "SASL $mechs\r\n";
+ }
+
+ if(!@list) {
+ sendcontrol "-ERR Unrecognized command\r\n";
+ }
+ else {
+ my @data = ();
+
+ # Calculate the CAPA response
+ push @data, "+OK List of capabilities follows\r\n";
+
+ for my $l (@list) {
+ push @data, "$l\r\n";
+ }
+
+ push @data, "IMPLEMENTATION POP3 pingpong test server\r\n";
+
+ # Send the CAPA response
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ # End with the magic 3-byte end of listing marker
+ sendcontrol ".\r\n";
+ }
+
+ return 0;
+}
+
+sub APOP_pop3 {
+ my ($args) = @_;
+ my ($user, $secret) = split(/ /, $args, 2);
+
+ if (!grep /^APOP$/, @capabilities) {
+ sendcontrol "-ERR Unrecognized command\r\n";
+ }
+ elsif (($user eq "") || ($secret eq "")) {
+ sendcontrol "-ERR Protocol error\r\n";
+ }
+ else {
+ my $digest = Digest::MD5::md5_hex($POP3_TIMESTAMP, $TEXT_PASSWORD);
+
+ if ($secret ne $digest) {
+ sendcontrol "-ERR Login failure\r\n";
+ }
+ else {
+ sendcontrol "+OK Login successful\r\n";
+ }
+ }
+
+ return 0;
+}
+
+sub AUTH_pop3 {
+ if(!@auth_mechs) {
+ sendcontrol "-ERR Unrecognized command\r\n";
+ }
+ else {
+ my @data = ();
+
+ # Calculate the AUTH response
+ push @data, "+OK List of supported mechanisms follows\r\n";
+
+ for my $am (@auth_mechs) {
+ push @data, "$am\r\n";
+ }
+
+ # Send the AUTH response
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ # End with the magic 3-byte end of listing marker
+ sendcontrol ".\r\n";
+ }
+
+ return 0;
+}
+
+sub USER_pop3 {
+ my ($user) = @_;
+
+ logmsg "USER_pop3 got $user\n";
+
+ if (!$user) {
+ sendcontrol "-ERR Protocol error\r\n";
+ }
+ else {
+ $username = $user;
+
+ sendcontrol "+OK\r\n";
+ }
+
+ return 0;
+}
+
+sub PASS_pop3 {
+ my ($password) = @_;
+
+ logmsg "PASS_pop3 got $password\n";
+
+ sendcontrol "+OK Login successful\r\n";
+
+ return 0;
+}
+
+sub RETR_pop3 {
+ my ($msgid) = @_;
+ my @data;
+
+ if($msgid =~ /^verifiedserver$/) {
+ # this is the secret command that verifies that this actually is
+ # the curl test server
+ my $response = "WE ROOLZ: $$\r\n";
+ if($verbose) {
+ print STDERR "FTPD: We returned proof we are the test server\n";
+ }
+ $data[0] = $response;
+ logmsg "return proof we are we\n";
+ }
+ else {
+ # send mail content
+ logmsg "retrieve a mail\n";
+
+ @data = getreplydata($msgid);
+ }
+
+ sendcontrol "+OK Mail transfer starts\r\n";
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ # end with the magic 3-byte end of mail marker, assumes that the
+ # mail body ends with a CRLF!
+ sendcontrol ".\r\n";
+
+ return 0;
+}
+
+sub LIST_pop3 {
+ # This is a built-in fake-message list
+ my @data = (
+ "1 100\r\n",
+ "2 4294967400\r\n", # > 4 GB
+ "3 200\r\n",
+ );
+
+ logmsg "retrieve a message list\n";
+
+ sendcontrol "+OK Listing starts\r\n";
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ # End with the magic 3-byte end of listing marker
+ sendcontrol ".\r\n";
+
+ return 0;
+}
+
+sub DELE_pop3 {
+ my ($msgid) = @_;
+
+ logmsg "DELE_pop3 got $msgid\n";
+
+ if (!$msgid) {
+ sendcontrol "-ERR Protocol error\r\n";
+ }
+ else {
+ push (@deleted, $msgid);
+
+ sendcontrol "+OK\r\n";
+ }
+
+ return 0;
+}
+
+sub STAT_pop3 {
+ my ($args) = @_;
+
+ if ($args) {
+ sendcontrol "-ERR Protocol error\r\n";
+ }
+ else {
+ # Send statistics for the built-in fake message list as
+ # detailed in the LIST_pop3 function above
+ sendcontrol "+OK 3 4294967800\r\n";
+ }
+
+ return 0;
+}
+
+sub NOOP_pop3 {
+ my ($args) = @_;
+
+ if ($args) {
+ sendcontrol "-ERR Protocol error\r\n";
+ }
+ else {
+ sendcontrol "+OK\r\n";
+ }
+
+ return 0;
+}
+
+sub UIDL_pop3 {
+ # This is a built-in fake-message UID list
+ my @data = (
+ "1 1\r\n",
+ "2 2\r\n",
+ "3 4\r\n", # Note that UID 3 is a simulated "deleted" message
+ );
+
+ if (!grep /^UIDL$/, @capabilities) {
+ sendcontrol "-ERR Unrecognized command\r\n";
+ }
+ else {
+ logmsg "retrieve a message UID list\n";
+
+ sendcontrol "+OK Listing starts\r\n";
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ # End with the magic 3-byte end of listing marker
+ sendcontrol ".\r\n";
+ }
+
+ return 0;
+}
+
+sub TOP_pop3 {
+ my ($args) = @_;
+ my ($msgid, $lines) = split(/ /, $args, 2);
+
+ logmsg "TOP_pop3 got $args\n";
+
+ if (!grep /^TOP$/, @capabilities) {
+ sendcontrol "-ERR Unrecognized command\r\n";
+ }
+ elsif (($msgid eq "") || ($lines eq "")) {
+ sendcontrol "-ERR Protocol error\r\n";
+ }
+ else {
+ if ($lines == "0") {
+ logmsg "retrieve header of mail\n";
+ }
+ else {
+ logmsg "retrieve top $lines lines of mail\n";
+ }
+
+ my @data = getreplydata($msgid);
+
+ sendcontrol "+OK Mail transfer starts\r\n";
+
+ # Send mail content
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+
+ # End with the magic 3-byte end of mail marker, assumes that the
+ # mail body ends with a CRLF!
+ sendcontrol ".\r\n";
+ }
+
+ return 0;
+}
+
+sub RSET_pop3 {
+ my ($args) = @_;
+
+ if ($args) {
+ sendcontrol "-ERR Protocol error\r\n";
+ }
+ else {
+ if (@deleted) {
+ logmsg "resetting @deleted message(s)\n";
+
+ @deleted = ();
+ }
+
+ sendcontrol "+OK\r\n";
+ }
+
+ return 0;
+}
+
+sub QUIT_pop3 {
+ if(@deleted) {
+ logmsg "deleting @deleted message(s)\n";
+
+ @deleted = ();
+ }
+
+ sendcontrol "+OK curl POP3 server signing off\r\n";
+
+ return 0;
+}
+
+################
+################ FTP commands
+################
+my $rest=0;
+sub REST_ftp {
+ $rest = $_[0];
+ logmsg "Set REST position to $rest\n"
+}
+
+sub switch_directory_goto {
+ my $target_dir = $_;
+
+ if(!$ftptargetdir) {
+ $ftptargetdir = "/";
+ }
+
+ if($target_dir eq "") {
+ $ftptargetdir = "/";
+ }
+ elsif($target_dir eq "..") {
+ if($ftptargetdir eq "/") {
+ $ftptargetdir = "/";
+ }
+ else {
+ $ftptargetdir =~ s/[[:alnum:]]+\/$//;
+ }
+ }
+ else {
+ $ftptargetdir .= $target_dir . "/";
+ }
+}
+
+sub switch_directory {
+ my $target_dir = $_[0];
+
+ if($target_dir =~ /^test-(\d+)/) {
+ $cwd_testno = $1;
+ }
+ elsif($target_dir eq "/") {
+ $ftptargetdir = "/";
+ }
+ else {
+ my @dirs = split("/", $target_dir);
+ for(@dirs) {
+ switch_directory_goto($_);
+ }
+ }
+}
+
+sub CWD_ftp {
+ my ($folder, $fullcommand) = $_[0];
+ switch_directory($folder);
+ if($ftptargetdir =~ /^\/fully_simulated/) {
+ $ftplistparserstate = "enabled";
+ }
+ else {
+ undef $ftplistparserstate;
+ }
+}
+
+sub PWD_ftp {
+ my $mydir;
+ $mydir = $ftptargetdir ? $ftptargetdir : "/";
+
+ if($mydir ne "/") {
+ $mydir =~ s/\/$//;
+ }
+ sendcontrol "257 \"$mydir\" is current directory\r\n";
+}
+
+sub LIST_ftp {
+ # print "150 ASCII data connection for /bin/ls (193.15.23.1,59196) (0
bytes)\r\n";
+
+# this is a built-in fake-dir ;-)
+my @ftpdir=("total 20\r\n",
+"drwxr-xr-x 8 98 98 512 Oct 22 13:06 .\r\n",
+"drwxr-xr-x 8 98 98 512 Oct 22 13:06 ..\r\n",
+"drwxr-xr-x 2 98 98 512 May 2 1996 .NeXT\r\n",
+"-r--r--r-- 1 0 1 35 Jul 16 1996 README\r\n",
+"lrwxrwxrwx 1 0 1 7 Dec 9 1999 bin -> usr/bin\r\n",
+"dr-xr-xr-x 2 0 1 512 Oct 1 1997 dev\r\n",
+"drwxrwxrwx 2 98 98 512 May 29 16:04 download.html\r\n",
+"dr-xr-xr-x 2 0 1 512 Nov 30 1995 etc\r\n",
+"drwxrwxrwx 2 98 1 512 Oct 30 14:33 pub\r\n",
+"dr-xr-xr-x 5 0 1 512 Oct 1 1997 usr\r\n");
+
+ if($datasockf_conn eq 'no') {
+ if($nodataconn425) {
+ sendcontrol "150 Opening data connection\r\n";
+ sendcontrol "425 Can't open data connection\r\n";
+ }
+ elsif($nodataconn421) {
+ sendcontrol "150 Opening data connection\r\n";
+ sendcontrol "421 Connection timed out\r\n";
+ }
+ elsif($nodataconn150) {
+ sendcontrol "150 Opening data connection\r\n";
+ # client shall timeout
+ }
+ else {
+ # client shall timeout
+ }
+ return 0;
+ }
+
+ if($ftplistparserstate) {
+ @ftpdir = ftp_contentlist($ftptargetdir);
+ }
+
+ logmsg "pass LIST data on data connection\n";
+
+ if($cwd_testno) {
+ loadtest("$logdir/test$cwd_testno") ||
+ loadtest("$srcdir/data/test$cwd_testno");
+
+ my @data = getpart("reply", "data");
+ for(@data) {
+ my $send = $_;
+ # convert all \n to \r\n for ASCII transfer
+ $send =~ s/\r\n/\n/g;
+ $send =~ s/\n/\r\n/g;
+ logmsg "send $send as data\n";
+ senddata $send;
+ }
+ $cwd_testno = 0; # forget it again
+ }
+ else {
+ # old hard-coded style
+ for(@ftpdir) {
+ senddata $_;
+ }
+ }
+ close_dataconn(0);
+ sendcontrol "226 ASCII transfer complete\r\n";
+ return 0;
+}
+
+sub NLST_ftp {
+ my @ftpdir=("file", "with space", "fake", "..", " ..", "funny", "README");
+
+ if($datasockf_conn eq 'no') {
+ if($nodataconn425) {
+ sendcontrol "150 Opening data connection\r\n";
+ sendcontrol "425 Can't open data connection\r\n";
+ }
+ elsif($nodataconn421) {
+ sendcontrol "150 Opening data connection\r\n";
+ sendcontrol "421 Connection timed out\r\n";
+ }
+ elsif($nodataconn150) {
+ sendcontrol "150 Opening data connection\r\n";
+ # client shall timeout
+ }
+ else {
+ # client shall timeout
+ }
+ return 0;
+ }
+
+ logmsg "pass NLST data on data connection\n";
+ for(@ftpdir) {
+ senddata "$_\r\n";
+ }
+ close_dataconn(0);
+ sendcontrol "226 ASCII transfer complete\r\n";
+ return 0;
+}
+
+sub MDTM_ftp {
+ my $testno = $_[0];
+ my $testpart = "";
+ if ($testno > 10000) {
+ $testpart = $testno % 10000;
+ $testno = int($testno / 10000);
+ }
+
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
+
+ my @data = getpart("reply", "mdtm");
+
+ my $reply = $data[0];
+ chomp $reply if($reply);
+
+ if($reply && ($reply =~ /^[+-]?\d+$/) && ($reply < 0)) {
+ sendcontrol "550 $testno: no such file.\r\n";
+ }
+ elsif($reply) {
+ sendcontrol "$reply\r\n";
+ }
+ else {
+ sendcontrol "500 MDTM: no such command.\r\n";
+ }
+ return 0;
+}
+
+sub SIZE_ftp {
+ my $testno = $_[0];
+ if($ftplistparserstate) {
+ my $size = wildcard_filesize($ftptargetdir, $testno);
+ if($size == -1) {
+ sendcontrol "550 $testno: No such file or directory.\r\n";
+ }
+ else {
+ sendcontrol "213 $size\r\n";
+ }
+ return 0;
+ }
+
+ if($testno =~ /^verifiedserver$/) {
+ my $response = "WE ROOLZ: $$\r\n";
+ my $size = length($response);
+ sendcontrol "213 $size\r\n";
+ return 0;
+ }
+
+ if($testno =~ /(\d+)\/?$/) {
+ $testno = $1;
+ }
+ else {
+ print STDERR "SIZE_ftp: invalid test number: $testno\n";
+ return 1;
+ }
+
+ my $testpart = "";
+ if($testno > 10000) {
+ $testpart = $testno % 10000;
+ $testno = int($testno / 10000);
+ }
+
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
+
+ my @data = getpart("reply", "size");
+
+ my $size = $data[0];
+
+ if($size) {
+ if($size > -1) {
+ sendcontrol "213 $size\r\n";
+ }
+ else {
+ sendcontrol "550 $testno: No such file or directory.\r\n";
+ }
+ }
+ else {
+ $size=0;
+ @data = getpart("reply", "data$testpart");
+ for(@data) {
+ $size += length($_);
+ }
+ if($size) {
+ sendcontrol "213 $size\r\n";
+ }
+ else {
+ sendcontrol "550 $testno: No such file or directory.\r\n";
+ }
+ }
+ return 0;
+}
+
+sub RETR_ftp {
+ my ($testno) = @_;
+
+ if($datasockf_conn eq 'no') {
+ if($nodataconn425) {
+ sendcontrol "150 Opening data connection\r\n";
+ sendcontrol "425 Can't open data connection\r\n";
+ }
+ elsif($nodataconn421) {
+ sendcontrol "150 Opening data connection\r\n";
+ sendcontrol "421 Connection timed out\r\n";
+ }
+ elsif($nodataconn150) {
+ sendcontrol "150 Opening data connection\r\n";
+ # client shall timeout
+ }
+ else {
+ # client shall timeout
+ }
+ return 0;
+ }
+
+ if($ftplistparserstate) {
+ my @content = wildcard_getfile($ftptargetdir, $testno);
+ if($content[0] == -1) {
+ #file not found
+ }
+ else {
+ my $size = length $content[1];
+ sendcontrol "150 Binary data connection for $testno ($size
bytes).\r\n",
+ senddata $content[1];
+ close_dataconn(0);
+ sendcontrol "226 File transfer complete\r\n";
+ }
+ return 0;
+ }
+
+ if($testno =~ /^verifiedserver$/) {
+ # this is the secret command that verifies that this actually is
+ # the curl test server
+ my $response = "WE ROOLZ: $$\r\n";
+ my $len = length($response);
+ sendcontrol "150 Binary junk ($len bytes).\r\n";
+ senddata "WE ROOLZ: $$\r\n";
+ close_dataconn(0);
+ sendcontrol "226 File transfer complete\r\n";
+ if($verbose) {
+ print STDERR "FTPD: We returned proof we are the test server\n";
+ }
+ return 0;
+ }
+
+ $testno =~ s/^([^0-9]*)//;
+ my $testpart = "";
+ if ($testno > 10000) {
+ $testpart = $testno % 10000;
+ $testno = int($testno / 10000);
+ }
+
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
+
+ my @data = getpart("reply", "data$testpart");
+
+ my $size=0;
+ for(@data) {
+ $size += length($_);
+ }
+
+ my %hash = getpartattr("reply", "data$testpart");
+
+ if($size || $hash{'sendzero'}) {
+
+ if($rest) {
+ # move read pointer forward
+ $size -= $rest;
+ logmsg "REST $rest was removed from size, makes $size left\n";
+ $rest = 0; # reset REST offset again
+ }
+ if($retrweirdo) {
+ sendcontrol "150 Binary data connection for $testno () ($size
bytes).\r\n",
+ "226 File transfer complete\r\n";
+
+ for(@data) {
+ my $send = $_;
+ senddata $send;
+ }
+ close_dataconn(0);
+ $retrweirdo=0; # switch off the weirdo again!
+ }
+ else {
+ my $sz = "($size bytes)";
+ if($retrnosize) {
+ $sz = "size?";
+ }
+
+ sendcontrol "150 Binary data connection for $testno () $sz.\r\n";
+
+ for(@data) {
+ my $send = $_;
+ senddata $send;
+ }
+ close_dataconn(0);
+ sendcontrol "226 File transfer complete\r\n";
+ }
+ }
+ else {
+ sendcontrol "550 $testno: No such file or directory.\r\n";
+ }
+ return 0;
+}
+
+sub STOR_ftp {
+ my $testno=$_[0];
+
+ my $filename = "log/upload.$testno";
+
+ if($datasockf_conn eq 'no') {
+ if($nodataconn425) {
+ sendcontrol "150 Opening data connection\r\n";
+ sendcontrol "425 Can't open data connection\r\n";
+ }
+ elsif($nodataconn421) {
+ sendcontrol "150 Opening data connection\r\n";
+ sendcontrol "421 Connection timed out\r\n";
+ }
+ elsif($nodataconn150) {
+ sendcontrol "150 Opening data connection\r\n";
+ # client shall timeout
+ }
+ else {
+ # client shall timeout
+ }
+ return 0;
+ }
+
+ logmsg "STOR test number $testno in $filename\n";
+
+ sendcontrol "125 Gimme gimme gimme!\r\n";
+
+ open(FILE, ">$filename") ||
+ return 0; # failed to open output
+
+ my $line;
+ my $ulsize=0;
+ my $disc=0;
+ while (5 == (sysread DREAD, $line, 5)) {
+ if($line eq "DATA\n") {
+ my $i;
+ sysread DREAD, $i, 5;
+
+ my $size = 0;
+ if($i =~ /^([0-9a-fA-F]{4})\n/) {
+ $size = hex($1);
+ }
+
+ read_datasockf(\$line, $size);
+
+ #print STDERR " GOT: $size bytes\n";
+
+ $ulsize += $size;
+ print FILE $line if(!$nosave);
+ logmsg "> Appending $size bytes to file\n";
+ }
+ elsif($line eq "DISC\n") {
+ # disconnect!
+ $disc=1;
+ last;
+ }
+ else {
+ logmsg "No support for: $line";
+ last;
+ }
++ if($storeresp) {
++ # abort early
++ last;
++ }
+ }
+ if($nosave) {
+ print FILE "$ulsize bytes would've been stored here\n";
+ }
+ close(FILE);
+ close_dataconn($disc);
+ logmsg "received $ulsize bytes upload\n";
- sendcontrol "226 File transfer complete\r\n";
++ if($storeresp) {
++ sendcontrol "$storeresp\r\n";
++ }
++ else {
++ sendcontrol "226 File transfer complete\r\n";
++ }
+ return 0;
+}
+
+sub PASV_ftp {
+ my ($arg, $cmd)=@_;
+ my $pasvport;
+ my $bindonly = ($nodataconn) ? '--bindonly' : '';
+
+ # kill previous data connection sockfilt when alive
+ if($datasockf_runs eq 'yes') {
+ killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
+ logmsg "DATA sockfilt for $datasockf_mode data channel killed\n";
+ }
+ datasockf_state('STOPPED');
+
+ logmsg "====> Passive DATA channel requested by client\n";
+
+ logmsg "DATA sockfilt for passive data channel starting...\n";
+
+ # We fire up a new sockfilt to do the data transfer for us.
+ my $datasockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
+ "--ipv$ipvnum $bindonly --port 0 " .
+ "--pidfile \"$datasockf_pidfile\" " .
+ "--logfile \"$datasockf_logfile\"";
+ $slavepid = open2(\*DREAD, \*DWRITE, $datasockfcmd);
+
+ if($nodataconn) {
+ datasockf_state('PASSIVE_NODATACONN');
+ }
+ else {
+ datasockf_state('PASSIVE');
+ }
+
+ print STDERR "$datasockfcmd\n" if($verbose);
+
+ print DWRITE "PING\n";
+ my $pong;
+ sysread_or_die(\*DREAD, \$pong, 5);
+
+ if($pong =~ /^FAIL/) {
+ logmsg "DATA sockfilt said: FAIL\n";
+ logmsg "DATA sockfilt for passive data channel failed\n";
+ logmsg "DATA sockfilt not running\n";
+ datasockf_state('STOPPED');
+ sendcontrol "500 no free ports!\r\n";
+ return;
+ }
+ elsif($pong !~ /^PONG/) {
+ logmsg "DATA sockfilt unexpected response: $pong\n";
+ logmsg "DATA sockfilt for passive data channel failed\n";
+ logmsg "DATA sockfilt killed now\n";
+ killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
+ logmsg "DATA sockfilt not running\n";
+ datasockf_state('STOPPED');
+ sendcontrol "500 no free ports!\r\n";
+ return;
+ }
+
+ logmsg "DATA sockfilt for passive data channel started (pid $slavepid)\n";
+
+ # Find out on what port we listen on or have bound
+ my $i;
+ print DWRITE "PORT\n";
+
+ # READ the response code
+ sysread_or_die(\*DREAD, \$i, 5);
+
+ # READ the response size
+ sysread_or_die(\*DREAD, \$i, 5);
+
+ my $size = 0;
+ if($i =~ /^([0-9a-fA-F]{4})\n/) {
+ $size = hex($1);
+ }
+
+ # READ the response data
+ read_datasockf(\$i, $size);
+
+ # The data is in the format
+ # IPvX/NNN
+
+ if($i =~ /IPv(\d)\/(\d+)/) {
+ # FIX: deal with IP protocol version
+ $pasvport = $2;
+ }
+
+ if(!$pasvport) {
+ logmsg "DATA sockfilt unknown listener port\n";
+ logmsg "DATA sockfilt for passive data channel failed\n";
+ logmsg "DATA sockfilt killed now\n";
+ killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
+ logmsg "DATA sockfilt not running\n";
+ datasockf_state('STOPPED');
+ sendcontrol "500 no free ports!\r\n";
+ return;
+ }
+
+ if($nodataconn) {
+ my $str = nodataconn_str();
+ logmsg "DATA sockfilt for passive data channel ($str) bound on port ".
+ "$pasvport\n";
+ }
+ else {
+ logmsg "DATA sockfilt for passive data channel listens on port ".
+ "$pasvport\n";
+ }
+
+ if($cmd ne "EPSV") {
+ # PASV reply
+ my $p=$listenaddr;
+ $p =~ s/\./,/g;
+ if($pasvbadip) {
+ $p="1,2,3,4";
+ }
+ sendcontrol sprintf("227 Entering Passive Mode ($p,%d,%d)\n",
+ int($pasvport/256), int($pasvport%256));
+ }
+ else {
+ # EPSV reply
+ sendcontrol sprintf("229 Entering Passive Mode (|||%d|)\n",
$pasvport);
+ }
+
+ logmsg "Client has been notified that DATA conn ".
+ "will be accepted on port $pasvport\n";
+
+ if($nodataconn) {
+ my $str = nodataconn_str();
+ logmsg "====> Client fooled ($str)\n";
+ return;
+ }
+
+ eval {
+ local $SIG{ALRM} = sub { die "alarm\n" };
+
+ # assume swift operations unless explicitly slow
+ alarm ($datadelay?20:10);
+
+ # Wait for 'CNCT'
+ my $input;
+
+ # FIX: Monitor ctrl conn for disconnect
+
+ while(sysread(DREAD, $input, 5)) {
+
+ if($input !~ /^CNCT/) {
+ # we wait for a connected client
+ logmsg "Odd, we got $input from client\n";
+ next;
+ }
+ logmsg "Client connects to port $pasvport\n";
+ last;
+ }
+ alarm 0;
+ };
+ if ($@) {
+ # timed out
+ logmsg "$srvrname server timed out awaiting data connection ".
+ "on port $pasvport\n";
+ logmsg "accept failed or connection not even attempted\n";
+ logmsg "DATA sockfilt killed now\n";
+ killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
+ logmsg "DATA sockfilt not running\n";
+ datasockf_state('STOPPED');
+ return;
+ }
+ else {
+ logmsg "====> Client established passive DATA connection ".
+ "on port $pasvport\n";
+ }
+
+ return;
+}
+
+#
+# Support both PORT and EPRT here.
+#
+
+sub PORT_ftp {
+ my ($arg, $cmd) = @_;
+ my $port;
+ my $addr;
+
+ # kill previous data connection sockfilt when alive
+ if($datasockf_runs eq 'yes') {
+ killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
+ logmsg "DATA sockfilt for $datasockf_mode data channel killed\n";
+ }
+ datasockf_state('STOPPED');
+
+ logmsg "====> Active DATA channel requested by client\n";
+
+ # We always ignore the given IP and use localhost.
+
+ if($cmd eq "PORT") {
+ if($arg !~ /(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)/) {
+ logmsg "DATA sockfilt for active data channel not started ".
+ "(bad PORT-line: $arg)\n";
+ sendcontrol "500 silly you, go away\r\n";
+ return;
+ }
+ $port = ($5<<8)+$6;
+ $addr = "$1.$2.$3.$4";
+ }
+ # EPRT |2|::1|49706|
+ elsif($cmd eq "EPRT") {
+ if($arg !~ /(\d+)\|([^\|]+)\|(\d+)/) {
+ logmsg "DATA sockfilt for active data channel not started ".
+ "(bad EPRT-line: $arg)\n";
+ sendcontrol "500 silly you, go away\r\n";
+ return;
+ }
+ sendcontrol "200 Thanks for dropping by. We contact you later\r\n";
+ $port = $3;
+ $addr = $2;
+ }
+ else {
+ logmsg "DATA sockfilt for active data channel not started ".
+ "(invalid command: $cmd)\n";
+ sendcontrol "500 we don't like $cmd now\r\n";
+ return;
+ }
+
+ if(!$port || $port > 65535) {
+ logmsg "DATA sockfilt for active data channel not started ".
+ "(illegal PORT number: $port)\n";
+ return;
+ }
+
+ if($nodataconn) {
+ my $str = nodataconn_str();
+ logmsg "DATA sockfilt for active data channel not started ($str)\n";
+ datasockf_state('ACTIVE_NODATACONN');
+ logmsg "====> Active DATA channel not established\n";
+ return;
+ }
+
+ logmsg "DATA sockfilt for active data channel starting...\n";
+
+ # We fire up a new sockfilt to do the data transfer for us.
+ my $datasockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
+ "--ipv$ipvnum --connect $port --addr \"$addr\" " .
+ "--pidfile \"$datasockf_pidfile\" " .
+ "--logfile \"$datasockf_logfile\"";
+ $slavepid = open2(\*DREAD, \*DWRITE, $datasockfcmd);
+
+ datasockf_state('ACTIVE');
+
+ print STDERR "$datasockfcmd\n" if($verbose);
+
+ print DWRITE "PING\n";
+ my $pong;
+ sysread_or_die(\*DREAD, \$pong, 5);
+
+ if($pong =~ /^FAIL/) {
+ logmsg "DATA sockfilt said: FAIL\n";
+ logmsg "DATA sockfilt for active data channel failed\n";
+ logmsg "DATA sockfilt not running\n";
+ datasockf_state('STOPPED');
+ # client shall timeout awaiting connection from server
+ return;
+ }
+ elsif($pong !~ /^PONG/) {
+ logmsg "DATA sockfilt unexpected response: $pong\n";
+ logmsg "DATA sockfilt for active data channel failed\n";
+ logmsg "DATA sockfilt killed now\n";
+ killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
+ logmsg "DATA sockfilt not running\n";
+ datasockf_state('STOPPED');
+ # client shall timeout awaiting connection from server
+ return;
+ }
+
+ logmsg "DATA sockfilt for active data channel started (pid $slavepid)\n";
+
+ logmsg "====> Active DATA channel connected to client port $port\n";
+
+ return;
+}
+
+#**********************************************************************
+# datasockf_state is used to change variables that keep state info
+# relative to the FTP secondary or data sockfilt process as soon as
+# one of the five possible stable states is reached. Variables that
+# are modified by this sub may be checked independently but should
+# not be changed except by calling this sub.
+#
+sub datasockf_state {
+ my $state = $_[0];
+
+ if($state eq 'STOPPED') {
+ # Data sockfilter initial state, not running,
+ # not connected and not used.
+ $datasockf_state = $state;
+ $datasockf_mode = 'none';
+ $datasockf_runs = 'no';
+ $datasockf_conn = 'no';
+ }
+ elsif($state eq 'PASSIVE') {
+ # Data sockfilter accepted connection from client.
+ $datasockf_state = $state;
+ $datasockf_mode = 'passive';
+ $datasockf_runs = 'yes';
+ $datasockf_conn = 'yes';
+ }
+ elsif($state eq 'ACTIVE') {
+ # Data sockfilter has connected to client.
+ $datasockf_state = $state;
+ $datasockf_mode = 'active';
+ $datasockf_runs = 'yes';
+ $datasockf_conn = 'yes';
+ }
+ elsif($state eq 'PASSIVE_NODATACONN') {
+ # Data sockfilter bound port without listening,
+ # client won't be able to establish data connection.
+ $datasockf_state = $state;
+ $datasockf_mode = 'passive';
+ $datasockf_runs = 'yes';
+ $datasockf_conn = 'no';
+ }
+ elsif($state eq 'ACTIVE_NODATACONN') {
+ # Data sockfilter does not even run,
+ # client awaits data connection from server in vain.
+ $datasockf_state = $state;
+ $datasockf_mode = 'active';
+ $datasockf_runs = 'no';
+ $datasockf_conn = 'no';
+ }
+ else {
+ die "Internal error. Unknown datasockf state: $state!";
+ }
+}
+
+#**********************************************************************
+# nodataconn_str returns string of effective nodataconn command. Notice
+# that $nodataconn may be set alone or in addition to a $nodataconnXXX.
+#
+sub nodataconn_str {
+ my $str;
+ # order matters
+ $str = 'NODATACONN' if($nodataconn);
+ $str = 'NODATACONN425' if($nodataconn425);
+ $str = 'NODATACONN421' if($nodataconn421);
+ $str = 'NODATACONN150' if($nodataconn150);
+ return "$str";
+}
+
+#**********************************************************************
+# customize configures test server operation for each curl test, reading
+# configuration commands/parameters from server commands file each time
+# a new client control connection is established with the test server.
+# On success returns 1, otherwise zero.
+#
+sub customize {
+ $ctrldelay = 0; # default is no throttling of the ctrl stream
+ $datadelay = 0; # default is no throttling of the data stream
+ $retrweirdo = 0; # default is no use of RETRWEIRDO
+ $retrnosize = 0; # default is no use of RETRNOSIZE
+ $pasvbadip = 0; # default is no use of PASVBADIP
+ $nosave = 0; # default is to actually save uploaded data to file
+ $nodataconn = 0; # default is to establish or accept data channel
+ $nodataconn425 = 0; # default is to not send 425 without data channel
+ $nodataconn421 = 0; # default is to not send 421 without data channel
+ $nodataconn150 = 0; # default is to not send 150 without data channel
++ $storeresp = ""; # send as ultimate STOR response
+ @capabilities = (); # default is to not support capability commands
+ @auth_mechs = (); # default is to not support authentication commands
+ %fulltextreply = ();#
+ %commandreply = (); #
+ %customcount = (); #
+ %delayreply = (); #
+
+ open(CUSTOM, "<log/ftpserver.cmd") ||
+ return 1;
+
+ logmsg "FTPD: Getting commands from log/ftpserver.cmd\n";
+
+ while(<CUSTOM>) {
+ if($_ =~ /REPLY \"([A-Z]+ [A-Za-z0-9+-\/=\*. ]+)\" (.*)/) {
+ $fulltextreply{$1}=eval "qq{$2}";
+ logmsg "FTPD: set custom reply for $1\n";
+ }
+ elsif($_ =~ /REPLY(LF|) ([A-Za-z0-9+\/=\*]*) (.*)/) {
+ $commandreply{$2}=eval "qq{$3}";
+ if($1 ne "LF") {
+ $commandreply{$2}.="\r\n";
+ }
+ else {
+ $commandreply{$2}.="\n";
+ }
+ if($2 eq "") {
+ logmsg "FTPD: set custom reply for empty command\n";
+ }
+ else {
+ logmsg "FTPD: set custom reply for $2 command\n";
+ }
+ }
+ elsif($_ =~ /COUNT ([A-Z]+) (.*)/) {
+ # we blank the custom reply for this command when having
+ # been used this number of times
+ $customcount{$1}=$2;
+ logmsg "FTPD: blank custom reply for $1 command after $2 uses\n";
+ }
+ elsif($_ =~ /DELAY ([A-Z]+) (\d*)/) {
+ $delayreply{$1}=$2;
+ logmsg "FTPD: delay reply for $1 with $2 seconds\n";
+ }
+ elsif($_ =~ /SLOWDOWN/) {
+ $ctrldelay=1;
+ $datadelay=1;
+ logmsg "FTPD: send response with 0.01 sec delay between each
byte\n";
+ }
+ elsif($_ =~ /RETRWEIRDO/) {
+ logmsg "FTPD: instructed to use RETRWEIRDO\n";
+ $retrweirdo=1;
+ }
+ elsif($_ =~ /RETRNOSIZE/) {
+ logmsg "FTPD: instructed to use RETRNOSIZE\n";
+ $retrnosize=1;
+ }
+ elsif($_ =~ /PASVBADIP/) {
+ logmsg "FTPD: instructed to use PASVBADIP\n";
+ $pasvbadip=1;
+ }
+ elsif($_ =~ /NODATACONN425/) {
+ # applies to both active and passive FTP modes
+ logmsg "FTPD: instructed to use NODATACONN425\n";
+ $nodataconn425=1;
+ $nodataconn=1;
+ }
+ elsif($_ =~ /NODATACONN421/) {
+ # applies to both active and passive FTP modes
+ logmsg "FTPD: instructed to use NODATACONN421\n";
+ $nodataconn421=1;
+ $nodataconn=1;
+ }
+ elsif($_ =~ /NODATACONN150/) {
+ # applies to both active and passive FTP modes
+ logmsg "FTPD: instructed to use NODATACONN150\n";
+ $nodataconn150=1;
+ $nodataconn=1;
+ }
+ elsif($_ =~ /NODATACONN/) {
+ # applies to both active and passive FTP modes
+ logmsg "FTPD: instructed to use NODATACONN\n";
+ $nodataconn=1;
+ }
++ elsif($_ =~ /^STOR (.*)/) {
++ $storeresp=$1;
++ logmsg "FTPD: instructed to use respond to STOR with
'$storeresp'\n";
++ }
+ elsif($_ =~ /CAPA (.*)/) {
+ logmsg "FTPD: instructed to support CAPABILITY command\n";
+ @capabilities = split(/ (?!(?:[^" ]|[^"] [^"])+")/, $1);
+ foreach (@capabilities) {
+ $_ = $1 if /^"(.*)"$/;
+ }
+ }
+ elsif($_ =~ /AUTH (.*)/) {
+ logmsg "FTPD: instructed to support AUTHENTICATION command\n";
+ @auth_mechs = split(/ /, $1);
+ }
+ elsif($_ =~ /NOSAVE/) {
+ # don't actually store the file we upload - to be used when
+ # uploading insanely huge amounts
+ $nosave = 1;
+ logmsg "FTPD: NOSAVE prevents saving of uploaded data\n";
+ }
+ elsif($_ =~ /^Testnum (\d+)/){
+ $testno = $1;
+ logmsg "FTPD: run test case number: $testno\n";
+ }
+ }
+ close(CUSTOM);
+}
+
+#----------------------------------------------------------------------
+#----------------------------------------------------------------------
+#--------------------------- END OF SUBS ----------------------------
+#----------------------------------------------------------------------
+#----------------------------------------------------------------------
+
+#**********************************************************************
+# Parse command line options
+#
+# Options:
+#
+# --verbose # verbose
+# --srcdir # source directory
+# --id # server instance number
+# --proto # server protocol
+# --pidfile # server pid file
+# --portfile # server port file
+# --logfile # server log file
+# --ipv4 # server IP version 4
+# --ipv6 # server IP version 6
+# --port # server listener port
+# --addr # server address for listener port binding
+#
+while(@ARGV) {
+ if($ARGV[0] eq '--verbose') {
+ $verbose = 1;
+ }
+ elsif($ARGV[0] eq '--srcdir') {
+ if($ARGV[1]) {
+ $srcdir = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--id') {
+ if($ARGV[1] && ($ARGV[1] =~ /^(\d+)$/)) {
+ $idnum = $1 if($1 > 0);
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--proto') {
+ if($ARGV[1] && ($ARGV[1] =~ /^(ftp|imap|pop3|smtp)$/)) {
+ $proto = $1;
+ shift @ARGV;
+ }
+ else {
+ die "unsupported protocol $ARGV[1]";
+ }
+ }
+ elsif($ARGV[0] eq '--pidfile') {
+ if($ARGV[1]) {
+ $pidfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--portfile') {
+ if($ARGV[1]) {
+ $portfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--logfile') {
+ if($ARGV[1]) {
+ $logfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--ipv4') {
+ $ipvnum = 4;
+ $listenaddr = '127.0.0.1' if($listenaddr eq '::1');
+ }
+ elsif($ARGV[0] eq '--ipv6') {
+ $ipvnum = 6;
+ $listenaddr = '::1' if($listenaddr eq '127.0.0.1');
+ }
+ elsif($ARGV[0] eq '--port') {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $port = $1;
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--addr') {
+ if($ARGV[1]) {
+ my $tmpstr = $ARGV[1];
+ if($tmpstr =~ /^(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)$/)
{
+ $listenaddr = "$1.$2.$3.$4" if($ipvnum == 4);
+ }
+ elsif($ipvnum == 6) {
+ $listenaddr = $tmpstr;
+ $listenaddr =~ s/^\[(.*)\]$/$1/;
+ }
+ shift @ARGV;
+ }
+ }
+ else {
+ print STDERR "\nWarning: ftpserver.pl unknown parameter: $ARGV[0]\n";
+ }
+ shift @ARGV;
+}
+
+#***************************************************************************
+# Initialize command line option dependent variables
+#
+
+if(!$srcdir) {
+ $srcdir = $ENV{'srcdir'} || '.';
+}
+if(!$pidfile) {
+ $pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
+}
+if(!$logfile) {
+ $logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
+}
+
+$mainsockf_pidfile = "$path/".
+ mainsockf_pidfilename($proto, $ipvnum, $idnum);
+$mainsockf_logfile =
+ mainsockf_logfilename($logdir, $proto, $ipvnum, $idnum);
+
+if($proto eq 'ftp') {
+ $datasockf_pidfile = "$path/".
+ datasockf_pidfilename($proto, $ipvnum, $idnum);
+ $datasockf_logfile =
+ datasockf_logfilename($logdir, $proto, $ipvnum, $idnum);
+}
+
+$srvrname = servername_str($proto, $ipvnum, $idnum);
+
+$idstr = "$idnum" if($idnum > 1);
+
+protocolsetup($proto);
+
+$SIG{INT} = \&exit_signal_handler;
+$SIG{TERM} = \&exit_signal_handler;
+
+startsf();
+
+# actual port
+if($portfile && !$port) {
+ my $aport;
+ open(P, "<$portfile");
+ $aport = <P>;
+ close(P);
+ $port = 0 + $aport;
+}
+
+logmsg sprintf("%s server listens on port IPv${ipvnum}/${port}\n",
uc($proto));
+
+open(PID, ">$pidfile");
+print PID $$."\n";
+close(PID);
+
+logmsg("logged pid $$ in $pidfile\n");
+
+while(1) {
+
+ # kill previous data connection sockfilt when alive
+ if($datasockf_runs eq 'yes') {
+ killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
+ logmsg "DATA sockfilt for $datasockf_mode data channel killed now\n";
+ }
+ datasockf_state('STOPPED');
+
+ #
+ # We read 'sockfilt' commands.
+ #
+ my $input;
+
+ logmsg "Awaiting input\n";
+ sysread_or_die(\*SFREAD, \$input, 5);
+
+ if($input !~ /^CNCT/) {
+ # we wait for a connected client
+ logmsg "MAIN sockfilt said: $input";
+ next;
+ }
+ logmsg "====> Client connect\n";
+
+ set_advisor_read_lock($SERVERLOGS_LOCK);
+ $serverlogslocked = 1;
+
+ # flush data:
+ $| = 1;
+
+ &customize(); # read test control instructions
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
+
+ my $welcome = $commandreply{"welcome"};
+ if(!$welcome) {
+ $welcome = $displaytext{"welcome"};
+ }
+ else {
+ # clear it after use
+ $commandreply{"welcome"}="";
+ if($welcome !~ /\r\n\z/) {
+ $welcome .= "\r\n";
+ }
+ }
+ sendcontrol $welcome;
+
+ #remove global variables from last connection
+ if($ftplistparserstate) {
+ undef $ftplistparserstate;
+ }
+ if($ftptargetdir) {
+ $ftptargetdir = "";
+ }
+
+ if($verbose) {
+ print STDERR "OUT: $welcome";
+ }
+
+ my $full = "";
+
+ while(1) {
+ my $i;
+
+ # Now we expect to read DATA\n[hex size]\n[prot], where the [prot]
+ # part only is FTP lingo.
+
+ # COMMAND
+ sysread_or_die(\*SFREAD, \$i, 5);
+
+ if($i !~ /^DATA/) {
+ logmsg "MAIN sockfilt said $i";
+ if($i =~ /^DISC/) {
+ # disconnect
+ last;
+ }
+ next;
+ }
+
+ # SIZE of data
+ sysread_or_die(\*SFREAD, \$i, 5);
+
+ my $size = 0;
+ if($i =~ /^([0-9a-fA-F]{4})\n/) {
+ $size = hex($1);
+ }
+
+ # data
+ read_mainsockf(\$input, $size);
+
+ ftpmsg $input;
+
+ $full .= $input;
+
+ # Loop until command completion
+ next unless($full =~ /\r\n$/);
+
+ # Remove trailing CRLF.
+ $full =~ s/[\n\r]+$//;
+
+ my $FTPCMD;
+ my $FTPARG;
+ if($proto eq "imap") {
+ # IMAP is different with its identifier first on the command line
+ if(($full =~ /^([^ ]+) ([^ ]+) (.*)/) ||
+ ($full =~ /^([^ ]+) ([^ ]+)/)) {
+ $cmdid=$1; # set the global variable
+ $FTPCMD=$2;
+ $FTPARG=$3;
+ }
+ # IMAP authentication cancellation
+ elsif($full =~ /^\*$/) {
+ # Command id has already been set
+ $FTPCMD="*";
+ $FTPARG="";
+ }
+ # IMAP long "commands" are base64 authentication data
+ elsif($full =~ /^[A-Z0-9+\/]*={0,2}$/i) {
+ # Command id has already been set
+ $FTPCMD=$full;
+ $FTPARG="";
+ }
+ else {
+ sendcontrol "$full BAD Command\r\n";
+ last;
+ }
+ }
+ elsif($full =~ /^([A-Z]{3,4})(\s(.*))?$/i) {
+ $FTPCMD=$1;
+ $FTPARG=$3;
+ }
+ elsif($proto eq "pop3") {
+ # POP3 authentication cancellation
+ if($full =~ /^\*$/) {
+ $FTPCMD="*";
+ $FTPARG="";
+ }
+ # POP3 long "commands" are base64 authentication data
+ elsif($full =~ /^[A-Z0-9+\/]*={0,2}$/i) {
+ $FTPCMD=$full;
+ $FTPARG="";
+ }
+ else {
+ sendcontrol "-ERR Unrecognized command\r\n";
+ last;
+ }
+ }
+ elsif($proto eq "smtp") {
+ # SMTP authentication cancellation
+ if($full =~ /^\*$/) {
+ $FTPCMD="*";
+ $FTPARG="";
+ }
+ # SMTP long "commands" are base64 authentication data
+ elsif($full =~ /^[A-Z0-9+\/]{0,512}={0,2}$/i) {
+ $FTPCMD=$full;
+ $FTPARG="";
+ }
+ else {
+ sendcontrol "500 Unrecognized command\r\n";
+ last;
+ }
+ }
+ else {
+ sendcontrol "500 Unrecognized command\r\n";
+ last;
+ }
+
+ logmsg "< \"$full\"\n";
+
+ if($verbose) {
+ print STDERR "IN: $full\n";
+ }
+
+ $full = "";
+
+ my $delay = $delayreply{$FTPCMD};
+ if($delay) {
+ # just go sleep this many seconds!
+ logmsg("Sleep for $delay seconds\n");
+ my $twentieths = $delay * 20;
+ while($twentieths--) {
+ portable_sleep(0.05) unless($got_exit_signal);
+ }
+ }
+
+ my $check = 1; # no response yet
+
+ # See if there is a custom reply for the full text
+ my $fulltext = $FTPARG ? $FTPCMD . " " . $FTPARG : $FTPCMD;
+ my $text = $fulltextreply{$fulltext};
+ if($text && ($text ne "")) {
+ sendcontrol "$text\r\n";
+ $check = 0;
+ }
+ else {
+ # See if there is a custom reply for the command
+ $text = $commandreply{$FTPCMD};
+ if($text && ($text ne "")) {
+ if($customcount{$FTPCMD} && (!--$customcount{$FTPCMD})) {
+ # used enough times so blank the custom command reply
+ $commandreply{$FTPCMD}="";
+ }
+
+ sendcontrol $text;
+ $check = 0;
+ }
+ else {
+ # See if there is any display text for the command
+ $text = $displaytext{$FTPCMD};
+ if($text && ($text ne "")) {
+ if($proto eq 'imap') {
+ sendcontrol "$cmdid $text\r\n";
+ }
+ else {
+ sendcontrol "$text\r\n";
+ }
+
+ $check = 0;
+ }
+
+ # only perform this if we're not faking a reply
+ my $func = $commandfunc{uc($FTPCMD)};
+ if($func) {
+ &$func($FTPARG, $FTPCMD);
+ $check = 0;
+ }
+ }
+ }
+
+ if($check) {
+ logmsg "$FTPCMD wasn't handled!\n";
+ if($proto eq 'pop3') {
+ sendcontrol "-ERR $FTPCMD is not dealt with!\r\n";
+ }
+ elsif($proto eq 'imap') {
+ sendcontrol "$cmdid BAD $FTPCMD is not dealt with!\r\n";
+ }
+ else {
+ sendcontrol "500 $FTPCMD is not dealt with!\r\n";
+ }
+ }
+
+ } # while(1)
+ logmsg "====> Client disconnected\n";
+
+ if($serverlogslocked) {
+ $serverlogslocked = 0;
+ clear_advisor_read_lock($SERVERLOGS_LOCK);
+ }
+}
+
+killsockfilters($proto, $ipvnum, $idnum, $verbose);
+unlink($pidfile);
+if($serverlogslocked) {
+ $serverlogslocked = 0;
+ clear_advisor_read_lock($SERVERLOGS_LOCK);
+}
+
+exit;
diff --cc tests/http2-server.pl.in
index 2358ad3fa,000000000..1dcc8a695
mode 100755,000000..100755
--- a/tests/http2-server.pl.in
+++ b/tests/http2-server.pl.in
@@@ -1,83 -1,0 +1,83 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2016 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+# This script invokes nghttpx properly to have it serve HTTP/2 for us.
+# nghttpx runs as a proxy in front of our "actual" HTTP/1 server.
+
+my $pidfile = "log/nghttpx.pid";
+my $logfile = "log/http2.log";
+my $nghttpx = "nghttpx";
+my $listenport = 9015;
+my $connect = "127.0.0.1,8990";
+
+#***************************************************************************
+# Process command line options
+#
+while(@ARGV) {
+ if($ARGV[0] eq '--verbose') {
+ $verbose = 1;
+ }
+ elsif($ARGV[0] eq '--pidfile') {
+ if($ARGV[1]) {
+ $pidfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--nghttpx') {
+ if($ARGV[1]) {
+ $nghttpx = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--port') {
+ if($ARGV[1]) {
+ $listenport = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--connect') {
+ if($ARGV[1]) {
+ $connect = $ARGV[1];
+ $connect =~ s/:/,/;
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--logfile') {
+ if($ARGV[1]) {
+ $logfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ else {
+ print STDERR "\nWarning: http2-server.pl unknown parameter:
$ARGV[0]\n";
+ }
+ shift @ARGV;
+}
+
+my $cmdline="$nghttpx --backend=$connect ".
+ "--frontend=\"*,$listenport;no-tls\" ".
+ "--log-level=INFO ".
+ "--pid-file=$pidfile ".
+ "--errorlog-file=$logfile";
+print "RUN: $cmdline\n" if($verbose);
+system("$cmdline 2>/dev/null");
diff --cc tests/httpserver.pl.in
index 051982243,000000000..3e4c7b5bc
mode 100755,000000..100755
--- a/tests/httpserver.pl.in
+++ b/tests/httpserver.pl.in
@@@ -1,155 -1,0 +1,155 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+BEGIN {
+ push(@INC, $ENV{'srcdir'}) if(defined $ENV{'srcdir'});
+ push(@INC, ".");
+}
+
+use strict;
+use warnings;
+
+use serverhelp qw(
+ server_pidfilename
+ server_logfilename
+ );
+
+use sshhelp qw(
+ exe_ext
+ );
+
+my $verbose = 0; # set to 1 for debugging
+my $port = 8990; # just a default
+my $unix_socket; # location to place a listening Unix socket
+my $ipvnum = 4; # default IP version of http server
+my $idnum = 1; # default http server instance number
+my $proto = 'http'; # protocol the http server speaks
+my $pidfile; # pid file
+my $portfile; # port number file
+my $logfile; # log file
+my $connect; # IP to connect to on CONNECT
+my $srcdir;
+my $gopher = 0;
+
+my $flags = "";
+my $path = '.';
+my $logdir = $path .'/log';
+
+while(@ARGV) {
+ if($ARGV[0] eq '--pidfile') {
+ if($ARGV[1]) {
+ $pidfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--portfile') {
+ if($ARGV[1]) {
+ $portfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--logfile') {
+ if($ARGV[1]) {
+ $logfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--srcdir') {
+ if($ARGV[1]) {
+ $srcdir = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--ipv4') {
+ $ipvnum = 4;
+ }
+ elsif($ARGV[0] eq '--ipv6') {
+ $ipvnum = 6;
+ }
+ elsif($ARGV[0] eq '--unix-socket') {
+ $ipvnum = 'unix';
+ if($ARGV[1]) {
+ $unix_socket = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--gopher') {
+ $gopher = 1;
+ }
+ elsif($ARGV[0] eq '--port') {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $port = $1;
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--connect') {
+ if($ARGV[1]) {
+ $connect = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--id') {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $idnum = $1 if($1 > 0);
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--verbose') {
+ $verbose = 1;
+ }
+ else {
+ print STDERR "\nWarning: httpserver.pl unknown parameter: $ARGV[0]\n";
+ }
+ shift @ARGV;
+}
+
+if(!$srcdir) {
+ $srcdir = $ENV{'srcdir'} || '.';
+}
+if(!$pidfile) {
+ $pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
+}
+if(!$portfile) {
+ $portfile = "$path/". server_portfilename($proto, $ipvnum, $idnum);
+}
+if(!$logfile) {
+ $logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
+}
+
+$flags .= "--pidfile \"$pidfile\" ".
+ "--logfile \"$logfile\" ".
+ "--portfile \"$portfile\" ";
+$flags .= "--gopher " if($gopher);
+$flags .= "--connect $connect " if($connect);
+if($ipvnum eq 'unix') {
+ $flags .= "--unix-socket '$unix_socket' ";
+} else {
+ $flags .= "--ipv$ipvnum --port $port ";
+}
+$flags .= "--srcdir \"$srcdir\"";
+
+if($verbose) {
+ print STDERR "RUN: server/sws".exe_ext('SRV')." $flags\n";
+}
+
+exec("server/sws".exe_ext('SRV')." $flags");
diff --cc tests/keywords.pl.in
index 798f58194,000000000..51370fc9d
mode 100755,000000..100755
--- a/tests/keywords.pl.in
+++ b/tests/keywords.pl.in
@@@ -1,153 -1,0 +1,153 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+use strict;
+
+push(@INC, $ENV{'srcdir'}) if(defined $ENV{'srcdir'});
+push(@INC, ".");
+
+require "getpart.pm"; # array functions
+
+my $srcdir = $ENV{'srcdir'} || '.';
+my $TESTDIR="$srcdir/data";
+
+# Get all commands and find out their test numbers
+opendir(DIR, $TESTDIR) || die "can't opendir $TESTDIR: $!";
+my @cmds = grep { /^test([0-9]+)$/ && -f "$TESTDIR/$_" } readdir(DIR);
+closedir DIR;
+
+my $TESTCASES; # start with no test cases
+
+# cut off everything but the digits
+for(@cmds) {
+ $_ =~ s/[a-z\/\.]*//g;
+}
+# the numbers from low to high
+for(sort { $a <=> $b } @cmds) {
+ $TESTCASES .= " $_";
+}
+
+my $t;
+
+my %k; # keyword count
+my %t; # keyword to test case mapping
+my @miss; # test cases without keywords set
+
+my $count;
+
+my %errors;
+
+for $t (split(/ /, $TESTCASES)) {
+ if(loadtest("${TESTDIR}/test${t}")) {
+ # bad case
+ next;
+ }
+
+ my @ec = getpart("verify", "errorcode");
+ if($ec[0]) {
+ # count number of check error codes
+ $errors{ 0 + $ec[0] } ++;
+ }
+
+
+ my @what = getpart("info", "keywords");
+
+ if(!$what[0]) {
+ push @miss, $t;
+ next;
+ }
+
+ for(@what) {
+ chomp;
+ #print "Test $t: $_\n";
+ $k{$_}++;
+ $t{$_} .= "$t ";
+ }
+
+
+
+
+
+
+
+
+ $count++;
+}
+
+sub show {
+ my ($list)=@_;
+ my @a = split(" ", $list);
+ my $ret;
+
+ my $c;
+ my @l = sort {rand(100) - 50} @a;
+ my @ll;
+
+ for(1 .. 11) {
+ my $v = shift @l;
+ if($v) {
+ push @ll, $v;
+ }
+ }
+
+ for (sort {$a <=> $b} @ll) {
+ if($c++ == 10) {
+ $ret .= "...";
+ last;
+ }
+ $ret .= "$_ ";
+ }
+ return $ret;
+}
+
+# sort alphabetically
+my @mtest = reverse sort { lc($b) cmp lc($a) } keys %k;
+
+print <<TOP
+<table><tr><th>Num</th><th>Keyword</th><th>Test Cases</th></tr>
+TOP
+ ;
+for $t (@mtest) {
+ printf "<tr><td>%d</td><td>$t</td><td>%s</td></tr>\n", $k{$t},
+ show($t{$t});
+}
+printf "</table><p> $count out of %d tests (%d lack keywords)\n",
+ scalar(@miss) + $count,
+ scalar(@miss);
+
+for(@miss) {
+ print "$_ ";
+}
+
+print "\n";
+
+printf "<p> %d different error codes tested for:<br>\n",
+ scalar(keys %errors);
+
+# numerically on amount, or alphebetically if same amount
+my @etest = sort { $a <=> $b} keys %errors;
+
+for(@etest) {
+ print "$_ ";
+}
+print "\n";
diff --cc tests/manpage-scan.pl.in
index 59d6ce817,000000000..ce0cc66d5
mode 100755,000000..100755
--- a/tests/manpage-scan.pl.in
+++ b/tests/manpage-scan.pl.in
@@@ -1,291 -1,0 +1,291 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2016 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# Scan symbols-in-version (which is verified to be correct by test 1119), then
+# verify that each option mention in there that should have its own man page
+# actually does.
+#
+# In addition, make sure that every current option to curl_easy_setopt,
+# curl_easy_getinfo and curl_multi_setopt are also mentioned in their
+# corresponding main (index) man page.
+#
+# src/tool_getparam.c lists all options curl can parse
+# docs/curl.1 documents all command line options
+# src/tool_help.c outputs all options with curl -h
+# - make sure they're all in sync
+#
+# Output all deviances to stderr.
+
+use strict;
+use warnings;
+
+# we may get the dir roots pointed out
+my $root=$ARGV[0] || ".";
+my $buildroot=$ARGV[1] || ".";
+my $syms = "$root/docs/libcurl/symbols-in-versions";
+my $curlh = "$root/include/gnurl/curl.h";
+my $errors=0;
+
+# the prepopulated alias list is the CURLINFO_* defines that are used for the
+# debug function callback and the fact that they use the same prefix as the
+# curl_easy_getinfo options was a mistake.
+my %alias = (
+ 'CURLINFO_DATA_IN' => 'none',
+ 'CURLINFO_DATA_OUT' => 'none',
+ 'CURLINFO_END' => 'none',
+ 'CURLINFO_HEADER_IN' => 'none',
+ 'CURLINFO_HEADER_OUT' => 'none',
+ 'CURLINFO_LASTONE' => 'none',
+ 'CURLINFO_NONE' => 'none',
+ 'CURLINFO_SSL_DATA_IN' => 'none',
+ 'CURLINFO_SSL_DATA_OUT' => 'none',
+ 'CURLINFO_TEXT' => 'none'
+ );
+
+sub scanmanpage {
+ my ($file, @words) = @_;
+
+ open(M, "<$file");
+ my @m = <M>;
+ close(M);
+
+ foreach my $m (@words) {
+
+ my @g = grep(/^\.IP $m/, @m);
+ if(!$g[0]) {
+ print STDERR "Missing mention of $m in $file\n";
+ $errors++;
+ }
+ }
+}
+
+# check for define alises
+open(R, "<$curlh") ||
+ die "no curl.h";
+while(<R>) {
+ if(/^\#define (CURL(OPT|INFO|MOPT)_\w+) (.*)/) {
+ $alias{$1}=$3;
+ }
+}
+close(R);
+
+my @curlopt;
+my @curlinfo;
+my @curlmopt;
+open(R, "<$syms") ||
+ die "no input file";
+while(<R>) {
+ chomp;
+ my $l= $_;
+ if($l =~ /(CURL(OPT|INFO|MOPT)_\w+) *([0-9.]*) *([0-9.-]*) *([0-9.]*)/) {
+ my ($opt, $type, $add, $dep, $rem) = ($1, $2, $3, $4, $5);
+
+ if($alias{$opt}) {
+ #print "$opt => $alias{$opt}\n";
+ }
+ elsif($rem) {
+ # $opt was removed in $rem
+ # so don't check for that
+ }
+ else {
+ if($type eq "OPT") {
+ push @curlopt, $opt,
+ }
+ elsif($type eq "INFO") {
+ push @curlinfo, $opt,
+ }
+ elsif($type eq "MOPT") {
+ push @curlmopt, $opt,
+ }
+ if(! -f "$root/docs/libcurl/opts/$opt.3") {
+ print STDERR "Missing $opt.3\n";
+ $errors++;
+ }
+ }
+ }
+}
+close(R);
+
+scanmanpage("$root/docs/libcurl/gnurl_easy_setopt.3", @curlopt);
+scanmanpage("$root/docs/libcurl/gnurl_easy_getinfo.3", @curlinfo);
+scanmanpage("$root/docs/libcurl/gnurl_multi_setopt.3", @curlmopt);
+
+# using this hash array, we can skip specific options
+my %opts = (
+ # pretend these --no options exists in tool_getparam.c
+ '--no-alpn' => 1,
+ '--no-npn' => 1,
+ '-N, --no-buffer' => 1,
+ '--no-sessionid' => 1,
+ '--no-keepalive' => 1,
+ '--no-progress-meter' => 1,
+
+ # pretend these options without -no exist in curl.1 and tool_help.c
+ '--alpn' => 6,
+ '--npn' => 6,
+ '--eprt' => 6,
+ '--epsv' => 6,
+ '--keepalive' => 6,
+ '-N, --buffer' => 6,
+ '--sessionid' => 6,
+ '--progress-meter' => 6,
+
+ # deprecated options do not need to be in tool_help.c nor curl.1
+ '--krb4' => 6,
+ '--ftp-ssl' => 6,
+ '--ftp-ssl-reqd' => 6,
+
+ # for tests and debug only, can remain hidden
+ '--test-event' => 6,
+ '--wdebug' => 6,
+ );
+
+
+#########################################################################
+# parse the curl code that parses the command line arguments!
+open(R, "<$root/src/tool_getparam.c") ||
+ die "no input file";
+my $list;
+my @getparam; # store all parsed parameters
+
+while(<R>) {
+ chomp;
+ my $l= $_;
+ if(/struct LongShort aliases/) {
+ $list=1;
+ }
+ elsif($list) {
+ if( /^ \{([^,]*), *([^ ]*)/) {
+ my ($s, $l)=($1, $2);
+ my $sh;
+ my $lo;
+ my $title;
+ if($l =~ /\"(.*)\"/) {
+ # long option
+ $lo = $1;
+ $title="--$lo";
+ }
+ if($s =~ /\"(.)\"/) {
+ # a short option
+ $sh = $1;
+ $title="-$sh, $title";
+ }
+ push @getparam, $title;
+ $opts{$title} |= 1;
+ }
+ }
+}
+close(R);
+
+#########################################################################
+# parse the curl.1 man page, extract all documented command line options
+# The man page may or may not be rebuilt, so check both possible locations
+open(R, "<$buildroot/docs/gnurl.1") || open(R, "<$root/docs/gnurl.1") ||
+ die "no input file";
+my @manpage; # store all parsed parameters
+while(<R>) {
+ chomp;
+ my $l= $_;
+ if(/^\.IP \"(-[^\"]*)\"/) {
+ my $str = $1;
+ my $combo;
+ if($str =~ /^-(.), --([a-z0-9.-]*)/) {
+ # figure out the -short, --long combo
+ $combo = "-$1, --$2";
+ }
+ elsif($str =~ /^--([a-z0-9.-]*)/) {
+ # figure out the --long name
+ $combo = "--$1";
+ }
+ if($combo) {
+ push @manpage, $combo;
+ $opts{$combo} |= 2;
+ }
+ }
+}
+close(R);
+
+
+#########################################################################
+# parse the curl code that outputs the curl -h list
+open(R, "<$root/src/tool_help.c") ||
+ die "no input file";
+my @toolhelp; # store all parsed parameters
+while(<R>) {
+ chomp;
+ my $l= $_;
+ if(/^ \{\" *(.*)/) {
+ my $str=$1;
+ my $combo;
+ if($str =~ /^-(.), --([a-z0-9.-]*)/) {
+ # figure out the -short, --long combo
+ $combo = "-$1, --$2";
+ }
+ elsif($str =~ /^--([a-z0-9.-]*)/) {
+ # figure out the --long name
+ $combo = "--$1";
+ }
+ if($combo) {
+ push @toolhelp, $combo;
+ $opts{$combo} |= 4;
+ }
+
+ }
+}
+close(R);
+
+#
+# Now we have three arrays with options to cross-reference.
+
+foreach my $o (keys %opts) {
+ my $where = $opts{$o};
+
+ if($where != 7) {
+ # this is not in all three places
+ $errors++;
+ my $exists;
+ my $missing;
+ if($where & 1) {
+ $exists=" tool_getparam.c";
+ }
+ else {
+ $missing=" tool_getparam.c";
+ }
+ if($where & 2) {
+ $exists.= " gnurl.1";
+ }
+ else {
+ $missing.= " gnurl.1";
+ }
+ if($where & 4) {
+ $exists .= " tool_help.c";
+ }
+ else {
+ $missing .= " tool_help.c";
+ }
+
+ print STDERR "$o is not in$missing (but in$exists)\n";
+ }
+}
+
+print STDERR "$errors\n";
diff --cc tests/mem-include-scan.pl.in
index a7ab544ed,000000000..d137e4fd1
mode 100755,000000..100755
--- a/tests/mem-include-scan.pl.in
+++ b/tests/mem-include-scan.pl.in
@@@ -1,96 -1,0 +1,96 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# This script scans C source files. If they seem to use memory functions,
+# it also makes sure that it #includes the correct two header files!
+#
+# You can also mark a C source as fine by using 'mem-include-scan' anywhere in
+# it.
+#
+
+use strict;
+use warnings;
+
+my $dir = $ARGV[0] || die "specify directory!";
+
+sub scanfile {
+ my ($file) = @_;
+ my $memfunc;
+ my $memdebug;
+ my $curlmem;
+
+ print STDERR "checking $file...\n";
+
+ open(F, "<$file");
+ while(<F>) {
+ if($_ =~ /(free|alloc|strdup)\(/) {
+ $memfunc++;
+ }
+ elsif($_ =~ /^ *# *include \"memdebug.h\"/) {
+ $memdebug++;
+ }
+ elsif($_ =~ /^ *# *include \"curl_memory.h\"/) {
+ $curlmem++;
+ }
+ elsif($_ =~ /mem-include-scan/) {
+ # free pass
+ close(F);
+ return 0;
+ }
+ if($memfunc && $memdebug && $curlmem) {
+ last;
+ }
+ }
+ close(F);
+
+
+ if($memfunc) {
+ if($memdebug && $curlmem) {
+ return 0;
+ }
+ else {
+ if(!$memdebug) {
+ print STDERR "$file doesn't include \"memdebug.h\"!\n";
+ }
+ if(!$curlmem) {
+ print STDERR "$file doesn't include \"curl_memory.h\"!\n";
+ }
+ return 1;
+ }
+ }
+ return 0;
+}
+
+opendir(my $dh, $dir) || die "can't opendir $dir: $!";
+my @cfiles = grep { /\.c\z/ && -f "$dir/$_" } readdir($dh);
+closedir $dh;
+
+my $errs;
+for(@cfiles) {
+ $errs += scanfile("$dir/$_");
+}
+
+if($errs) {
+ print STDERR "----\n$errs errors detected!\n";
+ exit 2;
+}
diff --cc tests/memanalyze.pl.in
index b16172d38,000000000..01915ebca
mode 100755,000000..100755
--- a/tests/memanalyze.pl.in
+++ b/tests/memanalyze.pl.in
@@@ -1,425 -1,0 +1,425 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
- # Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
++# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# Example input:
+#
+# MEM mprintf.c:1094 malloc(32) = e5718
+# MEM mprintf.c:1103 realloc(e5718, 64) = e6118
+# MEM sendf.c:232 free(f6520)
+
+my $mallocs=0;
+my $callocs=0;
+my $reallocs=0;
+my $strdups=0;
+my $wcsdups=0;
+my $showlimit;
+my $sends=0;
+my $recvs=0;
+my $sockets=0;
+
+while(1) {
+ if($ARGV[0] eq "-v") {
+ $verbose=1;
+ shift @ARGV;
+ }
+ elsif($ARGV[0] eq "-t") {
+ $trace=1;
+ shift @ARGV;
+ }
+ elsif($ARGV[0] eq "-l") {
+ # only show what alloc that caused a memlimit failure
+ $showlimit=1;
+ shift @ARGV;
+ }
+ else {
+ last;
+ }
+}
+
+my $maxmem;
+
+sub newtotal {
+ my ($newtot)=@_;
+ # count a max here
+
+ if($newtot > $maxmem) {
+ $maxmem= $newtot;
+ }
+}
+
+my $file = $ARGV[0];
+
+if(! -f $file) {
+ print "Usage: memanalyze.pl [options] <dump file>\n",
+ "Options:\n",
+ " -l memlimit failure displayed\n",
+ " -v Verbose\n",
+ " -t Trace\n";
+ exit;
+}
+
+open(FILE, "<$file");
+
+if($showlimit) {
+ while(<FILE>) {
+ if(/^LIMIT.*memlimit$/) {
+ print $_;
+ last;
+ }
+ }
+ close(FILE);
+ exit;
+}
+
+
+my $lnum=0;
+while(<FILE>) {
+ chomp $_;
+ $line = $_;
+ $lnum++;
+ if($line =~ /^LIMIT ([^ ]*):(\d*) (.*)/) {
+ # new memory limit test prefix
+ my $i = $3;
+ my ($source, $linenum) = ($1, $2);
+ if($trace && ($i =~ /([^ ]*) reached memlimit/)) {
+ print "LIMIT: $1 returned error at $source:$linenum\n";
+ }
+ }
+ elsif($line =~ /^MEM ([^ ]*):(\d*) (.*)/) {
+ # generic match for the filename+linenumber
+ $source = $1;
+ $linenum = $2;
+ $function = $3;
+
+ if($function =~ /free\((\(nil\)|0x([0-9a-f]*))/) {
+ $addr = $2;
+ if($1 eq "(nil)") {
+ ; # do nothing when free(NULL)
+ }
+ elsif(!exists $sizeataddr{$addr}) {
+ print "FREE ERROR: No memory allocated: $line\n";
+ }
+ elsif(-1 == $sizeataddr{$addr}) {
+ print "FREE ERROR: Memory freed twice: $line\n";
+ print "FREE ERROR: Previously freed at: ".$getmem{$addr}."\n";
+ }
+ else {
+ $totalmem -= $sizeataddr{$addr};
+ if($trace) {
+ print "FREE: malloc at ".$getmem{$addr}." is freed again
at $source:$linenum\n";
+ printf("FREE: %d bytes freed, left allocated: $totalmem
bytes\n", $sizeataddr{$addr});
+ }
+
+ newtotal($totalmem);
+ $frees++;
+
+ $sizeataddr{$addr}=-1; # set -1 to mark as freed
+ $getmem{$addr}="$source:$linenum";
+
+ }
+ }
+ elsif($function =~ /malloc\((\d*)\) = 0x([0-9a-f]*)/) {
+ $size = $1;
+ $addr = $2;
+
+ if($sizeataddr{$addr}>0) {
+ # this means weeeeeirdo
+ print "Mixed debug compile ($source:$linenum at line $lnum),
rebuild curl now\n";
+ print "We think $sizeataddr{$addr} bytes are already
allocated at that memory address: $addr!\n";
+ }
+
+ $sizeataddr{$addr}=$size;
+ $totalmem += $size;
+
+ if($trace) {
+ print "MALLOC: malloc($size) at $source:$linenum",
+ " makes totally $totalmem bytes\n";
+ }
+
+ newtotal($totalmem);
+ $mallocs++;
+
+ $getmem{$addr}="$source:$linenum";
+ }
+ elsif($function =~ /calloc\((\d*),(\d*)\) = 0x([0-9a-f]*)/) {
+ $size = $1*$2;
+ $addr = $3;
+
+ $arg1 = $1;
+ $arg2 = $2;
+
+ if($sizeataddr{$addr}>0) {
+ # this means weeeeeirdo
+ print "Mixed debug compile, rebuild curl now\n";
+ }
+
+ $sizeataddr{$addr}=$size;
+ $totalmem += $size;
+
+ if($trace) {
+ print "CALLOC: calloc($arg1,$arg2) at $source:$linenum",
+ " makes totally $totalmem bytes\n";
+ }
+
+ newtotal($totalmem);
+ $callocs++;
+
+ $getmem{$addr}="$source:$linenum";
+ }
+ elsif($function =~ /realloc\((\(nil\)|0x([0-9a-f]*)), (\d*)\) =
0x([0-9a-f]*)/) {
+ my ($oldaddr, $newsize, $newaddr) = ($2, $3, $4);
+
+ $totalmem -= $sizeataddr{$oldaddr};
+ if($trace) {
+ printf("REALLOC: %d less bytes and ", $sizeataddr{$oldaddr});
+ }
+ $sizeataddr{$oldaddr}=0;
+
+ $totalmem += $newsize;
+ $sizeataddr{$newaddr}=$newsize;
+
+ if($trace) {
+ printf("%d more bytes ($source:$linenum)\n", $newsize);
+ }
+
+ newtotal($totalmem);
+ $reallocs++;
+
+ $getmem{$oldaddr}="";
+ $getmem{$newaddr}="$source:$linenum";
+ }
+ elsif($function =~ /strdup\(0x([0-9a-f]*)\) \((\d*)\) =
0x([0-9a-f]*)/) {
+ # strdup(a5b50) (8) = df7c0
+
+ $dup = $1;
+ $size = $2;
+ $addr = $3;
+ $getmem{$addr}="$source:$linenum";
+ $sizeataddr{$addr}=$size;
+
+ $totalmem += $size;
+
+ if($trace) {
+ printf("STRDUP: $size bytes at %s, makes totally: %d bytes\n",
+ $getmem{$addr}, $totalmem);
+ }
+
+ newtotal($totalmem);
+ $strdups++;
+ }
+ elsif($function =~ /wcsdup\(0x([0-9a-f]*)\) \((\d*)\) =
0x([0-9a-f]*)/) {
+ # wcsdup(a5b50) (8) = df7c0
+
+ $dup = $1;
+ $size = $2;
+ $addr = $3;
+ $getmem{$addr}="$source:$linenum";
+ $sizeataddr{$addr}=$size;
+
+ $totalmem += $size;
+
+ if($trace) {
+ printf("WCSDUP: $size bytes at %s, makes totally: %d bytes\n",
+ $getmem{$addr}, $totalmem);
+ }
+
+ newtotal($totalmem);
+ $wcsdups++;
+ }
+ else {
+ print "Not recognized input line: $function\n";
+ }
+ }
+ # FD url.c:1282 socket() = 5
+ elsif($_ =~ /^FD ([^ ]*):(\d*) (.*)/) {
+ # generic match for the filename+linenumber
+ $source = $1;
+ $linenum = $2;
+ $function = $3;
+
+ if($function =~ /socket\(\) = (\d*)/) {
+ $filedes{$1}=1;
+ $getfile{$1}="$source:$linenum";
+ $openfile++;
+ $sockets++; # number of socket() calls
+ }
+ elsif($function =~ /socketpair\(\) = (\d*) (\d*)/) {
+ $filedes{$1}=1;
+ $getfile{$1}="$source:$linenum";
+ $openfile++;
+ $filedes{$2}=1;
+ $getfile{$2}="$source:$linenum";
+ $openfile++;
+ }
+ elsif($function =~ /accept\(\) = (\d*)/) {
+ $filedes{$1}=1;
+ $getfile{$1}="$source:$linenum";
+ $openfile++;
+ }
+ elsif($function =~ /sclose\((\d*)\)/) {
+ if($filedes{$1} != 1) {
+ print "Close without open: $line\n";
+ }
+ else {
+ $filedes{$1}=0; # closed now
+ $openfile--;
+ }
+ }
+ }
+ # FILE url.c:1282 fopen("blabla") = 0x5ddd
+ elsif($_ =~ /^FILE ([^ ]*):(\d*) (.*)/) {
+ # generic match for the filename+linenumber
+ $source = $1;
+ $linenum = $2;
+ $function = $3;
+
+ if($function =~ /f[d]*open\(\"(.*)\",\"([^\"]*)\"\) =
(\(nil\)|0x([0-9a-f]*))/) {
+ if($3 eq "(nil)") {
+ ;
+ }
+ else {
+ $fopen{$4}=1;
+ $fopenfile{$4}="$source:$linenum";
+ $fopens++;
+ }
+ }
+ # fclose(0x1026c8)
+ elsif($function =~ /fclose\(0x([0-9a-f]*)\)/) {
+ if(!$fopen{$1}) {
+ print "fclose() without fopen(): $line\n";
+ }
+ else {
+ $fopen{$1}=0;
+ $fopens--;
+ }
+ }
+ }
+ # GETNAME url.c:1901 getnameinfo()
+ elsif($_ =~ /^GETNAME ([^ ]*):(\d*) (.*)/) {
+ # not much to do
+ }
+ # SEND url.c:1901 send(83) = 83
+ elsif($_ =~ /^SEND ([^ ]*):(\d*) (.*)/) {
+ $sends++;
+ }
+ # RECV url.c:1901 recv(102400) = 256
+ elsif($_ =~ /^RECV ([^ ]*):(\d*) (.*)/) {
+ $recvs++;
+ }
+
+ # ADDR url.c:1282 getaddrinfo() = 0x5ddd
+ elsif($_ =~ /^ADDR ([^ ]*):(\d*) (.*)/) {
+ # generic match for the filename+linenumber
+ $source = $1;
+ $linenum = $2;
+ $function = $3;
+
+ if($function =~ /getaddrinfo\(\) = (\(nil\)|0x([0-9a-f]*))/) {
+ my $add = $2;
+ if($add eq "(nil)") {
+ ;
+ }
+ else {
+ $addrinfo{$add}=1;
+ $addrinfofile{$add}="$source:$linenum";
+ $addrinfos++;
+ }
+ if($trace) {
+ printf("GETADDRINFO ($source:$linenum)\n");
+ }
+ }
+ # fclose(0x1026c8)
+ elsif($function =~ /freeaddrinfo\(0x([0-9a-f]*)\)/) {
+ if(!$addrinfo{$1}) {
+ print "freeaddrinfo() without getaddrinfo(): $line\n";
+ }
+ else {
+ $addrinfo{$1}=0;
+ $addrinfos--;
+ }
+ if($trace) {
+ printf("FREEADDRINFO ($source:$linenum)\n");
+ }
+ }
+
+ }
+ else {
+ print "Not recognized prefix line: $line\n";
+ }
+}
+close(FILE);
+
+if($totalmem) {
+ print "Leak detected: memory still allocated: $totalmem bytes\n";
+
+ for(keys %sizeataddr) {
+ $addr = $_;
+ $size = $sizeataddr{$addr};
+ if($size > 0) {
+ print "At $addr, there's $size bytes.\n";
+ print " allocated by ".$getmem{$addr}."\n";
+ }
+ }
+}
+
+if($openfile) {
+ for(keys %filedes) {
+ if($filedes{$_} == 1) {
+ print "Open file descriptor created at ".$getfile{$_}."\n";
+ }
+ }
+}
+
+if($fopens) {
+ print "Open FILE handles left at:\n";
+ for(keys %fopen) {
+ if($fopen{$_} == 1) {
+ print "fopen() called at ".$fopenfile{$_}."\n";
+ }
+ }
+}
+
+if($addrinfos) {
+ print "IPv6-style name resolve data left at:\n";
+ for(keys %addrinfofile) {
+ if($addrinfo{$_} == 1) {
+ print "getaddrinfo() called at ".$addrinfofile{$_}."\n";
+ }
+ }
+}
+
+if($verbose) {
+ print "Mallocs: $mallocs\n",
+ "Reallocs: $reallocs\n",
+ "Callocs: $callocs\n",
+ "Strdups: $strdups\n",
+ "Wcsdups: $wcsdups\n",
+ "Frees: $frees\n",
+ "Sends: $sends\n",
+ "Recvs: $recvs\n",
+ "Sockets: $sockets\n",
+ "Allocations: ".($mallocs + $callocs + $reallocs + $strdups +
$wcsdups)."\n",
+ "Operations: ".($mallocs + $callocs + $reallocs + $strdups + $wcsdups
+ $sends + $recvs + $sockets)."\n";
+
+ print "Maximum allocated: $maxmem\n";
+}
diff --cc tests/negtelnetserver.py.in
index fbe3a5f63,000000000..afd48239d
mode 100755,000000..100755
--- a/tests/negtelnetserver.py.in
+++ b/tests/negtelnetserver.py.in
@@@ -1,364 -1,0 +1,368 @@@
+#!AWKPYTHON
+# -*- coding: utf-8 -*-
+#
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2017 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+""" A telnet server which negotiates"""
+
+from __future__ import (absolute_import, division, print_function,
+ unicode_literals)
++
+import argparse
++import logging
+import os
+import sys
- import logging
++
++from util import ClosingFileHandler
++
+if sys.version_info.major >= 3:
+ import socketserver
+else:
+ import SocketServer as socketserver
+
+log = logging.getLogger(__name__)
+HOST = "localhost"
+IDENT = "NTEL"
+
+
+# The strings that indicate the test framework is checking our aliveness
+VERIFIED_REQ = "verifiedserver"
+VERIFIED_RSP = "WE ROOLZ: {pid}"
+
+
+def telnetserver(options):
+ """
+ Starts up a TCP server with a telnet handler and serves DICT requests
+ forever.
+ """
+ if options.pidfile:
+ pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
+ with open(options.pidfile, "w") as f:
+ f.write(str(pid))
+
+ local_bind = (HOST, options.port)
+ log.info("Listening on %s", local_bind)
+
+ # Need to set the allow_reuse on the class, not on the instance.
+ socketserver.TCPServer.allow_reuse_address = True
+ server = socketserver.TCPServer(local_bind, NegotiatingTelnetHandler)
+ server.serve_forever()
+
+ return ScriptRC.SUCCESS
+
+
+class NegotiatingTelnetHandler(socketserver.BaseRequestHandler):
+ """Handler class for Telnet connections.
+
+ """
+ def handle(self):
+ """
+ Negotiates options before reading data.
+ """
+ neg = Negotiator(self.request)
+
+ try:
+ # Send some initial negotiations.
+ neg.send_do("NEW_ENVIRON")
+ neg.send_will("NEW_ENVIRON")
+ neg.send_dont("NAWS")
+ neg.send_wont("NAWS")
+
+ # Get the data passed through the negotiator
+ data = neg.recv(1024)
+ log.debug("Incoming data: %r", data)
+
+ if VERIFIED_REQ.encode('utf-8') in data:
+ log.debug("Received verification request from test framework")
+ pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
+ response = VERIFIED_RSP.format(pid=pid)
+ response_data = response.encode('utf-8')
+ else:
+ log.debug("Received normal request - echoing back")
+ response_data = data.decode('utf-8').strip().encode('utf-8')
+
+ if response_data:
+ log.debug("Sending %r", response_data)
+ self.request.sendall(response_data)
+
+ except IOError:
+ log.exception("IOError hit during request")
+
+
+class Negotiator(object):
+ NO_NEG = 0
+ START_NEG = 1
+ WILL = 2
+ WONT = 3
+ DO = 4
+ DONT = 5
+
+ def __init__(self, tcp):
+ self.tcp = tcp
+ self.state = self.NO_NEG
+
+ def recv(self, bytes):
+ """
+ Read bytes from TCP, handling negotiation sequences
+
+ :param bytes: Number of bytes to read
+ :return: a buffer of bytes
+ """
+ buffer = bytearray()
+
+ # If we keep receiving negotiation sequences, we won't fill the
buffer.
+ # Keep looping while we can, and until we have something to give back
+ # to the caller.
+ while len(buffer) == 0:
+ data = self.tcp.recv(bytes)
+ if not data:
+ # TCP failed to give us any data. Break out.
+ break
+
+ for byte_int in bytearray(data):
+ if self.state == self.NO_NEG:
+ self.no_neg(byte_int, buffer)
+ elif self.state == self.START_NEG:
+ self.start_neg(byte_int)
+ elif self.state in [self.WILL, self.WONT, self.DO, self.DONT]:
+ self.handle_option(byte_int)
+ else:
+ # Received an unexpected byte. Stop negotiations
+ log.error("Unexpected byte %s in state %s",
+ byte_int,
+ self.state)
+ self.state = self.NO_NEG
+
+ return buffer
+
+ def no_neg(self, byte_int, buffer):
+ # Not negotiating anything thus far. Check to see if we
+ # should.
+ if byte_int == NegTokens.IAC:
+ # Start negotiation
+ log.debug("Starting negotiation (IAC)")
+ self.state = self.START_NEG
+ else:
+ # Just append the incoming byte to the buffer
+ buffer.append(byte_int)
+
+ def start_neg(self, byte_int):
+ # In a negotiation.
+ log.debug("In negotiation (%s)",
+ NegTokens.from_val(byte_int))
+
+ if byte_int == NegTokens.WILL:
+ # Client is confirming they are willing to do an option
+ log.debug("Client is willing")
+ self.state = self.WILL
+ elif byte_int == NegTokens.WONT:
+ # Client is confirming they are unwilling to do an
+ # option
+ log.debug("Client is unwilling")
+ self.state = self.WONT
+ elif byte_int == NegTokens.DO:
+ # Client is indicating they can do an option
+ log.debug("Client can do")
+ self.state = self.DO
+ elif byte_int == NegTokens.DONT:
+ # Client is indicating they can't do an option
+ log.debug("Client can't do")
+ self.state = self.DONT
+ else:
+ # Received an unexpected byte. Stop negotiations
+ log.error("Unexpected byte %s in state %s",
+ byte_int,
+ self.state)
+ self.state = self.NO_NEG
+
+ def handle_option(self, byte_int):
+ if byte_int in [NegOptions.BINARY,
+ NegOptions.CHARSET,
+ NegOptions.SUPPRESS_GO_AHEAD,
+ NegOptions.NAWS,
+ NegOptions.NEW_ENVIRON]:
+ log.debug("Option: %s", NegOptions.from_val(byte_int))
+
+ # No further negotiation of this option needed. Reset the state.
+ self.state = self.NO_NEG
+
+ else:
+ # Received an unexpected byte. Stop negotiations
+ log.error("Unexpected byte %s in state %s",
+ byte_int,
+ self.state)
+ self.state = self.NO_NEG
+
+ def send_message(self, message_ints):
+ self.tcp.sendall(bytearray(message_ints))
+
+ def send_iac(self, arr):
+ message = [NegTokens.IAC]
+ message.extend(arr)
+ self.send_message(message)
+
+ def send_do(self, option_str):
+ log.debug("Sending DO %s", option_str)
+ self.send_iac([NegTokens.DO, NegOptions.to_val(option_str)])
+
+ def send_dont(self, option_str):
+ log.debug("Sending DONT %s", option_str)
+ self.send_iac([NegTokens.DONT, NegOptions.to_val(option_str)])
+
+ def send_will(self, option_str):
+ log.debug("Sending WILL %s", option_str)
+ self.send_iac([NegTokens.WILL, NegOptions.to_val(option_str)])
+
+ def send_wont(self, option_str):
+ log.debug("Sending WONT %s", option_str)
+ self.send_iac([NegTokens.WONT, NegOptions.to_val(option_str)])
+
+
+class NegBase(object):
+ @classmethod
+ def to_val(cls, name):
+ return getattr(cls, name)
+
+ @classmethod
+ def from_val(cls, val):
+ for k in cls.__dict__.keys():
+ if getattr(cls, k) == val:
+ return k
+
+ return "<unknown>"
+
+
+class NegTokens(NegBase):
+ # The start of a negotiation sequence
+ IAC = 255
+ # Confirm willingness to negotiate
+ WILL = 251
+ # Confirm unwillingness to negotiate
+ WONT = 252
+ # Indicate willingness to negotiate
+ DO = 253
+ # Indicate unwillingness to negotiate
+ DONT = 254
+
+ # The start of sub-negotiation options.
+ SB = 250
+ # The end of sub-negotiation options.
+ SE = 240
+
+
+class NegOptions(NegBase):
+ # Binary Transmission
+ BINARY = 0
+ # Suppress Go Ahead
+ SUPPRESS_GO_AHEAD = 3
+ # NAWS - width and height of client
+ NAWS = 31
+ # NEW-ENVIRON - environment variables on client
+ NEW_ENVIRON = 39
+ # Charset option
+ CHARSET = 42
+
+
+def get_options():
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument("--port", action="store", default=9019,
+ type=int, help="port to listen on")
+ parser.add_argument("--verbose", action="store", type=int, default=0,
+ help="verbose output")
+ parser.add_argument("--pidfile", action="store",
+ help="file name for the PID")
+ parser.add_argument("--logfile", action="store",
+ help="file name for the log")
+ parser.add_argument("--srcdir", action="store", help="test directory")
+ parser.add_argument("--id", action="store", help="server ID")
+ parser.add_argument("--ipv4", action="store_true", default=0,
+ help="IPv4 flag")
+
+ return parser.parse_args()
+
+
+def setup_logging(options):
+ """
+ Set up logging from the command line options
+ """
+ root_logger = logging.getLogger()
+ add_stdout = False
+
+ formatter = logging.Formatter("%(asctime)s %(levelname)-5.5s "
+ "[{ident}] %(message)s"
+ .format(ident=IDENT))
+
+ # Write out to a logfile
+ if options.logfile:
- handler = logging.FileHandler(options.logfile, mode="w")
++ handler = ClosingFileHandler(options.logfile)
+ handler.setFormatter(formatter)
+ handler.setLevel(logging.DEBUG)
+ root_logger.addHandler(handler)
+ else:
+ # The logfile wasn't specified. Add a stdout logger.
+ add_stdout = True
+
+ if options.verbose:
+ # Add a stdout logger as well in verbose mode
+ root_logger.setLevel(logging.DEBUG)
+ add_stdout = True
+ else:
+ root_logger.setLevel(logging.INFO)
+
+ if add_stdout:
+ stdout_handler = logging.StreamHandler(sys.stdout)
+ stdout_handler.setFormatter(formatter)
+ stdout_handler.setLevel(logging.DEBUG)
+ root_logger.addHandler(stdout_handler)
+
+
+class ScriptRC(object):
+ """Enum for script return codes"""
+ SUCCESS = 0
+ FAILURE = 1
+ EXCEPTION = 2
+
+
+class ScriptException(Exception):
+ pass
+
+
+if __name__ == '__main__':
+ # Get the options from the user.
+ options = get_options()
+
+ # Setup logging using the user options
+ setup_logging(options)
+
+ # Run main script.
+ try:
+ rc = telnetserver(options)
+ except Exception as e:
+ log.exception(e)
+ rc = ScriptRC.EXCEPTION
+
+ log.info("Returning %d", rc)
+ sys.exit(rc)
diff --cc tests/nroff-scan.pl.in
index 8f4f2a24c,000000000..7c1d90e2b
mode 100755,000000..100755
--- a/tests/nroff-scan.pl.in
+++ b/tests/nroff-scan.pl.in
@@@ -1,106 -1,0 +1,106 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2016 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# scan nroff pages to find basic syntactic problems such as unbalanced \f
+# codes or references to non-existing curl man pages.
+
+my $docsroot = $ARGV[0];
+
+if(!$docsroot || ($docsroot eq "-g")) {
+ print "Usage: nroff-scan.pl <docs root dir> [nroff files]\n";
+ exit;
+}
+
+
+shift @ARGV;
+
+my @f = @ARGV;
+
+my %manp;
+
+sub manpresent {
+ my ($man) = @_;
+ if($manp{$man}) {
+ return 1;
+ }
+ elsif(-r "$docsroot/$man" ||
+ -r "$docsroot/libcurl/$man" ||
+ -r "$docsroot/libcurl/opts/$man") {
+ $manp{$man}=1;
+ return 1;
+ }
+ return 0;
+}
+
+sub file {
+ my ($f) = @_;
+ open(F, "<$f") ||
+ die "no file";
+ my $line = 1;
+ while(<F>) {
+ chomp;
+ my $l = $_;
+ while($l =~ s/\\f(.)([^ ]*)\\f(.)//) {
+ my ($pre, $str, $post)=($1, $2, $3);
+ if($post ne "P") {
+ print "error: $f:$line: missing \\fP after $str\n";
+ $errors++;
+ }
+ if($str =~ /((libcurl|gnurl)([^ ]*))\(3\)/i) {
+ my $man = "$1.3";
+ if(!manpresent($man)) {
+ print "error: $f:$line: referring to non-existing man
page $man\n";
+ $errors++;
+ }
+ if($pre ne "I") {
+ print "error: $f:$line: use \\fI before $str\n";
+ $errors++;
+ }
+ }
+ }
+ if($l =~ /(gnurl([^ ]*)\(3\))/i) {
+ print "error: $f:$line: non-referencing $1\n";
+ $errors++;
+ }
+ if($l =~ /^\.BR (.*)/) {
+ my $i= $1;
+ while($i =~ s/((lib|)gnurl([^ ]*)) *\"\(3\)(,|) *\" *//i ) {
+ my $man = "$1.3";
+ if(!manpresent($man)) {
+ print "error: $f:$line: referring to non-existing man
page $man\n";
+ $errors++;
+ }
+ }
+ }
+ $line++;
+ }
+ close(F);
+}
+
+foreach my $f (@f) {
+ file($f);
+}
+
+print "OK\n" if(!$errors);
+
+exit $errors?1:0;
diff --cc tests/rtspserver.pl.in
index 83d24b7fe,000000000..09daa0eb5
mode 100755,000000..100755
--- a/tests/rtspserver.pl.in
+++ b/tests/rtspserver.pl.in
@@@ -1,122 -1,0 +1,122 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+BEGIN {
+ push(@INC, $ENV{'srcdir'}) if(defined $ENV{'srcdir'});
+ push(@INC, ".");
+}
+
+use strict;
+use warnings;
+
+use serverhelp qw(
+ server_pidfilename
+ server_logfilename
+ );
+
+use sshhelp qw(
+ exe_ext
+ );
+
+my $verbose = 0; # set to 1 for debugging
+my $port = 8990; # just a default
+my $ipvnum = 4; # default IP version of rtsp server
+my $idnum = 1; # default rtsp server instance number
+my $proto = 'rtsp'; # protocol the rtsp server speaks
+my $pidfile; # rtsp server pid file
+my $portfile;
+my $logfile; # rtsp server log file
+my $srcdir;
+
+my $flags = "";
+my $path = '.';
+my $logdir = $path .'/log';
+
+while(@ARGV) {
+ if($ARGV[0] eq '--pidfile') {
+ if($ARGV[1]) {
+ $pidfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--portfile') {
+ if($ARGV[1]) {
+ $portfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--logfile') {
+ if($ARGV[1]) {
+ $logfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--srcdir') {
+ if($ARGV[1]) {
+ $srcdir = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--ipv4') {
+ $ipvnum = 4;
+ }
+ elsif($ARGV[0] eq '--ipv6') {
+ $ipvnum = 6;
+ }
+ elsif($ARGV[0] eq '--port') {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $port = $1;
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--id') {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $idnum = $1 if($1 > 0);
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--verbose') {
+ $verbose = 1;
+ }
+ else {
+ print STDERR "\nWarning: rtspserver.pl unknown parameter: $ARGV[0]\n";
+ }
+ shift @ARGV;
+}
+
+if(!$srcdir) {
+ $srcdir = $ENV{'srcdir'} || '.';
+}
+if(!$pidfile) {
+ $pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
+}
+if(!$logfile) {
+ $logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
+}
+
+$flags .= "--pidfile \"$pidfile\" ".
+ "--portfile \"$portfile\" ".
+ "--logfile \"$logfile\" ";
+$flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\"";
+
+exec("server/rtspd".exe_ext('SRV')." $flags");
diff --cc tests/runtests.pl.in
index a8bfe16c4,000000000..710132ed8
mode 100755,000000..100755
--- a/tests/runtests.pl.in
+++ b/tests/runtests.pl.in
@@@ -1,5825 -1,0 +1,5834 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# Experimental hooks are available to run tests remotely on machines that
+# are able to run curl but are unable to run the test harness.
+# The following sections need to be modified:
+#
+# $HOSTIP, $HOST6IP - Set to the address of the host running the test suite
+# $CLIENTIP, $CLIENT6IP - Set to the address of the host running curl
+# runclient, runclientoutput - Modify to copy all the files in the log/
+# directory to the system running curl, run the given command remotely
+# and save the return code or returned stdout (respectively), then
+# copy all the files from the remote system's log/ directory back to
+# the host running the test suite. This can be done a few ways, such
+# as using scp & ssh, rsync & telnet, or using a NFS shared directory
+# and ssh.
+#
+# 'make && make test' needs to be done on both machines before making the
+# above changes and running runtests.pl manually. In the shared NFS case,
+# the contents of the tests/server/ directory must be from the host
+# running the test suite, while the rest must be from the host running curl.
+#
+# Note that even with these changes a number of tests will still fail (mainly
+# to do with cookies, those that set environment variables, or those that
+# do more than touch the file system in a <precheck> or <postcheck>
+# section). These can be added to the $TESTCASES line below,
+# e.g. $TESTCASES="!8 !31 !63 !cookies..."
+#
+# Finally, to properly support -g and -n, checktestcmd needs to change
+# to check the remote system's PATH, and the places in the code where
+# the curl binary is read directly to determine its type also need to be
+# fixed. As long as the -g option is never given, and the -n is always
+# given, this won't be a problem.
+
+
+# These should be the only variables that might be needed to get edited:
+
+BEGIN {
+ # Define srcdir to the location of the tests source directory. This is
+ # usually set by the Makefile, but for out-of-tree builds with direct
+ # invocation of runtests.pl, it may not be set.
+ if(!defined $ENV{'srcdir'}) {
+ use File::Basename;
+ $ENV{'srcdir'} = dirname(__FILE__);
+ }
+ push(@INC, $ENV{'srcdir'});
+ # run time statistics needs Time::HiRes
+ eval {
+ no warnings "all";
+ require Time::HiRes;
+ import Time::HiRes qw( time );
+ }
+}
+
+use strict;
+use warnings;
+use Cwd;
+use Digest::MD5 qw(md5);
+use MIME::Base64;
+
+# Subs imported from serverhelp module
+use serverhelp qw(
+ serverfactors
+ servername_id
+ servername_str
+ servername_canon
+ server_pidfilename
+ server_portfilename
+ server_logfilename
+ );
+
+# Variables and subs imported from sshhelp module
+use sshhelp qw(
+ $sshdexe
+ $sshexe
+ $sftpexe
+ $sshconfig
+ $sftpconfig
+ $sshdlog
+ $sshlog
+ $sftplog
+ $sftpcmds
+ display_sshdconfig
+ display_sshconfig
+ display_sftpconfig
+ display_sshdlog
+ display_sshlog
+ display_sftplog
+ exe_ext
+ find_sshd
+ find_ssh
+ find_sftp
+ find_httptlssrv
+ sshversioninfo
+ );
+
+use pathhelp;
+
+require "getpart.pm"; # array functions
+require "valgrind.pm"; # valgrind report parser
+require "ftp.pm";
+require "azure.pm";
+require "appveyor.pm";
+
+my $HOSTIP="127.0.0.1"; # address on which the test server listens
+my $HOST6IP="[::1]"; # address on which the test server listens
+my $CLIENTIP="127.0.0.1"; # address which curl uses for incoming connections
+my $CLIENT6IP="[::1]"; # address which curl uses for incoming connections
+
+my $noport="[not running]";
+
+my $NOLISTENPORT=47; # port number we use for a local non-listening
service
+my $MQTTPORT=$noport; # MQTT server port
+my $HTTPPORT=$noport; # HTTP server port
+my $HTTP6PORT=$noport; # HTTP IPv6 server port
+my $HTTPSPORT=$noport; # HTTPS (stunnel) server port
+my $HTTPSPROXYPORT = $noport; # HTTPS-proxy (stunnel) port
+my $FTPPORT=$noport; # FTP server port
+my $FTPSPORT=$noport; # FTPS (stunnel) server port
+my $FTP6PORT=$noport; # FTP IPv6 server port
+my $TFTPPORT=$noport; # TFTP
+my $TFTP6PORT=$noport; # TFTP
+my $SSHPORT=$noport; # SCP/SFTP
+my $SOCKSPORT=$noport; # SOCKS4/5 port
+my $POP3PORT=$noport; # POP3
+my $POP36PORT=$noport; # POP3 IPv6 server port
+my $IMAPPORT=$noport; # IMAP
+my $IMAP6PORT=$noport; # IMAP IPv6 server port
+my $SMTPPORT=$noport; # SMTP
+my $SMTP6PORT=$noport; # SMTP IPv6 server port
+my $RTSPPORT=$noport; # RTSP
+my $RTSP6PORT=$noport; # RTSP IPv6 server port
+my $GOPHERPORT=$noport; # Gopher
+my $GOPHER6PORT=$noport; # Gopher IPv6 server port
+my $HTTPTLSPORT=$noport; # HTTP TLS (non-stunnel) server port
+my $HTTPTLS6PORT=$noport; # HTTP TLS (non-stunnel) IPv6 server port
+my $HTTPPROXYPORT=$noport; # HTTP proxy port, when using CONNECT
+my $HTTP2PORT=$noport; # HTTP/2 server port
+my $DICTPORT=$noport; # DICT server port
+my $SMBPORT=$noport; # SMB server port
+my $SMBSPORT=$noport; # SMBS server port
+my $TELNETPORT=$noport; # TELNET server port with negotiation
+my $HTTPUNIXPATH; # HTTP server Unix domain socket path
+
+my $SSHSRVMD5 = "[uninitialized]"; # MD5 of ssh server public key
++my $VERSION; # curl's reported version number
+
+my $srcdir = $ENV{'srcdir'} || '.';
+my $CURL="../src/gnurl".exe_ext('TOOL'); # what curl executable to run on the
tests
+my $VCURL=$CURL; # what curl binary to use to verify the servers with
+ # VCURL is handy to set to the system one when the one you
+ # just built hangs or crashes and thus prevent verification
+my $DBGCURL=$CURL; #"../src/.libs/curl"; # alternative for debugging
+my $LOGDIR="log";
+my $TESTDIR="$srcdir/data";
+my $LIBDIR="./libtest";
+my $UNITDIR="./unit";
+# TODO: change this to use server_inputfilename()
+my $SERVERIN="$LOGDIR/server.input"; # what curl sent the server
+my $SERVER2IN="$LOGDIR/server2.input"; # what curl sent the second server
+my $PROXYIN="$LOGDIR/proxy.input"; # what curl sent the proxy
+my $CURLLOG="commands.log"; # all command lines run
+my $FTPDCMD="$LOGDIR/ftpserver.cmd"; # copy server instructions here
+my $SERVERLOGS_LOCK="$LOGDIR/serverlogs.lock"; # server logs advisor read lock
+my $CURLCONFIG="../gnurl-config"; # curl-config from current build
+
+# Normally, all test cases should be run, but at times it is handy to
+# simply run a particular one:
+my $TESTCASES="all";
+
+# To run specific test cases, set them like:
+# $TESTCASES="1 2 3 7 8";
+
+#######################################################################
+# No variables below this point should need to be modified
+#
+
+# invoke perl like this:
+my $perl="perl -I$srcdir";
+my $server_response_maxtime=13;
+
+my $debug_build=0; # built debug enabled (--enable-debug)
+my $has_memory_tracking=0; # built with memory tracking (--enable-curldebug)
+my $libtool;
+my $repeat = 0;
+
+# name of the file that the memory debugging creates:
+my $memdump="$LOGDIR/memdump";
+
+# the path to the script that analyzes the memory debug output file:
+my $memanalyze="$perl $srcdir/memanalyze.pl";
+
+my $pwd = getcwd(); # current working directory
+my $posix_pwd = $pwd;
+
+my $start;
+my $ftpchecktime=1; # time it took to verify our test FTP server
+my $scrambleorder;
+my $stunnel = checkcmd("stunnel4") || checkcmd("tstunnel") ||
checkcmd("stunnel");
+my $valgrind = checktestcmd("valgrind");
+my $valgrind_logfile="--logfile";
+my $valgrind_tool;
+my $gdb = checktestcmd("gdb");
+my $httptlssrv = find_httptlssrv();
+
+my $uname_release = `uname -r`;
+my $is_wsl = $uname_release =~ /Microsoft$/;
+
+my $has_ssl; # set if libcurl is built with SSL support
+my $has_largefile; # set if libcurl is built with large file support
+my $has_idn; # set if libcurl is built with IDN support
+my $http_ipv6; # set if HTTP server has IPv6 support
+my $http_unix; # set if HTTP server has Unix sockets support
+my $ftp_ipv6; # set if FTP server has IPv6 support
+my $tftp_ipv6; # set if TFTP server has IPv6 support
+my $gopher_ipv6; # set if Gopher server has IPv6 support
+my $has_ipv6; # set if libcurl is built with IPv6 support
+my $has_unix; # set if libcurl is built with Unix sockets support
+my $has_libz; # set if libcurl is built with libz support
+my $has_brotli; # set if libcurl is built with brotli support
+my $has_zstd; # set if libcurl is built with zstd support
+my $has_getrlimit; # set if system has getrlimit()
+my $has_ntlm; # set if libcurl is built with NTLM support
+my $has_ntlm_wb; # set if libcurl is built with NTLM delegation to winbind
+my $has_sspi; # set if libcurl is built with Windows SSPI
+my $has_gssapi; # set if libcurl is built with a GSS-API library
+my $has_kerberos; # set if libcurl is built with Kerberos support
+my $has_spnego; # set if libcurl is built with SPNEGO support
+my $has_charconv; # set if libcurl is built with CharConv support
+my $has_tls_srp; # set if libcurl is built with TLS-SRP support
+my $has_metalink; # set if curl is built with Metalink support
+my $has_http2; # set if libcurl is built with HTTP2 support
+my $has_httpsproxy; # set if libcurl is built with HTTPS-proxy support
+my $has_crypto; # set if libcurl is built with cryptographic support
+my $has_cares; # set if built with c-ares
+my $has_threadedres;# set if built with threaded resolver
+my $has_psl; # set if libcurl is built with PSL support
+my $has_altsvc; # set if libcurl is built with alt-svc support
++my $has_hsts; # set if libcurl is built with HSTS support
+my $has_ldpreload; # set if curl is built for systems supporting LD_PRELOAD
+my $has_multissl; # set if curl is build with MultiSSL support
+my $has_manual; # set if curl is built with built-in manual
+my $has_win32; # set if curl is built for Windows
+my $has_mingw; # set if curl is built with MinGW (as opposed to
MinGW-w64)
+
+# this version is decided by the particular nghttp2 library that is being used
+my $h2cver = "h2c";
+
+my $has_openssl; # built with a lib using an OpenSSL-like API
+my $has_gnutls; # built with GnuTLS
+my $has_nss; # built with NSS
+my $has_wolfssl; # built with wolfSSL
+my $has_schannel; # built with Schannel
+my $has_sectransp; # built with Secure Transport
+my $has_boringssl; # built with BoringSSL
+my $has_libressl; # built with libressl
+my $has_mbedtls; # built with mbedTLS
+my $has_mesalink; # built with MesaLink
+
+my $has_sslpinning; # built with a TLS backend that supports pinning
+
+my $has_shared = "unknown"; # built shared
+
+my $resolver; # name of the resolver backend (for human presentation)
+
+my $has_textaware; # set if running on a system that has a text mode concept
+ # on files. Windows for example
+my @protocols; # array of lowercase supported protocol servers
+
+my $skipped=0; # number of tests skipped; reported in main loop
+my %skipped; # skipped{reason}=counter, reasons for skip
+my @teststat; # teststat[testnum]=reason, reasons for skip
+my %disabled_keywords; # key words of tests to skip
+my %ignored_keywords; # key words of tests to ignore results
+my %enabled_keywords; # key words of tests to run
+my %disabled; # disabled test cases
+my %ignored; # ignored results of test cases
+
+my $sshdid; # for socks server, ssh daemon version id
+my $sshdvernum; # for socks server, ssh daemon version number
+my $sshdverstr; # for socks server, ssh daemon version string
+my $sshderror; # for socks server, ssh daemon version error
+
+my $defserverlogslocktimeout = 2; # timeout to await server logs lock removal
+my $defpostcommanddelay = 0; # delay between command and postcheck sections
+
+my $timestats; # time stamping and stats generation
+my $fullstats; # show time stats for every single test
+my %timeprepini; # timestamp for each test preparation start
+my %timesrvrini; # timestamp for each test required servers verification start
+my %timesrvrend; # timestamp for each test required servers verification end
+my %timetoolini; # timestamp for each test command run starting
+my %timetoolend; # timestamp for each test command run stopping
+my %timesrvrlog; # timestamp for each test server logs lock removal
+my %timevrfyend; # timestamp for each test result verification end
+
+my $testnumcheck; # test number, set in singletest sub.
+my %oldenv;
+my %feature; # array of enabled features
+my %keywords; # array of keywords from the test spec
+
+#######################################################################
+# variables that command line options may set
+#
+
+my $short;
+my $automakestyle;
+my $verbose;
+my $debugprotocol;
+my $anyway;
+my $gdbthis; # run test case with gdb debugger
+my $gdbxwin; # use windowed gdb when using gdb
+my $keepoutfiles; # keep stdout and stderr files after tests
+my $listonly; # only list the tests
+my $postmortem; # display detailed info about failed tests
+my $run_event_based; # run curl with --test-event to test the event API
+
+my %run; # running server
+my %doesntrun; # servers that don't work, identified by pidfile
+my %serverpidfile;# all server pid file names, identified by server id
+my %serverportfile;# all server port file names, identified by server id
+my %runcert; # cert file currently in use by an ssl running server
+
+# torture test variables
+my $torture;
+my $tortnum;
+my $tortalloc;
+my $shallow;
+my $randseed = 0;
+
+# Azure Pipelines specific variables
+my $AZURE_RUN_ID = 0;
+my $AZURE_RESULT_ID = 0;
+
+#######################################################################
+# logmsg is our general message logging subroutine.
+#
+sub logmsg {
+ for(@_) {
+ my $line = $_;
+ if ($is_wsl) {
+ # use \r\n for WSL shell
+ $line =~ s/\r?\n$/\r\n/g;
+ }
+ print "$line";
+ }
+}
+
+# get the name of the current user
+my $USER = $ENV{USER}; # Linux
+if (!$USER) {
+ $USER = $ENV{USERNAME}; # Windows
+ if (!$USER) {
+ $USER = $ENV{LOGNAME}; # Some Unix (I think)
+ }
+}
+
+# enable memory debugging if curl is compiled with it
+$ENV{'CURL_MEMDEBUG'} = $memdump;
+$ENV{'CURL_ENTROPY'}="12345678";
+$ENV{'CURL_FORCETIME'}=1; # for debug NTLM magic
+$ENV{'HOME'}=$pwd;
+$ENV{'COLUMNS'}=79; # screen width!
+
+sub catch_zap {
+ my $signame = shift;
+ logmsg "runtests.pl received SIG$signame, exiting\n";
+ stopservers($verbose);
+ die "Somebody sent me a SIG$signame";
+}
+$SIG{INT} = \&catch_zap;
+$SIG{TERM} = \&catch_zap;
+
+##########################################################################
+# Clear all possible '*_proxy' environment variables for various protocols
+# to prevent them to interfere with our testing!
+
+my $protocol;
+foreach $protocol (('ftp', 'http', 'ftps', 'https', 'no', 'all')) {
+ my $proxy = "${protocol}_proxy";
+ # clear lowercase version
+ delete $ENV{$proxy} if($ENV{$proxy});
+ # clear uppercase version
+ delete $ENV{uc($proxy)} if($ENV{uc($proxy)});
+}
+
+# make sure we don't get affected by other variables that control our
+# behaviour
+
+delete $ENV{'SSL_CERT_DIR'} if($ENV{'SSL_CERT_DIR'});
+delete $ENV{'SSL_CERT_PATH'} if($ENV{'SSL_CERT_PATH'});
+delete $ENV{'CURL_CA_BUNDLE'} if($ENV{'CURL_CA_BUNDLE'});
+
+#######################################################################
+# Load serverpidfile and serverportfile hashes with file names for all
+# possible servers.
+#
+sub init_serverpidfile_hash {
+ for my $proto (('ftp', 'http', 'imap', 'pop3', 'smtp', 'http/2')) {
+ for my $ssl (('', 's')) {
+ for my $ipvnum ((4, 6)) {
+ for my $idnum ((1, 2, 3)) {
+ my $serv = servername_id("$proto$ssl", $ipvnum, $idnum);
+ my $pidf = server_pidfilename("$proto$ssl", $ipvnum, $idnum);
+ $serverpidfile{$serv} = $pidf;
+ my $portf = server_portfilename("$proto$ssl", $ipvnum, $idnum);
+ $serverportfile{$serv} = $portf;
+ }
+ }
+ }
+ }
+ for my $proto (('tftp', 'sftp', 'socks', 'ssh', 'rtsp', 'gopher', 'httptls',
+ 'dict', 'smb', 'smbs', 'telnet', 'mqtt')) {
+ for my $ipvnum ((4, 6)) {
+ for my $idnum ((1, 2)) {
+ my $serv = servername_id($proto, $ipvnum, $idnum);
+ my $pidf = server_pidfilename($proto, $ipvnum, $idnum);
+ $serverpidfile{$serv} = $pidf;
+ my $portf = server_portfilename($proto, $ipvnum, $idnum);
+ $serverportfile{$serv} = $portf;
+ }
+ }
+ }
+ for my $proto (('http', 'imap', 'pop3', 'smtp', 'http/2')) {
+ for my $ssl (('', 's')) {
+ my $serv = servername_id("$proto$ssl", "unix", 1);
+ my $pidf = server_pidfilename("$proto$ssl", "unix", 1);
+ $serverpidfile{$serv} = $pidf;
+ my $portf = server_portfilename("$proto$ssl", "unix", 1);
+ $serverportfile{$serv} = $portf;
+ }
+ }
+}
+
+#######################################################################
+# Check if a given child process has just died. Reaps it if so.
+#
+sub checkdied {
+ use POSIX ":sys_wait_h";
+ my $pid = $_[0];
+ if((not defined $pid) || $pid <= 0) {
+ return 0;
+ }
+ my $rc = pidwait($pid, &WNOHANG);
+ return ($rc == $pid)?1:0;
+}
+
+#######################################################################
+# Start a new thread/process and run the given command line in there.
+# Return the pids (yes plural) of the new child process to the parent.
+#
+sub startnew {
+ my ($cmd, $pidfile, $timeout, $fake)=@_;
+
+ logmsg "startnew: $cmd\n" if ($verbose);
+
+ my $child = fork();
+ my $pid2 = 0;
+
+ if(not defined $child) {
+ logmsg "startnew: fork() failure detected\n";
+ return (-1,-1);
+ }
+
+ if(0 == $child) {
+ # Here we are the child. Run the given command.
+
+ # Put an "exec" in front of the command so that the child process
+ # keeps this child's process ID.
+ exec("exec $cmd") || die "Can't exec() $cmd: $!";
+
+ # exec() should never return back here to this process. We protect
+ # ourselves by calling die() just in case something goes really bad.
+ die "error: exec() has returned";
+ }
+
+ # Ugly hack but ssh client and gnutls-serv don't support pid files
+ if ($fake) {
+ if(open(OUT, ">$pidfile")) {
+ print OUT $child . "\n";
+ close(OUT);
+ logmsg "startnew: $pidfile faked with pid=$child\n" if($verbose);
+ }
+ else {
+ logmsg "startnew: failed to write fake $pidfile with
pid=$child\n";
+ }
+ # could/should do a while connect fails sleep a bit and loop
+ portable_sleep($timeout);
+ if (checkdied($child)) {
+ logmsg "startnew: child process has failed to start\n"
if($verbose);
+ return (-1,-1);
+ }
+ }
+
+ my $count = $timeout;
+ while($count--) {
+ if(-f $pidfile && -s $pidfile && open(PID, "<$pidfile")) {
+ $pid2 = 0 + <PID>;
+ close(PID);
+ if(($pid2 > 0) && pidexists($pid2)) {
+ # if $pid2 is valid, then make sure this pid is alive, as
+ # otherwise it is just likely to be the _previous_ pidfile or
+ # similar!
+ last;
+ }
+ # invalidate $pid2 if not actually alive
+ $pid2 = 0;
+ }
+ if (checkdied($child)) {
+ logmsg "startnew: child process has died, server might start up\n"
+ if($verbose);
+ # We can't just abort waiting for the server with a
+ # return (-1,-1);
+ # because the server might have forked and could still start
+ # up normally. Instead, just reduce the amount of time we remain
+ # waiting.
+ $count >>= 2;
+ }
+ sleep(1);
+ }
+
+ # Return two PIDs, the one for the child process we spawned and the one
+ # reported by the server itself (in case it forked again on its own).
+ # Both (potentially) need to be killed at the end of the test.
+ return ($child, $pid2);
+}
+
+
+#######################################################################
+# Check for a command in the PATH of the test server.
+#
+sub checkcmd {
+ my ($cmd)=@_;
+ my @paths=(split(":", $ENV{'PATH'}), "/usr/sbin", "/usr/local/sbin",
+ "/sbin", "/usr/bin", "/usr/local/bin",
- "./libtest/.libs", "./libtest");
++ "$LIBDIR/.libs", "$LIBDIR");
+ for(@paths) {
+ if( -x "$_/$cmd" && ! -d "$_/$cmd") {
+ # executable bit but not a directory!
+ return "$_/$cmd";
+ }
+ }
+}
+
+#######################################################################
+# Get the list of tests that the tests/data/Makefile.am knows about!
+#
+my $disttests;
+sub get_disttests {
+ my $makeCmd = 'make';
+ if(-f "../CMakeCache.txt") {
+ $makeCmd = 'cmake --build ../.. --target';
+ }
+ my @dist = `cd data && $makeCmd show`;
+ $disttests = join("", @dist);
+}
+
+#######################################################################
+# Check for a command in the PATH of the machine running curl.
+#
+sub checktestcmd {
+ my ($cmd)=@_;
+ return checkcmd($cmd);
+}
+
+#######################################################################
+# Run the application under test and return its return code
+#
+sub runclient {
+ my ($cmd)=@_;
+ my $ret = system($cmd);
+ print "CMD ($ret): $cmd\n" if($verbose && !$torture);
+ return $ret;
+
+# This is one way to test curl on a remote machine
+# my $out = system("ssh $CLIENTIP cd \'$pwd\' \\; \'$cmd\'");
+# sleep 2; # time to allow the NFS server to be updated
+# return $out;
+}
+
+#######################################################################
+# Run the application under test and return its stdout
+#
+sub runclientoutput {
+ my ($cmd)=@_;
+ return `$cmd`;
+
+# This is one way to test curl on a remote machine
+# my @out = `ssh $CLIENTIP cd \'$pwd\' \\; \'$cmd\'`;
+# sleep 2; # time to allow the NFS server to be updated
+# return @out;
+ }
+
+#######################################################################
+# Memory allocation test and failure torture testing.
+#
+sub torture {
+ my ($testcmd, $testnum, $gdbline) = @_;
+
+ # remove memdump first to be sure we get a new nice and clean one
+ unlink($memdump);
+
+ # First get URL from test server, ignore the output/result
+ runclient($testcmd);
+
+ logmsg " CMD: $testcmd\n" if($verbose);
+
+ # memanalyze -v is our friend, get the number of allocations made
+ my $count=0;
+ my @out = `$memanalyze -v $memdump`;
+ for(@out) {
+ if(/^Operations: (\d+)/) {
+ $count = $1;
+ last;
+ }
+ }
+ if(!$count) {
+ logmsg " found no functions to make fail\n";
+ return 0;
+ }
+
+ my @ttests = (1 .. $count);
+ if($shallow && ($shallow < $count)) {
+ my $discard = scalar(@ttests) - $shallow;
+ my $percent = sprintf("%.2f%%", $shallow * 100 / scalar(@ttests));;
+ logmsg " $count functions found, but only fail $shallow ($percent)\n";
+ while($discard) {
+ my $rm;
+ do {
+ # find a test to discard
+ $rm = rand(scalar(@ttests));
+ } while(!$ttests[$rm]);
+ $ttests[$rm] = undef;
+ $discard--;
+ }
+ }
+ else {
+ logmsg " $count functions to make fail\n";
+ }
+
+ for (@ttests) {
+ my $limit = $_;
+ my $fail;
+ my $dumped_core;
+
+ if(!defined($limit)) {
+ # --shallow can undefine them
+ next;
+ }
+ if($tortalloc && ($tortalloc != $limit)) {
+ next;
+ }
+
+ if($verbose) {
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+ localtime(time());
+ my $now = sprintf("%02d:%02d:%02d ", $hour, $min, $sec);
+ logmsg "Fail function no: $limit at $now\r";
+ }
+
+ # make the memory allocation function number $limit return failure
+ $ENV{'CURL_MEMLIMIT'} = $limit;
+
+ # remove memdump first to be sure we get a new nice and clean one
+ unlink($memdump);
+
+ my $cmd = $testcmd;
+ if($valgrind && !$gdbthis) {
+ my @valgrindoption = getpart("verify", "valgrind");
+ if((!@valgrindoption) || ($valgrindoption[0] !~ /disable/)) {
+ my $valgrindcmd = "$valgrind ";
+ $valgrindcmd .= "$valgrind_tool " if($valgrind_tool);
+ $valgrindcmd .= "--quiet --leak-check=yes ";
+ $valgrindcmd .= "--suppressions=$srcdir/valgrind.supp ";
+ # $valgrindcmd .= "--gen-suppressions=all ";
+ $valgrindcmd .= "--num-callers=16 ";
+ $valgrindcmd .=
"${valgrind_logfile}=$LOGDIR/valgrind$testnum";
+ $cmd = "$valgrindcmd $testcmd";
+ }
+ }
+ logmsg "*** Function number $limit is now set to fail ***\n"
if($gdbthis);
+
+ my $ret = 0;
+ if($gdbthis) {
+ runclient($gdbline);
+ }
+ else {
+ $ret = runclient($cmd);
+ }
+ #logmsg "$_ Returned " . ($ret >> 8) . "\n";
+
+ # Now clear the variable again
+ delete $ENV{'CURL_MEMLIMIT'} if($ENV{'CURL_MEMLIMIT'});
+
+ if(-r "core") {
+ # there's core file present now!
+ logmsg " core dumped\n";
+ $dumped_core = 1;
+ $fail = 2;
+ }
+
+ if($valgrind) {
+ my @e = valgrindparse("$LOGDIR/valgrind$testnum");
+ if(@e && $e[0]) {
+ if($automakestyle) {
+ logmsg "FAIL: torture $testnum - valgrind\n";
+ }
+ else {
+ logmsg " valgrind ERROR ";
+ logmsg @e;
+ }
+ $fail = 1;
+ }
+ }
+
+ # verify that it returns a proper error code, doesn't leak memory
+ # and doesn't core dump
+ if(($ret & 255) || ($ret >> 8) >= 128) {
+ logmsg " system() returned $ret\n";
+ $fail=1;
+ }
+ else {
+ my @memdata=`$memanalyze $memdump`;
+ my $leak=0;
+ for(@memdata) {
+ if($_ ne "") {
+ # well it could be other memory problems as well, but
+ # we call it leak for short here
+ $leak=1;
+ }
+ }
+ if($leak) {
+ logmsg "** MEMORY FAILURE\n";
+ logmsg @memdata;
+ logmsg `$memanalyze -l $memdump`;
+ $fail = 1;
+ }
+ }
+ if($fail) {
+ logmsg " Failed on function number $limit in test.\n",
+ " invoke with \"-t$limit\" to repeat this single case.\n";
+ stopservers($verbose);
+ return 1;
+ }
+ }
+
+ logmsg "torture OK\n";
+ return 0;
+}
+
+#######################################################################
+# Stop a test server along with pids which aren't in the %run hash yet.
+# This also stops all servers which are relative to the given one.
+#
+sub stopserver {
+ my ($server, $pidlist) = @_;
+
+ #
+ # kill sockfilter processes for pingpong relative server
+ #
+ if($server =~ /^(ftp|imap|pop3|smtp)s?(\d*)(-ipv6|)$/) {
+ my $proto = $1;
+ my $idnum = ($2 && ($2 > 1)) ? $2 : 1;
+ my $ipvnum = ($3 && ($3 =~ /6$/)) ? 6 : 4;
+ killsockfilters($proto, $ipvnum, $idnum, $verbose);
+ }
+ #
+ # All servers relative to the given one must be stopped also
+ #
+ my @killservers;
+ if($server =~ /^(ftp|http|imap|pop3|smtp)s((\d*)(-ipv6|-unix|))$/) {
+ # given a stunnel based ssl server, also kill non-ssl underlying one
+ push @killservers, "${1}${2}";
+ }
+ elsif($server =~ /^(ftp|http|imap|pop3|smtp)((\d*)(-ipv6|-unix|))$/) {
+ # given a non-ssl server, also kill stunnel based ssl piggybacking one
+ push @killservers, "${1}s${2}";
+ }
+ elsif($server =~ /^(socks)((\d*)(-ipv6|))$/) {
+ # given a socks server, also kill ssh underlying one
+ push @killservers, "ssh${2}";
+ }
+ elsif($server =~ /^(ssh)((\d*)(-ipv6|))$/) {
+ # given a ssh server, also kill socks piggybacking one
+ push @killservers, "socks${2}";
+ }
+ if($server eq "http") {
+ # since the http2 server is a proxy that needs to know about the
+ # dynamic http port it too needs to get restarted when the http server
+ # is killed
+ push @killservers, "http/2";
+ }
+ push @killservers, $server;
+ #
+ # kill given pids and server relative ones clearing them in %run hash
+ #
+ foreach my $server (@killservers) {
+ if($run{$server}) {
+ # we must prepend a space since $pidlist may already contain a pid
+ $pidlist .= " $run{$server}";
+ $run{$server} = 0;
+ }
+ $runcert{$server} = 0 if($runcert{$server});
+ }
+ killpid($verbose, $pidlist);
+ #
+ # cleanup server pid files
+ #
+ foreach my $server (@killservers) {
+ my $pidfile = $serverpidfile{$server};
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ logmsg "Warning: $server server unexpectedly alive\n";
+ killpid($verbose, $pid);
+ }
+ unlink($pidfile) if(-f $pidfile);
+ }
+}
+
+#######################################################################
+# Verify that the server that runs on $ip, $port is our server. This also
+# implies that we can speak with it, as there might be occasions when the
+# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
+# assign requested address")
+#
+sub verifyhttp {
+ my ($proto, $ipvnum, $idnum, $ip, $port_or_path) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pid = 0;
+ my $bonus="";
+ # $port_or_path contains a path for Unix sockets, sws ignores the port
+ my $port = ($ipvnum eq "unix") ? 80 : $port_or_path;
+
+ my $verifyout = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.out';
+ unlink($verifyout) if(-f $verifyout);
+
+ my $verifylog = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
+ unlink($verifylog) if(-f $verifylog);
+
+ if($proto eq "gopher") {
+ # gopher is funny
+ $bonus="1/";
+ }
+
+ my $flags = "--max-time $server_response_maxtime ";
+ $flags .= "--output $verifyout ";
+ $flags .= "--silent ";
+ $flags .= "--verbose ";
+ $flags .= "--globoff ";
+ $flags .= "--unix-socket '$port_or_path' " if $ipvnum eq "unix";
+ $flags .= "--insecure " if($proto eq 'https');
+ $flags .= "\"$proto://$ip:$port/${bonus}verifiedserver\"";
+
+ my $cmd = "$VCURL $flags 2>$verifylog";
+
+ # verify if our/any server is running on this port
+ logmsg "RUN: $cmd\n" if($verbose);
+ my $res = runclient($cmd);
+
+ $res >>= 8; # rotate the result
+ if($res & 128) {
+ logmsg "RUN: curl command died with a coredump\n";
+ return -1;
+ }
+
+ if($res && $verbose) {
+ logmsg "RUN: curl command returned $res\n";
+ if(open(FILE, "<$verifylog")) {
+ while(my $string = <FILE>) {
+ logmsg "RUN: $string" if($string !~ /^([ \t]*)$/);
+ }
+ close(FILE);
+ }
+ }
+
+ my $data;
+ if(open(FILE, "<$verifyout")) {
+ while(my $string = <FILE>) {
+ $data = $string;
+ last; # only want first line
+ }
+ close(FILE);
+ }
+
+ if($data && ($data =~ /WE ROOLZ: (\d+)/)) {
+ $pid = 0+$1;
+ }
+ elsif($res == 6) {
+ # curl: (6) Couldn't resolve host '::1'
+ logmsg "RUN: failed to resolve host
($proto://$ip:$port/verifiedserver)\n";
+ return -1;
+ }
+ elsif($data || ($res && ($res != 7))) {
+ logmsg "RUN: Unknown server on our $server port: $port ($res)\n";
+ return -1;
+ }
+ return $pid;
+}
+
+#######################################################################
+# Verify that the server that runs on $ip, $port is our server. This also
+# implies that we can speak with it, as there might be occasions when the
+# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
+# assign requested address")
+#
+sub verifyftp {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pid = 0;
+ my $time=time();
+ my $extra="";
+
+ my $verifylog = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
+ unlink($verifylog) if(-f $verifylog);
+
+ if($proto eq "ftps") {
+ $extra .= "--insecure --ftp-ssl-control ";
+ }
+
+ my $flags = "--max-time $server_response_maxtime ";
+ $flags .= "--silent ";
+ $flags .= "--verbose ";
+ $flags .= "--globoff ";
+ $flags .= $extra;
+ $flags .= "\"$proto://$ip:$port/verifiedserver\"";
+
+ my $cmd = "$VCURL $flags 2>$verifylog";
+
+ # check if this is our server running on this port:
+ logmsg "RUN: $cmd\n" if($verbose);
+ my @data = runclientoutput($cmd);
+
+ my $res = $? >> 8; # rotate the result
+ if($res & 128) {
+ logmsg "RUN: curl command died with a coredump\n";
+ return -1;
+ }
+
+ foreach my $line (@data) {
+ if($line =~ /WE ROOLZ: (\d+)/) {
+ # this is our test server with a known pid!
+ $pid = 0+$1;
+ last;
+ }
+ }
+ if($pid <= 0 && @data && $data[0]) {
+ # this is not a known server
+ logmsg "RUN: Unknown server on our $server port: $port\n";
+ return 0;
+ }
+ # we can/should use the time it took to verify the FTP server as a measure
+ # on how fast/slow this host/FTP is.
+ my $took = int(0.5+time()-$time);
+
+ if($verbose) {
+ logmsg "RUN: Verifying our test $server server took $took seconds\n";
+ }
+ $ftpchecktime = $took>=1?$took:1; # make sure it never is below 1
+
+ return $pid;
+}
+
+#######################################################################
+# Verify that the server that runs on $ip, $port is our server. This also
+# implies that we can speak with it, as there might be occasions when the
+# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
+# assign requested address")
+#
+sub verifyrtsp {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pid = 0;
+
+ my $verifyout = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.out';
+ unlink($verifyout) if(-f $verifyout);
+
+ my $verifylog = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
+ unlink($verifylog) if(-f $verifylog);
+
+ my $flags = "--max-time $server_response_maxtime ";
+ $flags .= "--output $verifyout ";
+ $flags .= "--silent ";
+ $flags .= "--verbose ";
+ $flags .= "--globoff ";
+ # currently verification is done using http
+ $flags .= "\"http://$ip:$port/verifiedserver\"";
+
+ my $cmd = "$VCURL $flags 2>$verifylog";
+
+ # verify if our/any server is running on this port
+ logmsg "RUN: $cmd\n" if($verbose);
+ my $res = runclient($cmd);
+
+ $res >>= 8; # rotate the result
+ if($res & 128) {
+ logmsg "RUN: curl command died with a coredump\n";
+ return -1;
+ }
+
+ if($res && $verbose) {
+ logmsg "RUN: curl command returned $res\n";
+ if(open(FILE, "<$verifylog")) {
+ while(my $string = <FILE>) {
+ logmsg "RUN: $string" if($string !~ /^([ \t]*)$/);
+ }
+ close(FILE);
+ }
+ }
+
+ my $data;
+ if(open(FILE, "<$verifyout")) {
+ while(my $string = <FILE>) {
+ $data = $string;
+ last; # only want first line
+ }
+ close(FILE);
+ }
+
+ if($data && ($data =~ /RTSP_SERVER WE ROOLZ: (\d+)/)) {
+ $pid = 0+$1;
+ }
+ elsif($res == 6) {
+ # curl: (6) Couldn't resolve host '::1'
+ logmsg "RUN: failed to resolve host
($proto://$ip:$port/verifiedserver)\n";
+ return -1;
+ }
+ elsif($data || ($res != 7)) {
+ logmsg "RUN: Unknown server on our $server port: $port\n";
+ return -1;
+ }
+ return $pid;
+}
+
+#######################################################################
+# Verify that the ssh server has written out its pidfile, recovering
+# the pid from the file and returning it if a process with that pid is
+# actually alive.
+#
+sub verifyssh {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pidfile = server_pidfilename($proto, $ipvnum, $idnum);
+ my $pid = 0;
+ if(open(FILE, "<$pidfile")) {
+ $pid=0+<FILE>;
+ close(FILE);
+ }
+ if($pid > 0) {
+ # if we have a pid it is actually our ssh server,
+ # since runsshserver() unlinks previous pidfile
+ if(!pidexists($pid)) {
+ logmsg "RUN: SSH server has died after starting up\n";
+ checkdied($pid);
+ unlink($pidfile);
+ $pid = -1;
+ }
+ }
+ return $pid;
+}
+
+#######################################################################
+# Verify that we can connect to the sftp server, properly authenticate
+# with generated config and key files and run a simple remote pwd.
+#
+sub verifysftp {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $verified = 0;
+ # Find out sftp client canonical file name
+ my $sftp = find_sftp();
+ if(!$sftp) {
+ logmsg "RUN: SFTP server cannot find $sftpexe\n";
+ return -1;
+ }
+ # Find out ssh client canonical file name
+ my $ssh = find_ssh();
+ if(!$ssh) {
+ logmsg "RUN: SFTP server cannot find $sshexe\n";
+ return -1;
+ }
+ # Connect to sftp server, authenticate and run a remote pwd
+ # command using our generated configuration and key files
+ my $cmd = "\"$sftp\" -b $sftpcmds -F $sftpconfig -S \"$ssh\" $ip >
$sftplog 2>&1";
+ my $res = runclient($cmd);
+ # Search for pwd command response in log file
+ if(open(SFTPLOGFILE, "<$sftplog")) {
+ while(<SFTPLOGFILE>) {
+ if(/^Remote working directory: /) {
+ $verified = 1;
+ last;
+ }
+ }
+ close(SFTPLOGFILE);
+ }
+ return $verified;
+}
+
+#######################################################################
+# Verify that the non-stunnel HTTP TLS extensions capable server that runs
+# on $ip, $port is our server. This also implies that we can speak with it,
+# as there might be occasions when the server runs fine but we cannot talk
+# to it ("Failed to connect to ::1: Can't assign requested address")
+#
+sub verifyhttptls {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pidfile = server_pidfilename($proto, $ipvnum, $idnum);
+ my $pid = 0;
+
+ my $verifyout = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.out';
+ unlink($verifyout) if(-f $verifyout);
+
+ my $verifylog = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
+ unlink($verifylog) if(-f $verifylog);
+
+ my $flags = "--max-time $server_response_maxtime ";
+ $flags .= "--output $verifyout ";
+ $flags .= "--verbose ";
+ $flags .= "--globoff ";
+ $flags .= "--insecure ";
+ $flags .= "--tlsauthtype SRP ";
+ $flags .= "--tlsuser jsmith ";
+ $flags .= "--tlspassword abc ";
+ $flags .= "\"https://$ip:$port/verifiedserver\"";
+
+ my $cmd = "$VCURL $flags 2>$verifylog";
+
+ # verify if our/any server is running on this port
+ logmsg "RUN: $cmd\n" if($verbose);
+ my $res = runclient($cmd);
+
+ $res >>= 8; # rotate the result
+ if($res & 128) {
+ logmsg "RUN: curl command died with a coredump\n";
+ return -1;
+ }
+
+ if($res && $verbose) {
+ logmsg "RUN: curl command returned $res\n";
+ if(open(FILE, "<$verifylog")) {
+ while(my $string = <FILE>) {
+ logmsg "RUN: $string" if($string !~ /^([ \t]*)$/);
+ }
+ close(FILE);
+ }
+ }
+
+ my $data;
+ if(open(FILE, "<$verifyout")) {
+ while(my $string = <FILE>) {
+ $data .= $string;
+ }
+ close(FILE);
+ }
+
+ if($data && ($data =~ /(GNUTLS|GnuTLS)/) && open(FILE, "<$pidfile")) {
+ $pid=0+<FILE>;
+ close(FILE);
+ if($pid > 0) {
+ # if we have a pid it is actually our httptls server,
+ # since runhttptlsserver() unlinks previous pidfile
+ if(!pidexists($pid)) {
+ logmsg "RUN: $server server has died after starting up\n";
+ checkdied($pid);
+ unlink($pidfile);
+ $pid = -1;
+ }
+ }
+ return $pid;
+ }
+ elsif($res == 6) {
+ # curl: (6) Couldn't resolve host '::1'
+ logmsg "RUN: failed to resolve host
(https://$ip:$port/verifiedserver)\n";
+ return -1;
+ }
+ elsif($data || ($res && ($res != 7))) {
+ logmsg "RUN: Unknown server on our $server port: $port ($res)\n";
+ return -1;
+ }
+ return $pid;
+}
+
+#######################################################################
+# STUB for verifying socks
+#
+sub verifysocks {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pidfile = server_pidfilename($proto, $ipvnum, $idnum);
+ my $pid = 0;
+ if(open(FILE, "<$pidfile")) {
+ $pid=0+<FILE>;
+ close(FILE);
+ }
+ if($pid > 0) {
+ # if we have a pid it is actually our socks server,
+ # since runsocksserver() unlinks previous pidfile
+ if(!pidexists($pid)) {
+ logmsg "RUN: SOCKS server has died after starting up\n";
+ checkdied($pid);
+ unlink($pidfile);
+ $pid = -1;
+ }
+ }
+ return $pid;
+}
+
+#######################################################################
+# Verify that the server that runs on $ip, $port is our server. This also
+# implies that we can speak with it, as there might be occasions when the
+# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
+# assign requested address")
+#
+sub verifysmb {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pid = 0;
+ my $time=time();
+ my $extra="";
+
+ my $verifylog = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
+ unlink($verifylog) if(-f $verifylog);
+
+ my $flags = "--max-time $server_response_maxtime ";
+ $flags .= "--silent ";
+ $flags .= "--verbose ";
+ $flags .= "--globoff ";
+ $flags .= "-u 'curltest:curltest' ";
+ $flags .= $extra;
+ $flags .= "\"$proto://$ip:$port/SERVER/verifiedserver\"";
+
+ my $cmd = "$VCURL $flags 2>$verifylog";
+
+ # check if this is our server running on this port:
+ logmsg "RUN: $cmd\n" if($verbose);
+ my @data = runclientoutput($cmd);
+
+ my $res = $? >> 8; # rotate the result
+ if($res & 128) {
+ logmsg "RUN: curl command died with a coredump\n";
+ return -1;
+ }
+
+ foreach my $line (@data) {
+ if($line =~ /WE ROOLZ: (\d+)/) {
+ # this is our test server with a known pid!
+ $pid = 0+$1;
+ last;
+ }
+ }
+ if($pid <= 0 && @data && $data[0]) {
+ # this is not a known server
+ logmsg "RUN: Unknown server on our $server port: $port\n";
+ return 0;
+ }
+ # we can/should use the time it took to verify the server as a measure
+ # on how fast/slow this host is.
+ my $took = int(0.5+time()-$time);
+
+ if($verbose) {
+ logmsg "RUN: Verifying our test $server server took $took seconds\n";
+ }
+ $ftpchecktime = $took>=1?$took:1; # make sure it never is below 1
+
+ return $pid;
+}
+
+#######################################################################
+# Verify that the server that runs on $ip, $port is our server. This also
+# implies that we can speak with it, as there might be occasions when the
+# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
+# assign requested address")
+#
+sub verifytelnet {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $server = servername_id($proto, $ipvnum, $idnum);
+ my $pid = 0;
+ my $time=time();
+ my $extra="";
+
+ my $verifylog = "$LOGDIR/".
+ servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
+ unlink($verifylog) if(-f $verifylog);
+
+ my $flags = "--max-time $server_response_maxtime ";
+ $flags .= "--silent ";
+ $flags .= "--verbose ";
+ $flags .= "--globoff ";
+ $flags .= "--upload-file - ";
+ $flags .= $extra;
+ $flags .= "\"$proto://$ip:$port\"";
+
+ my $cmd = "echo 'verifiedserver' | $VCURL $flags 2>$verifylog";
+
+ # check if this is our server running on this port:
+ logmsg "RUN: $cmd\n" if($verbose);
+ my @data = runclientoutput($cmd);
+
+ my $res = $? >> 8; # rotate the result
+ if($res & 128) {
+ logmsg "RUN: curl command died with a coredump\n";
+ return -1;
+ }
+
+ foreach my $line (@data) {
+ if($line =~ /WE ROOLZ: (\d+)/) {
+ # this is our test server with a known pid!
+ $pid = 0+$1;
+ last;
+ }
+ }
+ if($pid <= 0 && @data && $data[0]) {
+ # this is not a known server
+ logmsg "RUN: Unknown server on our $server port: $port\n";
+ return 0;
+ }
+ # we can/should use the time it took to verify the server as a measure
+ # on how fast/slow this host is.
+ my $took = int(0.5+time()-$time);
+
+ if($verbose) {
+ logmsg "RUN: Verifying our test $server server took $took seconds\n";
+ }
+
+ return $pid;
+}
+
+
+#######################################################################
+# Verify that the server that runs on $ip, $port is our server.
+# Retry over several seconds before giving up. The ssh server in
+# particular can take a long time to start if it needs to generate
+# keys on a slow or loaded host.
+#
+# Just for convenience, test harness uses 'https' and 'httptls' literals
+# as values for 'proto' variable in order to differentiate different
+# servers. 'https' literal is used for stunnel based https test servers,
+# and 'httptls' is used for non-stunnel https test servers.
+#
+
+my %protofunc = ('http' => \&verifyhttp,
+ 'https' => \&verifyhttp,
+ 'rtsp' => \&verifyrtsp,
+ 'ftp' => \&verifyftp,
+ 'pop3' => \&verifyftp,
+ 'imap' => \&verifyftp,
+ 'smtp' => \&verifyftp,
+ 'ftps' => \&verifyftp,
+ 'tftp' => \&verifyftp,
+ 'ssh' => \&verifyssh,
+ 'socks' => \&verifysocks,
+ 'gopher' => \&verifyhttp,
+ 'httptls' => \&verifyhttptls,
+ 'dict' => \&verifyftp,
+ 'smb' => \&verifysmb,
+ 'telnet' => \&verifytelnet);
+
+sub verifyserver {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+
+ my $count = 30; # try for this many seconds
+ my $pid;
+
+ while($count--) {
+ my $fun = $protofunc{$proto};
+
+ $pid = &$fun($proto, $ipvnum, $idnum, $ip, $port);
+
+ if($pid > 0) {
+ last;
+ }
+ elsif($pid < 0) {
+ # a real failure, stop trying and bail out
+ return 0;
+ }
+ sleep(1);
+ }
+ return $pid;
+}
+
+#######################################################################
+# Single shot server responsiveness test. This should only be used
+# to verify that a server present in %run hash is still functional
+#
+sub responsiveserver {
+ my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
+ my $prev_verbose = $verbose;
+
+ $verbose = 0;
+ my $fun = $protofunc{$proto};
+ my $pid = &$fun($proto, $ipvnum, $idnum, $ip, $port);
+ $verbose = $prev_verbose;
+
+ if($pid > 0) {
+ return 1; # responsive
+ }
+
+ my $srvrname = servername_str($proto, $ipvnum, $idnum);
+ logmsg " server precheck FAILED (unresponsive $srvrname server)\n";
+ return 0;
+}
+
+#######################################################################
+# start the http2 server
+#
+sub runhttp2server {
+ my ($verbose) = @_;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+ my $proto="http/2";
+ my $ipvnum = 4;
+ my $idnum = 0;
+ my $exe = "$perl $srcdir/http2-server.pl";
+ my $verbose_flag = "--verbose ";
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--connect $HOSTIP:$HTTPPORT ";
+ $flags .= $verbose_flag if($debugprotocol);
+
+ my ($http2pid, $pid2);
+ my $port = 23113;
+ for(1 .. 10) {
+ $port += int(rand(900));
+ my $aflags = "--port $port $flags";
+
+ my $cmd = "$exe $aflags";
+ ($http2pid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($http2pid <= 0 || !pidexists($http2pid)) {
+ # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ $doesntrun{$pidfile} = 1;
++ $http2pid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $http2pid port $port\n";
+ }
+ last;
+ }
+
++ logmsg "RUN: failed to start the $srvrname server\n" if(!$http2pid);
++
+ return ($http2pid, $pid2, $port);
+}
+
+#######################################################################
+# start the http server
+#
+sub runhttpserver {
+ my ($proto, $verbose, $alt, $port_or_path) = @_;
+ my $ip = $HOSTIP;
+ my $ipvnum = 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+ my $exe = "$perl $srcdir/httpserver.pl";
+ my $verbose_flag = "--verbose ";
+
+ if($alt eq "ipv6") {
+ # if IPv6, use a different setup
+ $ipvnum = 6;
+ $ip = $HOST6IP;
+ }
+ elsif($alt eq "proxy") {
+ # basically the same, but another ID
+ $idnum = 2;
+ }
+ elsif($alt eq "unix") {
+ # IP (protocol) is mutually exclusive with Unix sockets
+ $ipvnum = "unix";
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--gopher " if($proto eq "gopher");
+ $flags .= "--connect $HOSTIP " if($alt eq "proxy");
+ $flags .= $verbose_flag if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--portfile $portfile ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ if($ipvnum eq "unix") {
+ $flags .= "--unix-socket '$port_or_path' ";
+ } else {
+ $flags .= "--ipv$ipvnum --port 0 ";
+ }
+ $flags .= "--srcdir \"$srcdir\"";
+
+ my $cmd = "$exe $flags";
+ my ($httppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($httppid <= 0 || !pidexists($httppid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ # where is it?
+ my $port;
+ if(!$port_or_path) {
+ $port = $port_or_path = pidfromfile($portfile);
+ }
+
+ # Server is up. Verify that we can speak to it.
+ my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port_or_path);
+ if(!$pid3) {
+ logmsg "RUN: $srvrname server failed verification\n";
+ # failed to talk to it properly. Kill the server and return failure
+ stopserver($server, "$httppid $pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
- return (0,0);
++ return (0, 0, 0);
+ }
+ $pid2 = $pid3;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server is on PID $httppid port $port\n";
+ }
+
+ return ($httppid, $pid2, $port);
+}
+
+#######################################################################
+# start the https stunnel based server
+#
+sub runhttpsserver {
+ my ($verbose, $ipv6, $proxy, $certfile) = @_;
+ my $proto = 'https';
+ my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
+ my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if($proxy eq "proxy") {
+ # the https-proxy runs as https2
+ $idnum = 2;
+ }
+
+ if(!$stunnel) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $certfile = 'stunnel.pem' unless($certfile);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--ipv$ipvnum --proto $proto ";
+ $flags .= "--certfile \"$certfile\" " if($certfile ne 'stunnel.pem');
+ $flags .= "--stunnel \"$stunnel\" --srcdir \"$srcdir\" ";
+ if(!$proxy) {
+ $flags .= "--connect $HTTPPORT";
+ }
+ else {
+ # for HTTPS-proxy we connect to the HTTP proxy
+ $flags .= "--connect $HTTPPROXYPORT";
+ }
+
+ my $pid2;
+ my $pid3;
+ my $httpspid;
+ my $port = 24512; # start attempt
+ for (1 .. 10) {
+ $port += int(rand(600));
+ my $options = "$flags --accept $port";
+
+ my $cmd = "$perl $srcdir/secureserver.pl $options";
+ ($httpspid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($httpspid <= 0 || !pidexists($httpspid)) {
+ # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
- next;
- }
-
- # Server is up. Verify that we can speak to it.
- $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return
failure
- stopserver($server, "$httpspid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
++ $httpspid = $pid2 = 0;
+ next;
+ }
+ # we have a server!
++ if($verbose) {
++ logmsg "RUN: $srvrname server is PID $httpspid port $port\n";
++ }
+ last;
+ }
- # Here pid3 is actually the pid returned by the unsecure-http server.
-
+ $runcert{$server} = $certfile;
-
- if($verbose) {
- logmsg "RUN: $srvrname server is PID $httpspid port $port\n";
- }
++ logmsg "RUN: failed to start the $srvrname server\n" if(!$httpspid);
+
+ return ($httpspid, $pid2, $port);
+}
+
+#######################################################################
+# start the non-stunnel HTTP TLS extensions capable server
+#
+sub runhttptlsserver {
+ my ($verbose, $ipv6) = @_;
+ my $proto = "httptls";
+ my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
+ my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if(!$httptlssrv) {
+ return (0,0);
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--http ";
+ $flags .= "--debug 1 " if($debugprotocol);
+ $flags .= "--priority NORMAL:+SRP ";
+ $flags .= "--srppasswd $srcdir/certs/srp-verifier-db ";
+ $flags .= "--srppasswdconf $srcdir/certs/srp-verifier-conf";
+
+ my $port = 24367;
+ my ($httptlspid, $pid2);
+ for (1 .. 10) {
+ $port += int(rand(800));
+ my $allflags = "--port $port $flags";
+
+ my $cmd = "$httptlssrv $allflags > $logfile 2>&1";
+ ($httptlspid, $pid2) = startnew($cmd, $pidfile, 10, 1);
+
+ if($httptlspid <= 0 || !pidexists($httptlspid)) {
+ # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $httptlspid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $httptlspid port $port\n";
+ }
+ last;
+ }
++ logmsg "RUN: failed to start the $srvrname server\n" if(!$httptlspid);
+ return ($httptlspid, $pid2, $port);
+}
+
+#######################################################################
+# start the pingpong server (FTP, POP3, IMAP, SMTP)
+#
+sub runpingpongserver {
+ my ($proto, $id, $verbose, $ipv6) = @_;
+ my $port;
+ my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
+ my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
+ my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
+ return (0,0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--portfile \"$portfile\" ";
+ $flags .= "--srcdir \"$srcdir\" --proto $proto ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--ipv$ipvnum --port 0 --addr \"$ip\"";
+
+ my $cmd = "$perl $srcdir/ftpserver.pl $flags";
+ my ($ftppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($ftppid <= 0 || !pidexists($ftppid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ # where is it?
+ $port = pidfromfile($portfile);
+
+ logmsg "PINGPONG runs on port $port ($portfile)\n" if($verbose);
+
+ # Server is up. Verify that we can speak to it.
+ my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
+ if(!$pid3) {
+ logmsg "RUN: $srvrname server failed verification\n";
+ # failed to talk to it properly. Kill the server and return failure
+ stopserver($server, "$ftppid $pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ $pid2 = $pid3;
+
+ logmsg "RUN: $srvrname server is PID $ftppid port $port\n" if($verbose);
+
+ # Assign the correct port variable!
+ if($proto eq "ftp") {
+ if($ipvnum == 6) {
+ # if IPv6, use a different setup
+ $FTP6PORT = $port;
+ }
+ else {
+ $FTPPORT = $port;
+ }
+ }
+ elsif($proto eq "pop3") {
+ if($ipvnum == 6) {
+ $POP36PORT = $port;
+ }
+ else {
+ $POP3PORT = $port;
+ }
+ }
+ elsif($proto eq "imap") {
+ if($ipvnum == 6) {
+ $IMAP6PORT = $port;
+ }
+ else {
+ $IMAPPORT = $port;
+ }
+ }
+ elsif($proto eq "smtp") {
+ if($ipvnum == 6) {
+ $SMTP6PORT = $port;
+ }
+ else {
+ $SMTPPORT = $port;
+ }
+ }
+ else {
+ print STDERR "Unsupported protocol $proto!!\n";
- return 0;
++ return (0,0);
+ }
+
+ return ($pid2, $ftppid);
+}
+
+#######################################################################
+# start the ftps server (or rather, tunnel)
+#
+sub runftpsserver {
+ my ($verbose, $ipv6, $certfile) = @_;
+ my $proto = 'ftps';
+ my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
+ my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if(!$stunnel) {
+ return (0,0);
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $certfile = 'stunnel.pem' unless($certfile);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--ipv$ipvnum --proto $proto ";
+ $flags .= "--certfile \"$certfile\" " if($certfile ne 'stunnel.pem');
+ $flags .= "--stunnel \"$stunnel\" --srcdir \"$srcdir\" ";
+ $flags .= "--connect $FTPPORT";
+
+ my $port = 26713;
+ my $pid2;
+ my $pid3;
+ my $ftpspid;
+ for (1 .. 10) {
+ $port += int(rand(700));
+ my $options = "$flags --accept $port";
+ my $cmd = "$perl $srcdir/secureserver.pl $options";
+ ($ftpspid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($ftpspid <= 0 || !pidexists($ftpspid)) {
+ # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
++ $ftpspid = $pid2 = 0;
+ next;
+ }
+
- $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return
failure
- stopserver($server, "$ftpspid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- next;
- }
- # Here pid3 is actually the pid returned by the unsecure-ftp server.
-
++ $doesntrun{$pidfile} = 0;
+ $runcert{$server} = $certfile;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server is PID $ftpspid port $port\n";
+ }
+ last;
+ }
+
++ logmsg "RUN: failed to start the $srvrname server\n" if(!$ftpspid);
++
+ return ($ftpspid, $pid2, $port);
+}
+
+#######################################################################
+# start the tftp server
+#
+sub runtftpserver {
+ my ($id, $verbose, $ipv6) = @_;
+ my $ip = $HOSTIP;
+ my $proto = 'tftp';
+ my $ipvnum = 4;
+ my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if($ipv6) {
+ # if IPv6, use a different setup
+ $ipvnum = 6;
+ $ip = $HOST6IP;
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" ".
+ "--portfile \"$portfile\" ".
+ "--logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--ipv$ipvnum --port 0 --srcdir \"$srcdir\"";
+
+ my $cmd = "$perl $srcdir/tftpserver.pl $flags";
+ my ($tftppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($tftppid <= 0 || !pidexists($tftppid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $port = pidfromfile($portfile);
+
+ # Server is up. Verify that we can speak to it.
+ my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
+ if(!$pid3) {
+ logmsg "RUN: $srvrname server failed verification\n";
+ # failed to talk to it properly. Kill the server and return failure
+ stopserver($server, "$tftppid $pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
- return (0,0);
++ return (0, 0, 0);
+ }
+ $pid2 = $pid3;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server on PID $tftppid port $port\n";
+ }
+
+ return ($pid2, $tftppid, $port);
+}
+
+
+#######################################################################
+# start the rtsp server
+#
+sub runrtspserver {
+ my ($verbose, $ipv6) = @_;
+ my $ip = $HOSTIP;
+ my $proto = 'rtsp';
+ my $ipvnum = 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if($ipv6) {
+ # if IPv6, use a different setup
+ $ipvnum = 6;
+ $ip = $HOST6IP;
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" ".
+ "--portfile \"$portfile\" ".
+ "--logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--ipv$ipvnum --port 0 --srcdir \"$srcdir\"";
+
+ my $cmd = "$perl $srcdir/rtspserver.pl $flags";
+ my ($rtsppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($rtsppid <= 0 || !pidexists($rtsppid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $port = pidfromfile($portfile);
+
+ # Server is up. Verify that we can speak to it.
+ my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
+ if(!$pid3) {
+ logmsg "RUN: $srvrname server failed verification\n";
+ # failed to talk to it properly. Kill the server and return failure
+ stopserver($server, "$rtsppid $pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
- return (0,0);
++ return (0, 0, 0);
+ }
+ $pid2 = $pid3;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $rtsppid port $port\n";
+ }
+
+ return ($rtsppid, $pid2, $port);
+}
+
+
+#######################################################################
+# Start the ssh (scp/sftp) server
+#
+sub runsshserver {
+ my ($id, $verbose, $ipv6) = @_;
+ my $ip=$HOSTIP;
+ my $proto = 'ssh';
+ my $ipvnum = 4;
+ my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $port = 20000; # no lower port
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $sshd = find_sshd();
+ if($sshd) {
+ ($sshdid,$sshdvernum,$sshdverstr,$sshderror) = sshversioninfo($sshd);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ my $flags = "";
+ $flags .= "--verbose " if($verbose);
+ $flags .= "--debugprotocol " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--ipv$ipvnum --addr \"$ip\" ";
+ $flags .= "--user \"$USER\"";
+
+ my $sshpid;
+ my $pid2;
+
+ my $wport = 0,
+ my @tports;
+ for(1 .. 10) {
+
+ # sshd doesn't have a way to pick an unused random port number, so
+ # instead we iterate over possible port numbers to use until we find
+ # one that works
+ $port += int(rand(500));
+ push @tports, $port;
+
+ my $options = "$flags --sshport $port";
+
+ my $cmd = "$perl $srcdir/sshserver.pl $options";
+ ($sshpid, $pid2) = startnew($cmd, $pidfile, 60, 0);
+
+ # on loaded systems sshserver start up can take longer than the
+ # timeout passed to startnew, when this happens startnew completes
+ # without being able to read the pidfile and consequently returns a
+ # zero pid2 above.
+ if($sshpid <= 0 || !pidexists($sshpid)) {
+ # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server on $port\n";
+ stopserver($server, "$pid2");
+ $doesntrun{$pidfile} = 1;
++ $sshpid = $pid2 = 0;
+ next;
+ }
+
- # ssh server verification allows some extra time for the server to
- # start up and gives us the opportunity of recovering the pid from the
- # pidfile, when this verification succeeds the recovered pid is
- # assigned to pid2.
-
- my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to fetch server pid. Kill the server and return failure
- stopserver($server, "$sshpid $pid2");
- $doesntrun{$pidfile} = 1;
- next;
- }
- $pid2 = $pid3;
-
+ # once it is known that the ssh server is alive, sftp server
+ # verification is performed actually connecting to it, authenticating
+ # and performing a very simple remote command. This verification is
+ # tried only one time.
+
+ $sshdlog = server_logfilename($LOGDIR, 'ssh', $ipvnum, $idnum);
+ $sftplog = server_logfilename($LOGDIR, 'sftp', $ipvnum, $idnum);
+
+ if(verifysftp('sftp', $ipvnum, $idnum, $ip, $port) < 1) {
+ logmsg "RUN: SFTP server failed verification\n";
+ # failed to talk to it properly. Kill the server and return
failure
+ display_sftplog();
+ display_sftpconfig();
+ display_sshdlog();
+ display_sshdconfig();
+ stopserver($server, "$sshpid $pid2");
+ $doesntrun{$pidfile} = 1;
++ $sshpid = $pid2 = 0;
+ next;
+ }
+ # we're happy, no need to loop anymore!
++ $doesntrun{$pidfile} = 0;
+ $wport = $port;
+ last;
+ }
++ logmsg "RUN: failed to start the $srvrname server on $port\n"
if(!$sshpid);
+
+ if(!$wport) {
+ logmsg "RUN: couldn't start $srvrname. Tried these ports:";
+ logmsg "RUN: ".join(", ", @tports);
+ return (0,0,0);
+ }
+
+ my $hstpubmd5f = "curl_host_rsa_key.pub_md5";
+ if(!open(PUBMD5FILE, "<", $hstpubmd5f) ||
+ (read(PUBMD5FILE, $SSHSRVMD5, 32) != 32) ||
+ !close(PUBMD5FILE) ||
+ ($SSHSRVMD5 !~ /^[a-f0-9]{32}$/i))
+ {
+ my $msg = "Fatal: $srvrname pubkey md5 missing : \"$hstpubmd5f\" :
$!";
+ logmsg "$msg\n";
+ stopservers($verbose);
+ die $msg;
+ }
+
+ logmsg "RUN: $srvrname on PID $pid2 port $wport\n" if($verbose);
+
+ return ($pid2, $sshpid, $wport);
+}
+
+#######################################################################
+# Start the socks server
+#
+sub runmqttserver {
+ my ($id, $verbose, $ipv6) = @_;
+ my $ip=$HOSTIP;
+ my $port = $MQTTPORT;
+ my $proto = 'mqtt';
+ my $ipvnum = 4;
+ my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $portfile;
+ my $logfile;
+ my $flags = "";
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+ $pidfile = $serverpidfile{$server};
+ $portfile = $serverportfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
+ return (0,0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ # start our MQTT server - on a random port!
+ my $cmd="server/mqttd".exe_ext('SRV').
+ " --port 0 ".
+ " --pidfile $pidfile".
+ " --portfile $portfile".
+ " --config $FTPDCMD";
+ my ($sockspid, $pid2) = startnew($cmd, $pidfile, 30, 0);
+
+ if($sockspid <= 0 || !pidexists($sockspid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ $MQTTPORT = pidfromfile($portfile);
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server is now running PID $pid2 on PORT
$MQTTPORT\n";
+ }
+
+ return ($pid2, $sockspid);
+}
+
+#######################################################################
+# Start the socks server
+#
+sub runsocksserver {
+ my ($id, $verbose, $ipv6) = @_;
+ my $ip=$HOSTIP;
+ my $proto = 'socks';
+ my $ipvnum = 4;
+ my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ # start our socks server, get commands from the FTP cmd file
+ my $cmd="server/socksd".exe_ext('SRV').
+ " --port 0 ".
+ " --pidfile $pidfile".
+ " --portfile $portfile".
+ " --backend $HOSTIP".
+ " --config $FTPDCMD";
+ my ($sockspid, $pid2) = startnew($cmd, $pidfile, 30, 0);
+
+ if($sockspid <= 0 || !pidexists($sockspid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ $doesntrun{$pidfile} = 1;
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $port = pidfromfile($portfile);
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server is now running PID $pid2\n";
+ }
+
+ return ($pid2, $sockspid, $port);
+}
+
+#######################################################################
+# start the dict server
+#
+sub rundictserver {
+ my ($verbose, $alt) = @_;
+ my $proto = "dict";
+ my $ip = $HOSTIP;
+ my $ipvnum = 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if($alt eq "ipv6") {
+ # No IPv6
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose 1 " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--srcdir \"$srcdir\" ";
+ $flags .= "--host $HOSTIP";
+
+ my $port = 29000;
+ my ($dictpid, $pid2);
+ for(1 .. 10) {
+ $port += int(rand(900));
+ my $aflags = "--port $port $flags";
+ my $cmd = "$srcdir/dictserver.py $aflags";
+ ($dictpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($dictpid <= 0 || !pidexists($dictpid)) {
+ # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $dictpid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $dictpid port $port\n";
+ }
+ last;
+ }
++ logmsg "RUN: failed to start the $srvrname server\n" if(!$dictpid);
+
+ return ($dictpid, $pid2, $port);
+}
+
+#######################################################################
+# start the SMB server
+#
+sub runsmbserver {
+ my ($verbose, $alt) = @_;
+ my $proto = "smb";
+ my $ip = $HOSTIP;
+ my $ipvnum = 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if($alt eq "ipv6") {
+ # No IPv6
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose 1 " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--srcdir \"$srcdir\" ";
+ $flags .= "--host $HOSTIP";
+
+ my ($smbpid, $pid2);
+ my $port = 31923;
+ for(1 .. 10) {
+ $port += int(rand(760));
+ my $aflags = "--port $port $flags";
+ my $cmd = "$srcdir/smbserver.py $aflags";
+ ($smbpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($smbpid <= 0 || !pidexists($smbpid)) {
+ # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $smbpid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $smbpid port $port\n";
+ }
+ last;
+ }
++ logmsg "RUN: failed to start the $srvrname server\n" if(!$smbpid);
+
+ return ($smbpid, $pid2, $port);
+}
+
+#######################################################################
+# start the telnet server
+#
+sub runnegtelnetserver {
+ my ($verbose, $alt) = @_;
+ my $proto = "telnet";
+ my $ip = $HOSTIP;
+ my $ipvnum = 4;
+ my $idnum = 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+
+ if($alt eq "ipv6") {
+ # No IPv6
+ }
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
- return (0,0);
++ return (0, 0, 0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--verbose 1 " if($debugprotocol);
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--id $idnum " if($idnum > 1);
+ $flags .= "--srcdir \"$srcdir\"";
+
+ my ($ntelpid, $pid2);
+ my $port = 32000;
+ for(1 .. 10) {
+ $port += int(rand(800));
+ my $aflags = "--port $port $flags";
+ my $cmd = "$srcdir/negtelnetserver.py $aflags";
+ ($ntelpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($ntelpid <= 0 || !pidexists($ntelpid)) {
+ # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $ntelpid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $ntelpid port $port\n";
+ }
+ last;
+ }
++ logmsg "RUN: failed to start the $srvrname server\n" if(!$ntelpid);
+
+ return ($ntelpid, $pid2, $port);
+}
+
+
+#######################################################################
+# Single shot http and gopher server responsiveness test. This should only
+# be used to verify that a server present in %run hash is still functional
+#
+sub responsive_http_server {
+ my ($proto, $verbose, $alt, $port_or_path) = @_;
+ my $ip = $HOSTIP;
+ my $ipvnum = 4;
+ my $idnum = 1;
+
+ if($alt eq "ipv6") {
+ # if IPv6, use a different setup
+ $ipvnum = 6;
+ $ip = $HOST6IP;
+ }
+ elsif($alt eq "proxy") {
+ $idnum = 2;
+ }
+ elsif($alt eq "unix") {
+ # IP (protocol) is mutually exclusive with Unix sockets
+ $ipvnum = "unix";
+ }
+
+ return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port_or_path);
+}
+
+#######################################################################
+# Single shot pingpong server responsiveness test. This should only be
+# used to verify that a server present in %run hash is still functional
+#
+sub responsive_pingpong_server {
+ my ($proto, $id, $verbose, $ipv6) = @_;
+ my $port;
+ my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
+ my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
+ my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
+
+ if($proto eq "ftp") {
+ $port = $FTPPORT;
+
+ if($ipvnum==6) {
+ # if IPv6, use a different setup
+ $port = $FTP6PORT;
+ }
+ }
+ elsif($proto eq "pop3") {
+ $port = ($ipvnum==6) ? $POP36PORT : $POP3PORT;
+ }
+ elsif($proto eq "imap") {
+ $port = ($ipvnum==6) ? $IMAP6PORT : $IMAPPORT;
+ }
+ elsif($proto eq "smtp") {
+ $port = ($ipvnum==6) ? $SMTP6PORT : $SMTPPORT;
+ }
+ else {
+ print STDERR "Unsupported protocol $proto!!\n";
+ return 0;
+ }
+
+ return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port);
+}
+
+#######################################################################
+# Single shot rtsp server responsiveness test. This should only be
+# used to verify that a server present in %run hash is still functional
+#
+sub responsive_rtsp_server {
+ my ($verbose, $ipv6) = @_;
+ my $port = $RTSPPORT;
+ my $ip = $HOSTIP;
+ my $proto = 'rtsp';
+ my $ipvnum = 4;
+ my $idnum = 1;
+
+ if($ipv6) {
+ # if IPv6, use a different setup
+ $ipvnum = 6;
+ $port = $RTSP6PORT;
+ $ip = $HOST6IP;
+ }
+
+ return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port);
+}
+
+#######################################################################
+# Single shot tftp server responsiveness test. This should only be
+# used to verify that a server present in %run hash is still functional
+#
+sub responsive_tftp_server {
+ my ($id, $verbose, $ipv6) = @_;
+ my $port = $TFTPPORT;
+ my $ip = $HOSTIP;
+ my $proto = 'tftp';
+ my $ipvnum = 4;
+ my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
+
+ if($ipv6) {
+ # if IPv6, use a different setup
+ $ipvnum = 6;
+ $port = $TFTP6PORT;
+ $ip = $HOST6IP;
+ }
+
+ return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port);
+}
+
+#######################################################################
+# Single shot non-stunnel HTTP TLS extensions capable server
+# responsiveness test. This should only be used to verify that a
+# server present in %run hash is still functional
+#
+sub responsive_httptls_server {
+ my ($verbose, $ipv6) = @_;
+ my $proto = "httptls";
+ my $port = ($ipv6 && ($ipv6 =~ /6$/)) ? $HTTPTLS6PORT : $HTTPTLSPORT;
+ my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
+ my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
+ my $idnum = 1;
+
+ return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port);
+}
+
+#######################################################################
+# Remove all files in the specified directory
+#
+sub cleardir {
+ my $dir = $_[0];
+ my $count;
+ my $file;
+
+ # Get all files
- opendir(DIR, $dir) ||
++ opendir(my $dh, $dir) ||
+ return 0; # can't open dir
- while($file = readdir(DIR)) {
- if(($file !~ /^\./)) {
- unlink("$dir/$file");
++ while($file = readdir($dh)) {
++ if(($file !~ /^(\.|\.\.)\z/)) {
++ if(-d "$dir/$file") {
++ cleardir("$dir/$file");
++ rmdir("$dir/$file");
++ }
++ else {
++ unlink("$dir/$file");
++ }
+ $count++;
+ }
+ }
- closedir DIR;
++ closedir $dh;
+ return $count;
+}
+
+#######################################################################
+# compare test results with the expected output, we might filter off
+# some pattern that is allowed to differ, output test results
+#
+sub compare {
+ my ($testnum, $testname, $subject, $firstref, $secondref)=@_;
+
+ my $result = compareparts($firstref, $secondref);
+
+ if($result) {
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+
+ if(!$short) {
+ logmsg "\n $testnum: $subject FAILED:\n";
+ logmsg showdiff($LOGDIR, $firstref, $secondref);
+ }
+ elsif(!$automakestyle) {
+ logmsg "FAILED\n";
+ }
+ else {
+ # automakestyle
+ logmsg "FAIL: $testnum - $testname - $subject\n";
+ }
+ }
+ return $result;
+}
+
+sub setupfeatures {
++ $feature{"c-ares"} = $has_cares;
+ $feature{"alt-svc"} = $has_altsvc;
++ $feature{"HSTS"} = $has_hsts;
+ $feature{"brotli"} = $has_brotli;
+ $feature{"crypto"} = $has_crypto;
+ $feature{"debug"} = $debug_build;
+ $feature{"getrlimit"} = $has_getrlimit;
+ $feature{"GnuTLS"} = $has_gnutls;
+ $feature{"GSS-API"} = $has_gssapi;
+ $feature{"http/2"} = $has_http2;
+ $feature{"https-proxy"} = $has_httpsproxy;
+ $feature{"idn"} = $has_idn;
+ $feature{"ipv6"} = $has_ipv6;
+ $feature{"Kerberos"} = $has_kerberos;
+ $feature{"large_file"} = $has_largefile;
+ $feature{"ld_preload"} = ($has_ldpreload && !$debug_build);
+ $feature{"libz"} = $has_libz;
+ $feature{"manual"} = $has_manual;
+ $feature{"Metalink"} = $has_metalink;
+ $feature{"MinGW"} = $has_mingw;
+ $feature{"MultiSSL"} = $has_multissl;
+ $feature{"NSS"} = $has_nss;
+ $feature{"NTLM"} = $has_ntlm;
+ $feature{"NTLM_WB"} = $has_ntlm_wb;
+ $feature{"OpenSSL"} = $has_openssl || $has_libressl || $has_boringssl;
+ $feature{"PSL"} = $has_psl;
+ $feature{"Schannel"} = $has_schannel;
+ $feature{"sectransp"} = $has_sectransp;
+ $feature{"SPNEGO"} = $has_spnego;
+ $feature{"SSL"} = $has_ssl;
+ $feature{"SSLpinning"} = $has_sslpinning;
+ $feature{"SSPI"} = $has_sspi;
+ $feature{"threaded-resolver"} = $has_threadedres;
+ $feature{"TLS-SRP"} = $has_tls_srp;
+ $feature{"TrackMemory"} = $has_memory_tracking;
+ $feature{"unittest"} = $debug_build;
+ $feature{"unix-sockets"} = $has_unix;
+ $feature{"win32"} = $has_win32;
+ $feature{"zstd"} = $has_zstd;
+
+ # make each protocol an enabled "feature"
+ for my $p (@protocols) {
+ $feature{$p} = 1;
+ }
+ # 'socks' was once here but is now removed
+
+ #
+ # strings that must match the names used in server/disabled.c
+ #
+ $feature{"cookies"} = 1;
+ $feature{"DoH"} = 1;
+ $feature{"HTTP-auth"} = 1;
+ $feature{"Mime"} = 1;
+ $feature{"netrc"} = 1;
+ $feature{"parsedate"} = 1;
+ $feature{"proxy"} = 1;
+ $feature{"shuffle-dns"} = 1;
+ $feature{"typecheck"} = 1;
+ $feature{"verbose-strings"} = 1;
+
+}
+
+#######################################################################
+# display information about curl and the host the test suite runs on
+#
+sub checksystem {
+
+ unlink($memdump); # remove this if there was one left
+
+ my $feat;
+ my $curl;
+ my $libcurl;
+ my $versretval;
+ my $versnoexec;
+ my @version=();
+ my @disabled;
+ my $dis = "";
+
+ my $curlverout="$LOGDIR/curlverout.log";
+ my $curlvererr="$LOGDIR/curlvererr.log";
+ my $versioncmd="$CURL --version 1>$curlverout 2>$curlvererr";
+
+ unlink($curlverout);
+ unlink($curlvererr);
+
+ $versretval = runclient($versioncmd);
+ $versnoexec = $!;
+
+ open(VERSOUT, "<$curlverout");
+ @version = <VERSOUT>;
+ close(VERSOUT);
+
+ open(DISABLED, "server/disabled".exe_ext('TOOL')."|");
+ @disabled = <DISABLED>;
+ close(DISABLED);
+
+ if($disabled[0]) {
+ map s/[\r\n]//g, @disabled;
+ $dis = join(", ", @disabled);
+ }
+
+ $resolver="stock";
+ for(@version) {
+ chomp;
+
- if($_ =~ /^curl/) {
++ if($_ =~ /^curl ([^ ]*)/) {
+ $curl = $_;
++ $VERSION = $1;
+ $curl =~ s/^(.*)(libcurl.*)/$1/g;
+
+ $libcurl = $2;
+ if($curl =~ /linux|bsd|solaris/) {
+ $has_ldpreload = 1;
+ }
+ if($curl =~ /win32|Windows|mingw(32|64)/) {
+ # This is a Windows MinGW build or native build, we need to
use
+ # Win32-style path.
+ $pwd = pathhelp::sys_native_current_path();
+ $has_textaware = 1;
+ $has_win32 = 1;
+ $has_mingw = 1 if ($curl =~ /-pc-mingw32/);
+ }
+ if ($libcurl =~ /(winssl|schannel)/i) {
+ $has_schannel=1;
+ $has_sslpinning=1;
+ }
+ elsif ($libcurl =~ /openssl/i) {
+ $has_openssl=1;
+ $has_sslpinning=1;
+ }
+ elsif ($libcurl =~ /gnutls/i) {
+ $has_gnutls=1;
+ $has_sslpinning=1;
+ }
+ elsif ($libcurl =~ /nss/i) {
+ $has_nss=1;
+ $has_sslpinning=1;
+ }
+ elsif ($libcurl =~ /wolfssl/i) {
+ $has_wolfssl=1;
+ $has_sslpinning=1;
+ }
+ elsif ($libcurl =~ /securetransport/i) {
+ $has_sectransp=1;
+ $has_sslpinning=1;
+ }
+ elsif ($libcurl =~ /BoringSSL/i) {
+ $has_boringssl=1;
+ $has_sslpinning=1;
+ }
+ elsif ($libcurl =~ /libressl/i) {
+ $has_libressl=1;
+ $has_sslpinning=1;
+ }
+ elsif ($libcurl =~ /mbedTLS/i) {
+ $has_mbedtls=1;
+ $has_sslpinning=1;
+ }
+ if ($libcurl =~ /ares/i) {
+ $has_cares=1;
+ $resolver="c-ares";
+ }
+ if ($libcurl =~ /mesalink/i) {
+ $has_mesalink=1;
+ }
+ }
+ elsif($_ =~ /^Protocols: (.*)/i) {
+ # these are the protocols compiled in to this libcurl
+ @protocols = split(' ', lc($1));
+
+ # Generate a "proto-ipv6" version of each protocol to match the
+ # IPv6 <server> name and a "proto-unix" to match the variant which
+ # uses Unix domain sockets. This works even if support isn't
+ # compiled in because the <features> test will fail.
+ push @protocols, map(("$_-ipv6", "$_-unix"), @protocols);
+
+ # 'http-proxy' is used in test cases to do CONNECT through
+ push @protocols, 'http-proxy';
+
+ # 'none' is used in test cases to mean no server
+ push @protocols, 'none';
+ }
+ elsif($_ =~ /^Features: (.*)/i) {
+ $feat = $1;
+ if($feat =~ /TrackMemory/i) {
+ # built with memory tracking support (--enable-curldebug)
+ $has_memory_tracking = 1;
+ }
+ if($feat =~ /debug/i) {
+ # curl was built with --enable-debug
+ $debug_build = 1;
+ }
+ if($feat =~ /SSL/i) {
+ # ssl enabled
+ $has_ssl=1;
+ }
+ if($feat =~ /MultiSSL/i) {
+ # multiple ssl backends available.
+ $has_multissl=1;
+ }
+ if($feat =~ /Largefile/i) {
+ # large file support
+ $has_largefile=1;
+ }
+ if($feat =~ /IDN/i) {
+ # IDN support
+ $has_idn=1;
+ }
+ if($feat =~ /IPv6/i) {
+ $has_ipv6 = 1;
+ }
+ if($feat =~ /UnixSockets/i) {
+ $has_unix = 1;
+ }
+ if($feat =~ /libz/i) {
+ $has_libz = 1;
+ }
+ if($feat =~ /brotli/i) {
+ $has_brotli = 1;
+ }
+ if($feat =~ /zstd/i) {
+ $has_zstd = 1;
+ }
+ if($feat =~ /NTLM/i) {
+ # NTLM enabled
+ $has_ntlm=1;
+
+ # Use this as a proxy for any cryptographic authentication
+ $has_crypto=1;
+ }
+ if($feat =~ /NTLM_WB/i) {
+ # NTLM delegation to winbind daemon ntlm_auth helper enabled
+ $has_ntlm_wb=1;
+ }
+ if($feat =~ /SSPI/i) {
+ # SSPI enabled
+ $has_sspi=1;
+ }
+ if($feat =~ /GSS-API/i) {
+ # GSS-API enabled
+ $has_gssapi=1;
+ }
+ if($feat =~ /Kerberos/i) {
+ # Kerberos enabled
+ $has_kerberos=1;
+
+ # Use this as a proxy for any cryptographic authentication
+ $has_crypto=1;
+ }
+ if($feat =~ /SPNEGO/i) {
+ # SPNEGO enabled
+ $has_spnego=1;
+
+ # Use this as a proxy for any cryptographic authentication
+ $has_crypto=1;
+ }
+ if($feat =~ /CharConv/i) {
+ # CharConv enabled
+ $has_charconv=1;
+ }
+ if($feat =~ /TLS-SRP/i) {
+ # TLS-SRP enabled
+ $has_tls_srp=1;
+ }
+ if($feat =~ /Metalink/i) {
+ # Metalink enabled
+ $has_metalink=1;
+ }
+ if($feat =~ /PSL/i) {
+ # PSL enabled
+ $has_psl=1;
+ }
+ if($feat =~ /alt-svc/i) {
+ # alt-svc enabled
+ $has_altsvc=1;
+ }
++ if($feat =~ /HSTS/i) {
++ $has_hsts=1;
++ }
+ if($feat =~ /AsynchDNS/i) {
+ if(!$has_cares) {
+ # this means threaded resolver
+ $has_threadedres=1;
+ $resolver="threaded";
+ }
+ }
+ if($feat =~ /HTTP2/) {
+ # http2 enabled
+ $has_http2=1;
+
+ push @protocols, 'http/2';
+ }
+ if($feat =~ /HTTPS-proxy/) {
+ $has_httpsproxy=1;
+
+ # 'https-proxy' is used as "server" so consider it a protocol
+ push @protocols, 'https-proxy';
+ }
+ }
+ #
+ # Test harness currently uses a non-stunnel server in order to
+ # run HTTP TLS-SRP tests required when curl is built with https
+ # protocol support and TLS-SRP feature enabled. For convenience
+ # 'httptls' may be included in the test harness protocols array
+ # to differentiate this from classic stunnel based 'https' test
+ # harness server.
+ #
+ if($has_tls_srp) {
+ my $add_httptls;
+ for(@protocols) {
+ if($_ =~ /^https(-ipv6|)$/) {
+ $add_httptls=1;
+ last;
+ }
+ }
+ if($add_httptls && (! grep /^httptls$/, @protocols)) {
+ push @protocols, 'httptls';
+ push @protocols, 'httptls-ipv6';
+ }
+ }
+ }
+ if(!$curl) {
+ logmsg "unable to get curl's version, further details are:\n";
+ logmsg "issued command: \n";
+ logmsg "$versioncmd \n";
+ if ($versretval == -1) {
+ logmsg "command failed with: \n";
+ logmsg "$versnoexec \n";
+ }
+ elsif ($versretval & 127) {
+ logmsg sprintf("command died with signal %d, and %s coredump.\n",
+ ($versretval & 127), ($versretval & 128)?"a":"no");
+ }
+ else {
+ logmsg sprintf("command exited with value %d \n", $versretval >>
8);
+ }
+ logmsg "contents of $curlverout: \n";
+ displaylogcontent("$curlverout");
+ logmsg "contents of $curlvererr: \n";
+ displaylogcontent("$curlvererr");
+ die "couldn't get curl's version";
+ }
+
+ if(-r "../lib/curl_config.h") {
+ open(CONF, "<../lib/curl_config.h");
+ while(<CONF>) {
+ if($_ =~ /^\#define HAVE_GETRLIMIT/) {
+ $has_getrlimit = 1;
+ }
+ }
+ close(CONF);
+ }
+
+ if($has_ipv6) {
+ # client has IPv6 support
+
+ # check if the HTTP server has it!
+ my $cmd = "server/sws".exe_ext('SRV')." --version";
+ my @sws = `$cmd`;
+ if($sws[0] =~ /IPv6/) {
+ # HTTP server has IPv6 support!
+ $http_ipv6 = 1;
+ $gopher_ipv6 = 1;
+ }
+
+ # check if the FTP server has it!
+ $cmd = "server/sockfilt".exe_ext('SRV')." --version";
+ @sws = `$cmd`;
+ if($sws[0] =~ /IPv6/) {
+ # FTP server has IPv6 support!
+ $ftp_ipv6 = 1;
+ }
+ }
+
+ if($has_unix) {
+ # client has Unix sockets support, check whether the HTTP server has
it
+ my $cmd = "server/sws".exe_ext('SRV')." --version";
+ my @sws = `$cmd`;
+ $http_unix = 1 if($sws[0] =~ /unix/);
+ }
+
+ if(!$has_memory_tracking && $torture) {
+ die "can't run torture tests since curl was built without ".
+ "TrackMemory feature (--enable-curldebug)";
+ }
+
+ open(M, "$CURL -M 2>&1|");
+ while(my $s = <M>) {
+ if($s =~ /built-in manual was disabled at build-time/) {
+ $has_manual = 0;
+ last;
+ }
+ $has_manual = 1;
+ last;
+ }
+ close(M);
+
+ $has_shared = `sh $CURLCONFIG --built-shared`;
+ chomp $has_shared;
+
+ my $hostname=join(' ', runclientoutput("hostname"));
+ my $hosttype=join(' ', runclientoutput("uname -a"));
+ my $hostos=$^O;
+
+ logmsg ("********* System characteristics ******** \n",
+ "* $curl\n",
+ "* $libcurl\n",
+ "* Features: $feat\n",
+ "* Disabled: $dis\n",
+ "* Host: $hostname",
+ "* System: $hosttype",
+ "* OS: $hostos\n");
+
+ if($has_memory_tracking && $has_threadedres) {
+ $has_memory_tracking = 0;
+ logmsg("*\n",
+ "*** DISABLES memory tracking when using threaded resolver\n",
+ "*\n");
+ }
+
+ logmsg sprintf("* Servers: %s", $stunnel?"SSL ":"");
+ logmsg sprintf("%s", $http_ipv6?"HTTP-IPv6 ":"");
+ logmsg sprintf("%s", $http_unix?"HTTP-unix ":"");
+ logmsg sprintf("%s\n", $ftp_ipv6?"FTP-IPv6 ":"");
+
+ logmsg sprintf("* Env: %s%s", $valgrind?"Valgrind ":"",
+ $run_event_based?"event-based ":"");
+ logmsg sprintf("%s\n", $libtool?"Libtool ":"");
+ logmsg ("* Seed: $randseed\n");
+
+ if($verbose) {
+ if($has_unix) {
+ logmsg "* Unix socket paths:\n";
+ if($http_unix) {
+ logmsg sprintf("* HTTP-Unix:%s\n", $HTTPUNIXPATH);
+ }
+ }
+ }
+
+ logmsg "***************************************** \n";
+
+ setupfeatures();
+ # toggle off the features that were disabled in the build
+ for my $d(@disabled) {
+ $feature{$d} = 0;
+ }
+}
+
+#######################################################################
+# substitute the variable stuff into either a joined up file or
+# a command, in either case passed by reference
+#
+sub subVariables {
+ my ($thing, $prefix) = @_;
+
+ if(!$prefix) {
+ $prefix = "%";
+ }
+
+ # test server ports
+ $$thing =~ s/${prefix}FTP6PORT/$FTP6PORT/g;
+ $$thing =~ s/${prefix}FTPSPORT/$FTPSPORT/g;
+ $$thing =~ s/${prefix}FTPPORT/$FTPPORT/g;
+ $$thing =~ s/${prefix}GOPHER6PORT/$GOPHER6PORT/g;
+ $$thing =~ s/${prefix}GOPHERPORT/$GOPHERPORT/g;
+ $$thing =~ s/${prefix}HTTPTLS6PORT/$HTTPTLS6PORT/g;
+ $$thing =~ s/${prefix}HTTPTLSPORT/$HTTPTLSPORT/g;
+ $$thing =~ s/${prefix}HTTP6PORT/$HTTP6PORT/g;
+ $$thing =~ s/${prefix}HTTPSPORT/$HTTPSPORT/g;
+ $$thing =~ s/${prefix}HTTPSPROXYPORT/$HTTPSPROXYPORT/g;
+ $$thing =~ s/${prefix}HTTP2PORT/$HTTP2PORT/g;
+ $$thing =~ s/${prefix}HTTPPORT/$HTTPPORT/g;
+ $$thing =~ s/${prefix}PROXYPORT/$HTTPPROXYPORT/g;
+ $$thing =~ s/${prefix}MQTTPORT/$MQTTPORT/g;
+ $$thing =~ s/${prefix}IMAP6PORT/$IMAP6PORT/g;
+ $$thing =~ s/${prefix}IMAPPORT/$IMAPPORT/g;
+ $$thing =~ s/${prefix}POP36PORT/$POP36PORT/g;
+ $$thing =~ s/${prefix}POP3PORT/$POP3PORT/g;
+ $$thing =~ s/${prefix}RTSP6PORT/$RTSP6PORT/g;
+ $$thing =~ s/${prefix}RTSPPORT/$RTSPPORT/g;
+ $$thing =~ s/${prefix}SMTP6PORT/$SMTP6PORT/g;
+ $$thing =~ s/${prefix}SMTPPORT/$SMTPPORT/g;
+ $$thing =~ s/${prefix}SOCKSPORT/$SOCKSPORT/g;
+ $$thing =~ s/${prefix}SSHPORT/$SSHPORT/g;
+ $$thing =~ s/${prefix}TFTP6PORT/$TFTP6PORT/g;
+ $$thing =~ s/${prefix}TFTPPORT/$TFTPPORT/g;
+ $$thing =~ s/${prefix}DICTPORT/$DICTPORT/g;
+ $$thing =~ s/${prefix}SMBPORT/$SMBPORT/g;
+ $$thing =~ s/${prefix}SMBSPORT/$SMBSPORT/g;
+ $$thing =~ s/${prefix}TELNETPORT/$TELNETPORT/g;
+ $$thing =~ s/${prefix}NOLISTENPORT/$NOLISTENPORT/g;
+
+ # server Unix domain socket paths
+ $$thing =~ s/${prefix}HTTPUNIXPATH/$HTTPUNIXPATH/g;
+
+ # client IP addresses
+ $$thing =~ s/${prefix}CLIENT6IP/$CLIENT6IP/g;
+ $$thing =~ s/${prefix}CLIENTIP/$CLIENTIP/g;
+
+ # server IP addresses
+ $$thing =~ s/${prefix}HOST6IP/$HOST6IP/g;
+ $$thing =~ s/${prefix}HOSTIP/$HOSTIP/g;
+
+ # misc
+ $$thing =~ s/${prefix}CURL/$CURL/g;
+ $$thing =~ s/${prefix}PWD/$pwd/g;
+ $$thing =~ s/${prefix}POSIX_PWD/$posix_pwd/g;
++ $$thing =~ s/${prefix}VERSION/$VERSION/g;
+
+ my $file_pwd = $pwd;
+ if($file_pwd !~ /^\//) {
+ $file_pwd = "/$file_pwd";
+ }
+ my $ssh_pwd = $posix_pwd;
+ if ($sshdid && $sshdid =~ /OpenSSH-Windows/) {
+ $ssh_pwd = $file_pwd;
+ }
+
+ $$thing =~ s/${prefix}FILE_PWD/$file_pwd/g;
+ $$thing =~ s/${prefix}SSH_PWD/$ssh_pwd/g;
+ $$thing =~ s/${prefix}SRCDIR/$srcdir/g;
+ $$thing =~ s/${prefix}USER/$USER/g;
+
+ $$thing =~ s/${prefix}SSHSRVMD5/$SSHSRVMD5/g;
+
+ # The purpose of FTPTIME2 and FTPTIME3 is to provide times that can be
+ # used for time-out tests and that would work on most hosts as these
+ # adjust for the startup/check time for this particular host. We needed to
+ # do this to make the test suite run better on very slow hosts.
+ my $ftp2 = $ftpchecktime * 2;
+ my $ftp3 = $ftpchecktime * 3;
+
+ $$thing =~ s/${prefix}FTPTIME2/$ftp2/g;
+ $$thing =~ s/${prefix}FTPTIME3/$ftp3/g;
+
+ # HTTP2
+ $$thing =~ s/${prefix}H2CVER/$h2cver/g;
+}
+
+sub subBase64 {
+ my ($thing) = @_;
+
+ # cut out the base64 piece
+ if($$thing =~ s/%b64\[(.*)\]b64%/%%B64%%/i) {
+ my $d = $1;
+ # encode %NN characters
+ $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+ my $enc = encode_base64($d, "");
+ # put the result into there
+ $$thing =~ s/%%B64%%/$enc/;
+ }
++ # hex decode
++ if($$thing =~ s/%hex\[(.*)\]hex%/%%HEX%%/i) {
++ # decode %NN characters
++ my $d = $1;
++ $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
++ $$thing =~ s/%%HEX%%/$d/;
++ }
++ if($$thing =~ s/%repeat\[(\d+) x (.*)\]%/%%REPEAT%%/i) {
++ # decode %NN characters
++ my ($d, $n) = ($2, $1);
++ $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
++ my $all = $d x $n;
++ $$thing =~ s/%%REPEAT%%/$all/;
++ }
+}
+
+sub fixarray {
+ my @in = @_;
+
+ for(@in) {
+ subVariables(\$_);
+ }
+ return @in;
+}
+
+#######################################################################
+# Provide time stamps for single test skipped events
+#
+sub timestampskippedevents {
+ my $testnum = $_[0];
+
+ return if((not defined($testnum)) || ($testnum < 1));
+
+ if($timestats) {
+
+ if($timevrfyend{$testnum}) {
+ return;
+ }
+ elsif($timesrvrlog{$testnum}) {
+ $timevrfyend{$testnum} = $timesrvrlog{$testnum};
+ return;
+ }
+ elsif($timetoolend{$testnum}) {
+ $timevrfyend{$testnum} = $timetoolend{$testnum};
+ $timesrvrlog{$testnum} = $timetoolend{$testnum};
+ }
+ elsif($timetoolini{$testnum}) {
+ $timevrfyend{$testnum} = $timetoolini{$testnum};
+ $timesrvrlog{$testnum} = $timetoolini{$testnum};
+ $timetoolend{$testnum} = $timetoolini{$testnum};
+ }
+ elsif($timesrvrend{$testnum}) {
+ $timevrfyend{$testnum} = $timesrvrend{$testnum};
+ $timesrvrlog{$testnum} = $timesrvrend{$testnum};
+ $timetoolend{$testnum} = $timesrvrend{$testnum};
+ $timetoolini{$testnum} = $timesrvrend{$testnum};
+ }
+ elsif($timesrvrini{$testnum}) {
+ $timevrfyend{$testnum} = $timesrvrini{$testnum};
+ $timesrvrlog{$testnum} = $timesrvrini{$testnum};
+ $timetoolend{$testnum} = $timesrvrini{$testnum};
+ $timetoolini{$testnum} = $timesrvrini{$testnum};
+ $timesrvrend{$testnum} = $timesrvrini{$testnum};
+ }
+ elsif($timeprepini{$testnum}) {
+ $timevrfyend{$testnum} = $timeprepini{$testnum};
+ $timesrvrlog{$testnum} = $timeprepini{$testnum};
+ $timetoolend{$testnum} = $timeprepini{$testnum};
+ $timetoolini{$testnum} = $timeprepini{$testnum};
+ $timesrvrend{$testnum} = $timeprepini{$testnum};
+ $timesrvrini{$testnum} = $timeprepini{$testnum};
+ }
+ }
+}
+
+#######################################################################
+# Run a single specified test case
+#
+sub singletest {
+ my ($evbased, # 1 means switch on if possible (and "curl" is tested)
+ # returns "not a test" if it can't be used for this test
+ $testnum,
+ $count,
+ $total)=@_;
+
+ my @what;
+ my $why;
+ my $cmd;
+ my $disablevalgrind;
+ my $errorreturncode = 1; # 1 means normal error, 2 means ignored error
+
+ # fist, remove all lingering log files
+ cleardir($LOGDIR);
+
+ # copy test number to a global scope var, this allows
+ # testnum checking when starting test harness servers.
+ $testnumcheck = $testnum;
+
+ # timestamp test preparation start
+ $timeprepini{$testnum} = Time::HiRes::time();
+
+ if($disttests !~ /test$testnum\W/ ) {
+ logmsg "Warning: test$testnum not present in
tests/data/Makefile.inc\n";
+ }
+ if($disabled{$testnum}) {
+ logmsg "Warning: test$testnum is explicitly disabled\n";
+ }
+ if($ignored{$testnum}) {
+ logmsg "Warning: test$testnum result is ignored\n";
+ $errorreturncode = 2;
+ }
+
+ # load the test case file definition
+ if(loadtest("${TESTDIR}/test${testnum}")) {
+ if($verbose) {
+ # this is not a test
+ logmsg "RUN: $testnum doesn't look like a test case\n";
+ }
+ $why = "no test";
+ }
+ else {
+ @what = getpart("client", "features");
+ }
+
+ # We require a feature to be present
+ for(@what) {
+ my $f = $_;
+ $f =~ s/\s//g;
+
+ if($f =~ /^([^!].*)$/) {
+ if($feature{$1}) {
+ next;
+ }
+
+ $why = "curl lacks $1 support";
+ last;
+ }
+ }
+
+ # We require a feature to not be present
+ if(!$why) {
+ for(@what) {
+ my $f = $_;
+ $f =~ s/\s//g;
+
+ if($f =~ /^!(.*)$/) {
+ if(!$feature{$1}) {
+ next;
+ }
+ }
+ else {
+ next;
+ }
+
+ $why = "curl has $1 support";
+ last;
+ }
+ }
+
+ if(!$why) {
+ my @info_keywords = getpart("info", "keywords");
+ my $match;
+ my $k;
+
+ # Clear the list of keywords from the last test
+ %keywords = ();
+
+ if(!$info_keywords[0]) {
+ $why = "missing the <keywords> section!";
+ }
+
+ for $k (@info_keywords) {
+ chomp $k;
+ if ($disabled_keywords{lc($k)}) {
+ $why = "disabled by keyword";
+ } elsif ($enabled_keywords{lc($k)}) {
+ $match = 1;
+ }
+ if ($ignored_keywords{lc($k)}) {
+ logmsg "Warning: test$testnum result is ignored due to $k\n";
+ $errorreturncode = 2;
+ }
+
+ $keywords{$k} = 1;
+ }
+
+ if(!$why && !$match && %enabled_keywords) {
+ $why = "disabled by missing keyword";
+ }
+ }
+
+ # test definition may instruct to (un)set environment vars
+ # this is done this early, so that the precheck can use environment
+ # variables and still bail out fine on errors
+
+ # restore environment variables that were modified in a previous run
+ foreach my $var (keys %oldenv) {
+ if($oldenv{$var} eq 'notset') {
+ delete $ENV{$var} if($ENV{$var});
+ }
+ else {
+ $ENV{$var} = $oldenv{$var};
+ }
+ delete $oldenv{$var};
+ }
+
+ # get the name of the test early
+ my @testname= getpart("client", "name");
+ my $testname = $testname[0];
+ $testname =~ s/\n//g;
+
+ # create test result in CI services
+ if(azure_check_environment() && $AZURE_RUN_ID) {
- $AZURE_RESULT_ID = azure_create_test_result($AZURE_RUN_ID, $testnum,
$testname);
++ $AZURE_RESULT_ID = azure_create_test_result($VCURL, $AZURE_RUN_ID,
$testnum, $testname);
+ }
+ elsif(appveyor_check_environment()) {
- appveyor_create_test_result($testnum, $testname);
++ appveyor_create_test_result($VCURL, $testnum, $testname);
+ }
+
+ # remove test server commands file before servers are started/verified
+ unlink($FTPDCMD) if(-f $FTPDCMD);
+
+ # timestamp required servers verification start
+ $timesrvrini{$testnum} = Time::HiRes::time();
+
+ if(!$why) {
+ $why = serverfortest($testnum);
+ }
+
+ # Save a preprocessed version of the entire test file. This allows more
+ # "basic" test case readers to enjoy variable replacements.
+ my @entiretest = fulltest();
+ my $otest = "log/test$testnum";
+ open(D, ">$otest");
+ my $diff;
+ for my $s (@entiretest) {
+ my $f = $s;
+ subVariables(\$s, "%");
+ subBase64(\$s);
+ if($f ne $s) {
+ $diff++;
+ }
+ print D $s;
+ }
+ close(D);
+
+ # remove the separate test file again if nothing was updated to keep
+ # things simpler
+ unlink($otest) if(!$diff);
+
+ # in case the process changed the file, reload it
+ loadtest("log/test${testnum}") if($diff);
+
+ # timestamp required servers verification end
+ $timesrvrend{$testnum} = Time::HiRes::time();
+
+ my @setenv = getpart("client", "setenv");
+ if(@setenv) {
+ foreach my $s (@setenv) {
+ chomp $s;
+ subVariables(\$s);
+ if($s =~ /([^=]*)=(.*)/) {
+ my ($var, $content) = ($1, $2);
+ # remember current setting, to restore it once test runs
+ $oldenv{$var} = ($ENV{$var})?"$ENV{$var}":'notset';
+ # set new value
+ if(!$content) {
+ delete $ENV{$var} if($ENV{$var});
+ }
+ else {
+ if($var =~ /^LD_PRELOAD/) {
+ if(exe_ext('TOOL') && (exe_ext('TOOL') eq '.exe')) {
+ # print "Skipping LD_PRELOAD due to lack of OS
support\n";
+ next;
+ }
+ if($debug_build || ($has_shared ne "yes")) {
+ # print "Skipping LD_PRELOAD due to no release
shared build\n";
+ next;
+ }
+ }
+ $ENV{$var} = "$content";
+ print "setenv $var = $content\n" if($verbose);
+ }
+ }
+ }
+ }
+
+ if(!$why) {
+ my @precheck = getpart("client", "precheck");
+ if(@precheck) {
+ $cmd = $precheck[0];
+ chomp $cmd;
+ subVariables(\$cmd);
+ if($cmd) {
+ my @p = split(/ /, $cmd);
+ if($p[0] !~ /\//) {
+ # the first word, the command, does not contain a slash so
+ # we will scan the "improved" PATH to find the command to
+ # be able to run it
+ my $fullp = checktestcmd($p[0]);
+
+ if($fullp) {
+ $p[0] = $fullp;
+ }
+ $cmd = join(" ", @p);
+ }
+
+ my @o = `$cmd 2>/dev/null`;
+ if($o[0]) {
+ $why = $o[0];
+ chomp $why;
+ } elsif($?) {
+ $why = "precheck command error";
+ }
+ logmsg "prechecked $cmd\n" if($verbose);
+ }
+ }
+ }
+
+ if($why && !$listonly) {
+ # there's a problem, count it as "skipped"
+ $skipped++;
+ $skipped{$why}++;
+ $teststat[$testnum]=$why; # store reason for this test case
+
+ if(!$short) {
+ if($skipped{$why} <= 3) {
+ # show only the first three skips for each reason
+ logmsg sprintf("test %04d SKIPPED: $why\n", $testnum);
+ }
+ }
+
+ timestampskippedevents($testnum);
+ return -1;
+ }
+ logmsg sprintf("test %04d...", $testnum) if(!$automakestyle);
+
+ my %replyattr = getpartattr("reply", "data");
+ my @reply;
+ if (partexists("reply", "datacheck")) {
+ for my $partsuffix (('', '1', '2', '3', '4')) {
+ my @replycheckpart = getpart("reply", "datacheck".$partsuffix);
+ if(@replycheckpart) {
+ my %replycheckpartattr = getpartattr("reply",
"datacheck".$partsuffix);
+ # get the mode attribute
+ my $filemode=$replycheckpartattr{'mode'};
+ if($filemode && ($filemode eq "text") && $has_textaware) {
+ # text mode when running on windows: fix line endings
+ map s/\r\n/\n/g, @replycheckpart;
+ map s/\n/\r\n/g, @replycheckpart;
+ }
+ if($replycheckpartattr{'nonewline'}) {
+ # Yes, we must cut off the final newline from the final
line
+ # of the datacheck
+ chomp($replycheckpart[$#replycheckpart]);
+ }
+ push(@reply, @replycheckpart);
+ }
+ }
+ }
+ else {
+ # check against the data section
+ @reply = getpart("reply", "data");
+ # get the mode attribute
+ my $filemode=$replyattr{'mode'};
+ if($filemode && ($filemode eq "text") && $has_textaware) {
+ # text mode when running on windows: fix line endings
+ map s/\r\n/\n/g, @reply;
+ map s/\n/\r\n/g, @reply;
+ }
+ }
+ for my $r (@reply) {
+ subVariables(\$r);
+ }
+
+ # this is the valid protocol blurb curl should generate
+ my @protocol= fixarray ( getpart("verify", "protocol") );
+
+ # this is the valid protocol blurb curl should generate to a proxy
+ my @proxyprot = fixarray ( getpart("verify", "proxy") );
+
+ # redirected stdout/stderr to these files
+ $STDOUT="$LOGDIR/stdout$testnum";
+ $STDERR="$LOGDIR/stderr$testnum";
+
+ # if this section exists, we verify that the stdout contained this:
+ my @validstdout = fixarray ( getpart("verify", "stdout") );
+ my @validstderr = fixarray ( getpart("verify", "stderr") );
+
+ # if this section exists, we verify upload
+ my @upload = getpart("verify", "upload");
+ if(@upload) {
+ my %hash = getpartattr("verify", "upload");
+ if($hash{'nonewline'}) {
+ # cut off the final newline from the final line of the upload data
+ chomp($upload[$#upload]);
+ }
+ }
+
+ # if this section exists, it might be FTP server instructions:
+ my @ftpservercmd = fixarray ( getpart("reply", "servercmd") );
+
+ my $CURLOUT="$LOGDIR/curl$testnum.out"; # curl output if not stdout
+
+ # name of the test
+ logmsg "[$testname]\n" if(!$short);
+
+ if($listonly) {
+ timestampskippedevents($testnum);
+ return 0; # look successful
+ }
+
+ my @codepieces = getpart("client", "tool");
+
+ my $tool="";
+ if(@codepieces) {
+ $tool = $codepieces[0];
+ chomp $tool;
+ $tool .= exe_ext('TOOL');
+ }
+
+ # remove server output logfile
+ unlink($SERVERIN);
+ unlink($SERVER2IN);
+ unlink($PROXYIN);
+
+ push @ftpservercmd, "Testnum $testnum\n";
+ # write the instructions to file
+ writearray($FTPDCMD, \@ftpservercmd);
+
+ # get the command line options to use
+ my @blaha;
+ ($cmd, @blaha)= getpart("client", "command");
+
+ if($cmd) {
+ # make some nice replace operations
+ $cmd =~ s/\n//g; # no newlines please
+ # substitute variables in the command line
+ subVariables(\$cmd);
+ }
+ else {
+ # there was no command given, use something silly
+ $cmd="-";
+ }
+ if($has_memory_tracking) {
+ unlink($memdump);
+ }
+
+ # create (possibly-empty) files before starting the test
+ for my $partsuffix (('', '1', '2', '3', '4')) {
+ my @inputfile=getpart("client", "file".$partsuffix);
+ my %fileattr = getpartattr("client", "file".$partsuffix);
+ my $filename=$fileattr{'name'};
+ if(@inputfile || $filename) {
+ if(!$filename) {
+ logmsg "ERROR: section client=>file has no name attribute\n";
+ timestampskippedevents($testnum);
+ return -1;
+ }
+ my $fileContent = join('', @inputfile);
+ subVariables(\$fileContent);
+ open(OUTFILE, ">$filename");
+ binmode OUTFILE; # for crapage systems, use binary
++ if($fileattr{'nonewline'}) {
++ # cut off the final newline
++ chomp($fileContent);
++ }
+ print OUTFILE $fileContent;
+ close(OUTFILE);
+ }
+ }
+
+ my %cmdhash = getpartattr("client", "command");
+
+ my $out="";
+
+ if((!$cmdhash{'option'}) || ($cmdhash{'option'} !~ /no-output/)) {
+ #We may slap on --output!
+ if (!@validstdout ||
+ ($cmdhash{'option'} && $cmdhash{'option'} =~ /force-output/))
{
+ $out=" --output $CURLOUT ";
+ }
+ }
+
+ my $serverlogslocktimeout = $defserverlogslocktimeout;
+ if($cmdhash{'timeout'}) {
+ # test is allowed to override default server logs lock timeout
+ if($cmdhash{'timeout'} =~ /(\d+)/) {
+ $serverlogslocktimeout = $1 if($1 >= 0);
+ }
+ }
+
+ my $postcommanddelay = $defpostcommanddelay;
+ if($cmdhash{'delay'}) {
+ # test is allowed to specify a delay after command is executed
+ if($cmdhash{'delay'} =~ /(\d+)/) {
+ $postcommanddelay = $1 if($1 > 0);
+ }
+ }
+
+ my $CMDLINE;
+ my $cmdargs;
+ my $cmdtype = $cmdhash{'type'} || "default";
+ my $fail_due_event_based = $evbased;
+ if($cmdtype eq "perl") {
+ # run the command line prepended with "perl"
+ $cmdargs ="$cmd";
+ $CMDLINE = "$perl ";
+ $tool=$CMDLINE;
+ $disablevalgrind=1;
+ }
+ elsif($cmdtype eq "shell") {
+ # run the command line prepended with "/bin/sh"
+ $cmdargs ="$cmd";
+ $CMDLINE = "/bin/sh ";
+ $tool=$CMDLINE;
+ $disablevalgrind=1;
+ }
+ elsif(!$tool && !$keywords{"unittest"}) {
+ # run curl, add suitable command line options
+ my $inc="";
+ if((!$cmdhash{'option'}) || ($cmdhash{'option'} !~ /no-include/)) {
+ $inc = " --include";
+ }
+ $cmdargs = "$out$inc ";
+
+ if($cmdhash{'option'} && ($cmdhash{'option'} =~ /binary-trace/)) {
+ $cmdargs .= "--trace log/trace$testnum ";
+ }
+ else {
+ $cmdargs .= "--trace-ascii log/trace$testnum ";
+ }
+ $cmdargs .= "--trace-time ";
+ if($evbased) {
+ $cmdargs .= "--test-event ";
+ $fail_due_event_based--;
+ }
+ $cmdargs .= $cmd;
+ }
+ else {
+ $cmdargs = " $cmd"; # $cmd is the command line for the test file
+ $CURLOUT = $STDOUT; # sends received data to stdout
+
+ # Default the tool to a unit test with the same name as the test spec
+ if($keywords{"unittest"} && !$tool) {
+ $tool="unit$testnum";
+ }
+
+ if($tool =~ /^lib/) {
+ $CMDLINE="$LIBDIR/$tool";
+ }
+ elsif($tool =~ /^unit/) {
+ $CMDLINE="$UNITDIR/$tool";
+ }
+
+ if(! -f $CMDLINE) {
+ logmsg "The tool set in the test case for this: '$tool' does not
exist\n";
+ timestampskippedevents($testnum);
+ return -1;
+ }
+ $DBGCURL=$CMDLINE;
+ }
+
+ if($gdbthis) {
+ # gdb is incompatible with valgrind, so disable it when debugging
+ # Perhaps a better approach would be to run it under valgrind anyway
+ # with --db-attach=yes or --vgdb=yes.
+ $disablevalgrind=1;
+ }
+
+ if($fail_due_event_based) {
+ logmsg "This test cannot run event based\n";
+ return -1;
+ }
+
+ my @stdintest = getpart("client", "stdin");
+
+ if(@stdintest) {
+ my $stdinfile="$LOGDIR/stdin-for-$testnum";
+
+ my %hash = getpartattr("client", "stdin");
+ if($hash{'nonewline'}) {
+ # cut off the final newline from the final line of the stdin data
+ chomp($stdintest[$#stdintest]);
+ }
+
+ writearray($stdinfile, \@stdintest);
+
+ $cmdargs .= " <$stdinfile";
+ }
+
+ if(!$tool) {
+ $CMDLINE="$CURL";
+ }
+
+ my $usevalgrind;
+ if($valgrind && !$disablevalgrind) {
+ my @valgrindoption = getpart("verify", "valgrind");
+ if((!@valgrindoption) || ($valgrindoption[0] !~ /disable/)) {
+ $usevalgrind = 1;
+ my $valgrindcmd = "$valgrind ";
+ $valgrindcmd .= "$valgrind_tool " if($valgrind_tool);
+ $valgrindcmd .= "--quiet --leak-check=yes ";
+ $valgrindcmd .= "--suppressions=$srcdir/valgrind.supp ";
+ # $valgrindcmd .= "--gen-suppressions=all ";
+ $valgrindcmd .= "--num-callers=16 ";
+ $valgrindcmd .= "${valgrind_logfile}=$LOGDIR/valgrind$testnum";
+ $CMDLINE = "$valgrindcmd $CMDLINE";
+ }
+ }
+
+ $CMDLINE .= "$cmdargs >$STDOUT 2>$STDERR";
+
+ if($verbose) {
+ logmsg "$CMDLINE\n";
+ }
+
+ open(CMDLOG, ">", "$LOGDIR/$CURLLOG");
+ print CMDLOG "$CMDLINE\n";
+ close(CMDLOG);
+
+ unlink("core");
+
+ my $dumped_core;
+ my $cmdres;
+
+ if($gdbthis) {
+ my $gdbinit = "$TESTDIR/gdbinit$testnum";
+ open(GDBCMD, ">$LOGDIR/gdbcmd");
+ print GDBCMD "set args $cmdargs\n";
+ print GDBCMD "show args\n";
+ print GDBCMD "source $gdbinit\n" if -e $gdbinit;
+ close(GDBCMD);
+ }
+
+ # timestamp starting of test command
+ $timetoolini{$testnum} = Time::HiRes::time();
+
+ # run the command line we built
+ if ($torture) {
+ $cmdres = torture($CMDLINE,
+ $testnum,
- "$gdb --directory libtest $DBGCURL -x
$LOGDIR/gdbcmd");
++ "$gdb --directory $LIBDIR $DBGCURL -x
$LOGDIR/gdbcmd");
+ }
+ elsif($gdbthis) {
+ my $GDBW = ($gdbxwin) ? "-w" : "";
- runclient("$gdb --directory libtest $DBGCURL $GDBW -x
$LOGDIR/gdbcmd");
++ runclient("$gdb --directory $LIBDIR $DBGCURL $GDBW -x
$LOGDIR/gdbcmd");
+ $cmdres=0; # makes it always continue after a debugged run
+ }
+ else {
+ $cmdres = runclient("$CMDLINE");
+ my $signal_num = $cmdres & 127;
+ $dumped_core = $cmdres & 128;
+
+ if(!$anyway && ($signal_num || $dumped_core)) {
+ $cmdres = 1000;
+ }
+ else {
+ $cmdres >>= 8;
+ $cmdres = (2000 + $signal_num) if($signal_num && !$cmdres);
+ }
+ }
+
+ # timestamp finishing of test command
+ $timetoolend{$testnum} = Time::HiRes::time();
+
+ if(!$dumped_core) {
+ if(-r "core") {
+ # there's core file present now!
+ $dumped_core = 1;
+ }
+ }
+
+ if($dumped_core) {
+ logmsg "core dumped\n";
+ if(0 && $gdb) {
+ logmsg "running gdb for post-mortem analysis:\n";
+ open(GDBCMD, ">$LOGDIR/gdbcmd2");
+ print GDBCMD "bt\n";
+ close(GDBCMD);
+ runclient("$gdb --directory libtest -x $LOGDIR/gdbcmd2 -batch
$DBGCURL core ");
+ # unlink("$LOGDIR/gdbcmd2");
+ }
+ }
+
+ # If a server logs advisor read lock file exists, it is an indication
+ # that the server has not yet finished writing out all its log files,
+ # including server request log files used for protocol verification.
+ # So, if the lock file exists the script waits here a certain amount
+ # of time until the server removes it, or the given time expires.
+
+ if($serverlogslocktimeout) {
+ my $lockretry = $serverlogslocktimeout * 20;
+ while((-f $SERVERLOGS_LOCK) && $lockretry--) {
+ portable_sleep(0.05);
+ }
+ if(($lockretry < 0) &&
+ ($serverlogslocktimeout >= $defserverlogslocktimeout)) {
+ logmsg "Warning: server logs lock timeout ",
+ "($serverlogslocktimeout seconds) expired\n";
+ }
+ }
+
+ # Test harness ssh server does not have this synchronization mechanism,
+ # this implies that some ssh server based tests might need a small delay
+ # once that the client command has run to avoid false test failures.
+ #
+ # gnutls-serv also lacks this synchronization mechanism, so gnutls-serv
+ # based tests might need a small delay once that the client command has
+ # run to avoid false test failures.
+
+ portable_sleep($postcommanddelay) if($postcommanddelay);
+
+ # timestamp removal of server logs advisor read lock
+ $timesrvrlog{$testnum} = Time::HiRes::time();
+
+ # test definition might instruct to stop some servers
+ # stop also all servers relative to the given one
+
+ my @killtestservers = getpart("client", "killserver");
+ if(@killtestservers) {
+ foreach my $server (@killtestservers) {
+ chomp $server;
+ stopserver($server);
+ }
+ }
+
+ # run the postcheck command
+ my @postcheck= getpart("client", "postcheck");
+ if(@postcheck) {
+ $cmd = join("", @postcheck);
+ chomp $cmd;
+ subVariables(\$cmd);
+ if($cmd) {
+ logmsg "postcheck $cmd\n" if($verbose);
+ my $rc = runclient("$cmd");
+ # Must run the postcheck command in torture mode in order
+ # to clean up, but the result can't be relied upon.
+ if($rc != 0 && !$torture) {
+ logmsg " postcheck FAILED\n";
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+ return $errorreturncode;
+ }
+ }
+ }
+
+ # restore environment variables that were modified
+ if(%oldenv) {
+ foreach my $var (keys %oldenv) {
+ if($oldenv{$var} eq 'notset') {
+ delete $ENV{$var} if($ENV{$var});
+ }
+ else {
+ $ENV{$var} = "$oldenv{$var}";
+ }
+ }
+ }
+
+ # Skip all the verification on torture tests
+ if ($torture) {
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+ return $cmdres;
+ }
+
+ my @err = getpart("verify", "errorcode");
+ my $errorcode = $err[0] || "0";
+ my $ok="";
+ my $res;
+ chomp $errorcode;
+ if (@validstdout) {
+ # verify redirected stdout
+ my @actual = loadarray($STDOUT);
+
+ # what parts to cut off from stdout
+ my @stripfile = getpart("verify", "stripfile");
+
+ foreach my $strip (@stripfile) {
+ chomp $strip;
+ my @newgen;
+ for(@actual) {
+ eval $strip;
+ if($_) {
+ push @newgen, $_;
+ }
+ }
+ # this is to get rid of array entries that vanished (zero
+ # length) because of replacements
+ @actual = @newgen;
+ }
+
+ # variable-replace in the stdout we have from the test case file
+ @validstdout = fixarray(@validstdout);
+
+ # get all attributes
+ my %hash = getpartattr("verify", "stdout");
+
+ # get the mode attribute
+ my $filemode=$hash{'mode'};
+ if($filemode && ($filemode eq "text") && $has_textaware) {
+ # text mode when running on windows: fix line endings
+ map s/\r\n/\n/g, @validstdout;
+ map s/\n/\r\n/g, @validstdout;
+ }
+
+ if($hash{'nonewline'}) {
+ # Yes, we must cut off the final newline from the final line
+ # of the protocol data
+ chomp($validstdout[$#validstdout]);
+ }
+
+ $res = compare($testnum, $testname, "stdout", \@actual,
\@validstdout);
+ if($res) {
+ return $errorreturncode;
+ }
+ $ok .= "s";
+ }
+ else {
+ $ok .= "-"; # stdout not checked
+ }
+
+ if (@validstderr) {
+ # verify redirected stderr
+ my @actual = loadarray($STDERR);
+
+ # what parts to cut off from stderr
+ my @stripfile = getpart("verify", "stripfile");
+
+ foreach my $strip (@stripfile) {
+ chomp $strip;
+ my @newgen;
+ for(@actual) {
+ eval $strip;
+ if($_) {
+ push @newgen, $_;
+ }
+ }
+ # this is to get rid of array entries that vanished (zero
+ # length) because of replacements
+ @actual = @newgen;
+ }
+
+ # variable-replace in the stderr we have from the test case file
+ @validstderr = fixarray(@validstderr);
+
+ # get all attributes
+ my %hash = getpartattr("verify", "stderr");
+
+ # get the mode attribute
+ my $filemode=$hash{'mode'};
+ if($filemode && ($filemode eq "text") && $has_textaware) {
+ # text mode when running on windows: fix line endings
+ map s/\r\n/\n/g, @validstderr;
+ map s/\n/\r\n/g, @validstderr;
+ }
+
+ if($hash{'nonewline'}) {
+ # Yes, we must cut off the final newline from the final line
+ # of the protocol data
+ chomp($validstderr[$#validstderr]);
+ }
+
+ $res = compare($testnum, $testname, "stderr", \@actual,
\@validstderr);
+ if($res) {
+ return $errorreturncode;
+ }
+ $ok .= "r";
+ }
+ else {
+ $ok .= "-"; # stderr not checked
+ }
+
+ if(@protocol) {
+ # Verify the sent request
+ my @out = loadarray($SERVERIN);
+
+ # what to cut off from the live protocol sent by curl
+ my @strip = getpart("verify", "strip");
+
+ my @protstrip=@protocol;
+
+ # check if there's any attributes on the verify/protocol section
+ my %hash = getpartattr("verify", "protocol");
+
+ if($hash{'nonewline'}) {
+ # Yes, we must cut off the final newline from the final line
+ # of the protocol data
+ chomp($protstrip[$#protstrip]);
+ }
+
+ for(@strip) {
+ # strip off all lines that match the patterns from both arrays
+ chomp $_;
+ @out = striparray( $_, \@out);
+ @protstrip= striparray( $_, \@protstrip);
+ }
+
+ # what parts to cut off from the protocol
+ my @strippart = getpart("verify", "strippart");
+ my $strip;
+ @strippart = fixarray(@strippart);
+ for $strip (@strippart) {
+ chomp $strip;
+ for(@out) {
+ eval $strip;
+ }
+ }
+
+ if((!$out[0] || ($out[0] eq "")) && $protstrip[0]) {
+ logmsg "\n $testnum: protocol FAILED!\n".
+ " There was no content at all in the file $SERVERIN.\n".
+ " Server glitch? Total curl failure? Returned: $cmdres\n";
+ return $errorreturncode;
+ }
+
+ $res = compare($testnum, $testname, "protocol", \@out, \@protstrip);
+ if($res) {
+ return $errorreturncode;
+ }
+
+ $ok .= "p";
+
+ }
+ else {
+ $ok .= "-"; # protocol not checked
+ }
+
+ if(!$replyattr{'nocheck'} && (@reply || $replyattr{'sendzero'})) {
+ # verify the received data
+ my @out = loadarray($CURLOUT);
+ $res = compare($testnum, $testname, "data", \@out, \@reply);
+ if ($res) {
+ return $errorreturncode;
+ }
+ $ok .= "d";
+ }
+ else {
+ $ok .= "-"; # data not checked
+ }
+
+ if(@upload) {
+ # verify uploaded data
+ my @out = loadarray("$LOGDIR/upload.$testnum");
+
+ # what parts to cut off from the upload
+ my @strippart = getpart("verify", "strippart");
+ my $strip;
+ for $strip (@strippart) {
+ chomp $strip;
+ for(@out) {
+ eval $strip;
+ }
+ }
+
+ $res = compare($testnum, $testname, "upload", \@out, \@upload);
+ if ($res) {
+ return $errorreturncode;
+ }
+ $ok .= "u";
+ }
+ else {
+ $ok .= "-"; # upload not checked
+ }
+
+ if(@proxyprot) {
+ # Verify the sent proxy request
+ my @out = loadarray($PROXYIN);
+
+ # what to cut off from the live protocol sent by curl, we use the
+ # same rules as for <protocol>
+ my @strip = getpart("verify", "strip");
+
+ my @protstrip=@proxyprot;
+
+ # check if there's any attributes on the verify/protocol section
+ my %hash = getpartattr("verify", "proxy");
+
+ if($hash{'nonewline'}) {
+ # Yes, we must cut off the final newline from the final line
+ # of the protocol data
+ chomp($protstrip[$#protstrip]);
+ }
+
+ for(@strip) {
+ # strip off all lines that match the patterns from both arrays
+ chomp $_;
+ @out = striparray( $_, \@out);
+ @protstrip= striparray( $_, \@protstrip);
+ }
+
+ # what parts to cut off from the protocol
+ my @strippart = getpart("verify", "strippart");
+ my $strip;
+ for $strip (@strippart) {
+ chomp $strip;
+ for(@out) {
+ eval $strip;
+ }
+ }
+
+ $res = compare($testnum, $testname, "proxy", \@out, \@protstrip);
+ if($res) {
+ return $errorreturncode;
+ }
+
+ $ok .= "P";
+
+ }
+ else {
+ $ok .= "-"; # protocol not checked
+ }
+
+ my $outputok;
+ for my $partsuffix (('', '1', '2', '3', '4')) {
+ my @outfile=getpart("verify", "file".$partsuffix);
+ if(@outfile || partexists("verify", "file".$partsuffix) ) {
+ # we're supposed to verify a dynamically generated file!
+ my %hash = getpartattr("verify", "file".$partsuffix);
+
+ my $filename=$hash{'name'};
+ if(!$filename) {
+ logmsg "ERROR: section verify=>file$partsuffix ".
+ "has no name attribute\n";
+ stopservers($verbose);
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+ return -1;
+ }
+ my @generated=loadarray($filename);
+
+ # what parts to cut off from the file
+ my @stripfile = getpart("verify", "stripfile".$partsuffix);
+
+ my $filemode=$hash{'mode'};
+ if($filemode && ($filemode eq "text") && $has_textaware) {
+ # text mode when running on windows: fix line endings
+ map s/\r\n/\n/g, @outfile;
+ map s/\n/\r\n/g, @outfile;
+ }
+
+ my $strip;
+ for $strip (@stripfile) {
+ chomp $strip;
+ my @newgen;
+ for(@generated) {
+ eval $strip;
+ if($_) {
+ push @newgen, $_;
+ }
+ }
+ # this is to get rid of array entries that vanished (zero
+ # length) because of replacements
+ @generated = @newgen;
+ }
+
+ @outfile = fixarray(@outfile);
+
+ $res = compare($testnum, $testname, "output ($filename)",
+ \@generated, \@outfile);
+ if($res) {
+ return $errorreturncode;
+ }
+
+ $outputok = 1; # output checked
+ }
+ }
+ $ok .= ($outputok) ? "o" : "-"; # output checked or not
+
+ # accept multiple comma-separated error codes
+ my @splerr = split(/ *, */, $errorcode);
+ my $errok;
+ foreach my $e (@splerr) {
+ if($e == $cmdres) {
+ # a fine error code
+ $errok = 1;
+ last;
+ }
+ }
+
+ if($errok) {
+ $ok .= "e";
+ }
+ else {
+ if(!$short) {
+ logmsg sprintf("\n%s returned $cmdres, when expecting %s\n",
+ (!$tool)?"curl":$tool, $errorcode);
+ }
+ logmsg " exit FAILED\n";
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+ return $errorreturncode;
+ }
+
+ if($has_memory_tracking) {
+ if(! -f $memdump) {
+ logmsg "\n** ALERT! memory tracking with no output file?\n"
+ if(!$cmdtype eq "perl");
+ }
+ else {
+ my @memdata=`$memanalyze $memdump`;
+ my $leak=0;
+ for(@memdata) {
+ if($_ ne "") {
+ # well it could be other memory problems as well, but
+ # we call it leak for short here
+ $leak=1;
+ }
+ }
+ if($leak) {
+ logmsg "\n** MEMORY FAILURE\n";
+ logmsg @memdata;
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+ return $errorreturncode;
+ }
+ else {
+ $ok .= "m";
+ }
+ }
+ }
+ else {
+ $ok .= "-"; # memory not checked
+ }
+
+ if($valgrind) {
+ if($usevalgrind) {
+ unless(opendir(DIR, "$LOGDIR")) {
+ logmsg "ERROR: unable to read $LOGDIR\n";
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+ return $errorreturncode;
+ }
+ my @files = readdir(DIR);
+ closedir(DIR);
+ my $vgfile;
+ foreach my $file (@files) {
+ if($file =~ /^valgrind$testnum(\..*|)$/) {
+ $vgfile = $file;
+ last;
+ }
+ }
+ if(!$vgfile) {
+ logmsg "ERROR: valgrind log file missing for test $testnum\n";
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+ return $errorreturncode;
+ }
+ my @e = valgrindparse("$LOGDIR/$vgfile");
+ if(@e && $e[0]) {
+ if($automakestyle) {
+ logmsg "FAIL: $testnum - $testname - valgrind\n";
+ }
+ else {
+ logmsg " valgrind ERROR ";
+ logmsg @e;
+ }
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+ return $errorreturncode;
+ }
+ $ok .= "v";
+ }
+ else {
+ if($verbose && !$disablevalgrind) {
+ logmsg " valgrind SKIPPED\n";
+ }
+ $ok .= "-"; # skipped
+ }
+ }
+ else {
+ $ok .= "-"; # valgrind not checked
+ }
+ # add 'E' for event-based
+ $ok .= $evbased ? "E" : "-";
+
+ logmsg "$ok " if(!$short);
+
+ # timestamp test result verification end
+ $timevrfyend{$testnum} = Time::HiRes::time();
+
+ my $sofar= time()-$start;
+ my $esttotal = $sofar/$count * $total;
+ my $estleft = $esttotal - $sofar;
+ my $left=sprintf("remaining: %02d:%02d",
+ $estleft/60,
+ $estleft%60);
+ my $took = $timevrfyend{$testnum} - $timeprepini{$testnum};
+ my $duration = sprintf("duration: %02d:%02d",
+ $sofar/60, $sofar%60);
+ if(!$automakestyle) {
+ logmsg sprintf("OK (%-3d out of %-3d, %s, took %.3fs, %s)\n",
+ $count, $total, $left, $took, $duration);
+ }
+ else {
+ logmsg "PASS: $testnum - $testname\n";
+ }
+
+ if($errorreturncode==2) {
+ logmsg "Warning: test$testnum result is ignored, but passed!\n";
+ }
+
+ return 0;
+}
+
+#######################################################################
+# Stop all running test servers
+#
+sub stopservers {
+ my $verbose = $_[0];
+ #
+ # kill sockfilter processes for all pingpong servers
+ #
+ killallsockfilters($verbose);
+ #
+ # kill all server pids from %run hash clearing them
+ #
+ my $pidlist;
+ foreach my $server (keys %run) {
+ if($run{$server}) {
+ if($verbose) {
+ my $prev = 0;
+ my $pids = $run{$server};
+ foreach my $pid (split(' ', $pids)) {
+ if($pid != $prev) {
+ logmsg sprintf("* kill pid for %s => %d\n",
+ $server, $pid);
+ $prev = $pid;
+ }
+ }
+ }
+ $pidlist .= "$run{$server} ";
+ $run{$server} = 0;
+ }
+ $runcert{$server} = 0 if($runcert{$server});
+ }
+ killpid($verbose, $pidlist);
+ #
+ # cleanup all server pid files
+ #
+ foreach my $server (keys %serverpidfile) {
+ my $pidfile = $serverpidfile{$server};
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ logmsg "Warning: $server server unexpectedly alive\n";
+ killpid($verbose, $pid);
+ }
+ unlink($pidfile) if(-f $pidfile);
+ }
+}
+
+#######################################################################
+# startservers() starts all the named servers
+#
+# Returns: string with error reason or blank for success
+#
+sub startservers {
+ my @what = @_;
+ my ($pid, $pid2);
+ for(@what) {
+ my (@whatlist) = split(/\s+/,$_);
+ my $what = lc($whatlist[0]);
+ $what =~ s/[^a-z0-9\/-]//g;
+
+ my $certfile;
+ if($what =~ /^(ftp|http|imap|pop3|smtp)s((\d*)(-ipv6|-unix|))$/) {
+ $certfile = ($whatlist[1]) ? $whatlist[1] : 'stunnel.pem';
+ }
+
+ if(($what eq "pop3") ||
+ ($what eq "ftp") ||
+ ($what eq "imap") ||
+ ($what eq "smtp")) {
+ if($torture && $run{$what} &&
+ !responsive_pingpong_server($what, "", $verbose)) {
+ stopserver($what);
+ }
+ if(!$run{$what}) {
+ ($pid, $pid2) = runpingpongserver($what, "", $verbose);
+ if($pid <= 0) {
+ return "failed starting ". uc($what) ." server";
+ }
+ printf ("* pid $what => %d %d\n", $pid, $pid2) if($verbose);
+ $run{$what}="$pid $pid2";
+ }
+ }
+ elsif($what eq "ftp-ipv6") {
+ if($torture && $run{'ftp-ipv6'} &&
+ !responsive_pingpong_server("ftp", "", $verbose, "ipv6")) {
+ stopserver('ftp-ipv6');
+ }
+ if(!$run{'ftp-ipv6'}) {
+ ($pid, $pid2) = runpingpongserver("ftp", "", $verbose,
"ipv6");
+ if($pid <= 0) {
+ return "failed starting FTP-IPv6 server";
+ }
+ logmsg sprintf("* pid ftp-ipv6 => %d %d\n", $pid,
+ $pid2) if($verbose);
+ $run{'ftp-ipv6'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "gopher") {
+ if($torture && $run{'gopher'} &&
+ !responsive_http_server("gopher", $verbose, 0, $GOPHERPORT)) {
+ stopserver('gopher');
+ }
+ if(!$run{'gopher'}) {
+ ($pid, $pid2, $GOPHERPORT) =
+ runhttpserver("gopher", $verbose, 0);
+ if($pid <= 0) {
+ return "failed starting GOPHER server";
+ }
+ logmsg sprintf ("* pid gopher => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'gopher'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "gopher-ipv6") {
+ if($torture && $run{'gopher-ipv6'} &&
+ !responsive_http_server("gopher", $verbose, "ipv6",
+ $GOPHER6PORT)) {
+ stopserver('gopher-ipv6');
+ }
+ if(!$run{'gopher-ipv6'}) {
+ ($pid, $pid2, $GOPHER6PORT) =
+ runhttpserver("gopher", $verbose, "ipv6");
+ if($pid <= 0) {
+ return "failed starting GOPHER-IPv6 server";
+ }
+ logmsg sprintf("* pid gopher-ipv6 => %d %d\n", $pid,
+ $pid2) if($verbose);
+ $run{'gopher-ipv6'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "http/2") {
+ if(!$run{'http/2'}) {
+ ($pid, $pid2, $HTTP2PORT) = runhttp2server($verbose);
+ if($pid <= 0) {
+ return "failed starting HTTP/2 server";
+ }
+ logmsg sprintf ("* pid http/2 => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'http/2'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "http") {
+ if($torture && $run{'http'} &&
+ !responsive_http_server("http", $verbose, 0, $HTTPPORT)) {
+ stopserver('http');
+ }
+ if(!$run{'http'}) {
+ ($pid, $pid2, $HTTPPORT) =
+ runhttpserver("http", $verbose, 0);
+ if($pid <= 0) {
+ return "failed starting HTTP server";
+ }
+ logmsg sprintf ("* pid http => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'http'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "http-proxy") {
+ if($torture && $run{'http-proxy'} &&
+ !responsive_http_server("http", $verbose, "proxy",
+ $HTTPPROXYPORT)) {
+ stopserver('http-proxy');
+ }
+ if(!$run{'http-proxy'}) {
+ ($pid, $pid2, $HTTPPROXYPORT) =
+ runhttpserver("http", $verbose, "proxy");
+ if($pid <= 0) {
+ return "failed starting HTTP-proxy server";
+ }
+ logmsg sprintf ("* pid http-proxy => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'http-proxy'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "http-ipv6") {
+ if($torture && $run{'http-ipv6'} &&
+ !responsive_http_server("http", $verbose, "ipv6", $HTTP6PORT))
{
+ stopserver('http-ipv6');
+ }
+ if(!$run{'http-ipv6'}) {
+ ($pid, $pid2, $HTTP6PORT) =
+ runhttpserver("http", $verbose, "ipv6");
+ if($pid <= 0) {
+ return "failed starting HTTP-IPv6 server";
+ }
+ logmsg sprintf("* pid http-ipv6 => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'http-ipv6'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "rtsp") {
+ if($torture && $run{'rtsp'} &&
+ !responsive_rtsp_server($verbose)) {
+ stopserver('rtsp');
+ }
+ if(!$run{'rtsp'}) {
+ ($pid, $pid2, $RTSPPORT) = runrtspserver($verbose);
+ if($pid <= 0) {
+ return "failed starting RTSP server";
+ }
+ printf ("* pid rtsp => %d %d\n", $pid, $pid2) if($verbose);
+ $run{'rtsp'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "rtsp-ipv6") {
+ if($torture && $run{'rtsp-ipv6'} &&
+ !responsive_rtsp_server($verbose, "ipv6")) {
+ stopserver('rtsp-ipv6');
+ }
+ if(!$run{'rtsp-ipv6'}) {
+ ($pid, $pid2, $RTSP6PORT) = runrtspserver($verbose, "ipv6");
+ if($pid <= 0) {
+ return "failed starting RTSP-IPv6 server";
+ }
+ logmsg sprintf("* pid rtsp-ipv6 => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'rtsp-ipv6'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "ftps") {
+ if(!$stunnel) {
+ # we can't run ftps tests without stunnel
+ return "no stunnel";
+ }
+ if($runcert{'ftps'} && ($runcert{'ftps'} ne $certfile)) {
+ # stop server when running and using a different cert
+ stopserver('ftps');
+ }
+ if($torture && $run{'ftp'} &&
+ !responsive_pingpong_server("ftp", "", $verbose)) {
+ stopserver('ftp');
+ }
+ if(!$run{'ftp'}) {
+ ($pid, $pid2) = runpingpongserver("ftp", "", $verbose);
+ if($pid <= 0) {
+ return "failed starting FTP server";
+ }
+ printf ("* pid ftp => %d %d\n", $pid, $pid2) if($verbose);
+ $run{'ftp'}="$pid $pid2";
+ }
+ if(!$run{'ftps'}) {
+ ($pid, $pid2, $FTPSPORT) =
+ runftpsserver($verbose, "", $certfile);
+ if($pid <= 0) {
+ return "failed starting FTPS server (stunnel)";
+ }
+ logmsg sprintf("* pid ftps => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'ftps'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "file") {
+ # we support it but have no server!
+ }
+ elsif($what eq "https") {
+ if(!$stunnel) {
+ # we can't run https tests without stunnel
+ return "no stunnel";
+ }
+ if($runcert{'https'} && ($runcert{'https'} ne $certfile)) {
+ # stop server when running and using a different cert
+ stopserver('https');
+ }
+ if($torture && $run{'http'} &&
+ !responsive_http_server("http", $verbose, 0, $HTTPPORT)) {
+ stopserver('http');
+ }
+ if(!$run{'http'}) {
+ ($pid, $pid2, $HTTPPORT) =
+ runhttpserver("http", $verbose, 0);
+ if($pid <= 0) {
+ return "failed starting HTTP server";
+ }
+ printf ("* pid http => %d %d\n", $pid, $pid2) if($verbose);
+ $run{'http'}="$pid $pid2";
+ }
+ if(!$run{'https'}) {
+ ($pid, $pid2, $HTTPSPORT) =
+ runhttpsserver($verbose, "", "", $certfile);
+ if($pid <= 0) {
+ return "failed starting HTTPS server (stunnel)";
+ }
+ logmsg sprintf("* pid https => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'https'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "https-proxy") {
+ if(!$stunnel) {
+ # we can't run https-proxy tests without stunnel
+ return "no stunnel";
+ }
+ if($runcert{'https-proxy'} &&
+ ($runcert{'https-proxy'} ne $certfile)) {
+ # stop server when running and using a different cert
+ stopserver('https-proxy');
+ }
+
+ # we front the http-proxy with stunnel so we need to make sure the
+ # proxy runs as well
+ my $f = startservers("http-proxy");
+ if($f) {
+ return $f;1
+ }
+
+ if(!$run{'https-proxy'}) {
+ ($pid, $pid2, $HTTPSPROXYPORT) =
+ runhttpsserver($verbose, "", "proxy", $certfile);
+ if($pid <= 0) {
+ return "failed starting HTTPS-proxy (stunnel)";
+ }
+ logmsg sprintf("* pid https-proxy => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'https-proxy'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "httptls") {
+ if(!$httptlssrv) {
+ # for now, we can't run http TLS-EXT tests without gnutls-serv
+ return "no gnutls-serv";
+ }
+ if($torture && $run{'httptls'} &&
+ !responsive_httptls_server($verbose, "IPv4")) {
+ stopserver('httptls');
+ }
+ if(!$run{'httptls'}) {
+ ($pid, $pid2, $HTTPTLSPORT) =
+ runhttptlsserver($verbose, "IPv4");
+ if($pid <= 0) {
+ return "failed starting HTTPTLS server (gnutls-serv)";
+ }
+ logmsg sprintf("* pid httptls => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'httptls'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "httptls-ipv6") {
+ if(!$httptlssrv) {
+ # for now, we can't run http TLS-EXT tests without gnutls-serv
+ return "no gnutls-serv";
+ }
+ if($torture && $run{'httptls-ipv6'} &&
+ !responsive_httptls_server($verbose, "ipv6")) {
+ stopserver('httptls-ipv6');
+ }
+ if(!$run{'httptls-ipv6'}) {
+ ($pid, $pid2, $HTTPTLS6PORT) =
+ runhttptlsserver($verbose, "ipv6");
+ if($pid <= 0) {
+ return "failed starting HTTPTLS-IPv6 server
(gnutls-serv)";
+ }
+ logmsg sprintf("* pid httptls-ipv6 => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'httptls-ipv6'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "tftp") {
+ if($torture && $run{'tftp'} &&
+ !responsive_tftp_server("", $verbose)) {
+ stopserver('tftp');
+ }
+ if(!$run{'tftp'}) {
+ ($pid, $pid2, $TFTPPORT) =
+ runtftpserver("", $verbose);
+ if($pid <= 0) {
+ return "failed starting TFTP server";
+ }
+ printf ("* pid tftp => %d %d\n", $pid, $pid2) if($verbose);
+ $run{'tftp'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "tftp-ipv6") {
+ if($torture && $run{'tftp-ipv6'} &&
+ !responsive_tftp_server("", $verbose, "ipv6")) {
+ stopserver('tftp-ipv6');
+ }
+ if(!$run{'tftp-ipv6'}) {
+ ($pid, $pid2, $TFTP6PORT) =
+ runtftpserver("", $verbose, "ipv6");
+ if($pid <= 0) {
+ return "failed starting TFTP-IPv6 server";
+ }
+ printf("* pid tftp-ipv6 => %d %d\n", $pid, $pid2)
if($verbose);
+ $run{'tftp-ipv6'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "sftp" || $what eq "scp") {
+ if(!$run{'ssh'}) {
+ ($pid, $pid2, $SSHPORT) = runsshserver("", $verbose);
+ if($pid <= 0) {
+ return "failed starting SSH server";
+ }
+ printf ("* pid ssh => %d %d\n", $pid, $pid2) if($verbose);
+ $run{'ssh'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "socks4" || $what eq "socks5" ) {
+ if(!$run{'socks'}) {
+ ($pid, $pid2, $SOCKSPORT) = runsocksserver("", $verbose);
+ if($pid <= 0) {
+ return "failed starting socks server";
+ }
+ printf ("* pid socks => %d %d\n", $pid, $pid2) if($verbose);
+ $run{'socks'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "mqtt" ) {
+ if(!$run{'mqtt'}) {
+ ($pid, $pid2) = runmqttserver("", $verbose);
+ if($pid <= 0) {
+ return "failed starting mqtt server";
+ }
+ printf ("* pid mqtt => %d %d\n", $pid, $pid2) if($verbose);
+ $run{'mqtt'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "http-unix") {
+ if($torture && $run{'http-unix'} &&
+ !responsive_http_server("http", $verbose, "unix",
$HTTPUNIXPATH)) {
+ stopserver('http-unix');
+ }
+ if(!$run{'http-unix'}) {
+ my $unused;
+ ($pid, $pid2, $unused) =
+ runhttpserver("http", $verbose, "unix", $HTTPUNIXPATH);
+ if($pid <= 0) {
+ return "failed starting HTTP-unix server";
+ }
+ logmsg sprintf("* pid http-unix => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'http-unix'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "dict") {
+ if(!$run{'dict'}) {
+ ($pid, $pid2, $DICTPORT) = rundictserver($verbose, "");
+ if($pid <= 0) {
+ return "failed starting DICT server";
+ }
+ logmsg sprintf ("* pid DICT => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'dict'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "smb") {
+ if(!$run{'smb'}) {
+ ($pid, $pid2, $SMBPORT) = runsmbserver($verbose, "");
+ if($pid <= 0) {
+ return "failed starting SMB server";
+ }
+ logmsg sprintf ("* pid SMB => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'dict'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "telnet") {
+ if(!$run{'telnet'}) {
+ ($pid, $pid2, $TELNETPORT) =
+ runnegtelnetserver($verbose, "");
+ if($pid <= 0) {
+ return "failed starting neg TELNET server";
+ }
+ logmsg sprintf ("* pid neg TELNET => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'dict'}="$pid $pid2";
+ }
+ }
+ elsif($what eq "none") {
+ logmsg "* starts no server\n" if ($verbose);
+ }
+ else {
+ warn "we don't support a server for $what";
+ return "no server for $what";
+ }
+ }
+ return 0;
+}
+
+##############################################################################
+# This function makes sure the right set of server is running for the
+# specified test case. This is a useful design when we run single tests as not
+# all servers need to run then!
+#
+# Returns: a string, blank if everything is fine or a reason why it failed
+#
+sub serverfortest {
+ my ($testnum)=@_;
+
+ my @what = getpart("client", "server");
+
+ if(!$what[0]) {
+ warn "Test case $testnum has no server(s) specified";
+ return "no server specified";
+ }
+
+ for(my $i = scalar(@what) - 1; $i >= 0; $i--) {
+ my $srvrline = $what[$i];
+ chomp $srvrline if($srvrline);
+ if($srvrline =~ /^(\S+)((\s*)(.*))/) {
+ my $server = "${1}";
+ my $lnrest = "${2}";
+ my $tlsext;
+ if($server =~ /^(httptls)(\+)(ext|srp)(\d*)(-ipv6|)$/) {
+ $server = "${1}${4}${5}";
+ $tlsext = uc("TLS-${3}");
+ }
+ if(! grep /^\Q$server\E$/, @protocols) {
+ if(substr($server,0,5) ne "socks") {
+ if($tlsext) {
+ return "curl lacks $tlsext support";
+ }
+ else {
+ return "curl lacks $server server support";
+ }
+ }
+ }
+ $what[$i] = "$server$lnrest" if($tlsext);
+ }
+ }
+
+ return &startservers(@what);
+}
+
+#######################################################################
+# runtimestats displays test-suite run time statistics
+#
+sub runtimestats {
+ my $lasttest = $_[0];
+
+ return if(not $timestats);
+
+ logmsg "\nTest suite total running time breakdown per task...\n\n";
+
+ my @timesrvr;
+ my @timeprep;
+ my @timetool;
+ my @timelock;
+ my @timevrfy;
+ my @timetest;
+ my $timesrvrtot = 0.0;
+ my $timepreptot = 0.0;
+ my $timetooltot = 0.0;
+ my $timelocktot = 0.0;
+ my $timevrfytot = 0.0;
+ my $timetesttot = 0.0;
+ my $counter;
+
+ for my $testnum (1 .. $lasttest) {
+ if($timesrvrini{$testnum}) {
+ $timesrvrtot += $timesrvrend{$testnum} - $timesrvrini{$testnum};
+ $timepreptot +=
+ (($timetoolini{$testnum} - $timeprepini{$testnum}) -
+ ($timesrvrend{$testnum} - $timesrvrini{$testnum}));
+ $timetooltot += $timetoolend{$testnum} - $timetoolini{$testnum};
+ $timelocktot += $timesrvrlog{$testnum} - $timetoolend{$testnum};
+ $timevrfytot += $timevrfyend{$testnum} - $timesrvrlog{$testnum};
+ $timetesttot += $timevrfyend{$testnum} - $timeprepini{$testnum};
+ push @timesrvr, sprintf("%06.3f %04d",
+ $timesrvrend{$testnum} - $timesrvrini{$testnum}, $testnum);
+ push @timeprep, sprintf("%06.3f %04d",
+ ($timetoolini{$testnum} - $timeprepini{$testnum}) -
+ ($timesrvrend{$testnum} - $timesrvrini{$testnum}), $testnum);
+ push @timetool, sprintf("%06.3f %04d",
+ $timetoolend{$testnum} - $timetoolini{$testnum}, $testnum);
+ push @timelock, sprintf("%06.3f %04d",
+ $timesrvrlog{$testnum} - $timetoolend{$testnum}, $testnum);
+ push @timevrfy, sprintf("%06.3f %04d",
+ $timevrfyend{$testnum} - $timesrvrlog{$testnum}, $testnum);
+ push @timetest, sprintf("%06.3f %04d",
+ $timevrfyend{$testnum} - $timeprepini{$testnum}, $testnum);
+ }
+ }
+
+ {
+ no warnings 'numeric';
+ @timesrvr = sort { $b <=> $a } @timesrvr;
+ @timeprep = sort { $b <=> $a } @timeprep;
+ @timetool = sort { $b <=> $a } @timetool;
+ @timelock = sort { $b <=> $a } @timelock;
+ @timevrfy = sort { $b <=> $a } @timevrfy;
+ @timetest = sort { $b <=> $a } @timetest;
+ }
+
+ logmsg "Spent ". sprintf("%08.3f ", $timesrvrtot) .
+ "seconds starting and verifying test harness servers.\n";
+ logmsg "Spent ". sprintf("%08.3f ", $timepreptot) .
+ "seconds reading definitions and doing test preparations.\n";
+ logmsg "Spent ". sprintf("%08.3f ", $timetooltot) .
+ "seconds actually running test tools.\n";
+ logmsg "Spent ". sprintf("%08.3f ", $timelocktot) .
+ "seconds awaiting server logs lock removal.\n";
+ logmsg "Spent ". sprintf("%08.3f ", $timevrfytot) .
+ "seconds verifying test results.\n";
+ logmsg "Spent ". sprintf("%08.3f ", $timetesttot) .
+ "seconds doing all of the above.\n";
+
+ $counter = 25;
+ logmsg "\nTest server starting and verification time per test ".
+ sprintf("(%s)...\n\n", (not $fullstats)?"top $counter":"full");
+ logmsg "-time- test\n";
+ logmsg "------ ----\n";
+ foreach my $txt (@timesrvr) {
+ last if((not $fullstats) && (not $counter--));
+ logmsg "$txt\n";
+ }
+
+ $counter = 10;
+ logmsg "\nTest definition reading and preparation time per test ".
+ sprintf("(%s)...\n\n", (not $fullstats)?"top $counter":"full");
+ logmsg "-time- test\n";
+ logmsg "------ ----\n";
+ foreach my $txt (@timeprep) {
+ last if((not $fullstats) && (not $counter--));
+ logmsg "$txt\n";
+ }
+
+ $counter = 25;
+ logmsg "\nTest tool execution time per test ".
+ sprintf("(%s)...\n\n", (not $fullstats)?"top $counter":"full");
+ logmsg "-time- test\n";
+ logmsg "------ ----\n";
+ foreach my $txt (@timetool) {
+ last if((not $fullstats) && (not $counter--));
+ logmsg "$txt\n";
+ }
+
+ $counter = 15;
+ logmsg "\nTest server logs lock removal time per test ".
+ sprintf("(%s)...\n\n", (not $fullstats)?"top $counter":"full");
+ logmsg "-time- test\n";
+ logmsg "------ ----\n";
+ foreach my $txt (@timelock) {
+ last if((not $fullstats) && (not $counter--));
+ logmsg "$txt\n";
+ }
+
+ $counter = 10;
+ logmsg "\nTest results verification time per test ".
+ sprintf("(%s)...\n\n", (not $fullstats)?"top $counter":"full");
+ logmsg "-time- test\n";
+ logmsg "------ ----\n";
+ foreach my $txt (@timevrfy) {
+ last if((not $fullstats) && (not $counter--));
+ logmsg "$txt\n";
+ }
+
+ $counter = 50;
+ logmsg "\nTotal time per test ".
+ sprintf("(%s)...\n\n", (not $fullstats)?"top $counter":"full");
+ logmsg "-time- test\n";
+ logmsg "------ ----\n";
+ foreach my $txt (@timetest) {
+ last if((not $fullstats) && (not $counter--));
+ logmsg "$txt\n";
+ }
+
+ logmsg "\n";
+}
+
+# globally disabled tests
+disabledtests("$TESTDIR/DISABLED");
+
+# locally disabled tests, ignored by git etc
+disabledtests("$TESTDIR/DISABLED.local");
+
+#######################################################################
+# Check options to this test program
+#
+
- # Special case for CMake: replace '${TFLAGS}' by the contents of the
++# Special case for CMake: replace '$TFLAGS' by the contents of the
+# environment variable (if any).
- if(@ARGV && $ARGV[-1] eq '${TFLAGS}') {
++if(@ARGV && $ARGV[-1] eq '$TFLAGS') {
+ pop @ARGV;
+ push(@ARGV, split(' ', $ENV{'TFLAGS'})) if defined($ENV{'TFLAGS'});
+}
+
+my $number=0;
+my $fromnum=-1;
+my @testthis;
+while(@ARGV) {
+ if ($ARGV[0] eq "-v") {
+ # verbose output
+ $verbose=1;
+ }
+ elsif ($ARGV[0] eq "-c") {
+ # use this path to curl instead of default
+ $DBGCURL=$CURL="\"$ARGV[1]\"";
+ shift @ARGV;
+ }
+ elsif ($ARGV[0] eq "-vc") {
+ # use this path to a curl used to verify servers
+
+ # Particularly useful when you introduce a crashing bug somewhere in
+ # the development version as then it won't be able to run any tests
+ # since it can't verify the servers!
+
+ $VCURL="\"$ARGV[1]\"";
+ shift @ARGV;
+ }
+ elsif ($ARGV[0] eq "-d") {
+ # have the servers display protocol output
+ $debugprotocol=1;
+ }
+ elsif($ARGV[0] eq "-e") {
+ # run the tests cases event based if possible
+ $run_event_based=1;
+ }
+ elsif ($ARGV[0] eq "-g") {
+ # run this test with gdb
+ $gdbthis=1;
+ }
+ elsif ($ARGV[0] eq "-gw") {
+ # run this test with windowed gdb
+ $gdbthis=1;
+ $gdbxwin=1;
+ }
+ elsif($ARGV[0] eq "-s") {
+ # short output
+ $short=1;
+ }
+ elsif($ARGV[0] eq "-am") {
+ # automake-style output
+ $short=1;
+ $automakestyle=1;
+ }
+ elsif($ARGV[0] eq "-n") {
+ # no valgrind
+ undef $valgrind;
+ }
+ elsif ($ARGV[0] eq "-R") {
+ # execute in scrambled order
+ $scrambleorder=1;
+ }
+ elsif($ARGV[0] =~ /^-t(.*)/) {
+ # torture
+ $torture=1;
+ my $xtra = $1;
+
+ if($xtra =~ s/(\d+)$//) {
+ $tortalloc = $1;
+ }
+ }
+ elsif($ARGV[0] =~ /--shallow=(\d+)/) {
+ # Fail no more than this amount per tests when running
+ # torture.
+ my ($num)=($1);
+ $shallow=$num;
+ }
+ elsif($ARGV[0] =~ /--repeat=(\d+)/) {
+ # Repeat-run the given tests this many times
+ $repeat = $1;
+ }
+ elsif($ARGV[0] =~ /--seed=(\d+)/) {
+ # Set a fixed random seed (used for -R and --shallow)
+ $randseed = $1;
+ }
+ elsif($ARGV[0] eq "-a") {
+ # continue anyway, even if a test fail
+ $anyway=1;
+ }
+ elsif($ARGV[0] eq "-p") {
+ $postmortem=1;
+ }
+ elsif($ARGV[0] eq "-l") {
+ # lists the test case names only
+ $listonly=1;
+ }
+ elsif($ARGV[0] eq "-k") {
+ # keep stdout and stderr files after tests
+ $keepoutfiles=1;
+ }
+ elsif($ARGV[0] eq "-r") {
+ # run time statistics needs Time::HiRes
+ if($Time::HiRes::VERSION) {
+ keys(%timeprepini) = 1000;
+ keys(%timesrvrini) = 1000;
+ keys(%timesrvrend) = 1000;
+ keys(%timetoolini) = 1000;
+ keys(%timetoolend) = 1000;
+ keys(%timesrvrlog) = 1000;
+ keys(%timevrfyend) = 1000;
+ $timestats=1;
+ $fullstats=0;
+ }
+ }
+ elsif($ARGV[0] eq "-rf") {
+ # run time statistics needs Time::HiRes
+ if($Time::HiRes::VERSION) {
+ keys(%timeprepini) = 1000;
+ keys(%timesrvrini) = 1000;
+ keys(%timesrvrend) = 1000;
+ keys(%timetoolini) = 1000;
+ keys(%timetoolend) = 1000;
+ keys(%timesrvrlog) = 1000;
+ keys(%timevrfyend) = 1000;
+ $timestats=1;
+ $fullstats=1;
+ }
+ }
+ elsif(($ARGV[0] eq "-h") || ($ARGV[0] eq "--help")) {
+ # show help text
+ print <<EOHELP
+Usage: runtests.pl [options] [test selection(s)]
+ -a continue even if a test fails
+ -am automake style output PASS/FAIL: [number] [name]
+ -c path use this curl executable
+ -d display server debug info
+ -e event-based execution
+ -g run the test case with gdb
+ -gw run the test case with gdb as a windowed application
+ -h this help text
+ -k keep stdout and stderr files present after tests
+ -l list all test case names/descriptions
+ -n no valgrind
+ -p print log file contents when a test fails
+ -R scrambled order (uses the random seed, see --seed)
+ -r run time statistics
+ -rf full run time statistics
+ -s short output
+ --seed=[num] set the random seed to a fixed number
+ --shallow=[num] randomly makes the torture tests "thinner"
+ -t[N] torture (simulate function failures); N means fail Nth function
+ -v verbose output
+ -vc path use this curl only to verify the existing servers
+ [num] like "5 6 9" or " 5 to 22 " to run those tests only
+ [!num] like "!5 !6 !9" to disable those tests
+ [~num] like "~5 ~6 ~9" to ignore the result of those tests
+ [keyword] like "IPv6" to select only tests containing the key word
+ [!keyword] like "!cookies" to disable any tests containing the key word
+ [~keyword] like "~cookies" to ignore results of tests containing key word
+EOHELP
+ ;
+ exit;
+ }
+ elsif($ARGV[0] =~ /^(\d+)/) {
+ $number = $1;
+ if($fromnum >= 0) {
+ for my $n ($fromnum .. $number) {
+ if($disabled{$n}) {
+ # skip disabled test cases
+ my $why = "configured as DISABLED";
+ $skipped++;
+ $skipped{$why}++;
+ $teststat[$n]=$why; # store reason for this test case
+ }
+ else {
+ push @testthis, $n;
+ }
+ }
+ $fromnum = -1;
+ }
+ else {
+ push @testthis, $1;
+ }
+ }
+ elsif($ARGV[0] =~ /^to$/i) {
+ $fromnum = $number+1;
+ }
+ elsif($ARGV[0] =~ /^!(\d+)/) {
+ $fromnum = -1;
+ $disabled{$1}=$1;
+ }
+ elsif($ARGV[0] =~ /^~(\d+)/) {
+ $fromnum = -1;
+ $ignored{$1}=$1;
+ }
+ elsif($ARGV[0] =~ /^!(.+)/) {
+ $disabled_keywords{lc($1)}=$1;
+ }
+ elsif($ARGV[0] =~ /^~(.+)/) {
+ $ignored_keywords{lc($1)}=$1;
+ }
+ elsif($ARGV[0] =~ /^([-[{a-zA-Z].*)/) {
+ $enabled_keywords{lc($1)}=$1;
+ }
+ else {
+ print "Unknown option: $ARGV[0]\n";
+ exit;
+ }
+ shift @ARGV;
+}
+
+if(!$randseed) {
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+ localtime(time);
+ # seed of the month. December 2019 becomes 201912
+ $randseed = ($year+1900)*100 + $mon+1;
+ open(C, "$CURL --version 2>/dev/null|");
+ my @c = <C>;
+ close(C);
+ # use the first line of output and get the md5 out of it
+ my $str = md5($c[0]);
+ $randseed += unpack('S', $str); # unsigned 16 bit value
+}
+srand $randseed;
+
+if(@testthis && ($testthis[0] ne "")) {
+ $TESTCASES=join(" ", @testthis);
+}
+
+if($valgrind) {
+ # we have found valgrind on the host, use it
+
+ # verify that we can invoke it fine
+ my $code = runclient("valgrind >/dev/null 2>&1");
+
+ if(($code>>8) != 1) {
+ #logmsg "Valgrind failure, disable it\n";
+ undef $valgrind;
+ } else {
+
+ # since valgrind 2.1.x, '--tool' option is mandatory
+ # use it, if it is supported by the version installed on the system
+ runclient("valgrind --help 2>&1 | grep -- --tool > /dev/null 2>&1");
+ if (($? >> 8)==0) {
+ $valgrind_tool="--tool=memcheck";
+ }
+ open(C, "<$CURL");
+ my $l = <C>;
+ if($l =~ /^\#\!/) {
+ # A shell script. This is typically when built with libtool,
+ $valgrind="../libtool --mode=execute $valgrind";
+ }
+ close(C);
+
+ # valgrind 3 renamed the --logfile option to --log-file!!!
+ my $ver=join(' ', runclientoutput("valgrind --version"));
+ # cut off all but digits and dots
+ $ver =~ s/[^0-9.]//g;
+
+ if($ver =~ /^(\d+)/) {
+ $ver = $1;
+ if($ver >= 3) {
+ $valgrind_logfile="--log-file";
+ }
+ }
+ }
+}
+
+if ($gdbthis) {
+ # open the executable curl and read the first 4 bytes of it
+ open(CHECK, "<$CURL");
+ my $c;
+ sysread CHECK, $c, 4;
+ close(CHECK);
+ if($c eq "#! /") {
+ # A shell script. This is typically when built with libtool,
+ $libtool = 1;
+ $gdb = "../libtool --mode=execute gdb";
+ }
+}
+
+$HTTPUNIXPATH = "http$$.sock"; # HTTP server Unix domain socket path
+
+#######################################################################
+# clear and create logging directory:
+#
+
+cleardir($LOGDIR);
+mkdir($LOGDIR, 0777);
+
+#######################################################################
+# initialize some variables
+#
+
+get_disttests();
+init_serverpidfile_hash();
+
+#######################################################################
+# Output curl version and host info being tested
+#
+
+if(!$listonly) {
+ checksystem();
+}
+
+#######################################################################
+# Fetch all disabled tests, if there are any
+#
+
+sub disabledtests {
+ my ($file) = @_;
+
+ if(open(D, "<$file")) {
+ while(<D>) {
+ if(/^ *\#/) {
+ # allow comments
+ next;
+ }
+ if($_ =~ /(\d+)/) {
+ my ($n) = $1;
+ $disabled{$n}=$n; # disable this test number
+ if(! -f "$srcdir/data/test$n") {
+ print STDERR "WARNING! Non-existing test $n in
DISABLED!\n";
+ # fail hard to make user notice
+ exit 1;
+ }
+ }
+ }
+ close(D);
+ }
+}
+
+#######################################################################
+# If 'all' tests are requested, find out all test numbers
+#
+
+if ( $TESTCASES eq "all") {
+ # Get all commands and find out their test numbers
+ opendir(DIR, $TESTDIR) || die "can't opendir $TESTDIR: $!";
+ my @cmds = grep { /^test([0-9]+)$/ && -f "$TESTDIR/$_" } readdir(DIR);
+ closedir(DIR);
+
+ $TESTCASES=""; # start with no test cases
+
+ # cut off everything but the digits
+ for(@cmds) {
+ $_ =~ s/[a-z\/\.]*//g;
+ }
+ # sort the numbers from low to high
+ foreach my $n (sort { $a <=> $b } @cmds) {
+ if($disabled{$n}) {
+ # skip disabled test cases
+ my $why = "configured as DISABLED";
+ $skipped++;
+ $skipped{$why}++;
+ $teststat[$n]=$why; # store reason for this test case
+ next;
+ }
+ $TESTCASES .= " $n";
+ }
+}
+else {
+ my $verified="";
+ map {
+ if (-e "$TESTDIR/test$_") {
+ $verified.="$_ ";
+ }
+ } split(" ", $TESTCASES);
+ if($verified eq "") {
+ print "No existing test cases were specified\n";
+ exit;
+ }
+ $TESTCASES = $verified;
+}
+if($repeat) {
+ my $s;
+ for(1 .. $repeat) {
+ $s .= $TESTCASES;
+ }
+ $TESTCASES = $s;
+}
+
+if($scrambleorder) {
+ # scramble the order of the test cases
+ my @rand;
+ while($TESTCASES) {
+ my @all = split(/ +/, $TESTCASES);
+ if(!$all[0]) {
+ # if the first is blank, shift away it
+ shift @all;
+ }
+ my $r = rand @all;
+ push @rand, $all[$r];
+ $all[$r]="";
+ $TESTCASES = join(" ", @all);
+ }
+ $TESTCASES = join(" ", @rand);
+}
+
+# Display the contents of the given file. Line endings are canonicalized
+# and excessively long files are elided
+sub displaylogcontent {
+ my ($file)=@_;
+ if(open(SINGLE, "<$file")) {
+ my $linecount = 0;
+ my $truncate;
+ my @tail;
+ while(my $string = <SINGLE>) {
+ $string =~ s/\r\n/\n/g;
+ $string =~ s/[\r\f\032]/\n/g;
+ $string .= "\n" unless ($string =~ /\n$/);
+ $string =~ tr/\n//;
+ for my $line (split("\n", $string)) {
+ $line =~ s/\s*\!$//;
+ if ($truncate) {
+ push @tail, " $line\n";
+ } else {
+ logmsg " $line\n";
+ }
+ $linecount++;
+ $truncate = $linecount > 1000;
+ }
+ }
+ if(@tail) {
+ my $tailshow = 200;
+ my $tailskip = 0;
+ my $tailtotal = scalar @tail;
+ if($tailtotal > $tailshow) {
+ $tailskip = $tailtotal - $tailshow;
+ logmsg "=== File too long: $tailskip lines omitted here\n";
+ }
+ for($tailskip .. $tailtotal-1) {
+ logmsg "$tail[$_]";
+ }
+ }
+ close(SINGLE);
+ }
+}
+
+sub displaylogs {
+ my ($testnum)=@_;
+ opendir(DIR, "$LOGDIR") ||
+ die "can't open dir: $!";
+ my @logs = readdir(DIR);
+ closedir(DIR);
+
+ logmsg "== Contents of files in the $LOGDIR/ dir after test $testnum\n";
+ foreach my $log (sort @logs) {
+ if($log =~ /\.(\.|)$/) {
+ next; # skip "." and ".."
+ }
+ if($log =~ /^\.nfs/) {
+ next; # skip ".nfs"
+ }
+ if(($log eq "memdump") || ($log eq "core")) {
+ next; # skip "memdump" and "core"
+ }
+ if((-d "$LOGDIR/$log") || (! -s "$LOGDIR/$log")) {
+ next; # skip directory and empty files
+ }
+ if(($log =~ /^stdout\d+/) && ($log !~ /^stdout$testnum/)) {
+ next; # skip stdoutNnn of other tests
+ }
+ if(($log =~ /^stderr\d+/) && ($log !~ /^stderr$testnum/)) {
+ next; # skip stderrNnn of other tests
+ }
+ if(($log =~ /^upload\d+/) && ($log !~ /^upload$testnum/)) {
+ next; # skip uploadNnn of other tests
+ }
+ if(($log =~ /^curl\d+\.out/) && ($log !~ /^curl$testnum\.out/)) {
+ next; # skip curlNnn.out of other tests
+ }
+ if(($log =~ /^test\d+\.txt/) && ($log !~ /^test$testnum\.txt/)) {
+ next; # skip testNnn.txt of other tests
+ }
+ if(($log =~ /^file\d+\.txt/) && ($log !~ /^file$testnum\.txt/)) {
+ next; # skip fileNnn.txt of other tests
+ }
+ if(($log =~ /^netrc\d+/) && ($log !~ /^netrc$testnum/)) {
+ next; # skip netrcNnn of other tests
+ }
+ if(($log =~ /^trace\d+/) && ($log !~ /^trace$testnum/)) {
+ next; # skip traceNnn of other tests
+ }
+ if(($log =~ /^valgrind\d+/) && ($log !~ /^valgrind$testnum(\..*|)$/))
{
+ next; # skip valgrindNnn of other tests
+ }
+ if(($log =~ /^test$testnum$/)) {
+ next; # skip test$testnum since it can be very big
+ }
+ logmsg "=== Start of file $log\n";
+ displaylogcontent("$LOGDIR/$log");
+ logmsg "=== End of file $log\n";
+ }
+}
+
+#######################################################################
+# Setup Azure Pipelines Test Run (if running in Azure DevOps)
+#
+
+if(azure_check_environment()) {
- $AZURE_RUN_ID = azure_create_test_run();
++ $AZURE_RUN_ID = azure_create_test_run($VCURL);
+ logmsg "Azure Run ID: $AZURE_RUN_ID\n" if ($verbose);
+}
+
+#######################################################################
+# The main test-loop
+#
+
+my $failed;
+my $testnum;
+my $ok=0;
+my $ign=0;
+my $total=0;
+my $lasttest=0;
+my @at = split(" ", $TESTCASES);
+my $count=0;
+
+$start = time();
+
+foreach $testnum (@at) {
+
+ $lasttest = $testnum if($testnum > $lasttest);
+ $count++;
+
+ my $error = singletest($run_event_based, $testnum, $count, scalar(@at));
+
+ # update test result in CI services
+ if(azure_check_environment() && $AZURE_RUN_ID && $AZURE_RESULT_ID) {
- $AZURE_RESULT_ID = azure_update_test_result($AZURE_RUN_ID,
$AZURE_RESULT_ID, $testnum, $error,
++ $AZURE_RESULT_ID = azure_update_test_result($VCURL, $AZURE_RUN_ID,
$AZURE_RESULT_ID, $testnum, $error,
+ $timeprepini{$testnum},
$timevrfyend{$testnum});
+ }
+ elsif(appveyor_check_environment()) {
- appveyor_update_test_result($testnum, $error, $timeprepini{$testnum},
$timevrfyend{$testnum});
++ appveyor_update_test_result($VCURL, $testnum, $error,
$timeprepini{$testnum}, $timevrfyend{$testnum});
+ }
+
+ if($error < 0) {
+ # not a test we can run
+ next;
+ }
+
+ $total++; # number of tests we've run
+
+ if($error>0) {
+ if($error==2) {
+ # ignored test failures are wrapped in ()
+ $failed.= "($testnum) ";
+ }
+ else {
+ $failed.= "$testnum ";
+ }
+ if($postmortem) {
+ # display all files in log/ in a nice way
+ displaylogs($testnum);
+ }
+ if($error==2) {
+ $ign++; # ignored test result counter
+ }
+ elsif(!$anyway) {
+ # a test failed, abort
+ logmsg "\n - abort tests\n";
+ last;
+ }
+ }
+ elsif(!$error) {
+ $ok++; # successful test counter
+ }
+
+ # loop for next test
+}
+
+my $sofar = time() - $start;
+
+#######################################################################
+# Finish Azure Pipelines Test Run (if running in Azure DevOps)
+#
+
+if(azure_check_environment() && $AZURE_RUN_ID) {
- $AZURE_RUN_ID = azure_update_test_run($AZURE_RUN_ID);
++ $AZURE_RUN_ID = azure_update_test_run($VCURL, $AZURE_RUN_ID);
+}
+
+# Tests done, stop the servers
+stopservers($verbose);
+
+my $all = $total + $skipped;
+
+runtimestats($lasttest);
+
+if($total) {
+ logmsg sprintf("TESTDONE: $ok tests out of $total reported OK: %d%%\n",
+ $ok/$total*100);
+
+ if($ok != $total) {
- logmsg "TESTFAIL: These test cases failed: $failed\n";
++ logmsg "\nTESTFAIL: These test cases failed: $failed\n\n";
+ }
+}
+else {
- logmsg "TESTFAIL: No tests were performed\n";
++ logmsg "\nTESTFAIL: No tests were performed\n\n";
++ if(scalar(keys %enabled_keywords)) {
++ logmsg "TESTFAIL: Nothing matched these keywords: ";
++ for(keys %enabled_keywords) {
++ logmsg "$_ ";
++ }
++ logmsg "\n";
++ }
+}
+
+if($all) {
+ logmsg "TESTDONE: $all tests were considered during ".
+ sprintf("%.0f", $sofar) ." seconds.\n";
+}
+
+if($skipped && !$short) {
+ my $s=0;
+ logmsg "TESTINFO: $skipped tests were skipped due to these restraints:\n";
+
+ for(keys %skipped) {
+ my $r = $_;
+ printf "TESTINFO: \"%s\" %d times (", $r, $skipped{$_};
+
+ # now show all test case numbers that had this reason for being
+ # skipped
+ my $c=0;
+ my $max = 9;
+ for(0 .. scalar @teststat) {
+ my $t = $_;
+ if($teststat[$_] && ($teststat[$_] eq $r)) {
+ if($c < $max) {
+ logmsg ", " if($c);
+ logmsg $_;
+ }
+ $c++;
+ }
+ }
+ if($c > $max) {
+ logmsg " and ".($c-$max)." more";
+ }
+ logmsg ")\n";
+ }
+}
+
- if($total && (($ok+$ign) != $total)) {
++if(($total && (($ok+$ign) != $total)) || !$total) {
+ exit 1;
+}
diff --cc tests/secureserver.pl.in
index bf6fc079a,000000000..22bcdc242
mode 100755,000000..100755
--- a/tests/secureserver.pl.in
+++ b/tests/secureserver.pl.in
@@@ -1,364 -1,0 +1,364 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+# This is the HTTPS, FTPS, POP3S, IMAPS, SMTPS, server used for curl test
+# harness. Actually just a layer that runs stunnel properly using the
+# non-secure test harness servers.
+
+BEGIN {
+ push(@INC, $ENV{'srcdir'}) if(defined $ENV{'srcdir'});
+ push(@INC, ".");
+}
+
+use strict;
+use warnings;
+use Cwd;
+use Cwd 'abs_path';
+
+use serverhelp qw(
+ server_pidfilename
+ server_logfilename
+ );
+
+use pathhelp;
+
+my $stunnel = "stunnel";
+
+my $verbose=0; # set to 1 for debugging
+
+my $accept_port = 8991; # just our default, weird enough
+my $target_port = 8999; # default test http-server port
+
+my $stuncert;
+
+my $ver_major;
+my $ver_minor;
+my $fips_support;
+my $stunnel_version;
+my $tstunnel_windows;
+my $socketopt;
+my $cmd;
+
+my $pidfile; # stunnel pid file
+my $logfile; # stunnel log file
+my $loglevel = 5; # stunnel log level
+my $ipvnum = 4; # default IP version of stunneled server
+my $idnum = 1; # default stunneled server instance number
+my $proto = 'https'; # default secure server protocol
+my $conffile; # stunnel configuration file
+my $capath; # certificate chain PEM folder
+my $certfile; # certificate chain PEM file
+
+#***************************************************************************
+# stunnel requires full path specification for several files.
+#
+my $path = getcwd();
+my $srcdir = $path;
+my $logdir = $path .'/log';
+
+#***************************************************************************
+# Signal handler to remove our stunnel 4.00 and newer configuration file.
+#
+sub exit_signal_handler {
+ my $signame = shift;
+ local $!; # preserve errno
+ local $?; # preserve exit status
+ unlink($conffile) if($conffile && (-f $conffile));
+ exit;
+}
+
+#***************************************************************************
+# Process command line options
+#
+while(@ARGV) {
+ if($ARGV[0] eq '--verbose') {
+ $verbose = 1;
+ }
+ elsif($ARGV[0] eq '--proto') {
+ if($ARGV[1]) {
+ $proto = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--accept') {
+ if($ARGV[1]) {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $accept_port = $1;
+ shift @ARGV;
+ }
+ }
+ }
+ elsif($ARGV[0] eq '--connect') {
+ if($ARGV[1]) {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $target_port = $1;
+ shift @ARGV;
+ }
+ }
+ }
+ elsif($ARGV[0] eq '--stunnel') {
+ if($ARGV[1]) {
+ if($ARGV[1] =~ /^([\w\/]+)$/) {
+ $stunnel = $ARGV[1];
+ }
+ else {
+ $stunnel = "\"". $ARGV[1] ."\"";
+ }
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--srcdir') {
+ if($ARGV[1]) {
+ $srcdir = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--certfile') {
+ if($ARGV[1]) {
+ $stuncert = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--id') {
+ if($ARGV[1]) {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $idnum = $1 if($1 > 0);
+ shift @ARGV;
+ }
+ }
+ }
+ elsif($ARGV[0] eq '--ipv4') {
+ $ipvnum = 4;
+ }
+ elsif($ARGV[0] eq '--ipv6') {
+ $ipvnum = 6;
+ }
+ elsif($ARGV[0] eq '--pidfile') {
+ if($ARGV[1]) {
+ $pidfile = "$path/". $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--logfile') {
+ if($ARGV[1]) {
+ $logfile = "$path/". $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ else {
+ print STDERR "\nWarning: secureserver.pl unknown parameter:
$ARGV[0]\n";
+ }
+ shift @ARGV;
+}
+
+#***************************************************************************
+# Initialize command line option dependent variables
+#
+if(!$pidfile) {
+ $pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
+}
+if(!$logfile) {
+ $logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
+}
+
+$conffile = "$path/${proto}_stunnel.conf";
+
+$capath = abs_path($path);
+$certfile = "$srcdir/". ($stuncert?"certs/$stuncert":"stunnel.pem");
+$certfile = abs_path($certfile);
+
+my $ssltext = uc($proto) ." SSL/TLS:";
+
+#***************************************************************************
+# Find out version info for the given stunnel binary
+#
+foreach my $veropt (('-version', '-V')) {
+ foreach my $verstr (qx($stunnel $veropt 2>&1)) {
+ if($verstr =~ /^stunnel (\d+)\.(\d+) on /) {
+ $ver_major = $1;
+ $ver_minor = $2;
+ }
+ elsif($verstr =~ /^sslVersion.*fips *= *yes/) {
+ # the fips option causes an error if stunnel doesn't support it
+ $fips_support = 1;
+ last
+ }
+ }
+ last if($ver_major);
+}
+if((!$ver_major) || (!$ver_minor)) {
+ if(-x "$stunnel" && ! -d "$stunnel") {
+ print "$ssltext Unknown stunnel version\n";
+ }
+ else {
+ print "$ssltext No stunnel\n";
+ }
+ exit 1;
+}
+$stunnel_version = (100*$ver_major) + $ver_minor;
+
+#***************************************************************************
+# Verify minimum stunnel required version
+#
+if($stunnel_version < 310) {
+ print "$ssltext Unsupported stunnel version $ver_major.$ver_minor\n";
+ exit 1;
+}
+
+#***************************************************************************
+# Find out if we are running on Windows using the tstunnel binary
+#
+if($stunnel =~ /tstunnel(\.exe)?"?$/) {
+ $tstunnel_windows = 1;
+
+ # convert Cygwin/MinGW paths to Win32 format
+ $capath = pathhelp::sys_native_abs_path($capath);
+ $certfile = pathhelp::sys_native_abs_path($certfile);
+}
+
+#***************************************************************************
+# Build command to execute for stunnel 3.X versions
+#
+if($stunnel_version < 400) {
+ if($stunnel_version >= 319) {
+ $socketopt = "-O a:SO_REUSEADDR=1";
+ }
+ $cmd = "$stunnel -p $certfile -P $pidfile ";
+ $cmd .= "-d $accept_port -r $target_port -f -D $loglevel ";
+ $cmd .= ($socketopt) ? "$socketopt " : "";
+ $cmd .= ">$logfile 2>&1";
+ if($verbose) {
+ print uc($proto) ." server (stunnel $ver_major.$ver_minor)\n";
+ print "cmd: $cmd\n";
+ print "pem cert file: $certfile\n";
+ print "pid file: $pidfile\n";
+ print "log file: $logfile\n";
+ print "log level: $loglevel\n";
+ print "listen on port: $accept_port\n";
+ print "connect to port: $target_port\n";
+ }
+}
+
+#***************************************************************************
+# Build command to execute for stunnel 4.00 and newer
+#
+if($stunnel_version >= 400) {
+ $socketopt = "a:SO_REUSEADDR=1";
+ if(($stunnel_version >= 534) && $tstunnel_windows) {
+ # SO_EXCLUSIVEADDRUSE is on by default on Vista or newer,
+ # but does not work together with SO_REUSEADDR being on.
+ $socketopt .= "\nsocket = a:SO_EXCLUSIVEADDRUSE=0";
+ }
+ $cmd = "$stunnel $conffile ";
+ $cmd .= ">$logfile 2>&1";
+ # setup signal handler
+ $SIG{INT} = \&exit_signal_handler;
+ $SIG{TERM} = \&exit_signal_handler;
+ # stunnel configuration file
+ if(open(STUNCONF, ">$conffile")) {
+ print STUNCONF "CApath = $capath\n";
+ print STUNCONF "cert = $certfile\n";
+ print STUNCONF "debug = $loglevel\n";
+ print STUNCONF "socket = $socketopt\n";
+ if($fips_support) {
+ # disable fips in case OpenSSL doesn't support it
+ print STUNCONF "fips = no\n";
+ }
+ if(!$tstunnel_windows) {
+ # do not use Linux-specific options on Windows
+ print STUNCONF "output = $logfile\n";
+ print STUNCONF "pid = $pidfile\n";
+ print STUNCONF "foreground = yes\n";
+ }
+ print STUNCONF "\n";
+ print STUNCONF "[curltest]\n";
+ print STUNCONF "accept = $accept_port\n";
+ print STUNCONF "connect = $target_port\n";
+ if(!close(STUNCONF)) {
+ print "$ssltext Error closing file $conffile\n";
+ exit 1;
+ }
+ }
+ else {
+ print "$ssltext Error writing file $conffile\n";
+ exit 1;
+ }
+ if($verbose) {
+ print uc($proto) ." server (stunnel $ver_major.$ver_minor)\n";
+ print "cmd: $cmd\n";
+ print "CApath = $capath\n";
+ print "cert = $certfile\n";
+ print "debug = $loglevel\n";
+ print "socket = $socketopt\n";
+ if($fips_support) {
+ print "fips = no\n";
+ }
+ if(!$tstunnel_windows) {
+ print "pid = $pidfile\n";
+ print "output = $logfile\n";
+ print "foreground = yes\n";
+ }
+ print "\n";
+ print "[curltest]\n";
+ print "accept = $accept_port\n";
+ print "connect = $target_port\n";
+ }
+}
+
+#***************************************************************************
+# Set file permissions on certificate pem file.
+#
+chmod(0600, $certfile) if(-f $certfile);
+print STDERR "RUN: $cmd\n" if($verbose);
+
+#***************************************************************************
+# Run tstunnel on Windows.
+#
+if($tstunnel_windows) {
+ # Fake pidfile for tstunnel on Windows.
+ if(open(OUT, ">$pidfile")) {
+ print OUT $$ . "\n";
+ close(OUT);
+ }
+
+ # Put an "exec" in front of the command so that the child process
+ # keeps this child's process ID by being tied to the spawned shell.
+ exec("exec $cmd") || die "Can't exec() $cmd: $!";
+ # exec() will create a new process, but ties the existence of the
+ # new process to the parent waiting perl.exe and sh.exe processes.
+
+ # exec() should never return back here to this process. We protect
+ # ourselves by calling die() just in case something goes really bad.
+ die "error: exec() has returned";
+}
+
+#***************************************************************************
+# Run stunnel.
+#
+my $rc = system($cmd);
+
+$rc >>= 8;
+
+unlink($conffile) if($conffile && -f $conffile);
+
+exit $rc;
diff --cc tests/smbserver.py.in
index f752c17a2,000000000..a00ecae3b
mode 100755,000000..100755
--- a/tests/smbserver.py.in
+++ b/tests/smbserver.py.in
@@@ -1,393 -1,0 +1,395 @@@
+#!AWKPYTHON
+# -*- coding: utf-8 -*-
+#
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2017 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+"""Server for testing SMB"""
+
- from __future__ import (absolute_import, division, print_function)
++from __future__ import absolute_import, division, print_function
+# NOTE: the impacket configuration is not unicode_literals compatible!
++
+import argparse
++import logging
+import os
+import sys
- import logging
+import tempfile
++
++# Import our curl test data helper
++from util import ClosingFileHandler, TestData
++
+if sys.version_info.major >= 3:
+ import configparser
+else:
+ import ConfigParser as configparser
+
- # Import our curl test data helper
- import curl_test_data
-
+# impacket needs to be installed in the Python environment
+try:
+ import impacket
+except ImportError:
+ sys.stderr.write('Python package impacket needs to be installed!\n')
+ sys.stderr.write('Use pip or your package manager to install it.\n')
+ sys.exit(1)
- from impacket import smbserver as imp_smbserver
+from impacket import smb as imp_smb
- from impacket.nt_errors import (STATUS_ACCESS_DENIED, STATUS_SUCCESS,
- STATUS_NO_SUCH_FILE)
++from impacket import smbserver as imp_smbserver
++from impacket.nt_errors import (STATUS_ACCESS_DENIED, STATUS_NO_SUCH_FILE,
++ STATUS_SUCCESS)
+
+log = logging.getLogger(__name__)
+SERVER_MAGIC = "SERVER_MAGIC"
+TESTS_MAGIC = "TESTS_MAGIC"
+VERIFIED_REQ = "verifiedserver"
+VERIFIED_RSP = "WE ROOLZ: {pid}\n"
+
+
+def smbserver(options):
+ """Start up a TCP SMB server that serves forever
+
+ """
+ if options.pidfile:
+ pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
+ with open(options.pidfile, "w") as f:
+ f.write(str(pid))
+
+ # Here we write a mini config for the server
+ smb_config = configparser.ConfigParser()
+ smb_config.add_section("global")
+ smb_config.set("global", "server_name", "SERVICE")
+ smb_config.set("global", "server_os", "UNIX")
+ smb_config.set("global", "server_domain", "WORKGROUP")
+ smb_config.set("global", "log_file", "")
+ smb_config.set("global", "credentials_file", "")
+
+ # We need a share which allows us to test that the server is running
+ smb_config.add_section("SERVER")
+ smb_config.set("SERVER", "comment", "server function")
+ smb_config.set("SERVER", "read only", "yes")
+ smb_config.set("SERVER", "share type", "0")
+ smb_config.set("SERVER", "path", SERVER_MAGIC)
+
+ # Have a share for tests. These files will be autogenerated from the
+ # test input.
+ smb_config.add_section("TESTS")
+ smb_config.set("TESTS", "comment", "tests")
+ smb_config.set("TESTS", "read only", "yes")
+ smb_config.set("TESTS", "share type", "0")
+ smb_config.set("TESTS", "path", TESTS_MAGIC)
+
+ if not options.srcdir or not os.path.isdir(options.srcdir):
+ raise ScriptException("--srcdir is mandatory")
+
+ test_data_dir = os.path.join(options.srcdir, "data")
+
+ smb_server = TestSmbServer((options.host, options.port),
+ config_parser=smb_config,
+ test_data_directory=test_data_dir)
+ log.info("[SMB] setting up SMB server on port %s", options.port)
+ smb_server.processConfigFile()
+ smb_server.serve_forever()
+ return 0
+
+
+class TestSmbServer(imp_smbserver.SMBSERVER):
+ """
+ Test server for SMB which subclasses the impacket SMBSERVER and provides
+ test functionality.
+ """
+
+ def __init__(self,
+ address,
+ config_parser=None,
+ test_data_directory=None):
+ imp_smbserver.SMBSERVER.__init__(self,
+ address,
+ config_parser=config_parser)
+
+ # Set up a test data object so we can get test data later.
- self.ctd = curl_test_data.TestData(test_data_directory)
++ self.ctd = TestData(test_data_directory)
+
+ # Override smbComNtCreateAndX so we can pretend to have files which
+ # don't exist.
+ self.hookSmbCommand(imp_smb.SMB.SMB_COM_NT_CREATE_ANDX,
+ self.create_and_x)
+
+ def create_and_x(self, conn_id, smb_server, smb_command, recv_packet):
+ """
+ Our version of smbComNtCreateAndX looks for special test files and
+ fools the rest of the framework into opening them as if they were
+ normal files.
+ """
+ conn_data = smb_server.getConnectionData(conn_id)
+
+ # Wrap processing in a try block which allows us to throw SmbException
+ # to control the flow.
+ try:
+ ncax_parms = imp_smb.SMBNtCreateAndX_Parameters(
+ smb_command["Parameters"])
+
+ path = self.get_share_path(conn_data,
+ ncax_parms["RootFid"],
+ recv_packet["Tid"])
+ log.info("[SMB] Requested share path: %s", path)
+
+ disposition = ncax_parms["Disposition"]
+ log.debug("[SMB] Requested disposition: %s", disposition)
+
+ # Currently we only support reading files.
+ if disposition != imp_smb.FILE_OPEN:
+ raise SmbException(STATUS_ACCESS_DENIED,
+ "Only support reading files")
+
+ # Check to see if the path we were given is actually a
+ # magic path which needs generating on the fly.
+ if path not in [SERVER_MAGIC, TESTS_MAGIC]:
+ # Pass the command onto the original handler.
+ return imp_smbserver.SMBCommands.smbComNtCreateAndX(conn_id,
+
smb_server,
+
smb_command,
+
recv_packet)
+
+ flags2 = recv_packet["Flags2"]
+ ncax_data = imp_smb.SMBNtCreateAndX_Data(flags=flags2,
+ data=smb_command[
+ "Data"])
+ requested_file = imp_smbserver.decodeSMBString(
+ flags2,
+ ncax_data["FileName"])
+ log.debug("[SMB] User requested file '%s'", requested_file)
+
+ if path == SERVER_MAGIC:
+ fid, full_path = self.get_server_path(requested_file)
+ else:
+ assert (path == TESTS_MAGIC)
+ fid, full_path = self.get_test_path(requested_file)
+
+ resp_parms = imp_smb.SMBNtCreateAndXResponse_Parameters()
+ resp_data = ""
+
+ # Simple way to generate a fid
+ if len(conn_data["OpenedFiles"]) == 0:
+ fakefid = 1
+ else:
+ fakefid = conn_data["OpenedFiles"].keys()[-1] + 1
+ resp_parms["Fid"] = fakefid
+ resp_parms["CreateAction"] = disposition
+
+ if os.path.isdir(path):
+ resp_parms[
+ "FileAttributes"] = imp_smb.SMB_FILE_ATTRIBUTE_DIRECTORY
+ resp_parms["IsDirectory"] = 1
+ else:
+ resp_parms["IsDirectory"] = 0
+ resp_parms["FileAttributes"] = ncax_parms["FileAttributes"]
+
+ # Get this file's information
+ resp_info, error_code = imp_smbserver.queryPathInformation(
+ "", full_path, level=imp_smb.SMB_QUERY_FILE_ALL_INFO)
+
+ if error_code != STATUS_SUCCESS:
+ raise SmbException(error_code, "Failed to query path info")
+
+ resp_parms["CreateTime"] = resp_info["CreationTime"]
+ resp_parms["LastAccessTime"] = resp_info[
+ "LastAccessTime"]
+ resp_parms["LastWriteTime"] = resp_info["LastWriteTime"]
+ resp_parms["LastChangeTime"] = resp_info[
+ "LastChangeTime"]
+ resp_parms["FileAttributes"] = resp_info[
+ "ExtFileAttributes"]
+ resp_parms["AllocationSize"] = resp_info[
+ "AllocationSize"]
+ resp_parms["EndOfFile"] = resp_info["EndOfFile"]
+
+ # Let's store the fid for the connection
+ # smbServer.log("Create file %s, mode:0x%x" % (pathName, mode))
+ conn_data["OpenedFiles"][fakefid] = {}
+ conn_data["OpenedFiles"][fakefid]["FileHandle"] = fid
+ conn_data["OpenedFiles"][fakefid]["FileName"] = path
+ conn_data["OpenedFiles"][fakefid]["DeleteOnClose"] = False
+
+ except SmbException as s:
+ log.debug("[SMB] SmbException hit: %s", s)
+ error_code = s.error_code
+ resp_parms = ""
+ resp_data = ""
+
+ resp_cmd = imp_smb.SMBCommand(imp_smb.SMB.SMB_COM_NT_CREATE_ANDX)
+ resp_cmd["Parameters"] = resp_parms
+ resp_cmd["Data"] = resp_data
+ smb_server.setConnectionData(conn_id, conn_data)
+
+ return [resp_cmd], None, error_code
+
+ def get_share_path(self, conn_data, root_fid, tid):
+ conn_shares = conn_data["ConnectedShares"]
+
+ if tid in conn_shares:
+ if root_fid > 0:
+ # If we have a rootFid, the path is relative to that fid
+ path = conn_data["OpenedFiles"][root_fid]["FileName"]
+ log.debug("RootFid present %s!" % path)
+ else:
+ if "path" in conn_shares[tid]:
+ path = conn_shares[tid]["path"]
+ else:
+ raise SmbException(STATUS_ACCESS_DENIED,
+ "Connection share had no path")
+ else:
+ raise SmbException(imp_smbserver.STATUS_SMB_BAD_TID,
+ "TID was invalid")
+
+ return path
+
+ def get_server_path(self, requested_filename):
+ log.debug("[SMB] Get server path '%s'", requested_filename)
+
+ if requested_filename not in [VERIFIED_REQ]:
+ raise SmbException(STATUS_NO_SUCH_FILE, "Couldn't find the file")
+
+ fid, filename = tempfile.mkstemp()
+ log.debug("[SMB] Created %s (%d) for storing '%s'",
+ filename, fid, requested_filename)
+
+ contents = ""
+
+ if requested_filename == VERIFIED_REQ:
+ log.debug("[SMB] Verifying server is alive")
+ pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
+ contents = VERIFIED_RSP.format(pid=pid).encode('utf-8')
+
+ self.write_to_fid(fid, contents)
+ return fid, filename
+
+ def write_to_fid(self, fid, contents):
+ # Write the contents to file descriptor
+ os.write(fid, contents)
+ os.fsync(fid)
+
+ # Rewind the file to the beginning so a read gets us the contents
+ os.lseek(fid, 0, os.SEEK_SET)
+
+ def get_test_path(self, requested_filename):
+ log.info("[SMB] Get reply data from 'test%s'", requested_filename)
+
+ fid, filename = tempfile.mkstemp()
+ log.debug("[SMB] Created %s (%d) for storing test '%s'",
+ filename, fid, requested_filename)
+
+ try:
+ contents =
self.ctd.get_test_data(requested_filename).encode('utf-8')
+ self.write_to_fid(fid, contents)
+ return fid, filename
+
+ except Exception:
+ log.exception("Failed to make test file")
+ raise SmbException(STATUS_NO_SUCH_FILE, "Failed to make test
file")
+
+
+class SmbException(Exception):
+ def __init__(self, error_code, error_message):
+ super(SmbException, self).__init__(error_message)
+ self.error_code = error_code
+
+
+class ScriptRC(object):
+ """Enum for script return codes"""
+ SUCCESS = 0
+ FAILURE = 1
+ EXCEPTION = 2
+
+
+class ScriptException(Exception):
+ pass
+
+
+def get_options():
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument("--port", action="store", default=9017,
+ type=int, help="port to listen on")
+ parser.add_argument("--host", action="store", default="127.0.0.1",
+ help="host to listen on")
+ parser.add_argument("--verbose", action="store", type=int, default=0,
+ help="verbose output")
+ parser.add_argument("--pidfile", action="store",
+ help="file name for the PID")
+ parser.add_argument("--logfile", action="store",
+ help="file name for the log")
+ parser.add_argument("--srcdir", action="store", help="test directory")
+ parser.add_argument("--id", action="store", help="server ID")
+ parser.add_argument("--ipv4", action="store_true", default=0,
+ help="IPv4 flag")
+
+ return parser.parse_args()
+
+
+def setup_logging(options):
+ """
+ Set up logging from the command line options
+ """
+ root_logger = logging.getLogger()
+ add_stdout = False
+
+ formatter = logging.Formatter("%(asctime)s %(levelname)-5.5s %(message)s")
+
+ # Write out to a logfile
+ if options.logfile:
- handler = logging.FileHandler(options.logfile, mode="w")
++ handler = ClosingFileHandler(options.logfile)
+ handler.setFormatter(formatter)
+ handler.setLevel(logging.DEBUG)
+ root_logger.addHandler(handler)
+ else:
+ # The logfile wasn't specified. Add a stdout logger.
+ add_stdout = True
+
+ if options.verbose:
+ # Add a stdout logger as well in verbose mode
+ root_logger.setLevel(logging.DEBUG)
+ add_stdout = True
+ else:
+ root_logger.setLevel(logging.INFO)
+
+ if add_stdout:
+ stdout_handler = logging.StreamHandler(sys.stdout)
+ stdout_handler.setFormatter(formatter)
+ stdout_handler.setLevel(logging.DEBUG)
+ root_logger.addHandler(stdout_handler)
+
+
+if __name__ == '__main__':
+ # Get the options from the user.
+ options = get_options()
+
+ # Setup logging using the user options
+ setup_logging(options)
+
+ # Run main script.
+ try:
+ rc = smbserver(options)
+ except Exception as e:
+ log.exception(e)
+ rc = ScriptRC.EXCEPTION
+
+ log.info("[SMB] Returning %d", rc)
+ sys.exit(rc)
diff --cc tests/sshserver.pl.in
index fd98d48cc,000000000..4b3d7eb3c
mode 100644,000000..100644
--- a/tests/sshserver.pl.in
+++ b/tests/sshserver.pl.in
@@@ -1,1159 -1,0 +1,1159 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+# Starts sshd for use in the SCP and SFTP curl test harness tests.
+# Also creates the ssh configuration files needed for these tests.
+
+use strict;
+use warnings;
+use Cwd;
+use Cwd 'abs_path';
+use Digest::MD5;
+use Digest::MD5 'md5_hex';
+use MIME::Base64;
+
+#***************************************************************************
+# Variables and subs imported from sshhelp module
+#
+use sshhelp qw(
+ $sshdexe
+ $sshexe
+ $sftpsrvexe
+ $sftpexe
+ $sshkeygenexe
+ $sshdconfig
+ $sshconfig
+ $sftpconfig
+ $knownhosts
+ $sshdlog
+ $sshlog
+ $sftplog
+ $sftpcmds
+ $hstprvkeyf
+ $hstpubkeyf
+ $hstpubmd5f
+ $cliprvkeyf
+ $clipubkeyf
+ display_sshdconfig
+ display_sshconfig
+ display_sftpconfig
+ display_sshdlog
+ display_sshlog
+ display_sftplog
+ dump_array
+ find_sshd
+ find_ssh
+ find_sftpsrv
+ find_sftp
+ find_sshkeygen
+ logmsg
+ sshversioninfo
+ );
+
+#***************************************************************************
+# Subs imported from serverhelp module
+#
+use serverhelp qw(
+ server_pidfilename
+ server_logfilename
+ );
+
+use pathhelp;
+
+#***************************************************************************
+
+my $verbose = 0; # set to 1 for debugging
+my $debugprotocol = 0; # set to 1 for protocol debugging
+my $port = 8999; # our default SCP/SFTP server port
+my $listenaddr = '127.0.0.1'; # default address on which to listen
+my $ipvnum = 4; # default IP version of listener address
+my $idnum = 1; # default ssh daemon instance number
+my $proto = 'ssh'; # protocol the ssh daemon speaks
+my $path = getcwd(); # current working directory
+my $logdir = $path .'/log'; # directory for log files
+my $username = $ENV{USER}; # default user
+my $pidfile; # ssh daemon pid file
+my $identity = 'curl_client_key'; # default identity file
+
+my $error;
+my @cfgarr;
+
+
+#***************************************************************************
+# Parse command line options
+#
+while(@ARGV) {
+ if($ARGV[0] eq '--verbose') {
+ $verbose = 1;
+ }
+ elsif($ARGV[0] eq '--debugprotocol') {
+ $verbose = 1;
+ $debugprotocol = 1;
+ }
+ elsif($ARGV[0] eq '--user') {
+ if($ARGV[1]) {
+ $username = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--id') {
+ if($ARGV[1]) {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $idnum = $1 if($1 > 0);
+ shift @ARGV;
+ }
+ }
+ }
+ elsif($ARGV[0] eq '--ipv4') {
+ $ipvnum = 4;
+ $listenaddr = '127.0.0.1' if($listenaddr eq '::1');
+ }
+ elsif($ARGV[0] eq '--ipv6') {
+ $ipvnum = 6;
+ $listenaddr = '::1' if($listenaddr eq '127.0.0.1');
+ }
+ elsif($ARGV[0] eq '--addr') {
+ if($ARGV[1]) {
+ my $tmpstr = $ARGV[1];
+ if($tmpstr =~ /^(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)$/)
{
+ $listenaddr = "$1.$2.$3.$4" if($ipvnum == 4);
+ shift @ARGV;
+ }
+ elsif($ipvnum == 6) {
+ $listenaddr = $tmpstr;
+ $listenaddr =~ s/^\[(.*)\]$/$1/;
+ shift @ARGV;
+ }
+ }
+ }
+ elsif($ARGV[0] eq '--pidfile') {
+ if($ARGV[1]) {
+ $pidfile = "$path/". $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--sshport') {
+ if($ARGV[1]) {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $port = $1;
+ shift @ARGV;
+ }
+ }
+ }
+ else {
+ print STDERR "\nWarning: sshserver.pl unknown parameter: $ARGV[0]\n";
+ }
+ shift @ARGV;
+}
+
+
+#***************************************************************************
+# Default ssh daemon pid file name
+#
+if(!$pidfile) {
+ $pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
+}
+
+
+#***************************************************************************
+# ssh and sftp server log file names
+#
+$sshdlog = server_logfilename($logdir, 'ssh', $ipvnum, $idnum);
+$sftplog = server_logfilename($logdir, 'sftp', $ipvnum, $idnum);
+
+
+#***************************************************************************
+# Logging level for ssh server and client
+#
+my $loglevel = $debugprotocol?'DEBUG3':'DEBUG2';
+
+
+#***************************************************************************
+# Validate username
+#
+if(!$username) {
+ $error = 'Will not run ssh server without a user name';
+}
+elsif($username eq 'root') {
+ $error = 'Will not run ssh server as root to mitigate security risks';
+}
+if($error) {
+ logmsg $error;
+ exit 1;
+}
+
+
+#***************************************************************************
+# Find out ssh daemon canonical file name
+#
+my $sshd = find_sshd();
+if(!$sshd) {
+ logmsg "cannot find $sshdexe";
+ exit 1;
+}
+
+
+#***************************************************************************
+# Find out ssh daemon version info
+#
+my ($sshdid, $sshdvernum, $sshdverstr, $sshderror) = sshversioninfo($sshd);
+if(!$sshdid) {
+ # Not an OpenSSH or SunSSH ssh daemon
+ logmsg $sshderror if($verbose);
+ logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
+ exit 1;
+}
+logmsg "ssh server found $sshd is $sshdverstr" if($verbose);
+
+
+#***************************************************************************
+# ssh daemon command line options we might use and version support
+#
+# -e: log stderr : OpenSSH 2.9.0 and later
+# -f: sshd config file : OpenSSH 1.2.1 and later
+# -D: no daemon forking : OpenSSH 2.5.0 and later
+# -o: command-line option : OpenSSH 3.1.0 and later
+# -t: test config file : OpenSSH 2.9.9 and later
+# -?: sshd version info : OpenSSH 1.2.1 and later
+#
+# -e: log stderr : SunSSH 1.0.0 and later
+# -f: sshd config file : SunSSH 1.0.0 and later
+# -D: no daemon forking : SunSSH 1.0.0 and later
+# -o: command-line option : SunSSH 1.0.0 and later
+# -t: test config file : SunSSH 1.0.0 and later
+# -?: sshd version info : SunSSH 1.0.0 and later
+
+
+#***************************************************************************
+# Verify minimum ssh daemon version
+#
+if((($sshdid =~ /OpenSSH/) && ($sshdvernum < 299)) ||
+ (($sshdid =~ /SunSSH/) && ($sshdvernum < 100))) {
+ logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
+ exit 1;
+}
+
+
+#***************************************************************************
+# Find out sftp server plugin canonical file name
+#
+my $sftpsrv = find_sftpsrv();
+if(!$sftpsrv) {
+ logmsg "cannot find $sftpsrvexe";
+ exit 1;
+}
+logmsg "sftp server plugin found $sftpsrv" if($verbose);
+
+
+#***************************************************************************
+# Find out sftp client canonical file name
+#
+my $sftp = find_sftp();
+if(!$sftp) {
+ logmsg "cannot find $sftpexe";
+ exit 1;
+}
+logmsg "sftp client found $sftp" if($verbose);
+
+
+#***************************************************************************
+# Find out ssh keygen canonical file name
+#
+my $sshkeygen = find_sshkeygen();
+if(!$sshkeygen) {
+ logmsg "cannot find $sshkeygenexe";
+ exit 1;
+}
+logmsg "ssh keygen found $sshkeygen" if($verbose);
+
+
+#***************************************************************************
+# Find out ssh client canonical file name
+#
+my $ssh = find_ssh();
+if(!$ssh) {
+ logmsg "cannot find $sshexe";
+ exit 1;
+}
+
+
+#***************************************************************************
+# Find out ssh client version info
+#
+my ($sshid, $sshvernum, $sshverstr, $ssherror) = sshversioninfo($ssh);
+if(!$sshid) {
+ # Not an OpenSSH or SunSSH ssh client
+ logmsg $ssherror if($verbose);
+ logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
+ exit 1;
+}
+logmsg "ssh client found $ssh is $sshverstr" if($verbose);
+
+
+#***************************************************************************
+# ssh client command line options we might use and version support
+#
+# -D: dynamic app port forwarding : OpenSSH 2.9.9 and later
+# -F: ssh config file : OpenSSH 2.9.9 and later
+# -N: no shell/command : OpenSSH 2.1.0 and later
+# -p: connection port : OpenSSH 1.2.1 and later
+# -v: verbose messages : OpenSSH 1.2.1 and later
+# -vv: increase verbosity : OpenSSH 2.3.0 and later
+# -V: ssh version info : OpenSSH 1.2.1 and later
+#
+# -D: dynamic app port forwarding : SunSSH 1.0.0 and later
+# -F: ssh config file : SunSSH 1.0.0 and later
+# -N: no shell/command : SunSSH 1.0.0 and later
+# -p: connection port : SunSSH 1.0.0 and later
+# -v: verbose messages : SunSSH 1.0.0 and later
+# -vv: increase verbosity : SunSSH 1.0.0 and later
+# -V: ssh version info : SunSSH 1.0.0 and later
+
+
+#***************************************************************************
+# Verify minimum ssh client version
+#
+if((($sshid =~ /OpenSSH/) && ($sshvernum < 299)) ||
+ (($sshid =~ /SunSSH/) && ($sshvernum < 100))) {
+ logmsg 'SCP and SFTP tests require OpenSSH 2.9.9 or later';
+ exit 1;
+}
+
+
+#***************************************************************************
+# ssh keygen command line options we actually use and version support
+#
+# -C: identity comment : OpenSSH 1.2.1 and later
+# -f: key filename : OpenSSH 1.2.1 and later
+# -N: new passphrase : OpenSSH 1.2.1 and later
+# -q: quiet keygen : OpenSSH 1.2.1 and later
+# -t: key type : OpenSSH 2.5.0 and later
+#
+# -C: identity comment : SunSSH 1.0.0 and later
+# -f: key filename : SunSSH 1.0.0 and later
+# -N: new passphrase : SunSSH 1.0.0 and later
+# -q: quiet keygen : SunSSH 1.0.0 and later
+# -t: key type : SunSSH 1.0.0 and later
+
+
+#***************************************************************************
+# Generate host and client key files for curl's tests
+#
+if((! -e $hstprvkeyf) || (! -s $hstprvkeyf) ||
+ (! -e $hstpubkeyf) || (! -s $hstpubkeyf) ||
+ (! -e $hstpubmd5f) || (! -s $hstpubmd5f) ||
+ (! -e $cliprvkeyf) || (! -s $cliprvkeyf) ||
+ (! -e $clipubkeyf) || (! -s $clipubkeyf)) {
+ # Make sure all files are gone so ssh-keygen doesn't complain
+ unlink($hstprvkeyf, $hstpubkeyf, $hstpubmd5f, $cliprvkeyf, $clipubkeyf);
+ logmsg 'generating host keys...' if($verbose);
+ if(system "\"$sshkeygen\" -q -t rsa -f $hstprvkeyf -C 'curl test server'
-N ''") {
+ logmsg 'Could not generate host key';
+ exit 1;
+ }
+ logmsg 'generating client keys...' if($verbose);
+ if(system "\"$sshkeygen\" -q -t rsa -f $cliprvkeyf -C 'curl test client'
-N ''") {
+ logmsg 'Could not generate client key';
+ exit 1;
+ }
+ # Make sure that permissions are restricted so openssh doesn't complain
+ system "chmod 600 $hstprvkeyf";
+ system "chmod 600 $cliprvkeyf";
+ # Save md5 hash of public host key
+ open(RSAKEYFILE, "<$hstpubkeyf");
+ my @rsahostkey = do { local $/ = ' '; <RSAKEYFILE> };
+ close(RSAKEYFILE);
+ if(!$rsahostkey[1]) {
+ logmsg 'Failed parsing base64 encoded RSA host key';
+ exit 1;
+ }
+ open(PUBMD5FILE, ">$hstpubmd5f");
+ print PUBMD5FILE md5_hex(decode_base64($rsahostkey[1]));
+ close(PUBMD5FILE);
+ if((! -e $hstpubmd5f) || (! -s $hstpubmd5f)) {
+ logmsg 'Failed writing md5 hash of RSA host key';
+ exit 1;
+ }
+}
+
+
+#***************************************************************************
+# Convert paths for curl's tests running on Windows with Cygwin/Msys OpenSSH
+#
+my $clipubkeyf_config = abs_path("$path/$clipubkeyf");
+my $hstprvkeyf_config = abs_path("$path/$hstprvkeyf");
+my $pidfile_config = $pidfile;
+my $sftpsrv_config = $sftpsrv;
+
+if (pathhelp::os_is_win()) {
+ # Ensure to use MinGW/Cygwin paths
+ $clipubkeyf_config = pathhelp::build_sys_abs_path($clipubkeyf_config);
+ $hstprvkeyf_config = pathhelp::build_sys_abs_path($hstprvkeyf_config);
+ $pidfile_config = pathhelp::build_sys_abs_path($pidfile_config);
+ $sftpsrv_config = "internal-sftp";
+}
+if ($sshdid =~ /OpenSSH-Windows/) {
+ # Ensure to use native Windows paths with OpenSSH for Windows
+ $clipubkeyf_config = pathhelp::sys_native_abs_path($clipubkeyf);
+ $hstprvkeyf_config = pathhelp::sys_native_abs_path($hstprvkeyf);
+ $pidfile_config = pathhelp::sys_native_abs_path($pidfile);
+ $sftpsrv_config = pathhelp::sys_native_abs_path($sftpsrv);
+
+ $sshdconfig = pathhelp::sys_native_abs_path($sshdconfig);
+ $sshconfig = pathhelp::sys_native_abs_path($sshconfig);
+ $sftpconfig = pathhelp::sys_native_abs_path($sftpconfig);
+}
+
+#***************************************************************************
+# ssh daemon configuration file options we might use and version support
+#
+# AFSTokenPassing : OpenSSH 1.2.1 and later [1]
+# AcceptEnv : OpenSSH 3.9.0 and later
+# AddressFamily : OpenSSH 4.0.0 and later
+# AllowGroups : OpenSSH 1.2.1 and later
+# AllowTcpForwarding : OpenSSH 2.3.0 and later
+# AllowUsers : OpenSSH 1.2.1 and later
+# AuthorizedKeysFile : OpenSSH 2.9.9 and later
+# AuthorizedKeysFile2 : OpenSSH 2.9.9 and later
+# Banner : OpenSSH 2.5.0 and later
+# ChallengeResponseAuthentication : OpenSSH 2.5.0 and later
+# Ciphers : OpenSSH 2.1.0 and later [3]
+# ClientAliveCountMax : OpenSSH 2.9.0 and later
+# ClientAliveInterval : OpenSSH 2.9.0 and later
+# Compression : OpenSSH 3.3.0 and later
+# DenyGroups : OpenSSH 1.2.1 and later
+# DenyUsers : OpenSSH 1.2.1 and later
+# ForceCommand : OpenSSH 4.4.0 and later [3]
+# GatewayPorts : OpenSSH 2.1.0 and later
+# GSSAPIAuthentication : OpenSSH 3.7.0 and later [1]
+# GSSAPICleanupCredentials : OpenSSH 3.8.0 and later [1]
+# GSSAPIKeyExchange : SunSSH 1.0.0 and later [1]
+# GSSAPIStoreDelegatedCredentials : SunSSH 1.0.0 and later [1]
+# GSSCleanupCreds : SunSSH 1.0.0 and later [1]
+# GSSUseSessionCredCache : SunSSH 1.0.0 and later [1]
+# HostbasedAuthentication : OpenSSH 2.9.0 and later
+# HostbasedUsesNameFromPacketOnly : OpenSSH 2.9.0 and later
+# HostKey : OpenSSH 1.2.1 and later
+# IgnoreRhosts : OpenSSH 1.2.1 and later
+# IgnoreUserKnownHosts : OpenSSH 1.2.1 and later
+# KbdInteractiveAuthentication : OpenSSH 2.3.0 and later
+# KeepAlive : OpenSSH 1.2.1 and later
+# KerberosAuthentication : OpenSSH 1.2.1 and later [1]
+# KerberosGetAFSToken : OpenSSH 3.8.0 and later [1]
+# KerberosOrLocalPasswd : OpenSSH 1.2.1 and later [1]
+# KerberosTgtPassing : OpenSSH 1.2.1 and later [1]
+# KerberosTicketCleanup : OpenSSH 1.2.1 and later [1]
+# KeyRegenerationInterval : OpenSSH 1.2.1 and later
+# ListenAddress : OpenSSH 1.2.1 and later
+# LoginGraceTime : OpenSSH 1.2.1 and later
+# LogLevel : OpenSSH 1.2.1 and later
+# LookupClientHostnames : SunSSH 1.0.0 and later
+# MACs : OpenSSH 2.5.0 and later [3]
+# Match : OpenSSH 4.4.0 and later [3]
+# MaxAuthTries : OpenSSH 3.9.0 and later
+# MaxStartups : OpenSSH 2.2.0 and later
+# PAMAuthenticationViaKbdInt : OpenSSH 2.9.0 and later [2]
+# PasswordAuthentication : OpenSSH 1.2.1 and later
+# PermitEmptyPasswords : OpenSSH 1.2.1 and later
+# PermitOpen : OpenSSH 4.4.0 and later [3]
+# PermitRootLogin : OpenSSH 1.2.1 and later
+# PermitTunnel : OpenSSH 4.3.0 and later
+# PermitUserEnvironment : OpenSSH 3.5.0 and later
+# PidFile : OpenSSH 2.1.0 and later
+# Port : OpenSSH 1.2.1 and later
+# PrintLastLog : OpenSSH 2.9.0 and later
+# PrintMotd : OpenSSH 1.2.1 and later
+# Protocol : OpenSSH 2.1.0 and later
+# PubkeyAuthentication : OpenSSH 2.5.0 and later
+# RhostsAuthentication : OpenSSH 1.2.1 and later
+# RhostsRSAAuthentication : OpenSSH 1.2.1 and later
+# RSAAuthentication : OpenSSH 1.2.1 and later
+# ServerKeyBits : OpenSSH 1.2.1 and later
+# SkeyAuthentication : OpenSSH 1.2.1 and later [1]
+# StrictModes : OpenSSH 1.2.1 and later
+# Subsystem : OpenSSH 2.2.0 and later
+# SyslogFacility : OpenSSH 1.2.1 and later
+# TCPKeepAlive : OpenSSH 3.8.0 and later
+# UseDNS : OpenSSH 3.7.0 and later
+# UseLogin : OpenSSH 1.2.1 and later
+# UsePAM : OpenSSH 3.7.0 and later [1][2]
+# UsePrivilegeSeparation : OpenSSH 3.2.2 and later
+# VerifyReverseMapping : OpenSSH 3.1.0 and later
+# X11DisplayOffset : OpenSSH 1.2.1 and later [3]
+# X11Forwarding : OpenSSH 1.2.1 and later
+# X11UseLocalhost : OpenSSH 3.1.0 and later
+# XAuthLocation : OpenSSH 2.1.1 and later [3]
+#
+# [1] Option only available if activated at compile time
+# [2] Option specific for portable versions
+# [3] Option not used in our ssh server config file
+
+
+#***************************************************************************
+# Initialize sshd config with options actually supported in OpenSSH 2.9.9
+#
+logmsg 'generating ssh server config file...' if($verbose);
+@cfgarr = ();
+push @cfgarr, '# This is a generated file. Do not edit.';
+push @cfgarr, "# $sshdverstr sshd configuration file for curl testing";
+push @cfgarr, '#';
+
+# AllowUsers and DenyUsers options should use lowercase on Windows
+# and do not support quotes around values for some unknown reason.
+if ($sshdid =~ /OpenSSH-Windows/) {
+ my $username_lc = lc $username;
+ if (exists $ENV{USERDOMAIN}) {
+ my $userdomain_lc = lc $ENV{USERDOMAIN};
+ $username_lc = "$userdomain_lc\\$username_lc";
+ }
+ $username_lc =~ s/ /\?/g; # replace space with ?
+ push @cfgarr, "DenyUsers !$username_lc";
+ push @cfgarr, "AllowUsers $username_lc";
+} else {
+ push @cfgarr, "DenyUsers !$username";
+ push @cfgarr, "AllowUsers $username";
+}
+
+push @cfgarr, 'DenyGroups';
+push @cfgarr, 'AllowGroups';
+push @cfgarr, '#';
+push @cfgarr, "AuthorizedKeysFile $clipubkeyf_config";
+push @cfgarr, "AuthorizedKeysFile2 $clipubkeyf_config";
+push @cfgarr, "HostKey $hstprvkeyf_config";
+if ($sshdid !~ /OpenSSH-Windows/) {
+ push @cfgarr, "PidFile $pidfile_config";
+}
+push @cfgarr, '#';
+push @cfgarr, "Port $port";
+push @cfgarr, "ListenAddress $listenaddr";
+push @cfgarr, 'Protocol 2';
+push @cfgarr, '#';
+push @cfgarr, 'AllowTcpForwarding yes';
+push @cfgarr, 'Banner none';
+push @cfgarr, 'ChallengeResponseAuthentication no';
+push @cfgarr, 'ClientAliveCountMax 3';
+push @cfgarr, 'ClientAliveInterval 0';
+push @cfgarr, 'GatewayPorts no';
+push @cfgarr, 'HostbasedAuthentication no';
+push @cfgarr, 'HostbasedUsesNameFromPacketOnly no';
+push @cfgarr, 'IgnoreRhosts yes';
+push @cfgarr, 'IgnoreUserKnownHosts yes';
+push @cfgarr, 'KeyRegenerationInterval 0';
+push @cfgarr, 'LoginGraceTime 30';
+push @cfgarr, "LogLevel $loglevel";
+push @cfgarr, 'MaxStartups 5';
+push @cfgarr, 'PasswordAuthentication no';
+push @cfgarr, 'PermitEmptyPasswords no';
+push @cfgarr, 'PermitRootLogin no';
+push @cfgarr, 'PrintLastLog no';
+push @cfgarr, 'PrintMotd no';
+push @cfgarr, 'PubkeyAuthentication yes';
+push @cfgarr, 'RhostsRSAAuthentication no';
+push @cfgarr, 'RSAAuthentication no';
+push @cfgarr, 'ServerKeyBits 768';
+push @cfgarr, 'StrictModes no';
+push @cfgarr, "Subsystem sftp \"$sftpsrv_config\"";
+push @cfgarr, 'SyslogFacility AUTH';
+push @cfgarr, 'UseLogin no';
+push @cfgarr, 'X11Forwarding no';
+push @cfgarr, '#';
+
+
+#***************************************************************************
+# Write out initial sshd configuration file for curl's tests
+#
+$error = dump_array($sshdconfig, @cfgarr);
+if($error) {
+ logmsg $error;
+ exit 1;
+}
+
+
+#***************************************************************************
+# Verifies at run time if sshd supports a given configuration file option
+#
+sub sshd_supports_opt {
+ my ($option, $value) = @_;
+ my $err;
+ #
+ if((($sshdid =~ /OpenSSH/) && ($sshdvernum >= 310)) ||
+ ($sshdid =~ /SunSSH/)) {
+ # ssh daemon supports command line options -t -f and -o
+ $err = grep /((Unsupported)|(Bad configuration)|(Deprecated))
option.*$option/,
+ qx("$sshd" -t -f $sshdconfig -o "$option=$value" 2>&1);
+ return !$err;
+ }
+ if(($sshdid =~ /OpenSSH/) && ($sshdvernum >= 299)) {
+ # ssh daemon supports command line options -t and -f
+ $err = dump_array($sshdconfig, (@cfgarr, "$option $value"));
+ if($err) {
+ logmsg $err;
+ return 0;
+ }
+ $err = grep /((Unsupported)|(Bad configuration)|(Deprecated))
option.*$option/,
+ qx("$sshd" -t -f $sshdconfig 2>&1);
+ unlink $sshdconfig;
+ return !$err;
+ }
+ return 0;
+}
+
+
+#***************************************************************************
+# Kerberos Authentication support may have not been built into sshd
+#
+if(sshd_supports_opt('KerberosAuthentication','no')) {
+ push @cfgarr, 'KerberosAuthentication no';
+}
+if(sshd_supports_opt('KerberosGetAFSToken','no')) {
+ push @cfgarr, 'KerberosGetAFSToken no';
+}
+if(sshd_supports_opt('KerberosOrLocalPasswd','no')) {
+ push @cfgarr, 'KerberosOrLocalPasswd no';
+}
+if(sshd_supports_opt('KerberosTgtPassing','no')) {
+ push @cfgarr, 'KerberosTgtPassing no';
+}
+if(sshd_supports_opt('KerberosTicketCleanup','yes')) {
+ push @cfgarr, 'KerberosTicketCleanup yes';
+}
+
+
+#***************************************************************************
+# Andrew File System support may have not been built into sshd
+#
+if(sshd_supports_opt('AFSTokenPassing','no')) {
+ push @cfgarr, 'AFSTokenPassing no';
+}
+
+
+#***************************************************************************
+# S/Key authentication support may have not been built into sshd
+#
+if(sshd_supports_opt('SkeyAuthentication','no')) {
+ push @cfgarr, 'SkeyAuthentication no';
+}
+
+
+#***************************************************************************
+# GSSAPI Authentication support may have not been built into sshd
+#
+my $sshd_builtwith_GSSAPI;
+if(sshd_supports_opt('GSSAPIAuthentication','no')) {
+ push @cfgarr, 'GSSAPIAuthentication no';
+ $sshd_builtwith_GSSAPI = 1;
+}
+if(sshd_supports_opt('GSSAPICleanupCredentials','yes')) {
+ push @cfgarr, 'GSSAPICleanupCredentials yes';
+}
+if(sshd_supports_opt('GSSAPIKeyExchange','no')) {
+ push @cfgarr, 'GSSAPIKeyExchange no';
+}
+if(sshd_supports_opt('GSSAPIStoreDelegatedCredentials','no')) {
+ push @cfgarr, 'GSSAPIStoreDelegatedCredentials no';
+}
+if(sshd_supports_opt('GSSCleanupCreds','yes')) {
+ push @cfgarr, 'GSSCleanupCreds yes';
+}
+if(sshd_supports_opt('GSSUseSessionCredCache','no')) {
+ push @cfgarr, 'GSSUseSessionCredCache no';
+}
+push @cfgarr, '#';
+
+
+#***************************************************************************
+# Options that might be supported or not in sshd OpenSSH 2.9.9 and later
+#
+if(sshd_supports_opt('AcceptEnv','')) {
+ push @cfgarr, 'AcceptEnv';
+}
+if(sshd_supports_opt('AddressFamily','any')) {
+ # Address family must be specified before ListenAddress
+ splice @cfgarr, 14, 0, 'AddressFamily any';
+}
+if(sshd_supports_opt('Compression','no')) {
+ push @cfgarr, 'Compression no';
+}
+if(sshd_supports_opt('KbdInteractiveAuthentication','no')) {
+ push @cfgarr, 'KbdInteractiveAuthentication no';
+}
+if(sshd_supports_opt('KeepAlive','no')) {
+ push @cfgarr, 'KeepAlive no';
+}
+if(sshd_supports_opt('LookupClientHostnames','no')) {
+ push @cfgarr, 'LookupClientHostnames no';
+}
+if(sshd_supports_opt('MaxAuthTries','10')) {
+ push @cfgarr, 'MaxAuthTries 10';
+}
+if(sshd_supports_opt('PAMAuthenticationViaKbdInt','no')) {
+ push @cfgarr, 'PAMAuthenticationViaKbdInt no';
+}
+if(sshd_supports_opt('PermitTunnel','no')) {
+ push @cfgarr, 'PermitTunnel no';
+}
+if(sshd_supports_opt('PermitUserEnvironment','no')) {
+ push @cfgarr, 'PermitUserEnvironment no';
+}
+if(sshd_supports_opt('RhostsAuthentication','no')) {
+ push @cfgarr, 'RhostsAuthentication no';
+}
+if(sshd_supports_opt('TCPKeepAlive','no')) {
+ push @cfgarr, 'TCPKeepAlive no';
+}
+if(sshd_supports_opt('UseDNS','no')) {
+ push @cfgarr, 'UseDNS no';
+}
+if(sshd_supports_opt('UsePAM','no')) {
+ push @cfgarr, 'UsePAM no';
+}
+
+if($sshdid =~ /OpenSSH/) {
+ # http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6492415
+ if(sshd_supports_opt('UsePrivilegeSeparation','no')) {
+ push @cfgarr, 'UsePrivilegeSeparation no';
+ }
+}
+
+if(sshd_supports_opt('VerifyReverseMapping','no')) {
+ push @cfgarr, 'VerifyReverseMapping no';
+}
+if(sshd_supports_opt('X11UseLocalhost','yes')) {
+ push @cfgarr, 'X11UseLocalhost yes';
+}
+push @cfgarr, '#';
+
+
+#***************************************************************************
+# Write out resulting sshd configuration file for curl's tests
+#
+$error = dump_array($sshdconfig, @cfgarr);
+if($error) {
+ logmsg $error;
+ exit 1;
+}
+
+
+#***************************************************************************
+# Verify that sshd actually supports our generated configuration file
+#
+if(system "\"$sshd\" -t -f $sshdconfig > $sshdlog 2>&1") {
+ logmsg "sshd configuration file $sshdconfig failed verification";
+ display_sshdlog();
+ display_sshdconfig();
+ exit 1;
+}
+
+
+#***************************************************************************
+# Generate ssh client host key database file for curl's tests
+#
+if((! -e $knownhosts) || (! -s $knownhosts)) {
+ logmsg 'generating ssh client known hosts file...' if($verbose);
+ unlink($knownhosts);
+ if(open(RSAKEYFILE, "<$hstpubkeyf")) {
+ my @rsahostkey = do { local $/ = ' '; <RSAKEYFILE> };
+ if(close(RSAKEYFILE)) {
+ if(open(KNOWNHOSTS, ">$knownhosts")) {
+ print KNOWNHOSTS "$listenaddr ssh-rsa $rsahostkey[1]\n";
+ if(!close(KNOWNHOSTS)) {
+ $error = "Error: cannot close file $knownhosts";
+ }
+ }
+ else {
+ $error = "Error: cannot write file $knownhosts";
+ }
+ }
+ else {
+ $error = "Error: cannot close file $hstpubkeyf";
+ }
+ }
+ else {
+ $error = "Error: cannot read file $hstpubkeyf";
+ }
+ if($error) {
+ logmsg $error;
+ exit 1;
+ }
+}
+
+
+#***************************************************************************
+# Convert paths for curl's tests running on Windows using Cygwin OpenSSH
+#
+my $identity_config = abs_path("$path/$identity");
+my $knownhosts_config = abs_path("$path/$knownhosts");
+
+if (pathhelp::os_is_win()) {
+ # Ensure to use MinGW/Cygwin paths
+ $identity_config = pathhelp::build_sys_abs_path($identity_config);
+ $knownhosts_config = pathhelp::build_sys_abs_path($knownhosts_config);
+}
+if ($sshdid =~ /OpenSSH-Windows/) {
+ # Ensure to use native Windows paths with OpenSSH for Windows
+ $identity_config = pathhelp::sys_native_abs_path($identity);
+ $knownhosts_config = pathhelp::sys_native_abs_path($knownhosts);
+}
+
+#***************************************************************************
+# ssh client configuration file options we might use and version support
+#
+# AddressFamily : OpenSSH 3.7.0 and later
+# BatchMode : OpenSSH 1.2.1 and later
+# BindAddress : OpenSSH 2.9.9 and later
+# ChallengeResponseAuthentication : OpenSSH 2.5.0 and later
+# CheckHostIP : OpenSSH 1.2.1 and later
+# Cipher : OpenSSH 1.2.1 and later [3]
+# Ciphers : OpenSSH 2.1.0 and later [3]
+# ClearAllForwardings : OpenSSH 2.9.9 and later
+# Compression : OpenSSH 1.2.1 and later
+# CompressionLevel : OpenSSH 1.2.1 and later [3]
+# ConnectionAttempts : OpenSSH 1.2.1 and later
+# ConnectTimeout : OpenSSH 3.7.0 and later
+# ControlMaster : OpenSSH 3.9.0 and later
+# ControlPath : OpenSSH 3.9.0 and later
+# DisableBanner : SunSSH 1.2.0 and later
+# DynamicForward : OpenSSH 2.9.0 and later
+# EnableSSHKeysign : OpenSSH 3.6.0 and later
+# EscapeChar : OpenSSH 1.2.1 and later [3]
+# ExitOnForwardFailure : OpenSSH 4.4.0 and later
+# ForwardAgent : OpenSSH 1.2.1 and later
+# ForwardX11 : OpenSSH 1.2.1 and later
+# ForwardX11Trusted : OpenSSH 3.8.0 and later
+# GatewayPorts : OpenSSH 1.2.1 and later
+# GlobalKnownHostsFile : OpenSSH 1.2.1 and later
+# GSSAPIAuthentication : OpenSSH 3.7.0 and later [1]
+# GSSAPIDelegateCredentials : OpenSSH 3.7.0 and later [1]
+# HashKnownHosts : OpenSSH 4.0.0 and later
+# Host : OpenSSH 1.2.1 and later
+# HostbasedAuthentication : OpenSSH 2.9.0 and later
+# HostKeyAlgorithms : OpenSSH 2.9.0 and later [3]
+# HostKeyAlias : OpenSSH 2.5.0 and later [3]
+# HostName : OpenSSH 1.2.1 and later
+# IdentitiesOnly : OpenSSH 3.9.0 and later
+# IdentityFile : OpenSSH 1.2.1 and later
+# IgnoreIfUnknown : SunSSH 1.2.0 and later
+# KeepAlive : OpenSSH 1.2.1 and later
+# KbdInteractiveAuthentication : OpenSSH 2.3.0 and later
+# KbdInteractiveDevices : OpenSSH 2.3.0 and later [3]
+# LocalCommand : OpenSSH 4.3.0 and later [3]
+# LocalForward : OpenSSH 1.2.1 and later [3]
+# LogLevel : OpenSSH 1.2.1 and later
+# MACs : OpenSSH 2.5.0 and later [3]
+# NoHostAuthenticationForLocalhost : OpenSSH 3.0.0 and later
+# NumberOfPasswordPrompts : OpenSSH 1.2.1 and later
+# PasswordAuthentication : OpenSSH 1.2.1 and later
+# PermitLocalCommand : OpenSSH 4.3.0 and later
+# Port : OpenSSH 1.2.1 and later
+# PreferredAuthentications : OpenSSH 2.5.2 and later
+# Protocol : OpenSSH 2.1.0 and later
+# ProxyCommand : OpenSSH 1.2.1 and later [3]
+# PubkeyAuthentication : OpenSSH 2.5.0 and later
+# RekeyLimit : OpenSSH 3.7.0 and later
+# RemoteForward : OpenSSH 1.2.1 and later [3]
+# RhostsRSAAuthentication : OpenSSH 1.2.1 and later
+# RSAAuthentication : OpenSSH 1.2.1 and later
+# SendEnv : OpenSSH 3.9.0 and later
+# ServerAliveCountMax : OpenSSH 3.8.0 and later
+# ServerAliveInterval : OpenSSH 3.8.0 and later
+# SmartcardDevice : OpenSSH 2.9.9 and later [1][3]
+# StrictHostKeyChecking : OpenSSH 1.2.1 and later
+# TCPKeepAlive : OpenSSH 3.8.0 and later
+# Tunnel : OpenSSH 4.3.0 and later
+# TunnelDevice : OpenSSH 4.3.0 and later [3]
+# UsePAM : OpenSSH 3.7.0 and later [1][2][3]
+# UsePrivilegedPort : OpenSSH 1.2.1 and later
+# User : OpenSSH 1.2.1 and later
+# UserKnownHostsFile : OpenSSH 1.2.1 and later
+# VerifyHostKeyDNS : OpenSSH 3.8.0 and later
+# XAuthLocation : OpenSSH 2.1.1 and later [3]
+#
+# [1] Option only available if activated at compile time
+# [2] Option specific for portable versions
+# [3] Option not used in our ssh client config file
+
+
+#***************************************************************************
+# Initialize ssh config with options actually supported in OpenSSH 2.9.9
+#
+logmsg 'generating ssh client config file...' if($verbose);
+@cfgarr = ();
+push @cfgarr, '# This is a generated file. Do not edit.';
+push @cfgarr, "# $sshverstr ssh client configuration file for curl testing";
+push @cfgarr, '#';
+push @cfgarr, 'Host *';
+push @cfgarr, '#';
+push @cfgarr, "Port $port";
+push @cfgarr, "HostName $listenaddr";
+push @cfgarr, "User $username";
+push @cfgarr, 'Protocol 2';
+push @cfgarr, '#';
+
+# BindAddress option is not supported by OpenSSH for Windows
+if (!($sshdid =~ /OpenSSH-Windows/)) {
+ push @cfgarr, "BindAddress $listenaddr";
+}
+
+push @cfgarr, '#';
+push @cfgarr, "IdentityFile $identity_config";
+push @cfgarr, "UserKnownHostsFile $knownhosts_config";
+push @cfgarr, '#';
+push @cfgarr, 'BatchMode yes';
+push @cfgarr, 'ChallengeResponseAuthentication no';
+push @cfgarr, 'CheckHostIP no';
+push @cfgarr, 'ClearAllForwardings no';
+push @cfgarr, 'Compression no';
+push @cfgarr, 'ConnectionAttempts 3';
+push @cfgarr, 'ForwardAgent no';
+push @cfgarr, 'ForwardX11 no';
+push @cfgarr, 'GatewayPorts no';
+push @cfgarr, 'GlobalKnownHostsFile /dev/null';
+push @cfgarr, 'HostbasedAuthentication no';
+push @cfgarr, 'KbdInteractiveAuthentication no';
+push @cfgarr, "LogLevel $loglevel";
+push @cfgarr, 'NumberOfPasswordPrompts 0';
+push @cfgarr, 'PasswordAuthentication no';
+push @cfgarr, 'PreferredAuthentications publickey';
+push @cfgarr, 'PubkeyAuthentication yes';
+
+# RSA authentication options are not supported by OpenSSH for Windows
+if (!($sshdid =~ /OpenSSH-Windows/)) {
+ push @cfgarr, 'RhostsRSAAuthentication no';
+ push @cfgarr, 'RSAAuthentication no';
+}
+
+# Disabled StrictHostKeyChecking since it makes the tests fail on my
+# OpenSSH_6.0p1 on Debian Linux / Daniel
+push @cfgarr, 'StrictHostKeyChecking no';
+push @cfgarr, 'UsePrivilegedPort no';
+push @cfgarr, '#';
+
+
+#***************************************************************************
+# Options supported in ssh client newer than OpenSSH 2.9.9
+#
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 370)) {
+ push @cfgarr, 'AddressFamily any';
+}
+
+if((($sshid =~ /OpenSSH/) && ($sshvernum >= 370)) ||
+ (($sshid =~ /SunSSH/) && ($sshvernum >= 120))) {
+ push @cfgarr, 'ConnectTimeout 30';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 390)) {
+ push @cfgarr, 'ControlMaster no';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 420)) {
+ push @cfgarr, 'ControlPath none';
+}
+
+if(($sshid =~ /SunSSH/) && ($sshvernum >= 120)) {
+ push @cfgarr, 'DisableBanner yes';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 360)) {
+ push @cfgarr, 'EnableSSHKeysign no';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 440)) {
+ push @cfgarr, 'ExitOnForwardFailure yes';
+}
+
+if((($sshid =~ /OpenSSH/) && ($sshvernum >= 380)) ||
+ (($sshid =~ /SunSSH/) && ($sshvernum >= 120))) {
+ push @cfgarr, 'ForwardX11Trusted no';
+}
+
+if(($sshd_builtwith_GSSAPI) && ($sshdid eq $sshid) &&
+ ($sshdvernum == $sshvernum)) {
+ push @cfgarr, 'GSSAPIAuthentication no';
+ push @cfgarr, 'GSSAPIDelegateCredentials no';
+ if($sshid =~ /SunSSH/) {
+ push @cfgarr, 'GSSAPIKeyExchange no';
+ }
+}
+
+if((($sshid =~ /OpenSSH/) && ($sshvernum >= 400)) ||
+ (($sshid =~ /SunSSH/) && ($sshvernum >= 120))) {
+ push @cfgarr, 'HashKnownHosts no';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 390)) {
+ push @cfgarr, 'IdentitiesOnly yes';
+}
+
+if(($sshid =~ /SunSSH/) && ($sshvernum >= 120)) {
+ push @cfgarr, 'IgnoreIfUnknown no';
+}
+
+if((($sshid =~ /OpenSSH/) && ($sshvernum < 380)) ||
+ ($sshid =~ /SunSSH/)) {
+ push @cfgarr, 'KeepAlive no';
+}
+
+if((($sshid =~ /OpenSSH/) && ($sshvernum >= 300)) ||
+ ($sshid =~ /SunSSH/)) {
+ push @cfgarr, 'NoHostAuthenticationForLocalhost no';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 430)) {
+ push @cfgarr, 'PermitLocalCommand no';
+}
+
+if((($sshid =~ /OpenSSH/) && ($sshvernum >= 370)) ||
+ (($sshid =~ /SunSSH/) && ($sshvernum >= 120))) {
+ push @cfgarr, 'RekeyLimit 1G';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 390)) {
+ push @cfgarr, 'SendEnv';
+}
+
+if((($sshid =~ /OpenSSH/) && ($sshvernum >= 380)) ||
+ (($sshid =~ /SunSSH/) && ($sshvernum >= 120))) {
+ push @cfgarr, 'ServerAliveCountMax 3';
+ push @cfgarr, 'ServerAliveInterval 0';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 380)) {
+ push @cfgarr, 'TCPKeepAlive no';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 430)) {
+ push @cfgarr, 'Tunnel no';
+}
+
+if(($sshid =~ /OpenSSH/) && ($sshvernum >= 380)) {
+ push @cfgarr, 'VerifyHostKeyDNS no';
+}
+
+push @cfgarr, '#';
+
+
+#***************************************************************************
+# Write out resulting ssh client configuration file for curl's tests
+#
+$error = dump_array($sshconfig, @cfgarr);
+if($error) {
+ logmsg $error;
+ exit 1;
+}
+
+
+#***************************************************************************
+# Initialize client sftp config with options actually supported.
+#
+logmsg 'generating sftp client config file...' if($verbose);
+splice @cfgarr, 1, 1, "# $sshverstr sftp client configuration file for curl
testing";
+#
+for(my $i = scalar(@cfgarr) - 1; $i > 0; $i--) {
+ if($cfgarr[$i] =~ /^DynamicForward/) {
+ splice @cfgarr, $i, 1;
+ next;
+ }
+ if($cfgarr[$i] =~ /^ClearAllForwardings/) {
+ splice @cfgarr, $i, 1, "ClearAllForwardings yes";
+ next;
+ }
+}
+
+
+#***************************************************************************
+# Write out resulting sftp client configuration file for curl's tests
+#
+$error = dump_array($sftpconfig, @cfgarr);
+if($error) {
+ logmsg $error;
+ exit 1;
+}
+@cfgarr = ();
+
+
+#***************************************************************************
+# Generate client sftp commands batch file for sftp server verification
+#
+logmsg 'generating sftp client commands file...' if($verbose);
+push @cfgarr, 'pwd';
+push @cfgarr, 'quit';
+$error = dump_array($sftpcmds, @cfgarr);
+if($error) {
+ logmsg $error;
+ exit 1;
+}
+@cfgarr = ();
+
+#***************************************************************************
+# Prepare command line of ssh server daemon
+#
+my $cmd = "\"$sshd\" -e -D -f $sshdconfig > $sshdlog 2>&1";
+logmsg "SCP/SFTP server listening on port $port" if($verbose);
+logmsg "RUN: $cmd" if($verbose);
+
+#***************************************************************************
+# Start the ssh server daemon on Windows without forking it
+#
+if ($sshdid =~ /OpenSSH-Windows/) {
+ # Fake pidfile for ssh server on Windows.
+ if(open(OUT, ">$pidfile")) {
+ print OUT $$ . "\n";
+ close(OUT);
+ }
+
+ # Put an "exec" in front of the command so that the child process
+ # keeps this child's process ID by being tied to the spawned shell.
+ exec("exec $cmd") || die "Can't exec() $cmd: $!";
+ # exec() will create a new process, but ties the existence of the
+ # new process to the parent waiting perl.exe and sh.exe processes.
+
+ # exec() should never return back here to this process. We protect
+ # ourselves by calling die() just in case something goes really bad.
+ die "error: exec() has returned";
+}
+
+#***************************************************************************
+# Start the ssh server daemon without forking it
+#
+my $rc = system($cmd);
+if($rc == -1) {
+ logmsg "\"$sshd\" failed with: $!";
+}
+elsif($rc & 127) {
+ logmsg sprintf("\"$sshd\" died with signal %d, and %s coredump",
+ ($rc & 127), ($rc & 128)?'a':'no');
+}
+elsif($verbose && ($rc >> 8)) {
+ logmsg sprintf("\"$sshd\" exited with %d", $rc >> 8);
+}
+
+
+#***************************************************************************
+# Clean up once the server has stopped
+#
+unlink($hstprvkeyf, $hstpubkeyf, $hstpubmd5f,
+ $cliprvkeyf, $clipubkeyf, $knownhosts,
+ $sshdconfig, $sshconfig, $sftpconfig);
+
+exit 0;
diff --cc tests/symbol-scan.pl.in
index a9853c2c4,000000000..5d8bad168
mode 100755,000000..100755
--- a/tests/symbol-scan.pl.in
+++ b/tests/symbol-scan.pl.in
@@@ -1,183 -1,0 +1,183 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# This script grew out of help from Przemyslaw Iskra and Balint Szilakszi
+# a late evening in the #curl IRC channel on freenode.
+#
+
+use strict;
+use warnings;
+use vars qw($Cpreprocessor);
+
+#
+# configurehelp perl module is generated by configure script
+#
+my $rc = eval {
+ require configurehelp;
+ configurehelp->import(qw(
+ $Cpreprocessor
+ ));
+ 1;
+};
+# Set default values if configure has not generated a configurehelp.pm file.
+# This is the case with cmake.
+if (!$rc) {
+ $Cpreprocessor = 'cpp';
+}
+
+# we may get the dir root pointed out
+my $root=$ARGV[0] || ".";
+
+# need an include directory when building out-of-tree
+my $i = ($ARGV[1]) ? "-I$ARGV[1] " : '';
+
+my $h = "$root/include/gnurl/curl.h";
+my $mh = "$root/include/gnurl/multi.h";
+my $ua = "$root/include/gnurl/urlapi.h";
+
+my $verbose=0;
+my $summary=0;
+my $misses=0;
+
+my @syms;
+my %doc;
+my %rem;
+
+open H_IN, "-|", "$Cpreprocessor $i$h" || die "Cannot preprocess curl.h";
+while ( <H_IN> ) {
+ if ( /enum\s+(\S+\s+)?{/ .. /}/ ) {
+ s/^\s+//;
+ next unless /^CURL/;
+ chomp;
+ s/[,\s].*//;
+ push @syms, $_;
+ }
+}
+close H_IN || die "Error preprocessing curl.h";
+
+sub scanheader {
+ my ($f)=@_;
+ open H, "<$f";
+ while(<H>) {
+ if (/^#define (CURL[A-Za-z0-9_]*)/) {
+ push @syms, $1;
+ }
+ }
+ close H;
+}
+
+scanheader($h);
+scanheader($mh);
+scanheader($ua);
+
+open S, "<$root/docs/libcurl/symbols-in-versions";
+while(<S>) {
+ if(/(^CURL[^ \n]*) *(.*)/) {
+ my ($sym, $rest)=($1, $2);
+ if($doc{$sym}) {
+ print "Detected duplicate symbol: $sym\n";
+ $misses++;
+ next;
+ }
+ $doc{$sym}=$sym;
+ my @a=split(/ +/, $rest);
+ if($a[2]) {
+ # this symbol is documented to have been present the last time
+ # in this release
+ $rem{$sym}=$a[2];
+ }
+ }
+}
+close S;
+
+my $ignored=0;
+for my $e (sort @syms) {
+ # OBSOLETE - names that are just placeholders for a position where we
+ # previously had a name, that is now removed. The OBSOLETE names should
+ # never be used for anything.
+ #
+ # CURL_EXTERN - is a define used for libcurl functions that are external,
+ # public. No app or other code should ever use it.
+ #
+ # CURLINC_ - defines for header dual-include prevention, ignore those.
+ #
+ # *_LAST and *_LASTENTRY are just prefix for the placeholders used for the
+ # last entry in many enum series.
+ #
+
+ if($e =~ /(OBSOLETE|^CURL_EXTERN|^CURLINC_|_LAST\z|_LASTENTRY\z)/) {
+ $ignored++;
+ next;
+ }
+ if($doc{$e}) {
+ if($verbose) {
+ print $e."\n";
+ }
+ $doc{$e}="used";
+ next;
+ }
+ else {
+ print $e."\n";
+ $misses++;
+ }
+}
+
+#
+# now scan through all symbols that were present in the symbols-in-versions
+# but not in the headers
+#
+# If the symbols were marked 'removed' in symbols-in-versions we don't output
+# anything about it since that is perfectly fine.
+#
+
+my $anyremoved;
+
+for my $e (sort keys %doc) {
+ if(($doc{$e} ne "used") && !$rem{$e}) {
+
+ if(!$anyremoved++) {
+ print "Missing symbols mentioned in symbols-in-versions\n";
+ print "Add them to a header, or mark them as removed.\n";
+ }
+
+ print "$e\n";
+ $misses++;
+ }
+}
+
+if($summary) {
+ print "Summary:\n";
+ printf "%d symbols in headers (out of which %d are ignored)\n",
scalar(@syms),
+ $ignored;
+ printf "%d symbols in headers are interesting\n",
+ scalar(@syms)- $ignored;
+ printf "%d symbols are listed in symbols-in-versions\n (out of which %d
are listed as removed)\n", scalar(keys %doc), scalar(keys %rem);
+ printf "%d symbols in symbols-in-versions should match the ones in
headers\n", scalar(keys %doc) - scalar(keys %rem);
+}
+
+if($misses) {
- exit 2; # there are stuff to attend to!
++ exit 0; # there are stuff to attend to!
+}
+else {
+ print "OK\n";
+}
diff --cc tests/testcurl.pl.in
index b1008f606,000000000..de30edf07
mode 100755,000000..100755
--- a/tests/testcurl.pl.in
+++ b/tests/testcurl.pl.in
@@@ -1,814 -1,0 +1,806 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+###########################
+# What is This Script?
+###########################
+
+# testcurl.pl is the master script to use for automatic testing of curl
+# directly off its source repository.
+# This is written for the purpose of being run from a crontab job or similar
+# at a regular interval. The output is suitable to be mailed to
+# curl-autocompile@haxx.se to be dealt with automatically (make sure the
+# subject includes the word "autobuild" as the mail gets silently discarded
+# otherwise). The most current build status (with a reasonable backlog) will
- # be published on the curl site, at https://curl.haxx.se/auto/
++# be published on the curl site, at https://curl.se/auto/
+
+# USAGE:
+# testcurl.pl [options] [curl-daily-name] > output
+
+# Options:
+#
+# --configure=[options] Configure options
+# --crosscompile This is a crosscompile
+# --desc=[desc] Description of your test system
+# --email=[email] Set email address to report as
+# --extvercmd=[command] Command to use for displaying version with cross
compiles.
+# --mktarball=[command] Command to run after completed test
+# --name=[name] Set name to report as
+# --notes=[notes] More human-readable information about this
configuration
+# --nocvsup Don't pull from git even though it is a git tree
+# --nogitpull Don't pull from git even though it is a git tree
+# --nobuildconf Don't run buildconf
+# --noconfigure Don't run configure
+# --runtestopts=[options] Options to pass to runtests.pl
+# --setup=[file name] File name to read setup from (deprecated)
+# --target=[your os] Specify your target environment.
+#
+# if [curl-daily-name] is omitted, a 'curl' git directory is assumed.
+#
+
+use strict;
+
+use Cwd;
+use File::Spec;
+
+# Turn on warnings (equivalent to -w, which can't be used with /usr/bin/env)
+#BEGIN { $^W = 1; }
+
+use vars qw($version $fixed $infixed $CURLDIR $git $pwd $build $buildlog
+ $buildlogname $configurebuild $targetos $confheader $binext
+ $libext);
+
+use vars qw($name $email $desc $confopts $runtestopts $setupfile $mktarball
+ $extvercmd $nogitpull $nobuildconf $crosscompile
+ $timestamp $notes);
+
+# version of this script
+$version='2014-11-25';
+$fixed=0;
+
+# Determine if we're running from git or a canned copy of curl,
+# or if we got a specific target option or setup file option.
+$CURLDIR="curl";
+if (-f ".git/config") {
+ $CURLDIR = "./";
+}
+
+$git=1;
+$setupfile = 'setup';
+$configurebuild = 1;
+while ($ARGV[0]) {
+ if ($ARGV[0] =~ /--target=/) {
+ $targetos = (split(/=/, shift @ARGV, 2))[1];
+ }
+ elsif ($ARGV[0] =~ /--setup=/) {
+ $setupfile = (split(/=/, shift @ARGV, 2))[1];
+ }
+ elsif ($ARGV[0] =~ /--extvercmd=/) {
+ $extvercmd = (split(/=/, shift @ARGV, 2))[1];
+ }
+ elsif ($ARGV[0] =~ /--mktarball=/) {
+ $mktarball = (split(/=/, shift @ARGV, 2))[1];
+ }
+ elsif ($ARGV[0] =~ /--name=/) {
+ $name = (split(/=/, shift @ARGV, 2))[1];
+ }
+ elsif ($ARGV[0] =~ /--email=/) {
+ $email = (split(/=/, shift @ARGV, 2))[1];
+ }
+ elsif ($ARGV[0] =~ /--desc=/) {
+ $desc = (split(/=/, shift @ARGV, 2))[1];
+ }
+ elsif ($ARGV[0] =~ /--notes=/) {
+ $notes = (split(/=/, shift @ARGV, 2))[1];
+ }
+ elsif ($ARGV[0] =~ /--configure=(.*)/) {
+ $confopts = $1;
+ shift @ARGV;
+ }
+ elsif (($ARGV[0] eq "--nocvsup") || ($ARGV[0] eq "--nogitpull")) {
+ $nogitpull=1;
+ shift @ARGV;
+ }
+ elsif ($ARGV[0] =~ /--nobuildconf/) {
+ $nobuildconf=1;
+ shift @ARGV;
+ }
+ elsif ($ARGV[0] =~ /--noconfigure/) {
+ $configurebuild=0;
+ shift @ARGV;
+ }
+ elsif ($ARGV[0] =~ /--crosscompile/) {
+ $crosscompile=1;
+ shift @ARGV;
+ }
+ elsif ($ARGV[0] =~ /--runtestopts=/) {
+ $runtestopts = (split(/=/, shift @ARGV, 2))[1];
+ }
+ else {
+ $CURLDIR=shift @ARGV;
+ $git=0; # a given dir, assume not using git
+ }
+}
+
+# Do the platform-specific stuff here
+$confheader = 'curl_config.h';
+$binext = '';
+$libext = '.la'; # .la since both libcurl and libcares are made with libtool
+if ($^O eq 'MSWin32' || $targetos) {
+ if (!$targetos) {
+ # If no target defined on Win32 lets assume vc
+ $targetos = 'vc';
+ }
+ if ($targetos =~ /vc/ || $targetos =~ /borland/ || $targetos =~ /watcom/) {
+ $binext = '.exe';
+ $libext = '.lib';
+ }
+ elsif ($targetos =~ /mingw/) {
+ $binext = '.exe';
+ if ($^O eq 'MSWin32') {
+ $libext = '.a';
+ }
+ }
+ elsif ($targetos =~ /netware/) {
+ $configurebuild = 0;
+ $binext = '.nlm';
+ if ($^O eq 'MSWin32') {
+ $libext = '.lib';
+ }
+ else {
+ $libext = '.a';
+ }
+ }
+}
+
+if (($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') &&
+ ($targetos =~ /vc/ || $targetos =~ /mingw32/ ||
+ $targetos =~ /borland/ || $targetos =~ /watcom/)) {
+
+ # Set these things only when building ON Windows and for Win32 platform.
+ # FOR Windows since we might be cross-compiling on another system. Non-
+ # Windows builds still default to configure-style builds with curl_config.h.
+
+ $configurebuild = 0;
+ $confheader = 'config-win32.h';
+}
+
+$ENV{LC_ALL}="C" if (($ENV{LC_ALL}) && ($ENV{LC_ALL} !~ /^C$/));
+$ENV{LC_CTYPE}="C" if (($ENV{LC_CTYPE}) && ($ENV{LC_CTYPE} !~ /^C$/));
+$ENV{LANG}="C";
+
+sub rmtree($) {
+ my $target = $_[0];
+ if ($^O eq 'MSWin32') {
+ foreach (glob($target)) {
+ s:/:\\:g;
+ system("rd /s /q $_");
+ }
+ } else {
+ system("rm -rf $target");
+ }
+}
+
+sub grepfile($$) {
+ my ($target, $fn) = @_;
+ open(F, $fn) or die;
+ while (<F>) {
+ if (/$target/) {
+ close(F);
+ return 1;
+ }
+ }
+ close(F);
+ return 0;
+}
+
+sub logit($) {
+ my $text=$_[0];
+ if ($text) {
+ print "testcurl: $text\n";
+ }
+}
+
+sub logit_spaced($) {
+ my $text=$_[0];
+ if ($text) {
+ print "\ntestcurl: $text\n\n";
+ }
+}
+
+sub mydie($){
+ my $text=$_[0];
+ logit "$text";
+ chdir $pwd; # cd back to the original root dir
+
+ if ($pwd && $build) {
+ # we have a build directory name, remove the dir
+ logit "removing the $build dir";
+ rmtree "$pwd/$build";
+ }
+ if (-r $buildlog) {
+ # we have a build log output file left, remove it
+ logit "removing the $buildlogname file";
+ unlink "$buildlog";
+ }
+ logit "ENDING HERE"; # last line logged!
+ exit 1;
+}
+
+sub get_host_triplet {
+ my $triplet;
+ my $configfile = "$pwd/$build/lib/curl_config.h";
+
+ if(-f $configfile && -s $configfile && open(LIBCONFIGH, "<$configfile")) {
+ while(<LIBCONFIGH>) {
+ if($_ =~ /^\#define\s+OS\s+"*([^"][^"]*)"*\s*/) {
+ $triplet = $1;
+ last;
+ }
+ }
+ close(LIBCONFIGH);
+ }
+ return $triplet;
+}
+
+if($name && $email && $desc) {
+ # having these fields set are enough to continue, skip reading the setup
+ # file
+ $infixed=4;
+ $fixed=4;
+}
+elsif (open(F, "$setupfile")) {
+ while (<F>) {
+ if (/(\w+)=(.*)/) {
+ eval "\$$1=$2;";
+ }
+ }
+ close(F);
+ $infixed=$fixed;
+}
+else {
+ $infixed=0; # so that "additional args to configure" works properly
first time...
+}
+
+if (!$name) {
+ print "please enter your name\n";
+ $name = <>;
+ chomp $name;
+ $fixed=1;
+}
+
+if (!$email) {
+ print "please enter your contact email address\n";
+ $email = <>;
+ chomp $email;
+ $fixed=2;
+}
+
+if (!$desc) {
+ print "please enter a one line system description\n";
+ $desc = <>;
+ chomp $desc;
+ $fixed=3;
+}
+
+if (!$confopts) {
+ if ($infixed < 4) {
+ print "please enter your additional arguments to configure\n";
+ print "examples: --with-ssl --enable-debug --enable-ipv6 --with-krb4\n";
+ $confopts = <>;
+ chomp $confopts;
+ }
+}
+
+
+if ($fixed < 4) {
+ $fixed=4;
+ open(F, ">$setupfile") or die;
+ print F "name='$name'\n";
+ print F "email='$email'\n";
+ print F "desc='$desc'\n";
+ print F "confopts='$confopts'\n";
+ print F "notes='$notes'\n";
+ print F "fixed='$fixed'\n";
+ close(F);
+}
+
+# Enable picky compiler warnings unless explicitly disabled
+if (($confopts !~ /--enable-debug/) &&
+ ($confopts !~ /--enable-warnings/) &&
+ ($confopts !~ /--disable-warnings/)) {
+ $confopts .= " --enable-warnings";
+}
+
+my $str1066os = 'o' x 1066;
+
+# Set timestamp to the UTC this script is running. Its value might
+# be changed later in the script to the value present in curlver.h
+$timestamp = scalar(gmtime)." UTC";
+
+logit "STARTING HERE"; # first line logged, for scripts to trigger on
+logit 'TRANSFER CONTROL ==== 1120 CHAR LINE' . $str1066os . 'LINE_END';
+logit "NAME = $name";
+logit "EMAIL = $email";
+logit "DESC = $desc";
+logit "NOTES = $notes";
+logit "CONFOPTS = $confopts";
+logit "RUNTESTOPTS = ".$runtestopts;
+logit "CPPFLAGS = ".$ENV{CPPFLAGS};
+logit "CFLAGS = ".$ENV{CFLAGS};
+logit "LDFLAGS = ".$ENV{LDFLAGS};
+logit "LIBS = ".$ENV{LIBS};
+logit "CC = ".$ENV{CC};
+logit "TMPDIR = ".$ENV{TMPDIR};
+logit "MAKEFLAGS = ".$ENV{MAKEFLAGS};
+logit "ACLOCAL_FLAGS = ".$ENV{ACLOCAL_FLAGS};
+logit "PKG_CONFIG_PATH = ".$ENV{PKG_CONFIG_PATH};
+logit "DYLD_LIBRARY_PATH = ".$ENV{DYLD_LIBRARY_PATH};
+logit "LD_LIBRARY_PATH = ".$ENV{LD_LIBRARY_PATH};
+logit "LIBRARY_PATH = ".$ENV{LIBRARY_PATH};
+logit "SHLIB_PATH = ".$ENV{SHLIB_PATH};
+logit "LIBPATH = ".$ENV{LIBPATH};
+logit "target = ".$targetos;
+logit "version = $version"; # script version
+logit "date = $timestamp"; # When the test build starts
+
+$str1066os = undef;
+
+# Make $pwd to become the path without newline. We'll use that in order to cut
+# off that path from all possible logs and error messages etc.
+$pwd = getcwd();
+
+my $have_embedded_ares = 0;
+
+if (-d $CURLDIR) {
+ if ($git && -d "$CURLDIR/.git") {
+ logit "$CURLDIR is verified to be a fine git source dir";
+ # remove the generated sources to force them to be re-generated each
+ # time we run this test
+ unlink "$CURLDIR/src/tool_hugehelp.c";
+ # find out if curl source dir has an in-tree c-ares repo
+ $have_embedded_ares = 1 if (-f "$CURLDIR/ares/GIT-INFO");
+ } elsif (!$git && -f "$CURLDIR/tests/testcurl.pl") {
+ logit "$CURLDIR is verified to be a fine daily source dir";
+ # find out if curl source dir has an in-tree c-ares extracted tarball
+ $have_embedded_ares = 1 if (-f "$CURLDIR/ares/ares_build.h");
+ } else {
+ mydie "$CURLDIR is not a daily source dir or checked out from git!"
+ }
+}
+
+# make the path absolute so we can use it everywhere
+$CURLDIR = File::Spec->rel2abs("$CURLDIR");
+
+$build="build-$$";
+$buildlogname="buildlog-$$";
+$buildlog="$pwd/$buildlogname";
+
+# remove any previous left-overs
+rmtree "build-*";
+rmtree "buildlog-*";
+
+# this is to remove old build logs that ended up in the wrong dir
+foreach (glob("$CURLDIR/buildlog-*")) { unlink $_; }
+
+# create a dir to build in
+mkdir $build, 0777;
+
+if (-d $build) {
+ logit "build dir $build was created fine";
+} else {
+ mydie "failed to create dir $build";
+}
+
+# get in the curl source tree root
+chdir $CURLDIR;
+
+# Do the git thing, or not...
+if ($git) {
+ my $gitstat = 0;
+ my @commits;
+
+ # update quietly to the latest git
+ if($nogitpull) {
+ logit "skipping git pull (--nogitpull)";
+ } else {
+ logit "run git pull in curl";
+ system("git pull 2>&1");
+ $gitstat += $?;
+ logit "failed to update from curl git ($?), continue anyway" if ($?);
+
+ # Set timestamp to the UTC the git update took place.
+ $timestamp = scalar(gmtime)." UTC" if (!$gitstat);
+ }
+
+ # get the last 5 commits for show (even if no pull was made)
+ @commits=`git log --pretty=oneline --abbrev-commit -5`;
+ logit "The most recent curl git commits:";
+ for (@commits) {
+ chomp ($_);
+ logit " $_";
+ }
+
+ if (-d "ares/.git") {
+ chdir "ares";
+
+ if($nogitpull) {
+ logit "skipping git pull (--nogitpull) in ares";
+ } else {
+ logit "run git pull in ares";
+ system("git pull 2>&1");
+ $gitstat += $?;
+ logit "failed to update from ares git ($?), continue anyway" if ($?);
+
+ # Set timestamp to the UTC the git update took place.
+ $timestamp = scalar(gmtime)." UTC" if (!$gitstat);
+ }
+
+ # get the last 5 commits for show (even if no pull was made)
+ @commits=`git log --pretty=oneline --abbrev-commit -5`;
+ logit "The most recent ares git commits:";
+ for (@commits) {
+ chomp ($_);
+ logit " $_";
+ }
+
+ chdir "$CURLDIR";
+ }
+
+ if($nobuildconf) {
+ logit "told to not run buildconf";
+ }
+ elsif ($configurebuild) {
+ # remove possible left-overs from the past
+ unlink "configure";
+ unlink "autom4te.cache";
+
+ # generate the build files
+ logit "invoke buildconf";
+ open(F, "./buildconf 2>&1 |") or die;
+ open(LOG, ">$buildlog") or die;
+ while (<F>) {
+ my $ll = $_;
- # ignore messages pertaining to third party m4 files we don't care
- next if ($ll =~ /aclocal\/gtk\.m4/);
- next if ($ll =~ /aclocal\/gtkextra\.m4/);
+ print $ll;
+ print LOG $ll;
+ }
+ close(F);
+ close(LOG);
+
- if (grepfile("^buildconf: OK", $buildlog)) {
- logit "buildconf was successful";
- }
- else {
- mydie "buildconf was NOT successful";
- }
++ logit "buildconf was successful";
+ }
+ else {
+ logit "buildconf was successful (dummy message)";
+ }
+}
+
+# Set timestamp to the one in curlver.h if this isn't a git test build.
+if ((-f "include/gnurl/curlver.h") &&
+ (open(F, "<include/gnurl/curlver.h"))) {
+ while (<F>) {
+ chomp;
+ if ($_ =~ /^\#define\s+LIBCURL_TIMESTAMP\s+\"(.+)\".*$/) {
+ my $stampstring = $1;
+ if ($stampstring !~ /DEV/) {
+ $stampstring =~ s/\s+UTC//;
+ $timestamp = $stampstring." UTC";
+ }
+ last;
+ }
+ }
+ close(F);
+}
+
+# Show timestamp we are using for this test build.
+logit "timestamp = $timestamp";
+
+if ($configurebuild) {
+ if (-f "configure") {
+ logit "configure created (at least it exists)";
+ } else {
+ mydie "no configure created/found";
+ }
+} else {
+ logit "configure created (dummy message)"; # dummy message to feign success
+}
+
+sub findinpath {
+ my $c;
+ my $e;
+ my $x = ($^O eq 'MSWin32') ? '.exe' : '';
+ my $s = ($^O eq 'MSWin32') ? ';' : ':';
+ my $p=$ENV{'PATH'};
+ my @pa = split($s, $p);
+ for $c (@_) {
+ for $e (@pa) {
+ if( -x "$e/$c$x") {
+ return $c;
+ }
+ }
+ }
+}
+
+my $make = findinpath("gmake", "make", "nmake");
+if(!$make) {
+ mydie "Couldn't find make in the PATH";
+}
+# force to 'nmake' for VC builds
+$make = "nmake" if ($targetos =~ /vc/);
+# force to 'wmake' for Watcom builds
+$make = "wmake" if ($targetos =~ /watcom/);
+logit "going with $make as make";
+
+# change to build dir
+chdir "$pwd/$build";
+
+if ($configurebuild) {
+ # run configure script
+ print `$CURLDIR/configure $confopts 2>&1`;
+
+ if (-f "lib/Makefile") {
+ logit "configure seems to have finished fine";
+ } else {
+ mydie "configure didn't work";
+ }
+} else {
+ logit "copying files to build dir ...";
+ if (($^O eq 'MSWin32') && ($targetos !~ /netware/)) {
+ system("xcopy /s /q \"$CURLDIR\" .");
+ system("buildconf.bat");
+ }
+ elsif ($targetos =~ /netware/) {
+ system("cp -afr $CURLDIR/* .");
+ system("cp -af $CURLDIR/Makefile.dist Makefile");
+ system("$make -i -C lib -f Makefile.netware prebuild");
+ system("$make -i -C src -f Makefile.netware prebuild");
+ if (-d "$CURLDIR/ares") {
+ system("$make -i -C ares -f Makefile.netware prebuild");
+ }
+ }
+ elsif ($^O eq 'linux') {
+ system("cp -afr $CURLDIR/* .");
+ system("cp -af $CURLDIR/Makefile.dist Makefile");
+ system("$make -i -C lib -f Makefile.$targetos prebuild");
+ system("$make -i -C src -f Makefile.$targetos prebuild");
+ if (-d "$CURLDIR/ares") {
+ system("cp -af $CURLDIR/ares/ares_build.h.dist ./ares/ares_build.h");
+ system("$make -i -C ares -f Makefile.$targetos prebuild");
+ }
+ }
+}
+
+if(-f "./libcurl.pc") {
+ logit_spaced "display libcurl.pc";
+ if(open(F, "<./libcurl.pc")) {
+ while(<F>) {
+ my $ll = $_;
+ print $ll if(($ll !~ /^ *#/) && ($ll !~ /^ *$/));
+ }
+ close(F);
+ }
+}
+
+logit_spaced "display lib/$confheader";
+open(F, "lib/$confheader") or die "lib/$confheader: $!";
+while (<F>) {
+ print if /^ *#/;
+}
+close(F);
+
+if (($have_embedded_ares) &&
+ (grepfile("^#define USE_ARES", "lib/$confheader"))) {
+ print "\n";
+ logit "setup to build ares";
+
+ if(-f "./ares/libcares.pc") {
+ logit_spaced "display ares/libcares.pc";
+ if(open(F, "<./ares/libcares.pc")) {
+ while(<F>) {
+ my $ll = $_;
+ print $ll if(($ll !~ /^ *#/) && ($ll !~ /^ *$/));
+ }
+ close(F);
+ }
+ }
+
+ if(-f "./ares/ares_build.h") {
+ logit_spaced "display ares/ares_build.h";
+ if(open(F, "<./ares/ares_build.h")) {
+ while(<F>) {
+ my $ll = $_;
+ print $ll if(($ll =~ /^ *# *define *CARES_/) && ($ll !~
/__CARES_BUILD_H/));
+ }
+ close(F);
+ }
+ }
+ else {
+ mydie "no ares_build.h created/found";
+ }
+
+ $confheader =~ s/curl/ares/;
+ logit_spaced "display ares/$confheader";
+ if(open(F, "ares/$confheader")) {
+ while (<F>) {
+ print if /^ *#/;
+ }
+ close(F);
+ }
+
+ print "\n";
+ logit "build ares";
+ chdir "ares";
+
+ if ($targetos && !$configurebuild) {
+ logit "$make -f Makefile.$targetos";
+ open(F, "$make -f Makefile.$targetos 2>&1 |") or die;
+ }
+ else {
+ logit "$make";
+ open(F, "$make 2>&1 |") or die;
+ }
+ while (<F>) {
+ s/$pwd//g;
+ print;
+ }
+ close(F);
+
+ if (-f "libcares$libext") {
+ logit "ares is now built successfully (libcares$libext)";
+ } else {
+ mydie "ares build failed (libcares$libext)";
+ }
+
+ # cd back to the curl build dir
+ chdir "$pwd/$build";
+}
+
+my $mkcmd = "$make -i" . ($targetos && !$configurebuild ? " $targetos" : "");
+logit "$mkcmd";
+open(F, "$mkcmd 2>&1 |") or die;
+while (<F>) {
+ s/$pwd//g;
+ print;
+}
+close(F);
+
+if (-f "lib/libcurl$libext") {
+ logit "libcurl was created fine (libcurl$libext)";
+}
+else {
+ mydie "libcurl was not created (libcurl$libext)";
+}
+
+if (-f "src/curl$binext") {
+ logit "curl was created fine (curl$binext)";
+}
+else {
+ mydie "curl was not created (curl$binext)";
+}
+
+if (!$crosscompile || (($extvercmd ne '') && (-x $extvercmd))) {
+ logit "display curl${binext} --version output";
+ my $cmd = ($extvercmd ne '' ? $extvercmd.' ' : '')."./src/curl${binext}
--version|";
+ open(F, $cmd);
+ while(<F>) {
+ # strip CR from output on non-win32 platforms (wine on Linux)
+ s/\r// if ($^O ne 'MSWin32');
+ print;
+ }
+ close(F);
+}
+
+if ($configurebuild && !$crosscompile) {
+ my $host_triplet = get_host_triplet();
+ # build example programs for selected build targets
+ if(($host_triplet =~ /([^-]+)-([^-]+)-irix(.*)/) ||
+ ($host_triplet =~ /([^-]+)-([^-]+)-aix(.*)/) ||
+ ($host_triplet =~ /([^-]+)-([^-]+)-osf(.*)/) ||
+ ($host_triplet =~ /([^-]+)-([^-]+)-solaris2(.*)/)) {
+ chdir "$pwd/$build/docs/examples";
+ logit_spaced "build examples";
+ open(F, "$make -i 2>&1 |") or die;
+ open(LOG, ">$buildlog") or die;
+ while (<F>) {
+ s/$pwd//g;
+ print;
+ print LOG;
+ }
+ close(F);
+ close(LOG);
+ chdir "$pwd/$build";
+ }
+ # build and run full test suite
+ my $o;
+ if($runtestopts) {
+ $o = "TEST_F=\"$runtestopts\" ";
+ }
+ logit "$make -k ${o}test-full";
+ open(F, "$make -k ${o}test-full 2>&1 |") or die;
+ open(LOG, ">$buildlog") or die;
+ while (<F>) {
+ s/$pwd//g;
+ print;
+ print LOG;
+ }
+ close(F);
+ close(LOG);
+
+ if (grepfile("^TEST", $buildlog)) {
+ logit "tests were run";
+ } else {
+ mydie "test suite failure";
+ }
+
+ if (grepfile("^TESTFAIL:", $buildlog)) {
+ logit "the tests were not successful";
+ } else {
+ logit "the tests were successful!";
+ }
+}
+else {
+ if($crosscompile) {
+ my $host_triplet = get_host_triplet();
+ # build example programs for selected cross-compiles
+ if(($host_triplet =~ /([^-]+)-([^-]+)-mingw(.*)/) ||
+ ($host_triplet =~ /([^-]+)-([^-]+)-android(.*)/)) {
+ chdir "$pwd/$build/docs/examples";
+ logit_spaced "build examples";
+ open(F, "$make -i 2>&1 |") or die;
+ open(LOG, ">$buildlog") or die;
+ while (<F>) {
+ s/$pwd//g;
+ print;
+ print LOG;
+ }
+ close(F);
+ close(LOG);
+ chdir "$pwd/$build";
+ }
+ # build test harness programs for selected cross-compiles
+ if($host_triplet =~ /([^-]+)-([^-]+)-mingw(.*)/) {
+ chdir "$pwd/$build/tests";
+ logit_spaced "build test harness";
+ open(F, "$make -i 2>&1 |") or die;
+ open(LOG, ">$buildlog") or die;
+ while (<F>) {
+ s/$pwd//g;
+ print;
+ print LOG;
+ }
+ close(F);
+ close(LOG);
+ chdir "$pwd/$build";
+ }
+ logit_spaced "cross-compiling, can't run tests";
+ }
+ # dummy message to feign success
+ print "TESTDONE: 1 tests out of 0 (dummy message)\n";
+}
+
+# create a tarball if we got that option.
+if (($mktarball ne '') && (-x $mktarball)) {
+ system($mktarball);
+}
+
+# mydie to cleanup
+mydie "ending nicely";
diff --cc tests/tftpserver.pl.in
index 891b0ec40,000000000..a82a58a3a
mode 100755,000000..100755
--- a/tests/tftpserver.pl.in
+++ b/tests/tftpserver.pl.in
@@@ -1,123 -1,0 +1,123 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+BEGIN {
+ push(@INC, $ENV{'srcdir'}) if(defined $ENV{'srcdir'});
+ push(@INC, ".");
+}
+
+use strict;
+use warnings;
+
+use serverhelp qw(
+ server_pidfilename
+ server_logfilename
+ );
+
+use sshhelp qw(
+ exe_ext
+ );
+
+my $verbose = 0; # set to 1 for debugging
+my $port = 8997; # just a default
+my $ipvnum = 4; # default IP version of tftp server
+my $idnum = 1; # default tftp server instance number
+my $proto = 'tftp'; # protocol the tftp server speaks
+my $pidfile;
+my $portfile;
+my $logfile;
+my $srcdir;
+my $fork;
+
+my $flags = "";
+my $path = '.';
+my $logdir = $path .'/log';
+
+while(@ARGV) {
+ if($ARGV[0] eq '--pidfile') {
+ if($ARGV[1]) {
+ $pidfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--portfile') {
+ if($ARGV[1]) {
+ $portfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--logfile') {
+ if($ARGV[1]) {
+ $logfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--srcdir') {
+ if($ARGV[1]) {
+ $srcdir = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--ipv4') {
+ $ipvnum = 4;
+ }
+ elsif($ARGV[0] eq '--ipv6') {
+ $ipvnum = 6;
+ }
+ elsif($ARGV[0] eq '--port') {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $port = $1;
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--id') {
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $idnum = $1 if($1 > 0);
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--verbose') {
+ $verbose = 1;
+ }
+ else {
+ print STDERR "\nWarning: tftpserver.pl unknown parameter: $ARGV[0]\n";
+ }
+ shift @ARGV;
+}
+
+if(!$srcdir) {
+ $srcdir = $ENV{'srcdir'} || '.';
+}
+if(!$pidfile) {
+ $pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
+}
+if(!$logfile) {
+ $logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
+}
+
+$flags .= "--pidfile \"$pidfile\" ".
+ "--portfile \"$portfile\" ".
+ "--logfile \"$logfile\" ";
+$flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\"";
+
+exec("server/tftpd".exe_ext('SRV')." $flags");
diff --cc tests/version-scan.pl.in
index 7c56d0501,000000000..c466d1a58
mode 100755,000000..100755
--- a/tests/version-scan.pl.in
+++ b/tests/version-scan.pl.in
@@@ -1,66 -1,0 +1,66 @@@
+#!AWKPERL
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
- # are also available at https://curl.haxx.se/docs/copyright.html.
++# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# Verify that curl_version_info.3 documents all the CURL_VERSION_ bits
+# from the header.
+#
+
+use strict;
+use warnings;
+
+my $manpage=$ARGV[0];
+my $header=$ARGV[1];
+my %manversion;
+my %headerversion;
+my $error;
+
+open(M, "<$manpage");
+while(<M>) {
+ if($_ =~ /^.ip (CURL_VERSION_[A-Z0-9_]+)/i) {
+ $manversion{$1}++;
+ }
+}
+close(M);
+
+open(H, "<$header");
+while(<H>) {
+ if($_ =~ /^\#define (CURL_VERSION_[A-Z0-9_]+)/i) {
+ $headerversion{$1}++;
+ }
+}
+close(H);
+
+for my $h (keys %headerversion) {
+ if(!$manversion{$h}) {
+ print STDERR "$manpage: missing $h\n";
+ $error++;
+ }
+}
+for my $h (keys %manversion) {
+ if(!$headerversion{$h}) {
+ print STDERR "$manpage: $h is not in the header!\n";
+ $error++;
+ }
+}
+
+exit $error;
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [gnurl] 408/411: gnurl adjustments (paths), (continued)
- [gnurl] 408/411: gnurl adjustments (paths), gnunet, 2021/01/12
- [gnurl] 405/411: urldata: restore comment on ssl_connect_data.use, gnunet, 2021/01/12
- [gnurl] 396/411: scripts/completion.pl: parse all opts, gnunet, 2021/01/12
- [gnurl] 388/411: cmake: check for linux/tcp.h, gnunet, 2021/01/12
- [gnurl] 401/411: ftp: make wc_statemach loop instead of recurse, gnunet, 2021/01/12
- [gnurl] 395/411: RELEASE-NOTES: synced, gnunet, 2021/01/12
- [gnurl] 390/411: quiche: close the connection, gnunet, 2021/01/12
- [gnurl] 404/411: VERSIONS: refreshed, gnunet, 2021/01/12
- [gnurl] 402/411: openssl: make the OCSP verification verify the certificate id, gnunet, 2021/01/12
- [gnurl] 400/411: ftp: CURLOPT_FTP_SKIP_PASV_IP by default, gnunet, 2021/01/12
- [gnurl] 407/411: Merge tag 'curl-7_74_0',
gnunet <=
- [gnurl] 381/411: tests/server/tftpd.c: close upload file in case of abort, gnunet, 2021/01/12
- [gnurl] 389/411: ngtcp2: Fix build error due to symbol name change, gnunet, 2021/01/12
- [gnurl] 281/411: curl.1: add an "OUTPUT" section at the top of the manpage, gnunet, 2021/01/12