summaryrefslogtreecommitdiff
path: root/docs/libcurl
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2012-12-11 23:31:45 +0100
committerDaniel Stenberg <daniel@haxx.se>2012-12-11 23:31:45 +0100
commit50d7397ea54df79e403649d1e37d002eb52d268f (patch)
tree6b6eed95d3d4b69cd26e0b2377fa934d5ea99c09 /docs/libcurl
parenta3d6368c690b943e92082951e8c5fc3ef2d76c12 (diff)
parent4deb52831a071bc83cefb4871764281a5c32f902 (diff)
downloadcurl-multi-always.tar.gz
Merge branch 'multi2' into multi-alwaysmulti-always
Diffstat (limited to 'docs/libcurl')
-rw-r--r--docs/libcurl/.gitignore2
-rw-r--r--docs/libcurl/ABI69
-rw-r--r--docs/libcurl/Makefile.am102
-rw-r--r--docs/libcurl/curl_easy_cleanup.357
-rw-r--r--docs/libcurl/curl_easy_duphandle.351
-rw-r--r--docs/libcurl/curl_easy_escape.346
-rw-r--r--docs/libcurl/curl_easy_getinfo.3292
-rw-r--r--docs/libcurl/curl_easy_init.351
-rw-r--r--docs/libcurl/curl_easy_pause.385
-rw-r--r--docs/libcurl/curl_easy_perform.357
-rw-r--r--docs/libcurl/curl_easy_recv.369
-rw-r--r--docs/libcurl/curl_easy_reset.343
-rw-r--r--docs/libcurl/curl_easy_send.364
-rw-r--r--docs/libcurl/curl_easy_setopt.32527
-rw-r--r--docs/libcurl/curl_easy_strerror.337
-rw-r--r--docs/libcurl/curl_easy_unescape.351
-rw-r--r--docs/libcurl/curl_escape.348
-rw-r--r--docs/libcurl/curl_formadd.3235
-rw-r--r--docs/libcurl/curl_formfree.344
-rw-r--r--docs/libcurl/curl_formget.370
-rw-r--r--docs/libcurl/curl_free.335
-rw-r--r--docs/libcurl/curl_getdate.3117
-rw-r--r--docs/libcurl/curl_getenv.349
-rw-r--r--docs/libcurl/curl_global_cleanup.349
-rw-r--r--docs/libcurl/curl_global_init.380
-rw-r--r--docs/libcurl/curl_global_init_mem.360
-rw-r--r--docs/libcurl/curl_mprintf.3109
-rw-r--r--docs/libcurl/curl_multi_add_handle.357
-rw-r--r--docs/libcurl/curl_multi_assign.363
-rw-r--r--docs/libcurl/curl_multi_cleanup.346
-rw-r--r--docs/libcurl/curl_multi_fdset.370
-rw-r--r--docs/libcurl/curl_multi_info_read.376
-rw-r--r--docs/libcurl/curl_multi_init.340
-rw-r--r--docs/libcurl/curl_multi_perform.378
-rw-r--r--docs/libcurl/curl_multi_remove_handle.343
-rw-r--r--docs/libcurl/curl_multi_setopt.3103
-rw-r--r--docs/libcurl/curl_multi_socket.3158
-rw-r--r--docs/libcurl/curl_multi_socket_action.3149
-rw-r--r--docs/libcurl/curl_multi_socket_all.31
-rw-r--r--docs/libcurl/curl_multi_strerror.337
-rw-r--r--docs/libcurl/curl_multi_timeout.363
-rw-r--r--docs/libcurl/curl_multi_wait.375
-rw-r--r--docs/libcurl/curl_share_cleanup.340
-rw-r--r--docs/libcurl/curl_share_init.344
-rw-r--r--docs/libcurl/curl_share_setopt.385
-rw-r--r--docs/libcurl/curl_share_strerror.337
-rw-r--r--docs/libcurl/curl_slist_append.356
-rw-r--r--docs/libcurl/curl_slist_free_all.337
-rw-r--r--docs/libcurl/curl_strequal.351
-rw-r--r--docs/libcurl/curl_strnequal.31
-rw-r--r--docs/libcurl/curl_unescape.348
-rw-r--r--docs/libcurl/curl_version.336
-rw-r--r--docs/libcurl/curl_version_info.3154
-rw-r--r--docs/libcurl/getinfo-times27
-rw-r--r--docs/libcurl/index.html61
-rw-r--r--docs/libcurl/libcurl-easy.345
-rw-r--r--docs/libcurl/libcurl-errors.3289
-rw-r--r--docs/libcurl/libcurl-multi.3151
-rw-r--r--docs/libcurl/libcurl-share.362
-rw-r--r--docs/libcurl/libcurl-tutorial.31369
-rw-r--r--docs/libcurl/libcurl.3222
-rw-r--r--docs/libcurl/libcurl.m4251
-rw-r--r--docs/libcurl/symbols-in-versions705
-rwxr-xr-xdocs/libcurl/symbols.pl100
64 files changed, 9429 insertions, 0 deletions
diff --git a/docs/libcurl/.gitignore b/docs/libcurl/.gitignore
new file mode 100644
index 000000000..23f832b73
--- /dev/null
+++ b/docs/libcurl/.gitignore
@@ -0,0 +1,2 @@
+*.html
+*.pdf
diff --git a/docs/libcurl/ABI b/docs/libcurl/ABI
new file mode 100644
index 000000000..3ec0e04de
--- /dev/null
+++ b/docs/libcurl/ABI
@@ -0,0 +1,69 @@
+ _ _ ____ _
+ ___| | | | _ \| |
+ / __| | | | |_) | |
+ | (__| |_| | _ <| |___
+ \___|\___/|_| \_\_____|
+
+ libcurl's binary interface
+
+ABI - Application Binary Interface
+
+ First, allow me to define the word for this context: ABI describes the
+ low-level interface between an application program and a library. Calling
+ conventions, function arguments, return values, struct sizes/defines and
+ more.
+
+ For a longer description, see
+ http://en.wikipedia.org/wiki/Application_binary_interface
+
+Upgrades
+
+ In the vast majority of all cases, a typical libcurl upgrade does not break
+ the ABI at all. Your application can remain using libcurl just as before,
+ only with less bugs and possibly with added new features. You need to read
+ the release notes, and if they mention an ABI break/soname bump, you may
+ have to verify that your application still builds fine and uses libcurl as
+ it now is defined to work.
+
+Version Numbers
+
+ In libcurl land, you really can't tell by the libcurl version number if that
+ libcurl is binary compatible or not with another libcurl version.
+
+Soname Bumps
+
+ Whenever there are changes done to the library that will cause an ABI
+ breakage, that may require your application to get attention or possibly be
+ changed to adhere to new things, we will bump the soname. Then the library
+ will get a different output name and thus can in fact be installed in
+ parallel with an older installed lib (on most systems). Thus, old
+ applications built against the previous ABI version will remain working and
+ using the older lib, while newer applications build and use the newer one.
+
+ During the first seven years of libcurl releases, there have only been four
+ ABI breakages.
+
+Downgrades
+
+ Going to an older libcurl version from one you're currently using can be a
+ tricky thing. Mostly we add features and options to newer libcurls as that
+ won't break ABI or hamper existing applications. This has the implication
+ that going backwards may get you in a situation where you pick a libcurl
+ that doesn't support the options your application needs. Or possibly you
+ even downgrade so far so you cross an ABI break border and thus a different
+ soname, and then your application may need to adapt to the modified ABI.
+
+History
+
+ The previous major library soname number bumps (breaking backwards
+ compatibility) have happened the following times:
+
+ 0 - libcurl 7.1, August 2000
+
+ 1 - libcurl 7.5 December 2000
+
+ 2 - libcurl 7.7 March 2001
+
+ 3 - libcurl 7.12.0 June 2004
+
+ 4 - libcurl 7.16.0 October 2006
diff --git a/docs/libcurl/Makefile.am b/docs/libcurl/Makefile.am
new file mode 100644
index 000000000..3114e2b3b
--- /dev/null
+++ b/docs/libcurl/Makefile.am
@@ -0,0 +1,102 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \
+ curl_easy_perform.3 curl_easy_setopt.3 curl_easy_duphandle.3 \
+ curl_formadd.3 curl_formfree.3 curl_getdate.3 curl_getenv.3 \
+ curl_slist_append.3 curl_slist_free_all.3 curl_version.3 \
+ curl_version_info.3 curl_escape.3 curl_unescape.3 curl_free.3 \
+ curl_strequal.3 curl_mprintf.3 curl_global_init.3 curl_global_cleanup.3 \
+ curl_multi_add_handle.3 curl_multi_cleanup.3 curl_multi_fdset.3 \
+ curl_multi_info_read.3 curl_multi_init.3 curl_multi_perform.3 \
+ curl_multi_remove_handle.3 curl_share_cleanup.3 curl_share_init.3 \
+ curl_share_setopt.3 libcurl.3 libcurl-easy.3 libcurl-multi.3 \
+ libcurl-share.3 libcurl-errors.3 curl_easy_strerror.3 \
+ curl_multi_strerror.3 curl_share_strerror.3 curl_global_init_mem.3 \
+ libcurl-tutorial.3 curl_easy_reset.3 curl_easy_escape.3 \
+ curl_easy_unescape.3 curl_multi_setopt.3 curl_multi_socket.3 \
+ curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3 \
+ curl_easy_pause.3 curl_easy_recv.3 curl_easy_send.3 \
+ curl_multi_socket_action.3 curl_multi_wait.3
+
+HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html \
+ curl_easy_init.html curl_easy_perform.html curl_easy_setopt.html \
+ curl_easy_duphandle.html curl_formadd.html curl_formfree.html \
+ curl_getdate.html curl_getenv.html curl_slist_append.html \
+ curl_slist_free_all.html curl_version.html curl_version_info.html \
+ curl_escape.html curl_unescape.html curl_free.html curl_strequal.html \
+ curl_mprintf.html curl_global_init.html curl_global_cleanup.html \
+ curl_multi_add_handle.html curl_multi_cleanup.html \
+ curl_multi_fdset.html curl_multi_info_read.html curl_multi_init.html \
+ curl_multi_perform.html curl_multi_remove_handle.html \
+ curl_share_cleanup.html curl_share_init.html curl_share_setopt.html \
+ libcurl.html libcurl-multi.html libcurl-easy.html libcurl-share.html \
+ libcurl-errors.html curl_easy_strerror.html curl_multi_strerror.html \
+ curl_share_strerror.html curl_global_init_mem.html \
+ libcurl-tutorial.html curl_easy_reset.html curl_easy_escape.html \
+ curl_easy_unescape.html curl_multi_setopt.html curl_multi_socket.html \
+ curl_multi_timeout.html curl_formget.html curl_multi_assign.html \
+ curl_easy_pause.html curl_easy_recv.html curl_easy_send.html \
+ curl_multi_socket_action.html curl_multi_wait.html
+
+PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf \
+ curl_easy_init.pdf curl_easy_perform.pdf curl_easy_setopt.pdf \
+ curl_easy_duphandle.pdf curl_formadd.pdf curl_formfree.pdf \
+ curl_getdate.pdf curl_getenv.pdf curl_slist_append.pdf \
+ curl_slist_free_all.pdf curl_version.pdf curl_version_info.pdf \
+ curl_escape.pdf curl_unescape.pdf curl_free.pdf curl_strequal.pdf \
+ curl_mprintf.pdf curl_global_init.pdf curl_global_cleanup.pdf \
+ curl_multi_add_handle.pdf curl_multi_cleanup.pdf curl_multi_fdset.pdf \
+ curl_multi_info_read.pdf curl_multi_init.pdf curl_multi_perform.pdf \
+ curl_multi_remove_handle.pdf curl_share_cleanup.pdf curl_share_init.pdf \
+ curl_share_setopt.pdf libcurl.pdf libcurl-multi.pdf libcurl-easy.pdf \
+ libcurl-share.pdf libcurl-errors.pdf curl_easy_strerror.pdf \
+ curl_multi_strerror.pdf curl_share_strerror.pdf \
+ curl_global_init_mem.pdf libcurl-tutorial.pdf curl_easy_reset.pdf \
+ curl_easy_escape.pdf curl_easy_unescape.pdf curl_multi_setopt.pdf \
+ curl_multi_socket.pdf curl_multi_timeout.pdf curl_formget.pdf \
+ curl_multi_assign.pdf curl_easy_pause.pdf curl_easy_recv.pdf \
+ curl_easy_send.pdf curl_multi_socket_action.pdf curl_multi_wait.pdf
+
+CLEANFILES = $(HTMLPAGES) $(PDFPAGES)
+
+EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) libcurl.m4 ABI \
+ symbols-in-versions symbols.pl
+MAN2HTML= roffit --mandir=. < $< >$@
+
+SUFFIXES = .3 .html
+
+html: $(HTMLPAGES)
+
+.3.html:
+ $(MAN2HTML)
+
+pdf: $(PDFPAGES)
+
+.3.pdf:
+ @(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \
+ groff -Tps -man $< >$$foo.ps; \
+ ps2pdf $$foo.ps $@; \
+ rm $$foo.ps; \
+ echo "converted $< to $@")
diff --git a/docs/libcurl/curl_easy_cleanup.3 b/docs/libcurl/curl_easy_cleanup.3
new file mode 100644
index 000000000..d8a3f9fcf
--- /dev/null
+++ b/docs/libcurl/curl_easy_cleanup.3
@@ -0,0 +1,57 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH curl_easy_cleanup 3 "22 aug 2007" "libcurl 7.17.0" "libcurl Manual"
+.SH NAME
+curl_easy_cleanup - End a libcurl easy session
+.SH SYNOPSIS
+.B #include <curl/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 the curl_easy_init call returned.
+
+This will effectively close all connections this handle has used and possibly
+has kept open until now. Don't call this function if you intend to transfer
+more files.
+
+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 uses of the \fBhandle\fP after this function has been called and have
+returned, are illegal. This kills the handle and all memory associated with
+it!
+
+With libcurl versions prior to 7.17.: when you've called this, 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 "SEE ALSO"
+.BR curl_easy_init "(3), "
+
diff --git a/docs/libcurl/curl_easy_duphandle.3 b/docs/libcurl/curl_easy_duphandle.3
new file mode 100644
index 000000000..e53ced48b
--- /dev/null
+++ b/docs/libcurl/curl_easy_duphandle.3
@@ -0,0 +1,51 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_duphandle 3 "18 September 2001" "libcurl 7.9" "libcurl Manual"
+.SH NAME
+curl_easy_duphandle - Clone a libcurl session handle
+.SH SYNOPSIS
+.B #include <curl/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.
+
+\fBNote\fP that even 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_global_init "(3)
+
diff --git a/docs/libcurl/curl_easy_escape.3 b/docs/libcurl/curl_easy_escape.3
new file mode 100644
index 000000000..3a98e6fe8
--- /dev/null
+++ b/docs/libcurl/curl_easy_escape.3
@@ -0,0 +1,46 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH curl_easy_escape 3 "7 April 2006" "libcurl 7.15.4" "libcurl Manual"
+.SH NAME
+curl_easy_escape - URL encodes the given string
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "char *curl_easy_escape( CURL *" curl ", char *" url ", int "length " );"
+.ad
+.SH DESCRIPTION
+This function converts the given input string to an 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 the \fBlength\fP argument is set to 0 (zero), \fIcurl_easy_escape(3)\fP
+uses strlen() on the input \fBurl\fP to find out the size.
+
+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_escape(3)\fP function.
+.SH RETURN VALUE
+A pointer to a zero terminated string or NULL if it failed.
+.SH "SEE ALSO"
+.BR curl_easy_unescape "(3), " curl_free "(3), " RFC 2396
diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3
new file mode 100644
index 000000000..096813609
--- /dev/null
+++ b/docs/libcurl/curl_easy_getinfo.3
@@ -0,0 +1,292 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH curl_easy_getinfo 3 "11 Feb 2009" "libcurl 7.19.4" "libcurl Manual"
+.SH NAME
+curl_easy_getinfo - extract information from a curl handle
+.SH SYNOPSIS
+.B #include <curl/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- oriented
+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_URL
+Pass a pointer to a char pointer to receive the last used effective URL.
+.IP CURLINFO_RESPONSE_CODE
+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 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\fP and not this.
+
+Support for SMTP responses added in 7.25.0.
+.IP CURLINFO_HTTP_CONNECTCODE
+Pass a pointer to a long to receive the last received proxy response code to a
+CONNECT request.
+.IP CURLINFO_FILETIME
+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 (unknown, the server hides it or the
+server doesn't support the command that tells document time etc) and the time
+of the document is unknown. Note that you must tell the server to collect this
+information before the transfer is made, by using the CURLOPT_FILETIME option
+to \fIcurl_easy_setopt(3)\fP or you will unconditionally get a -1 back. (Added
+in 7.5)
+.IP CURLINFO_TOTAL_TIME
+Pass a pointer to a double to receive the total time in seconds for the
+previous transfer, including name resolving, TCP connect etc.
+.IP CURLINFO_NAMELOOKUP_TIME
+Pass a pointer to a double to receive the time, in seconds, it took from the
+start until the name resolving was completed.
+.IP CURLINFO_CONNECT_TIME
+Pass a pointer to a double to receive the time, in seconds, it took from the
+start until the connect to the remote host (or proxy) was completed.
+.IP CURLINFO_APPCONNECT_TIME
+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 PRETRANSFER time, except for cases
+such as HTTP pippelining where the pretransfer time can be delayed due to
+waits in line for the pipeline and more. (Added in 7.19.0)
+.IP CURLINFO_PRETRANSFER_TIME
+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.
+.IP CURLINFO_STARTTRANSFER_TIME
+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
+CURLINFO_PRETRANSFER_TIME and also the time the server needs to calculate the
+result.
+.IP CURLINFO_REDIRECT_TIME
+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. (Added in 7.9.7)
+.IP CURLINFO_REDIRECT_COUNT
+Pass a pointer to a long to receive the total number of redirections that were
+actually followed. (Added in 7.9.7)
+.IP CURLINFO_REDIRECT_URL
+Pass a pointer to a char pointer to receive the URL a redirect \fIwould\fP
+take you to if you would enable CURLOPT_FOLLOWLOCATION. 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. (Added in 7.18.2)
+.IP CURLINFO_SIZE_UPLOAD
+Pass a pointer to a double to receive the total amount of bytes that were
+uploaded.
+.IP CURLINFO_SIZE_DOWNLOAD
+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.
+.IP CURLINFO_SPEED_DOWNLOAD
+Pass a pointer to a double to receive the average download speed that curl
+measured for the complete download. Measured in bytes/second.
+.IP CURLINFO_SPEED_UPLOAD
+Pass a pointer to a double to receive the average upload speed that curl
+measured for the complete upload. Measured in bytes/second.
+.IP CURLINFO_HEADER_SIZE
+Pass a pointer to a long to receive the total size of all the headers
+received. Measured in number of bytes.
+.IP CURLINFO_REQUEST_SIZE
+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 FOLLOWLOCATION is true.
+.IP CURLINFO_SSL_VERIFYRESULT
+Pass a pointer to a long to receive the result of the certification
+verification that was requested (using the CURLOPT_SSL_VERIFYPEER option to
+\fIcurl_easy_setopt(3)\fP).
+.IP CURLINFO_SSL_ENGINES
+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. (Added in 7.12.3)
+.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD
+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.
+.IP CURLINFO_CONTENT_LENGTH_UPLOAD
+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.
+.IP CURLINFO_CONTENT_TYPE
+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.
+.IP CURLINFO_PRIVATE
+Pass a pointer to a char pointer to receive the pointer to the private data
+associated with the curl handle (set with the CURLOPT_PRIVATE option to
+\fIcurl_easy_setopt(3)\fP). Please note that for internal reasons, the
+value is returned as a char pointer, although effectively being a 'void *'.
+(Added in 7.10.3)
+.IP CURLINFO_HTTPAUTH_AVAIL
+Pass a pointer to a long to receive a bitmask indicating the authentication
+method(s) available. The meaning of the bits is explained in the
+CURLOPT_HTTPAUTH option for \fIcurl_easy_setopt(3)\fP. (Added in 7.10.8)
+.IP CURLINFO_PROXYAUTH_AVAIL
+Pass a pointer to a long to receive a bitmask indicating the authentication
+method(s) available for your proxy authentication. (Added in 7.10.8)
+.IP CURLINFO_OS_ERRNO
+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
+successfull operation. (Added in 7.12.2)
+.IP CURLINFO_NUM_CONNECTS
+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\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. (Added in 7.12.3)
+.IP CURLINFO_PRIMARY_IP
+Pass a pointer to a char pointer to receive the pointer to a zero-terminated
+string holding the IP address of the most recent connection done with this
+\fBcurl\fP handle. This string may be IPv6 if that's 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. (Added in 7.19.0)
+.IP CURLINFO_PRIMARY_PORT
+Pass a pointer to a long to receive the destination port of the most recent
+connection done with this \fBcurl\fP handle. (Added in 7.21.0)
+.IP CURLINFO_LOCAL_IP
+Pass a pointer to a char pointer to receive the pointer to a zero-terminated
+string holding the local (source) IP address of the most recent connection done
+with this \fBcurl\fP handle. This string may be IPv6 if that's enabled. The
+same restrictions apply as to \fICURLINFO_PRIMARY_IP\fP. (Added in 7.21.0)
+.IP CURLINFO_LOCAL_PORT
+Pass a pointer to a long to receive the local (source) port of the most recent
+connection done with this \fBcurl\fP handle. (Added in 7.21.0)
+.IP CURLINFO_COOKIELIST
+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
+\fIcurl_slist_free_all(3)\fP 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. (Added in
+7.14.1)
+.IP CURLINFO_LASTSOCKET
+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\fP.
+(Added in 7.15.2)
+
+NOTE: this API is not really working on win64, since the SOCKET type on win64
+is 64 bit large while its 'long' is only 32 bits.
+.IP CURLINFO_FTP_ENTRY_PATH
+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. (Added in 7.15.4)
+
+Also works for SFTP since 7.21.4
+.IP CURLINFO_CERTINFO
+Pass a pointer to a 'struct curl_certinfo *' and you'll get it set to point to
+struct that holds a number of linked lists with info about the certificate
+chain, assuming you had CURLOPT_CERTINFO enabled when the previous request was
+done. 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. NOTE: this
+option is only available in libcurl built with OpenSSL support. (Added in
+7.19.1)
+.IP CURLINFO_CONDITION_UNMET
+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\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 ths argument points to will
+get a zero stored if the condition instead was met. (Added in 7.19.4)
+.IP CURLINFO_RTSP_SESSION_ID
+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
+retreive this info before closing the active connection.
+.IP CURLINFO_RTSP_CLIENT_CSEQ
+Pass a pointer to a long to receive the next CSeq that will be used by the
+application.
+.IP CURLINFO_RTSP_SERVER_CSEQ
+Pass a pointer to a long to receive the next server CSeq that will be expected
+by the application.
+
+\fI(NOTE: listening for server initiated requests is currently
+unimplemented).\fP
+
+Applications wishing to resume an RTSP session on another connection should
+retreive this info before closing the active connection.
+.IP CURLINFO_RTSP_CSEQ_RECV
+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 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. The time it took from the start until the name
+resolving was completed.
+.IP CONNECT
+\fICURLINFO_CONNECT_TIME\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. The time it took from the start until the SSL
+connect/handshake with the remote host was completed. (Added in in 7.19.0)
+.IP PRETRANSFER
+\fICURLINFO_PRETRANSFER_TIME\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. The time it took from the start until the
+first byte is received by libcurl.
+.IP TOTAL
+\fICURLINFO_TOTAL_TIME\fP. Total time of the previous request.
+.IP REDIRECT
+\fICURLINFO_REDIRECT_TIME\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 --git a/docs/libcurl/curl_easy_init.3 b/docs/libcurl/curl_easy_init.3
new file mode 100644
index 000000000..837ba32a5
--- /dev/null
+++ b/docs/libcurl/curl_easy_init.3
@@ -0,0 +1,51 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_init 3 "4 March 2002" "libcurl 7.8.1" "libcurl Manual"
+.SH NAME
+curl_easy_init - Start a libcurl easy session
+.SH SYNOPSIS
+.B #include <curl/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 easy-functions. curl_easy_init
+initializes curl and 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 "SEE ALSO"
+.BR curl_easy_cleanup "(3), " curl_global_init "(3), " curl_easy_reset "(3)"
diff --git a/docs/libcurl/curl_easy_pause.3 b/docs/libcurl/curl_easy_pause.3
new file mode 100644
index 000000000..25d67bfbb
--- /dev/null
+++ b/docs/libcurl/curl_easy_pause.3
@@ -0,0 +1,85 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_pause 3 "17 Dec 2007" "libcurl 7.18.0" "libcurl Manual"
+.SH NAME
+curl_easy_pause - pause and unpause a connection
+.SH SYNOPSIS
+.B #include <curl/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.
+
+NOTE: while it may feel tempting, take care and notice that you cannot call
+this function from another thread.
+
+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\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\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 AVAILABILITY
+This function was added in libcurl 7.18.0. Before this version, there was no
+explicit support for pausing transfers.
+.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 --git a/docs/libcurl/curl_easy_perform.3 b/docs/libcurl/curl_easy_perform.3
new file mode 100644
index 000000000..8f8517f22
--- /dev/null
+++ b/docs/libcurl/curl_easy_perform.3
@@ -0,0 +1,57 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_perform 3 "5 Mar 2001" "libcurl 7.7" "libcurl Manual"
+.SH NAME
+curl_easy_perform - Perform a file transfer
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLcode curl_easy_perform(CURL *" handle ");"
+.ad
+.SH DESCRIPTION
+This function is called after the init 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
+.I handle
+as input as the curl_easy_init call returned.
+
+You can do any amount of calls to \fIcurl_easy_perform(3)\fP while using the
+same handle. 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 handle. Let the function return first before invoking it another time. If
+you want parallel transfers, you must use several curl handles.
+.SH RETURN VALUE
+0 means everything was ok, non-zero means an error occurred as
+.I <curl/curl.h>
+defines. If the CURLOPT_ERRORBUFFER was set with
+.I curl_easy_setopt
+there will be a readable error message in the error buffer when non-zero is
+returned.
+.SH "SEE ALSO"
+.BR curl_easy_init "(3), " curl_easy_setopt "(3), "
+
diff --git a/docs/libcurl/curl_easy_recv.3 b/docs/libcurl/curl_easy_recv.3
new file mode 100644
index 000000000..1ede58944
--- /dev/null
+++ b/docs/libcurl/curl_easy_recv.3
@@ -0,0 +1,69 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH curl_easy_recv 3 "29 April 2008" "libcurl 7.18.2" "libcurl Manual"
+.SH NAME
+curl_easy_recv - receives raw data on an "easy" connection
+.SH SYNOPSIS
+.B #include <curl/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 \fBCURLOPT_CONNECT_ONLY\fP option before
+calling \fIcurl_easy_perform(3)\fP. Note that \fIcurl_easy_recv(3)\fP does not
+work on connections that were created without this option.
+
+You must ensure that the socket has data to read before calling
+\fIcurl_easy_recv(3)\fP, otherwise the call will return \fBCURLE_AGAIN\fP -
+the socket is used in non-blocking mode internally. Use
+\fIcurl_easy_getinfo(3)\fP with \fBCURLINFO_LASTSOCKET\fP to obtain the
+socket; use your operating system facilities like \fIselect(2)\fP to check if
+it has any data you can read.
+.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.
+
+If there is no data to read, the function returns \fBCURLE_AGAIN\fP. Use
+your operating system facilities to wait until the data is ready, and retry.
+.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 --git a/docs/libcurl/curl_easy_reset.3 b/docs/libcurl/curl_easy_reset.3
new file mode 100644
index 000000000..592d3ed5c
--- /dev/null
+++ b/docs/libcurl/curl_easy_reset.3
@@ -0,0 +1,43 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_reset 3 "31 July 2004" "libcurl 7.12.1" "libcurl Manual"
+.SH NAME
+curl_easy_reset - reset all options of a libcurl session handle
+.SH SYNOPSIS
+.B #include <curl/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 and shares.
+.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)
+
diff --git a/docs/libcurl/curl_easy_send.3 b/docs/libcurl/curl_easy_send.3
new file mode 100644
index 000000000..17c4c1f54
--- /dev/null
+++ b/docs/libcurl/curl_easy_send.3
@@ -0,0 +1,64 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH curl_easy_send 3 "29 April 2008" "libcurl 7.18.2" "libcurl Manual"
+.SH NAME
+curl_easy_send - sends raw data over an "easy" connection
+.SH SYNOPSIS
+.B #include <curl/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 \fBCURLOPT_CONNECT_ONLY\fP option before
+calling \fIcurl_easy_perform(3)\fP. Note that \fIcurl_easy_send(3)\fP will not
+work on connections that were created without this option.
+
+You must ensure that the socket is writable before calling
+\fIcurl_easy_send(3)\fP, otherwise the call will return \fBCURLE_AGAIN\fP -
+the socket is used in non-blocking mode internally. Use
+\fIcurl_easy_getinfo(3)\fP with \fBCURLINFO_LASTSOCKET\fP to obtain the
+socket; use your operating system facilities like \fIselect(2)\fP to check if
+it can be written to.
+.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.
+.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 --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
new file mode 100644
index 000000000..9d712a45e
--- /dev/null
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -0,0 +1,2527 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH curl_easy_setopt 3 "1 Jan 2010" "libcurl 7.20.0" "libcurl Manual"
+.SH NAME
+curl_easy_setopt \- set options for a curl easy handle
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
+.SH DESCRIPTION
+curl_easy_setopt() is used to tell libcurl how to behave. By using the
+appropriate options to \fIcurl_easy_setopt\fP, you can change libcurl's
+behavior. All options are set with the \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 curl_easy_setopt() 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 curl_easy_setopt() returns. Exceptions to this rule are described in
+the option details below.
+
+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
+Set the parameter to 1 to get the library to display a lot of verbose
+information about its operations. 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\fP.
+
+You hardly ever want this set in production use, you will almost always want
+this when you debug/report problems. Another neat option for debugging is the
+\fICURLOPT_DEBUGFUNCTION\fP.
+.IP CURLOPT_HEADER
+A parameter set to 1 tells the library to include the header in the body
+output. This is only relevant for protocols that actually have headers
+preceding the data (like HTTP).
+.IP CURLOPT_NOPROGRESS
+Pass a long. If set to 1, it tells the library to shut off the progress meter
+completely. It will also prevent the \fICURLOPT_PROGRESSFUNCTION\fP from
+getting called.
+
+Future versions of libcurl are likely to not have any built-in progress meter
+at all.
+.IP CURLOPT_NOSIGNAL
+Pass a long. If it 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 mainly here to allow multi-threaded unix applications
+to still set/use all timeout options etc, without risking getting signals.
+(Added in 7.10)
+
+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 c-ares support to enable asynchronous DNS
+lookups, which enables nice timeouts for name resolves without signals.
+
+Setting \fICURLOPT_NOSIGNAL\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.
+.IP CURLOPT_WILDCARDMATCH
+Set this option 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\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\fP
+option.
+
+This feature is only supported by the FTP download for now.
+
+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)
+.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
+(This was added in 7.21.0)
+.SH CALLBACK OPTIONS
+.IP CURLOPT_WRITEFUNCTION
+Pass a pointer to a function that matches the following prototype:
+\fBsize_t function( char *ptr, size_t size, size_t nmemb, void *userdata);\fP
+This function gets called by libcurl as soon as there is data received that
+needs to be saved. The size of the data pointed to by \fIptr\fP is \fIsize\fP
+multiplied with \fInmemb\fP, it will not be zero terminated. Return the number
+of bytes actually taken care of. If that amount differs from the amount passed
+to your function, it'll signal an error to the library. This will abort the
+transfer and return \fICURLE_WRITE_ERROR\fP.
+
+From 7.18.0, the function can return CURL_WRITEFUNC_PAUSE which then will
+cause writing to this connection to become paused. See
+\fIcurl_easy_pause(3)\fP for further details.
+
+This function may be called with zero bytes data if the transferred file is
+empty.
+
+Set this option to NULL to get the internal default function. The internal
+default function will write the data to the FILE * given with
+\fICURLOPT_WRITEDATA\fP.
+
+Set the \fIuserdata\fP argument with the \fICURLOPT_WRITEDATA\fP option.
+
+The callback function will be passed as much data as possible in all invokes,
+but you cannot possibly make any assumptions. It may be one byte, it may be
+thousands. The maximum amount of body data that can be passed to the write
+callback is defined in the curl.h header file: CURL_MAX_WRITE_SIZE (the usual
+default is 16K). If you however have \fICURLOPT_HEADER\fP set, which sends
+header data 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.
+.IP CURLOPT_WRITEDATA
+Data pointer to pass to the file write function. If you use the
+\fICURLOPT_WRITEFUNCTION\fP option, this is the pointer you'll get as
+input. If you don't use a callback, you must pass a 'FILE *' as libcurl will
+pass this to fwrite() when writing data.
+
+The internal \fICURLOPT_WRITEFUNCTION\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 the
+\fICURLOPT_WRITEFUNCTION\fP if you set this option or you will experience
+crashes.
+
+This option is also known with the older name \fICURLOPT_FILE\fP, the name
+\fICURLOPT_WRITEDATA\fP was introduced in 7.9.7.
+.IP CURLOPT_READFUNCTION
+Pass a pointer to a function that matches the following prototype:
+\fBsize_t function( void *ptr, size_t size, size_t nmemb, void *userdata);\fP
+This function gets called by libcurl as soon as it needs to read data in order
+to send it to the peer. The data area pointed at by the pointer \fIptr\fP may
+be filled with at most \fIsize\fP multiplied with \fInmemb\fP number of
+bytes. Your function must return the actual number of bytes that you 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 (Added in 7.12.1)
+
+From 7.18.0, the function can return CURL_READFUNC_PAUSE which then will cause
+reading from this connection to become paused. See \fIcurl_easy_pause(3)\fP
+for further details.
+
+\fBBugs\fP: 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 \fICURLOPT_READDATA\fP.
+.IP CURLOPT_READDATA
+Data pointer to pass to the file read function. If you use the
+\fICURLOPT_READFUNCTION\fP option, this is the pointer you'll get as input. 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 *.
+
+If you're using libcurl as a win32 DLL, you MUST use a
+\fICURLOPT_READFUNCTION\fP if you set this option.
+
+This option was also known by the older name \fICURLOPT_INFILE\fP, the name
+\fICURLOPT_READDATA\fP was introduced in 7.9.7.
+.IP CURLOPT_IOCTLFUNCTION
+Pass a pointer to a function that matches the following prototype:
+\fBcurlioerr function(CURL *handle, int cmd, void *clientp);\fP. This 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 a HTTP PUT or POST with a multi-pass authentication
+method. (Option added in 7.12.3).
+
+Use \fICURLOPT_SEEKFUNCTION\fP instead to provide seeking!
+.IP CURLOPT_IOCTLDATA
+Pass a pointer that will be untouched by libcurl and passed as the 3rd
+argument in the ioctl callback set with \fICURLOPT_IOCTLFUNCTION\fP. (Option
+added in 7.12.3)
+.IP CURLOPT_SEEKFUNCTION
+Pass a pointer to a function that matches the following prototype: \fBint
+function(void *instream, curl_off_t offset, int origin);\fP 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 doing a HTTP PUT or POST with a multi-pass authentication
+method. The function shall work like "fseek" or "lseek" and accepted SEEK_SET,
+SEEK_CUR and SEEK_END as argument for origin, although (in 7.18.0) libcurl
+only passes SEEK_SET. The callback must return 0 (CURL_SEEKFUNC_OK) on
+success, 1 (CURL_SEEKFUNC_FAIL) to cause the upload operation to fail or 2
+(CURL_SEEKFUNC_CANTSEEK) 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" or "lseek", note that
+the data type for \fIoffset\fP is not the same as defined for curl_off_t on
+many systems! (Option added in 7.18.0)
+.IP CURLOPT_SEEKDATA
+Data pointer to pass to the file seek function. If you use the
+\fICURLOPT_SEEKFUNCTION\fP option, this is the pointer you'll get as input. If
+you don't specify a seek callback, NULL is passed. (Option added in 7.18.0)
+.IP CURLOPT_SOCKOPTFUNCTION
+Pass a pointer to a function that matches the following prototype: \fBint
+function(void *clientp, curl_socket_t curlfd, curlsocktype purpose);\fP. This
+function gets called by libcurl after the socket() call but before the
+connect() call. 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. It passes the newly
+created socket descriptor so additional setsockopt() calls can be done at the
+user's discretion. Return 0 (zero) from the callback on success. Return 1
+from the callback function to signal an unrecoverable error to the library and
+it will close the socket and return \fICURLE_COULDNT_CONNECT\fP. (Option
+added in 7.16.0)
+
+Added in 7.21.5, the callback function may return
+\fICURL_SOCKOPT_ALREADY_CONNECTED\fP, which tells libcurl that the socket is
+in fact already connected and then libcurl will not attempt to connect it.
+.IP CURLOPT_SOCKOPTDATA
+Pass a pointer that will be untouched by libcurl and passed as the first
+argument in the sockopt callback set with \fICURLOPT_SOCKOPTFUNCTION\fP.
+(Option added in 7.16.0)
+.IP CURLOPT_OPENSOCKETFUNCTION
+Pass a pointer to a function that matches the following prototype:
+\fBcurl_socket_t function(void *clientp, curlsocktype purpose, struct
+curl_sockaddr *address);\fP. This 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. Future versions of libcurl may support more purposes. It
+passes the resolved peer address as a \fIaddress\fP argument so the callback
+can modify the address or refuse to connect at all. The callback function
+should return the 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 be done on the socket at the user's discretion.
+\fICURL_SOCKET_BAD\fP return value from the callback function will signal an
+unrecoverable error to the library and it will return
+\fICURLE_COULDNT_CONNECT\fP. This return code can be used for IP address
+blacklisting. The default behavior is:
+.nf
+ return socket(addr->family, addr->socktype, addr->protocol);
+.fi
+(Option added in 7.17.1.)
+.IP CURLOPT_OPENSOCKETDATA
+Pass a pointer that will be untouched by libcurl and passed as the first
+argument in the opensocket callback set with \fICURLOPT_OPENSOCKETFUNCTION\fP.
+(Option added in 7.17.1.)
+.IP CURLOPT_CLOSESOCKETFUNCTION
+Pass a pointer to a function that matches the following prototype: \fBint
+function(void *clientp, curl_socket_t item);\fP. This 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\fP option. Return 0 to signal
+success and 1 if there was an error. (Option added in 7.21.7)
+.IP CURLOPT_CLOSESOCKETDATA
+Pass a pointer that will be untouched by libcurl and passed as the first
+argument in the closesocket callback set with
+\fICURLOPT_CLOSESOCKETFUNCTION\fP. (Option added in 7.21.7)
+.IP CURLOPT_PROGRESSFUNCTION
+Pass a pointer to a function that matches the following prototype: \fBint
+function(void *clientp, double dltotal, double dlnow, double ultotal, double
+ulnow); \fP. This function gets called by libcurl instead of its internal
+equivalent with a frequent interval during operation (roughly once per second
+or sooner) no matter if data is being transferred or not. 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). Returning a 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\fP must be set to 0 to make this function actually
+get called.
+.IP CURLOPT_PROGRESSDATA
+Pass a pointer that will be untouched by libcurl and passed as the first
+argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION\fP.
+.IP CURLOPT_HEADERFUNCTION
+Pass a pointer to a function that matches the following prototype:
+\fBsize_t function( void *ptr, size_t size, size_t nmemb, void
+*userdata);\fP. 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. The size of the data pointed to by \fIptr\fP is
+\fIsize\fP multiplied with \fInmemb\fP. Do not assume that the header line is
+zero terminated! The pointer named \fIuserdata\fP is the one you set with the
+\fICURLOPT_WRITEHEADER\fP option. The callback function must return the number
+of bytes actually taken care of. If that amount differs from the amount passed
+to your function, it'll signal an error to the library. This will abort the
+transfer and return \fICURL_WRITE_ERROR\fP.
+
+A complete HTTP header that is passed to this function can be up to
+\fICURL_MAX_HTTP_HEADER\fP (100K) bytes.
+
+If this option is not set, or if it is set to NULL, but
+\fICURLOPT_HEADERDATA\fP (\fICURLOPT_WRITEHEADER\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\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.
+
+When a server sends a chunked encoded transfer, it may contain a trailer. That
+trailer is identical to a 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.
+.IP CURLOPT_WRITEHEADER
+(This option is also known as \fBCURLOPT_HEADERDATA\fP) Pass a pointer to be
+used to write the header part of the received data to. If you don't use
+\fICURLOPT_WRITEFUNCTION\fP or \fICURLOPT_HEADERFUNCTION\fP to take care of
+the writing, this must be a valid FILE * as the internal default will then be
+a plain fwrite(). See also the \fICURLOPT_HEADERFUNCTION\fP option above on
+how to set a custom get-all-headers callback.
+.IP CURLOPT_DEBUGFUNCTION
+Pass a pointer to a function that matches the following prototype: \fBint
+curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP
+\fICURLOPT_DEBUGFUNCTION\fP replaces the standard debug function used when
+\fICURLOPT_VERBOSE \fP is in effect. This callback receives debug information,
+as specified with the \fBcurl_infotype\fP argument. This function must return
+0. The data pointed to by the char * passed to this function WILL NOT be zero
+terminated, but will be exactly of the size as told by the size_t argument.
+
+Available curl_infotype values:
+.RS
+.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.
+.RE
+.IP CURLOPT_DEBUGDATA
+Pass a pointer to whatever you want passed in to your
+\fICURLOPT_DEBUGFUNCTION\fP in the last void * argument. This pointer is not
+used by libcurl, it is only passed to the callback.
+.IP CURLOPT_SSL_CTX_FUNCTION
+This option does only function for libcurl powered by OpenSSL. If libcurl was
+built against another SSL library, this functionality is absent.
+
+Pass a pointer to a function that matches the following prototype:
+\fBCURLcode sslctxfun(CURL *curl, void *sslctx, void *parm);\fP This function
+gets called by libcurl just before the initialization of a SSL connection
+after having processed all other SSL related options to give a last chance to
+an application to modify the behaviour of openssl's ssl initialization. The
+\fIsslctx\fP parameter is actually a pointer to an openssl \fISSL_CTX\fP. If
+an error is returned no attempt to establish a connection is made and the
+perform operation will return the error code from this callback function. Set
+the \fIparm\fP argument with the \fICURLOPT_SSL_CTX_DATA\fP option. This
+option was introduced in 7.11.0.
+
+This function will get called on all new connections made to a server, during
+the SSL negotiation. The SSL_CTX pointer will be a new one every time.
+
+To use this properly, a non-trivial amount of knowledge of the openssl
+libraries is necessary. For example, using this function allows you to use
+openssl callbacks to add additional validation code for certificates, and even
+to change the actual URI of a HTTPS request (example used in the lib509 test
+case). See also the example section for a replacement of the key, certificate
+and trust file settings.
+.IP CURLOPT_SSL_CTX_DATA
+Data pointer to pass to the ssl context callback set by the option
+\fICURLOPT_SSL_CTX_FUNCTION\fP, this is the pointer you'll get as third
+parameter, otherwise \fBNULL\fP. (Added in 7.11.0)
+.IP CURLOPT_CONV_TO_NETWORK_FUNCTION
+.IP CURLOPT_CONV_FROM_NETWORK_FUNCTION
+.IP CURLOPT_CONV_FROM_UTF8_FUNCTION
+Pass a pointer to a function that matches the following prototype:
+\fBCURLcode function(char *ptr, size_t length);\fP
+
+These three options apply to non-ASCII platforms only. They are available
+only if \fBCURL_DOES_CONVERSIONS\fP was defined when libcurl was built. When
+this is the case, \fIcurl_version_info(3)\fP will return the CURL_VERSION_CONV
+feature bit set.
+
+The data to be converted is in a buffer pointed to by the ptr parameter. The
+amount of data to convert is indicated by the length parameter. The converted
+data overlays the input data in the buffer pointed to by the ptr parameter.
+CURLE_OK should be returned upon successful conversion. A CURLcode return
+value defined by curl.h, such as CURLE_CONV_FAILED, should be returned if an
+error was encountered.
+
+\fBCURLOPT_CONV_TO_NETWORK_FUNCTION\fP and
+\fBCURLOPT_CONV_FROM_NETWORK_FUNCTION\fP convert between the host encoding and
+the network encoding. They are used when commands or ASCII data are
+sent/received over the network.
+
+\fBCURLOPT_CONV_FROM_UTF8_FUNCTION\fP is called to convert from UTF8 into the
+host 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.
+.IP CURLOPT_INTERLEAVEFUNCTION
+Pass a pointer to a function that matches the following prototype:
+\fBsize_t function( void *ptr, size_t size, size_t nmemb, void
+*userdata)\fP. This 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. (Added
+in 7.20.0)
+.IP CURLOPT_INTERLEAVEDATA
+This is the userdata pointer that will be passed to
+\fICURLOPT_INTERLEAVEFUNCTION\fP when interleaved RTP data is received. (Added
+in 7.20.0)
+.IP CURLOPT_CHUNK_BGN_FUNCTION
+Pass a pointer to a function that matches the following prototype:
+\fBlong function (const void *transfer_info, void *ptr, int remains)\fP. This
+function gets called by libcurl before a part of the stream is going to be
+transferred (if the transfer supports chunks).
+
+This callback makes sense only when using the \fICURLOPT_WILDCARDMATCH\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
+\fIcurl/curl.h\fP). The parameter ptr is a pointer given by
+\fICURLOPT_CHUNK_DATA\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.
+(This was added in 7.21.0)
+.IP CURLOPT_CHUNK_END_FUNCTION
+Pass a pointer to a function that matches the following prototype:
+\fBlong function(void *ptr)\fP. 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.
+(This was added in 7.21.0)
+.IP CURLOPT_CHUNK_DATA
+Pass a pointer that will be untouched by libcurl and passed as the ptr
+argument to the \fICURL_CHUNK_BGN_FUNTION\fP and \fICURL_CHUNK_END_FUNTION\fP.
+(This was added in 7.21.0)
+.IP CURLOPT_FNMATCH_FUNCTION
+Pass a pointer to a function that matches the following prototype: \fBint
+function(void *ptr, const char *pattern, const char *string)\fP prototype (see
+\fIcurl/curl.h\fP). It is used internally for the wildcard matching feature.
+
+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. (This was added in 7.21.0)
+.IP CURLOPT_FNMATCH_DATA
+Pass a pointer that will be untouched by libcurl and passed as the ptr argument
+to the \fICURL_FNMATCH_FUNCTION\fP. (This was added in 7.21.0)
+.SH ERROR OPTIONS
+.IP CURLOPT_ERRORBUFFER
+Pass a char * to a buffer that the libcurl may store human readable error
+messages in. This may be more helpful than just the return code from
+\fIcurl_easy_perform\fP. The buffer must be at least CURL_ERROR_SIZE big.
+Although this argument is a 'char *', it does not describe an input string.
+Therefore the (probably undefined) contents of the buffer is NOT copied by the
+library. You must keep the associated storage 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.
+
+Use \fICURLOPT_VERBOSE\fP and \fICURLOPT_DEBUGFUNCTION\fP to better
+debug/trace why errors happen.
+
+If the library does not return an error, the buffer may not have been
+touched. Do not rely on the contents in those cases.
+
+.IP CURLOPT_STDERR
+Pass a FILE * as parameter. Tell libcurl to use this stream instead of stderr
+when showing the progress meter and displaying \fICURLOPT_VERBOSE\fP data.
+.IP CURLOPT_FAILONERROR
+A parameter set to 1 tells the library to fail silently 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.
+.SH NETWORK OPTIONS
+.IP CURLOPT_URL
+Pass in a pointer to the actual URL to deal with. The parameter should be a
+char * to a zero 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.
+
+If the given URL lacks the scheme, or protocol, part ("http://" or "ftp://"
+etc), libcurl will attempt to resolve which protocol to use based on the
+given host mame. If the protocol is not supported, libcurl will return
+(\fICURLE_UNSUPPORTED_PROTOCOL\fP) when you call \fIcurl_easy_perform(3)\fP
+or \fIcurl_multi_perform(3)\fP. Use \fIcurl_version_info(3)\fP for detailed
+information on which protocols are supported.
+
+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 and password as part of the
+host, for some protocols, when connecting to servers that require
+authentication.
+
+For example the following types of authentication support this:
+
+http://user:password@www.example.com
+
+ftp://user:password@ftp.example.com
+
+pop3://user:password@mail.example.com
+
+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:
+
+.B HTTP
+
+The path part of a 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.
+
+.B 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.
+
+.B 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.
+
+.B POP3
+
+The path part of a POP3 request specifies the mailbox (message) to retrieve.
+If the mailbox is not specified then a list of waiting messages is returned
+instead.
+
+pop3://user:password@mail.example.com - This lists the available messages
+pop3://user:password@mail.example.com/1 - This retrieves the first message
+
+.B 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
+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\fP or \fBCURLOPT_USERNAME\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
+
+.B 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\fP or \fBCURLOPT_USERNAME\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
+
+.B 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.
+
+.B NOTES
+
+Starting with version 7.20.0, the fragment part of the URI will not be sent as
+part of the path, which was previously the case.
+
+\fICURLOPT_URL\fP is the only option that \fBmust\fP be set before
+\fIcurl_easy_perform(3)\fP is called.
+
+\fICURLOPT_PROTOCOLS\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.
+.IP CURLOPT_PROTOCOLS
+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. See also
+\fICURLOPT_REDIR_PROTOCOLS\fP. (Added in 7.19.4)
+.IP CURLOPT_REDIR_PROTOCOLS
+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\fP is enabled. This allows you to
+limit specific transfers to only be allowed to use a subset of protocols in
+redirections. By default libcurl will allow all protocols except for FILE and
+SCP. This is a difference compared to pre-7.19.4 versions which
+unconditionally would follow to all protocols supported. (Added in 7.19.4)
+.IP CURLOPT_PROXY
+Set HTTP proxy to use. The parameter should be a char * to a zero terminated
+string holding the host name or dotted IP address. To specify port number in
+this string, append :[port] to the end of the host name. The proxy string may
+be prefixed with [protocol]:// since any such prefix will be ignored. The
+proxy's port number may optionally be specified with the separate option. If
+not specified, libcurl will default to using port 1080 for proxies.
+\fICURLOPT_PROXYPORT\fP.
+
+When you tell the library to use a 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\fP and similar FTP specifics that don't work unless you
+tunnel through the HTTP proxy. Such tunneling is activated with
+\fICURLOPT_HTTPPROXYTUNNEL\fP.
+
+libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP,
+\fBall_proxy\fP etc, if any of those are set. The \fICURLOPT_PROXY\fP option
+does however override any possibly set environment variables.
+
+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.
+
+Since 7.14.1, the proxy host string given in environment variables can be
+specified the exact same way as the proxy can be set with \fICURLOPT_PROXY\fP,
+include protocol prefix (http://) and embedded user + password.
+
+Since 7.21.7, the proxy string may be specified with a protocol:// prefix to
+specify alternative proxy protocols. Use socks4://, socks4a://, socks5:// or
+socks5h:// (the last one to enable socks5 and asking the proxy to do the
+resolving, also known as CURLPROXY_SOCKS5_HOSTNAME type) to request the
+specific SOCKS version to be used. No protocol specified, http:// and all
+others will be treated as HTTP proxies.
+.IP CURLOPT_PROXYPORT
+Pass a long with this option to set the proxy port to connect to unless it is
+specified in the proxy string \fICURLOPT_PROXY\fP.
+.IP CURLOPT_PROXYTYPE
+Pass a long with this option to set type of the proxy. Available options for
+this are \fICURLPROXY_HTTP\fP, \fICURLPROXY_HTTP_1_0\fP (added in 7.19.4),
+\fICURLPROXY_SOCKS4\fP (added in 7.10), \fICURLPROXY_SOCKS5\fP,
+\fICURLPROXY_SOCKS4A\fP (added in 7.18.0) and \fICURLPROXY_SOCKS5_HOSTNAME\fP
+(added in 7.18.0). The HTTP type is default. (Added in 7.10)
+
+If you set \fBCURLOPT_PROXYTYPE\fP to \fICURLPROXY_HTTP_1_0\fP, it will only
+affect how libcurl speaks to a proxy when CONNECT is used. The HTTP version
+used for "regular" HTTP requests is instead controlled with
+\fICURLOPT_HTTP_VERSION\fP.
+.IP CURLOPT_NOPROXY
+Pass a pointer to a zero 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. (Added in
+7.19.4)
+.IP CURLOPT_HTTPPROXYTUNNEL
+Set the parameter to 1 to make the library tunnel all operations through a
+given HTTP proxy. There is a big difference between using a proxy and to
+tunnel through it. If you don't know what this means, you probably don't want
+this tunneling option.
+.IP CURLOPT_SOCKS5_GSSAPI_SERVICE
+Pass a char * as parameter to a string holding the name of the service. The
+default service name for a SOCKS5 server is rcmd/server-fqdn. This option
+allows you to change it. (Added in 7.19.4)
+.IP CURLOPT_SOCKS5_GSSAPI_NEC
+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. (Added in 7.19.4).
+.IP CURLOPT_INTERFACE
+Pass a char * as parameter. This sets the interface name to use as outgoing
+network interface. The name can be an interface name, an IP address, or a host
+name.
+
+Starting with 7.24.0: 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.
+.IP CURLOPT_LOCALPORT
+Pass a long. This sets the local port number of the socket used for
+connection. This can be used in combination with \fICURLOPT_INTERFACE\fP and
+you are recommended to use \fICURLOPT_LOCALPORTRANGE\fP as well when this is
+set. Valid port numbers are 1 - 65535. (Added in 7.15.2)
+.IP CURLOPT_LOCALPORTRANGE
+Pass a long. This is the number of attempts libcurl will make to find a
+working local port number. It starts with the given \fICURLOPT_LOCALPORT\fP
+and adds one to the number for each retry. Setting this 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. (Added in
+7.15.2)
+.IP CURLOPT_DNS_CACHE_TIMEOUT
+Pass a long, this sets the timeout in seconds. Name resolves will be kept in
+memory 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.
+.IP CURLOPT_DNS_USE_GLOBAL_CACHE
+Pass a long. If the 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\fP and
+\fIcurl_share_init(3)\fP.
+.IP CURLOPT_BUFFERSIZE
+Pass a long specifying your preferred size (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. This is just treated as a request,
+not an order. You cannot be guaranteed to actually get the given size. (Added
+in 7.10)
+
+This size is by default set as big as possible (CURL_MAX_WRITE_SIZE), so it
+only makes sense to use this option if you want it smaller.
+.IP CURLOPT_PORT
+Pass a long specifying what remote port number to connect to, instead of the
+one specified in the URL or the default port for the used protocol.
+.IP CURLOPT_TCP_NODELAY
+Pass a long specifying whether the TCP_NODELAY option is to be set or cleared
+(1 = set, 0 = clear). The option is cleared by default. This will have no
+effect after the connection has been established.
+
+Setting this option will disable TCP's Nagle algorithm. 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 (most notably
+telnet or rlogin) 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.
+.IP CURLOPT_ADDRESS_SCOPE
+Pass a long specifying the scope_id value to use when connecting to IPv6
+link-local or site-local addresses. (Added in 7.19.0)
+.IP CURLOPT_TCP_KEEPALIVE
+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\fP
+and \fICURLOPT_TCP_KEEPINTVL\fP options, provided the operating system supports
+them. Set to 0 (default behavior) to disable keepalive probes (Added in
+7.25.0).
+.IP CURLOPT_TCP_KEEPIDLE
+Pass a long. Sets the delay, in seconds, that the operating system will wait
+while the connection is idle before sending keepalive probes. Not all operating
+systems support this option. (Added in 7.25.0)
+.IP CURLOPT_TCP_KEEPINTVL
+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 NAMES and PASSWORDS OPTIONS (Authentication)
+.IP CURLOPT_NETRC
+This parameter controls the preference 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\fP.
+
+libcurl uses a user name (and supplied or prompted password) supplied with
+\fICURLOPT_USERPWD\fP in preference to any of the options controlled by this
+parameter.
+
+Pass a long, set to one of the values described below.
+.RS
+.IP CURL_NETRC_OPTIONAL
+The use of your \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 in
+the URL.
+
+Undefined values of the option will have this effect.
+.IP CURL_NETRC_IGNORED
+The library will ignore the file and use only the information in the URL.
+
+This is the default.
+.IP CURL_NETRC_REQUIRED
+This value tells the library that use of the file is required, to ignore the
+information in the URL, and to search the file for the host only.
+.RE
+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.
+.IP CURLOPT_NETRC_FILE
+Pass a char * as parameter, pointing to a zero terminated string containing
+the full path name to the file you want libcurl to use as .netrc file. If this
+option is omitted, and \fICURLOPT_NETRC\fP is set, libcurl will attempt to
+find a .netrc file in the current user's home directory. (Added in 7.10.9)
+.IP CURLOPT_USERPWD
+Pass a char * as parameter, which should be [user name]:[password] to use for
+the connection. Use \fICURLOPT_HTTPAUTH\fP to decide the authentication method.
+
+When using NTLM, you can set the domain by prepending it to the user name and
+separating the domain and name with a forward (/) or backward slash (\\). Like
+this: "domain/user:password" or "domain\\user:password". Some HTTP servers (on
+Windows) support this style even for Basic authentication.
+
+When using HTTP and \fICURLOPT_FOLLOWLOCATION\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\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.
+.IP CURLOPT_PROXYUSERPWD
+Pass a char * as parameter, which should be [user name]:[password] to use for
+the connection to the HTTP proxy. Use \fICURLOPT_PROXYAUTH\fP to decide
+the authentication method.
+.IP CURLOPT_USERNAME
+Pass a char * as parameter, which should be pointing to the zero terminated
+user name to use for the transfer.
+
+\fBCURLOPT_USERNAME\fP sets the user name to be used in protocol
+authentication. You should not use this option together with the (older)
+CURLOPT_USERPWD option.
+
+In order to specify the password to be used in conjunction with the user name
+use the \fICURLOPT_PASSWORD\fP option. (Added in 7.19.1)
+.IP CURLOPT_PASSWORD
+Pass a char * as parameter, which should be pointing to the zero terminated
+password to use for the transfer.
+
+The CURLOPT_PASSWORD option should be used in conjunction with
+the \fICURLOPT_USERNAME\fP option. (Added in 7.19.1)
+.IP CURLOPT_PROXYUSERNAME
+Pass a char * as parameter, which should be pointing to the zero terminated
+user name to use for the transfer while connecting to Proxy.
+
+The CURLOPT_PROXYUSERNAME option should be used in same way as the
+\fICURLOPT_PROXYUSERPWD\fP is used. In comparison to
+\fICURLOPT_PROXYUSERPWD\fP the CURLOPT_PROXYUSERNAME allows the username to
+contain a colon, like in the following example: "sip:user@example.com". The
+CURLOPT_PROXYUSERNAME option is an alternative way to set the user name while
+connecting to Proxy. There is no meaning to use it together with the
+\fICURLOPT_PROXYUSERPWD\fP option.
+
+In order to specify the password to be used in conjunction with the user name
+use the \fICURLOPT_PROXYPASSWORD\fP option. (Added in 7.19.1)
+.IP CURLOPT_PROXYPASSWORD
+Pass a char * as parameter, which should be pointing to the zero terminated
+password to use for the transfer while connecting to Proxy.
+
+The CURLOPT_PROXYPASSWORD option should be used in conjunction with
+the \fICURLOPT_PROXYUSERNAME\fP option. (Added in 7.19.1)
+.IP CURLOPT_HTTPAUTH
+Pass a long as parameter, which is set to a bitmask, to tell libcurl which
+authentication method(s) you want it to use. 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\fP option or
+with the \fICURLOPT_USERNAME\fP and the \fICURLOPT_PASSWORD\fP options.
+(Added in 7.10.6)
+.RS
+.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. (This define was
+added in 7.19.3)
+.IP CURLAUTH_GSSNEGOTIATE
+HTTP GSS-Negotiate authentication. The GSS-Negotiate (also known as plain
+\&"Negotiate") method was designed by Microsoft and is used in their web
+applications. It is primarily meant as a support for Kerberos5 authentication
+but may also be used along with other authentication methods. For more
+information see IETF draft draft-brezak-spnego-http-04.txt.
+
+You need to build libcurl with a suitable GSS-API library 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.
+.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
+(Added in 7.22.0)
+
+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\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. (Added in 7.21.3)
+.RE
+.IP CURLOPT_TLSAUTH_TYPE
+Pass a long as parameter, which is set to a bitmask, to tell libcurl which
+authentication method(s) you want it to use for TLS authentication.
+.RS
+.IP CURLOPT_TLSAUTH_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\fP and \fICURLOPT_TLSAUTH_PASSWORD\fP options.
+
+You need to build libcurl with GnuTLS or OpenSSL with TLS-SRP support for this
+to work. (Added in 7.21.4)
+.RE
+.IP CURLOPT_TLSAUTH_USERNAME
+Pass a char * as parameter, which should point to the zero terminated username
+to use for the TLS authentication method specified with the
+\fICURLOPT_TLSAUTH_TYPE\fP option. Requires that the
+\fICURLOPT_TLS_PASSWORD\fP option also be set. (Added in 7.21.4)
+.IP CURLOPT_TLSAUTH_PASSWORD
+Pass a char * as parameter, which should point to the zero terminated password
+to use for the TLS authentication method specified with the
+\fICURLOPT_TLSAUTH_TYPE\fP option. Requires that the
+\fICURLOPT_TLS_USERNAME\fP option also be set. (Added in 7.21.4)
+.IP CURLOPT_PROXYAUTH
+Pass a long as parameter, which is set to a bitmask, to tell libcurl which
+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\fP option. The
+bitmask can be constructed by or'ing together the bits listed above for the
+\fICURLOPT_HTTPAUTH\fP option. As of this writing, only Basic, Digest and NTLM
+work. (Added in 7.10.7)
+.SH HTTP OPTIONS
+.IP CURLOPT_AUTOREFERER
+Pass a parameter set to 1 to enable this. When enabled, libcurl will
+automatically set the Referer: field in requests where it follows a Location:
+redirect.
+.IP CURLOPT_ACCEPT_ENCODING
+Sets the contents of the Accept-Encoding: header sent in a HTTP request, and
+enables decoding of a response when a Content-Encoding: header is received.
+Three encodings are supported: \fIidentity\fP, which does nothing,
+\fIdeflate\fP which requests the server to compress its response using the
+zlib algorithm, and \fIgzip\fP which requests the gzip algorithm. If a
+zero-length string is set, then an Accept-Encoding: header containing all
+supported encodings is sent.
+
+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. See the special file lib/README.encoding for details.
+
+(This option was called CURLOPT_ENCODING before 7.21.6)
+.IP CURLOPT_TRANSFER_ENCODING
+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
+\fBCURLOPT_ACCEPT_ENCODING\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.
+
+(Added in 7.21.6)
+.IP CURLOPT_FOLLOWLOCATION
+A parameter set to 1 tells the library to follow any Location: header that the
+server sends as part of a HTTP header.
+
+This means that the library will re-send the same request on the new location
+and follow new Location: headers all the way until no more such headers are
+returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number of redirects
+libcurl will follow.
+
+Since 7.19.4, libcurl can limit what protocols it will automatically
+follow. The accepted protocols are set with \fICURLOPT_REDIR_PROTOCOLS\fP and
+it excludes the FILE protocol by default.
+.IP CURLOPT_UNRESTRICTED_AUTH
+A parameter set to 1 tells the library it can continue to send authentication
+(user+password) when following locations, even when hostname changed. This
+option is meaningful only when setting \fICURLOPT_FOLLOWLOCATION\fP.
+.IP CURLOPT_MAXREDIRS
+Pass a long. The set number will be the redirection limit. 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\fP is used at the same time. Added in 7.15.1:
+Setting the limit to 0 will make libcurl refuse any redirect. Set it to -1 for
+an infinite number of redirects (which is the default)
+.IP CURLOPT_POSTREDIR
+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 RFC2616/10.3.2 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\fP. (Added in 7.17.1) (This option was
+known as CURLOPT_POST301 up to 7.19.0 as it only supported the 301 then)
+.IP CURLOPT_PUT
+A parameter set to 1 tells the library to use HTTP PUT to transfer data. The
+data should be set with \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP.
+
+This option is deprecated and starting with version 7.12.1 you should instead
+use \fICURLOPT_UPLOAD\fP.
+.IP CURLOPT_POST
+A parameter set to 1 tells the library 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\fP or \fICURLOPT_COPYPOSTFIELDS\fP options to
+specify what data to post and \fICURLOPT_POSTFIELDSIZE\fP or
+\fICURLOPT_POSTFIELDSIZE_LARGE\fP to set the data size.
+
+Optionally, you can provide data to POST using the \fICURLOPT_READFUNCTION\fP
+and \fICURLOPT_READDATA\fP options but then you must make sure to not set
+\fICURLOPT_POSTFIELDS\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\fP or
+\fICURLOPT_POSTFIELDSIZE_LARGE\fP option. 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\fP.
+
+Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
+You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual.
+
+If you use POST to a 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\fP. With HTTP 1.0 or without chunked transfer, you must
+specify the size in the request.
+
+When setting \fICURLOPT_POST\fP to 1, it will automatically set
+\fICURLOPT_NOBODY\fP to 0 (since 7.14.1).
+
+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\fP or \fICURLOPT_HTTPGET\fP or similar.
+.IP CURLOPT_POSTFIELDS
+Pass a void * as parameter, which should be the full data to post in a 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. Most
+web servers will assume this data to be url-encoded.
+
+The pointed data are NOT copied by the library: as a consequence, they must
+be preserved by the calling application until the transfer finishes.
+
+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 the most
+commonly used one by HTML forms. See also the \fICURLOPT_POST\fP. Using
+\fICURLOPT_POSTFIELDS\fP implies \fICURLOPT_POST\fP.
+
+If you want to do a zero-byte POST, you need to set
+\fICURLOPT_POSTFIELDSIZE\fP explicitly to zero, as simply setting
+\fICURLOPT_POSTFIELDS\fP to NULL or "" just effectively disables the sending
+of the specified string. libcurl will instead assume that you'll send the POST
+data using the read callback!
+
+Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
+You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual.
+
+To make multipart/formdata posts (aka RFC2388-posts), check out the
+\fICURLOPT_HTTPPOST\fP option.
+.IP CURLOPT_POSTFIELDSIZE
+If you want to post data to the server without letting 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.
+.IP CURLOPT_POSTFIELDSIZE_LARGE
+Pass a curl_off_t as parameter. Use this to set the size of the
+\fICURLOPT_POSTFIELDS\fP data to prevent libcurl from doing strlen() on the
+data to figure out the size. This is the large file version of the
+\fICURLOPT_POSTFIELDSIZE\fP option. (Added in 7.11.1)
+.IP CURLOPT_COPYPOSTFIELDS
+Pass a char * as parameter, which should be the full data to post in a HTTP
+POST operation. It behaves as the \fICURLOPT_POSTFIELDS\fP option, but the
+original data are 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\fP or
+\fICURLOPT_POSTFIELDSIZE_LARGE\fP: If the size has not been set prior to
+\fICURLOPT_COPYPOSTFIELDS\fP, the data are assumed to be a NUL-terminated
+string; else the stored size informs the library about the data byte count to
+copy. In any case, the size must not be changed after
+\fICURLOPT_COPYPOSTFIELDS\fP, unless another \fICURLOPT_POSTFIELDS\fP or
+\fICURLOPT_COPYPOSTFIELDS\fP option is issued.
+(Added in 7.17.1)
+.IP CURLOPT_HTTPPOST
+Tells libcurl you want a multipart/formdata HTTP POST to be made and you
+instruct what data to pass on to the server. 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 until you close this curl handle again with
+\fIcurl_easy_cleanup(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\fP as usual.
+
+When setting \fICURLOPT_HTTPPOST\fP, it will automatically set
+\fICURLOPT_NOBODY\fP to 0 (since 7.14.1).
+.IP CURLOPT_REFERER
+Pass a pointer to a zero 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\fP.
+.IP CURLOPT_USERAGENT
+Pass a pointer to a zero 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\fP.
+.IP CURLOPT_HTTPHEADER
+Pass a pointer to a linked list of HTTP headers to pass to the server in your
+HTTP 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. 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. Thus, using this option you can add
+new headers, replace internal headers and remove internal headers. To add a
+header with no content, make the content be two quotes: \&"". The headers
+included in the linked list must not be CRLF-terminated, because curl 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.
+
+Pass a NULL to this to reset back to no custom headers.
+
+The most commonly replaced headers have "shortcuts" in the options
+\fICURLOPT_COOKIE\fP, \fICURLOPT_USERAGENT\fP and \fICURLOPT_REFERER\fP.
+.IP CURLOPT_HTTP200ALIASES
+Pass a pointer to a linked list of aliases to be treated as valid HTTP 200
+responses. Some servers respond with a custom header response line. For
+example, IceCast servers respond with "ICY 200 OK". 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". (Added in 7.10.3)
+
+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. Before libcurl 7.16.3,
+Libcurl used the value set by option \fICURLOPT_HTTP_VERSION\fP, but starting
+with 7.16.3 the protocol is assumed to match HTTP 1.0 when an alias matched.
+.IP CURLOPT_COOKIE
+Pass a pointer to a zero 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, you need to set them all using a single
+option and thus you need to concatenate them all in one single string. Set
+multiple cookies in one string 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.
+
+Using this option multiple times will only make the latest string override the
+previous ones.
+.IP CURLOPT_COOKIEFILE
+Pass a pointer to a zero terminated string as parameter. It should contain the
+name of your file holding cookie data to read. The cookie data may be in
+Netscape / Mozilla cookie data format or just regular HTTP-style headers
+dumped to a file.
+
+Given an empty or non-existing file or by passing the empty string (""), this
+option will enable cookies for this curl handle, making it understand and
+parse received cookies and then use matching cookies in future requests.
+
+If you use this option multiple times, you just add more files to read.
+Subsequent files will add more cookies.
+.IP CURLOPT_COOKIEJAR
+Pass a file name as char *, zero 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 "-" 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.
+
+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\fP or \fICURLOPT_DEBUGFUNCTION\fP
+will get a warning to display, but that is the only visible feedback you get
+about this possibly lethal situation.
+.IP CURLOPT_COOKIESESSION
+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.
+.IP CURLOPT_COOKIELIST
+Pass a char * to a cookie string. Cookie can be either in Netscape / Mozilla
+format or just regular HTTP-style header (Set-Cookie: ...) format. If cURL
+cookie engine was not enabled it will enable its cookie engine. Passing a
+magic string \&"ALL" will erase all cookies known by cURL. (Added in 7.14.1)
+Passing the special string \&"SESS" will only erase all session cookies known
+by cURL. (Added in 7.15.4) Passing the special string \&"FLUSH" will write
+all cookies known by cURL to the file specified by \fICURLOPT_COOKIEJAR\fP.
+(Added in 7.17.1)
+.IP CURLOPT_HTTPGET
+Pass a long. If the long is 1, this forces the HTTP request to get back
+to GET. Usable if a POST, HEAD, PUT, or a custom request has been used
+previously using the same curl handle.
+
+When setting \fICURLOPT_HTTPGET\fP to 1, it will automatically set
+\fICURLOPT_NOBODY\fP to 0 (since 7.14.1).
+.IP CURLOPT_HTTP_VERSION
+Pass a long, set to one of the values described below. They force libcurl to
+use the specific HTTP versions. This is not sensible to do unless you have a
+good reason.
+.RS
+.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.
+.RE
+.IP CURLOPT_IGNORE_CONTENT_LENGTH
+Ignore the Content-Length header. This is useful for 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. (added in 7.14.1)
+.IP CURLOPT_HTTP_CONTENT_DECODING
+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_ENCODING\fP for
+that. (added in 7.16.2)
+.IP CURLOPT_HTTP_TRANSFER_DECODING
+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. (added in 7.16.2)
+.SH SMTP OPTIONS
+.IP CURLOPT_MAIL_FROM
+Pass a pointer to a zero 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 by libcurl from version
+7.21.4 onwards. Failing to provide such brackets may cause the server to
+reject the email.
+
+If this parameter is not specified then an empty address will be sent to the
+mail server which may or may not cause the email to be rejected.
+
+(Added in 7.20.0)
+.IP CURLOPT_MAIL_RCPT
+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.
+
+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.
+
+(Added in 7.20.0)
+.IP CURLOPT_MAIL_AUTH
+Pass a pointer to a zero 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 CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT, 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.
+
+(Added in 7.25.0)
+.SH TFTP OPTIONS
+.IP CURLOPT_TFTP_BLKSIZE
+Specify block size 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. (added in 7.19.4)
+.SH FTP OPTIONS
+.IP CURLOPT_FTPPORT
+Pass a pointer to a zero terminated string as parameter. It 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. (added in 7.19.5)
+
+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.
+.IP CURLOPT_QUOTE
+Pass a pointer to a linked list of FTP or SFTP commands to pass to the server
+prior to your FTP 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 a FTP (or SFTP since 7.24.0) 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: chgrp, chmod, chown, ln, mkdir, pwd, rename, rm,
+rmdir, symlink (see
+.BR curl (1))
+(SFTP support added in 7.16.3)
+.IP CURLOPT_POSTQUOTE
+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\fP. Disable this
+operation again by setting a NULL to this option.
+.IP CURLOPT_PREQUOTE
+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\fP. Disable this operation again by setting a NULL to this
+option. Before version 7.16.0, if you also set \fICURLOPT_NOBODY\fP to 1, this
+option didn't work.
+.IP CURLOPT_DIRLISTONLY
+A parameter set to 1 tells the library to just list the names of files in a
+directory, instead of doing a full directory listing that would include file
+sizes, dates etc. This works for FTP and SFTP URLs.
+
+This causes an FTP NLST command to be sent on an 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\fP as it will
+effectively break that feature then.
+
+(This option was known as CURLOPT_FTPLISTONLY up to 7.16.4)
+.IP CURLOPT_APPEND
+A 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.
+
+(This option was known as CURLOPT_FTPAPPEND up to 7.16.4)
+.IP CURLOPT_FTP_USE_EPRT
+Pass a long. If the value is 1, it tells curl to use the EPRT (and
+LPRT) command when doing active FTP downloads (which is enabled by
+\fICURLOPT_FTPPORT\fP). Using EPRT means that it will first attempt to use
+EPRT and then LPRT before using PORT, but if you pass zero to this
+option, it will not try using EPRT or LPRT, only plain PORT. (Added in 7.10.5)
+
+If the server is an IPv6 host, this option will have no effect as of 7.12.3.
+.IP CURLOPT_FTP_USE_EPSV
+Pass a long. If the value is 1, it tells curl to use the EPSV command
+when doing passive FTP downloads (which it always 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.
+.IP CURLOPT_FTP_USE_PRET
+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. (Added in 7.20.0)
+.IP CURLOPT_FTP_CREATE_MISSING_DIRS
+Pass a long. If the value is 1, curl will attempt to create any remote
+directory that it fails to CWD into. CWD is the command that changes working
+directory. (Added in 7.10.7)
+
+This setting also applies to SFTP-connections. curl 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. (Added in 7.16.3)
+
+Starting with 7.19.4, you can also set this value to 2, which will make
+libcurl 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! 7.19.4 also introduced the \fICURLFTP_CREATE_DIR\fP and
+\fICURLFTP_CREATE_DIR_RETRY\fP enum names for these arguments.
+
+Before version 7.19.4, libcurl will simply ignore arguments set to 2 and act
+as if 1 was selected.
+.IP CURLOPT_FTP_RESPONSE_TIMEOUT
+Pass a long. Causes curl to set a timeout period (in seconds) on the amount
+of time that the server is allowed to take in order to generate a response
+message for a command before the session is considered hung. While curl is
+waiting for a response, this value overrides \fICURLOPT_TIMEOUT\fP. It is
+recommended that if used in conjunction with \fICURLOPT_TIMEOUT\fP, you set
+\fICURLOPT_FTP_RESPONSE_TIMEOUT\fP to a value smaller than
+\fICURLOPT_TIMEOUT\fP. (Added in 7.10.8)
+.IP CURLOPT_FTP_ALTERNATIVE_TO_USER
+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. (Added in 7.15.5)
+.IP CURLOPT_FTP_SKIP_PASV_IP
+Pass a long. If 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. (Added in 7.14.2)
+
+This option has no effect if PORT, EPRT or EPSV is used instead of PASV.
+.IP CURLOPT_FTPSSLAUTH
+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 (see
+\fICURLOPT_USE_SSL\fP). (Added in 7.12.2)
+.RS
+.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".
+.RE
+.IP CURLOPT_FTP_SSL_CCC
+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.
+(Added in 7.16.1)
+.RS
+.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.
+.RE
+.IP CURLOPT_FTP_ACCOUNT
+Pass a pointer to a zero 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. (Added in 7.13.0)
+.IP CURLOPT_FTP_FILEMETHOD
+Pass a long that should have one of the following values. This option controls
+what method libcurl should use to reach a file on a FTP(S) server. The
+argument should be one of the following alternatives:
+.RS
+.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'.
+.RE
+(Added in 7.15.1)
+.SH RTSP OPTIONS
+.IP CURLOPT_RTSP_REQUEST
+Tell libcurl what kind of RTSP request to make. Pass one of the following RTSP
+enum values. Unless noted otherwise, commands require the Session ID to be
+initialized. (Added in 7.20.0)
+.RS
+.IP CURL_RTSPREQ_OPTIONS
+Used to retrieve the available methods of the server. The application is
+responsible for parsing and obeying the response. \fB(The session ID is not
+needed for this method.)\fP (Added in 7.20.0)
+.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\fP option is active. \fB(The session ID is not
+needed for this method)\fP (Added in 7.20.0)
+.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 a HTTP PUT or POST just like
+\fICURL_RTSPREQ_SET_PARAMETER\fP (Added in 7.20.0)
+.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\fP option prior to calling setup. If no session ID
+is currently set with \fICURLOPT_RTSP_SESSION_ID\fP, libcurl will extract and
+use the session ID in the response to this request. \fB(The session ID is not
+needed for this method).\fP (Added in 7.20.0)
+.IP CURL_RTSPREQ_PLAY
+Send a Play command to the server. Use the \fICURLOPT_RANGE\fP option to
+modify the playback time (e.g. 'npt=10-15'). (Added in 7.20.0)
+.IP CURL_RTSPREQ_PAUSE
+Send a Pause command to the server. Use the \fICURLOPT_RANGE\fP option with a
+single value to indicate when the stream should be halted. (e.g. npt='25')
+(Added in 7.20.0)
+.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. (Added in 7.20.0)
+.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 a 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.
+(Added in 7.20.0)
+.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_PARAMTER is much like a HTTP PUT or POST. An application
+may either use \fICURLOPT_UPLOAD\fP with \fICURLOPT_READDATA\fP like a HTTP
+PUT, or it may use \fICURLOPT_POSTFIELDS\fP like a HTTP POST. No chunked
+transfers are allowed, so the application must set the
+\fICURLOPT_INFILESIZE\fP in the former and \fICURLOPT_POSTFIELDSIZE\fP in the
+latter. Also, there is no use of multi-part POSTs within RTSP. (Added in
+7.20.0)
+.IP CURL_RTSPREQ_RECORD
+Used to tell the server to record a session. Use the \fICURLOPT_RANGE\fP
+option to modify the record time. (Added in 7.20.0)
+.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. (Added in 7.20.0)
+.RE
+.IP CURLOPT_RTSP_SESSION_ID
+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. (Added in 7.20.0)
+.IP CURLOPT_RTSP_STREAM_URI
+Set the stream URI 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\fP. When working with
+RTSP, the \fICURLOPT_STREAM_URI\fP indicates what URL to send to the server in
+the request header while the \fICURLOPT_URL\fP indicates where to make the
+connection to. (e.g. the \fICURLOPT_URL\fP for the above examples might be
+set to \fIrtsp://foo/twister\fP (Added in 7.20.0)
+.IP CURLOPT_RTSP_TRANSPORT
+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. (Added in 7.20.0)
+.IP CURLOPT_RTSP_HEADER
+This option is simply an alias for \fICURLOPT_HTTP_HEADER\fP. Use this to
+replace the standard headers that RTSP and HTTP share. It is also valid to use
+the shortcuts such as \fICURLOPT_USERAGENT\fP. (Added in 7.20.0)
+.IP CURLOPT_RTSP_CLIENT_CSEQ
+Manually set the 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. (Added in 7.20.0)
+.IP CURLOPT_RTSP_SERVER_CSEQ
+Manually set the CSEQ number to expect for the next RTSP Server->Client
+request. At the moment, this feature (listening for Server requests) is
+unimplemented. (Added in 7.20.0)
+.SH PROTOCOL OPTIONS
+.IP CURLOPT_TRANSFERTEXT
+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.
+.IP CURLOPT_PROXY_TRANSFER_MODE
+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 a 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\fP has no effect when doing
+FTP via a proxy. Beware that not all proxies support this feature. (Added in
+7.18.0)
+.IP CURLOPT_CRLF
+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).
+.IP CURLOPT_RANGE
+Pass a char * as parameter, which should contain the specified range you
+want. It should be in the format "X-Y", where X or Y may be left out. 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). 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.
+
+Pass a NULL to this option to disable the use of ranges.
+
+Ranges work on HTTP, FTP, FILE (since 7.18.0), and RTSP (since 7.20.0)
+transfers only.
+.IP CURLOPT_RESUME_FROM
+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.
+.IP CURLOPT_RESUME_FROM_LARGE
+Pass a curl_off_t as parameter. It contains the offset in number of bytes that
+you want the transfer to start from. (Added in 7.11.0)
+.IP CURLOPT_CUSTOMREQUEST
+Pass a pointer to a zero terminated string as parameter. It can be used to
+specify the request instead of GET or HEAD when performing HTTP based
+requests, instead of LIST and NLST when performing FTP directory listings and
+instead of LIST and RETR when issuing POP3 based commands. This is
+particularly useful, for example, for performing a HTTP DELETE request or a
+POP3 DELE command.
+
+Please don't perform this at will, on HTTP based requests, by making sure
+your server supports the command you are sending first.
+
+When you change the request method by setting \fBCURLOPT_CUSTOMREQUEST\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.
+
+For example:
+
+With the HTTP protocol 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\fP, to switch to a
+proper POST use \fICURLOPT_POST\fP or \fICURLOPT_POSTFIELDS\fP and to switch
+to a proper GET use CURLOPT_HTTPGET.
+
+With the POP3 protocol 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\fP should be used when
+specifying commands such as DELE and NOOP for example.
+
+Restore to the internal default by setting this to NULL.
+
+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\fP and
+\fICURLOPT_POSTFIELDS\fP to set POST data. Use \fICURLOPT_HTTPHEADER\fP to
+replace or extend the set of headers sent by libcurl. Use
+\fICURLOPT_HTTP_VERSION\fP to change HTTP version.
+
+(Support for POP3 added in 7.26.0)
+.IP CURLOPT_FILETIME
+Pass a long. If it is 1, libcurl will attempt to get the modification date 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\fP argument
+can be used after a transfer to extract the received time (if any).
+.IP CURLOPT_NOBODY
+A parameter set to 1 tells the library to not include the body-part in the
+output. This is only relevant for protocols that have separate header and
+body parts. On HTTP(S) servers, this will make libcurl do a HEAD request.
+
+To change request to GET, you should use \fICURLOPT_HTTPGET\fP. Change
+request to POST with \fICURLOPT_POST\fP etc.
+.IP CURLOPT_INFILESIZE
+When uploading a file to a remote site, this option should be used to tell
+libcurl what the expected size of the infile is. This value should be passed
+as a long. See also \fICURLOPT_INFILESIZE_LARGE\fP.
+
+For uploading using SCP, this option or \fICURLOPT_INFILESIZE_LARGE\fP is
+mandatory.
+
+When sending emails using SMTP, this command can be used to specify the
+optional SIZE parameter for the MAIL FROM command. (Added in 7.23.0)
+
+This option does not limit how much data libcurl will actually send, as that
+is controlled entirely by what the read callback returns.
+.IP CURLOPT_INFILESIZE_LARGE
+When uploading a file to a remote site, this option should be used to tell
+libcurl what the expected size of the infile is. This value should be passed
+as a curl_off_t. (Added in 7.11.0)
+
+For uploading using SCP, this option or \fICURLOPT_INFILESIZE\fP is mandatory.
+
+This option does not limit how much data libcurl will actually send, as that
+is controlled entirely by what the read callback returns.
+.IP CURLOPT_UPLOAD
+A parameter set to 1 tells the library to prepare for an upload. The
+\fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP or
+\fICURLOPT_INFILESIZE_LARGE\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\fP as usual.
+
+If you use PUT to a 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\fP. With HTTP 1.0 or without chunked transfer, you must
+specify the size.
+.IP CURLOPT_MAXFILESIZE
+Pass a long as parameter. This allows you to specify the maximum size (in
+bytes) of a file to download. If the file requested is larger than this value,
+the transfer will not start and CURLE_FILESIZE_EXCEEDED 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.
+.IP CURLOPT_MAXFILESIZE_LARGE
+Pass a curl_off_t as parameter. This allows you to specify the maximum size
+(in bytes) of a file to download. If the file requested is larger than this
+value, the transfer will not start and \fICURLE_FILESIZE_EXCEEDED\fP will be
+returned. (Added in 7.11.0)
+
+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.
+.IP CURLOPT_TIMECONDITION
+Pass a long as parameter. This defines how the \fICURLOPT_TIMEVALUE\fP time
+value is treated. You can set this parameter to \fICURL_TIMECOND_IFMODSINCE\fP
+or \fICURL_TIMECOND_IFUNMODSINCE\fP. This feature applies to HTTP, FTP, RTSP,
+and FILE.
+
+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.
+.IP CURLOPT_TIMEVALUE
+Pass a long as parameter. This should be the time in seconds since 1 Jan 1970,
+and the time will be used in a condition as specified with
+\fICURLOPT_TIMECONDITION\fP.
+.SH CONNECTION OPTIONS
+.IP CURLOPT_TIMEOUT
+Pass a long as parameter containing 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 to less than a few minutes risk
+aborting perfectly normal operations. This option will cause curl to use the
+SIGALRM to enable time-outing system calls.
+
+In unix-like systems, this might cause signals to be used unless
+\fICURLOPT_NOSIGNAL\fP is set.
+
+Default timeout is 0 (zero) which means it never times out.
+.IP CURLOPT_TIMEOUT_MS
+Like \fICURLOPT_TIMEOUT\fP but takes number of milliseconds instead. 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.
+(Added in 7.16.2)
+.IP CURLOPT_LOW_SPEED_LIMIT
+Pass a long as parameter. It contains the transfer speed in bytes per second
+that the transfer should be below during \fICURLOPT_LOW_SPEED_TIME\fP seconds
+for the library to consider it too slow and abort.
+.IP CURLOPT_LOW_SPEED_TIME
+Pass a long as parameter. It contains the time in seconds that the transfer
+should be below the \fICURLOPT_LOW_SPEED_LIMIT\fP for the library to consider
+it too slow and abort.
+.IP CURLOPT_MAX_SEND_SPEED_LARGE
+Pass a curl_off_t as parameter. If an upload exceeds this speed (counted in
+bytes per second) on cumulative average during the transfer, the transfer will
+pause to keep the average rate less than or equal to the parameter value.
+Defaults to unlimited speed. (Added in 7.15.5)
+.IP CURLOPT_MAX_RECV_SPEED_LARGE
+Pass a curl_off_t as parameter. If a download exceeds this speed (counted in
+bytes per second) on cumulative average during the transfer, the transfer will
+pause to keep the average rate less than or equal to the parameter
+value. Defaults to unlimited speed. (Added in 7.15.5)
+.IP CURLOPT_MAXCONNECTS
+Pass a long. The set number will be the persistent connection cache size. The
+set amount will be the maximum amount of simultaneously open connections that
+libcurl may cache in this easy handle. 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 MAXCONNECTS 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\fP option.
+.IP CURLOPT_CLOSEPOLICY
+(Obsolete) This option does nothing.
+.IP CURLOPT_FRESH_CONNECT
+Pass a long. Set to 1 to make the next transfer use a new (fresh) connection
+by force. If the connection cache is full before this connection, one of the
+existing connections will be closed as according to the selected or default
+policy. This option should be used with caution and only if you understand
+what it does. Set this to 0 to have libcurl attempt re-using an existing
+connection (default behavior).
+.IP CURLOPT_FORBID_REUSE
+Pass a long. Set to 1 to make the next transfer explicitly close the
+connection when done. 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. Set to 0 to have libcurl keep the connection open for possible later
+re-use (default behavior).
+.IP CURLOPT_CONNECTTIMEOUT
+Pass a long. It should contain the maximum time in seconds that you allow the
+connection to the server to take. This only limits the connection phase, once
+it has connected, this option is of no more use. Set to zero to switch to the
+default built-in connection timeout - 300 seconds. See also the
+\fICURLOPT_TIMEOUT\fP option.
+
+In unix-like systems, this might cause signals to be used unless
+\fICURLOPT_NOSIGNAL\fP is set.
+.IP CURLOPT_CONNECTTIMEOUT_MS
+Like \fICURLOPT_CONNECTTIMEOUT\fP but takes the number of milliseconds
+instead. If libcurl is built to use the standard system name resolver,
+that portion of the connect will still use full-second resolution for
+timeouts with a minimum timeout allowed of one second.
+(Added in 7.16.2)
+.IP CURLOPT_IPRESOLVE
+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:
+.RS
+.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.
+.RE
+.IP CURLOPT_CONNECT_ONLY
+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.
+This option is implemented for HTTP, SMTP and POP3.
+
+The option can be used to simply test a connection to a server, but is more
+useful when used with the \fICURLINFO_LASTSOCKET\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. (Added in 7.15.2)
+.IP CURLOPT_USE_SSL
+Pass a long using one of the values from below, to make libcurl use your
+desired level of SSL for the transfer. (Added in 7.11.0)
+
+This is for enabling SSL/TLS when you use FTP, SMTP, POP3, IMAP etc.
+
+(This option was known as CURLOPT_FTP_SSL up to 7.16.4, and the constants
+were known as CURLFTPSSL_*)
+.RS
+.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.
+.RE
+.IP CURLOPT_RESOLVE
+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 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 the numerical IP address. If libcurl is built to support IPv6,
+ADDRESS 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.
+
+You can 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.
+
+(Added in 7.21.3)
+.IP CURLOPT_DNS_SERVERS
+Set 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
+
+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)
+.IP CURLOPT_ACCEPTTIMEOUT_MS
+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. If no
+timeout is set, the internal default of 60000 will be used. (Added in 7.24.0)
+.SH SSL and SECURITY OPTIONS
+.IP CURLOPT_SSLCERT
+Pass a pointer to a zero terminated string as parameter. The string should be
+the file name of your certificate. The default format is "PEM" and can be
+changed with \fICURLOPT_SSLCERTTYPE\fP.
+
+With NSS this can also be the nickname of the certificate you wish to
+authenticate with. If you want to use a file from the current directory, please
+precede it with "./" prefix, in order to avoid confusion with a nickname.
+.IP CURLOPT_SSLCERTTYPE
+Pass a pointer to a zero terminated string as parameter. The string should be
+the format of your certificate. Supported formats are "PEM" and "DER". (Added
+in 7.9.3)
+.IP CURLOPT_SSLKEY
+Pass a pointer to a zero 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\fP.
+.IP CURLOPT_SSLKEYTYPE
+Pass a pointer to a zero 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\fP is used as an identifier passed to the
+engine. You have to set the crypto engine with \fICURLOPT_SSLENGINE\fP.
+\&"DER" format key file currently does not work because of a bug in OpenSSL.
+.IP CURLOPT_KEYPASSWD
+Pass a pointer to a zero terminated string as parameter. It will be used as
+the password required to use the \fICURLOPT_SSLKEY\fP or
+\fICURLOPT_SSH_PRIVATE_KEYFILE\fP private key.
+You never needed a pass phrase to load a certificate but you need one to
+load your private key.
+
+(This option was known as CURLOPT_SSLKEYPASSWD up to 7.16.4 and
+CURLOPT_SSLCERTPASSWD up to 7.9.2)
+.IP CURLOPT_SSLENGINE
+Pass a pointer to a zero terminated string as parameter. It will be used as
+the identifier for the crypto engine you want to use for your private
+key.
+
+If the crypto device cannot be loaded, \fICURLE_SSL_ENGINE_NOTFOUND\fP is
+returned.
+.IP CURLOPT_SSLENGINE_DEFAULT
+Sets the actual crypto engine as the default for (asymmetric) crypto
+operations.
+
+If the crypto device cannot be set, \fICURLE_SSL_ENGINE_SETFAILED\fP is
+returned.
+
+Even though this option doesn't need any parameter, in some configurations
+\fIcurl_easy_setopt\fP might be defined as a macro taking exactly three
+arguments. Therefore, it's recommended to pass 1 as parameter to this option.
+.IP CURLOPT_SSLVERSION
+Pass a long as parameter to control what version of SSL/TLS to attempt to use.
+The available options are:
+.RS
+.IP CURL_SSLVERSION_DEFAULT
+The default action. This will attempt to figure out the remote SSL protocol
+version, i.e. either SSLv3 or TLSv1 (but not SSLv2, which became disabled
+by default with 7.18.1).
+.IP CURL_SSLVERSION_TLSv1
+Force TLSv1
+.IP CURL_SSLVERSION_SSLv2
+Force SSLv2
+.IP CURL_SSLVERSION_SSLv3
+Force SSLv3
+.RE
+.IP CURLOPT_SSL_VERIFYPEER
+Pass a long as parameter. By default, curl assumes a value of 1.
+
+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 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\fP option or the \fICURLOPT_CAPATH\fP
+option.
+
+When \fICURLOPT_SSL_VERIFYPEER\fP is nonzero, 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 by itself very useful. You typically
+want to ensure that the server, as authentically identified by its
+certificate, is the server you mean to be talking to. Use
+\fICURLOPT_SSL_VERIFYHOST\fP to control 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\fP option.
+.IP CURLOPT_CAINFO
+Pass a char * to a zero terminated string naming a file holding one or more
+certificates to verify the peer with. This makes sense only when used in
+combination with the \fICURLOPT_SSL_VERIFYPEER\fP option. If
+\fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_CAINFO\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.
+
+When built against NSS, this is the directory that the NSS certificate
+database resides in.
+.IP CURLOPT_ISSUERCERT
+Pass a char * to a zero terminated string naming a file 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\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\fP has
+to be set too for the check to fail). (Added in 7.19.0)
+.IP CURLOPT_CAPATH
+Pass a char * to a zero 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\fP option. If \fICURLOPT_SSL_VERIFYPEER\fP is zero,
+\fICURLOPT_CAPATH\fP need not even indicate an accessible path. The
+\fICURLOPT_CAPATH\fP function apparently does not work in Windows due to some
+limitation in openssl. This option is OpenSSL-specific and does nothing if
+libcurl is built to use GnuTLS. NSS-powered libcurl provides the option only
+for backward compatibility.
+.IP CURLOPT_CRLFILE
+Pass a char * to a zero terminated string naming a file 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_SSL_VERIFYPEER\fP option.
+
+A specific error code (CURLE_SSL_CRL_BADFILE) 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. (Added in 7.19.0)
+.IP CURLOPT_SSL_VERIFYHOST
+Pass a long as parameter.
+
+This option determines whether libcurl verifies that the server cert is for
+the server it is known as.
+
+When negotiating a SSL connection, the server sends a certificate indicating
+its identity.
+
+When \fICURLOPT_SSL_VERIFYHOST\fP is 2, that certificate must indicate that
+the server is the server to which you meant to connect, or the connection
+fails.
+
+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.
+
+When the value is 1, libcurl will return a failure. It was previously (in
+7.28.0 and earlier) a debug option of some sorts, but it is no longer
+supported due to frequently leading to programmer mistakes.
+
+When the value is 0, the connection succeeds regardless of the names in the
+certificate.
+
+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\fP. If libcurl is built against NSS and
+\fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_SSL_VERIFYHOST\fP
+is ignored.
+
+.IP CURLOPT_CERTINFO
+Pass a long set to 1 to enable libcurl's certificate chain info gatherer. With
+this enabled, libcurl (if built with OpenSSL) will extract lots of information
+and data about the certificates in the certificate chain used in the SSL
+connection. This data is then possible to extract after a transfer using
+\fIcurl_easy_getinfo(3)\fP and its option \fICURLINFO_CERTINFO\fP. (Added in
+7.19.1)
+.IP CURLOPT_RANDOM_FILE
+Pass a char * to a zero terminated file name. The file will be used to read
+from to seed the random engine for SSL. The more random the specified file is,
+the more secure the SSL connection will become.
+.IP CURLOPT_EGDSOCKET
+Pass a char * to the zero terminated path name to the Entropy Gathering Daemon
+socket. It will be used to seed the random engine for SSL.
+.IP CURLOPT_SSL_CIPHER_LIST
+Pass a char *, pointing to a zero 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:
+\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP
+
+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:
+\fIhttp://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives\fP
+
+.IP CURLOPT_SSL_SESSIONID_CACHE
+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. While nothing ever should get hurt by attempting to reuse SSL
+session-IDs, there seem to be broken SSL implementations in the wild that may
+require you to disable this in order for you to succeed. (Added in 7.16.0)
+.IP CURLOPT_SSL_OPTIONS
+Pass a long with a bitmask to tell libcurl about specific SSL behaviors.
+
+CURLSSLOPT_ALLOW_BEAST is the only supported bit and by setting this the user
+will tell 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 loosens the security, and
+by setting this option to 1 you ask for exactly that. (Added in 7.25.0)
+.IP CURLOPT_KRBLEVEL
+Pass a char * as parameter. Set the kerberos security level for FTP; this also
+enables kerberos awareness. This is a string, \&'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.
+
+(This option was known as CURLOPT_KRB4LEVEL up to 7.16.3)
+.IP CURLOPT_GSSAPI_DELEGATION
+Set the parameter to CURLGSSAPI_DELEGATION_FLAG to allow unconditional GSSAPI
+credential delegation. The delegation is disabled by default since 7.21.7.
+Set the parameter to CURLGSSAPI_DELEGATION_POLICY_FLAG to delegate only if
+the OK-AS-DELEGATE flag is set in the service ticket in case this feature is
+supported by the GSSAPI implementation and the definition of
+GSS_C_DELEG_POLICY_FLAG was available at compile-time.
+(Added in 7.22.0)
+.SH SSH OPTIONS
+.IP CURLOPT_SSH_AUTH_TYPES
+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 CURLSSH_AUTH_ANY to let
+libcurl pick a suitable one. Currently CURLSSH_AUTH_HOST has no effect. (Added
+in 7.16.1) If CURLSSH_AUTH_AGENT is used, libcurl attempts to connect to
+ssh-agent or pageant and let the agent attempt the authentication. (Added in
+7.28.0)
+.IP CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
+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. This
+option is only for SCP and SFTP transfers. (Added in 7.17.1)
+.IP CURLOPT_SSH_PUBLIC_KEYFILE
+Pass a char * pointing to a file name 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. (Added in 7.16.1)
+If 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
+when libssh2 1.4.0+ is linked against OpenSSL. (Added in 7.26.0)
+.IP CURLOPT_SSH_PRIVATE_KEYFILE
+Pass a char * pointing to a file name 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\fP. (Added in 7.16.1)
+.IP CURLOPT_SSH_KNOWNHOSTS
+Pass a pointer to a zero 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\fP to alter the default
+behavior on host and key (mis)matching. (Added in 7.19.6)
+.IP CURLOPT_SSH_KEYFUNCTION
+Pass a pointer to a curl_sshkeycallback function. 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\fP is also set.
+
+The curl_sshkeycallback function gets passed the CURL handle, the key from the
+known_hosts file, the key from the remote site, info from libcurl on the
+matching status and a custom pointer (set with \fICURLOPT_SSH_KEYDATA\fP). It
+MUST return one of the following return codes to tell libcurl how to act:
+.RS
+.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.
+.RE
+ (Added in 7.19.6)
+.IP CURLOPT_SSH_KEYDATA
+Pass a void * as parameter. This pointer will be passed along verbatim to the
+callback set with \fICURLOPT_SSH_KEYFUNCTION\fP. (Added in 7.19.6)
+.SH OTHER OPTIONS
+.IP CURLOPT_PRIVATE
+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
+does nothing with this data. (Added in 7.10.3)
+.IP CURLOPT_SHARE
+Pass a share 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.
+.IP CURLOPT_NEW_FILE_PERMS
+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. (Added in 7.16.4)
+.IP CURLOPT_NEW_DIRECTORY_PERMS
+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.
+(Added in 7.16.4)
+.SH TELNET OPTIONS
+.IP CURLOPT_TELNETOPTIONS
+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 RETURN VALUE
+CURLE_OK (zero) means that the option was set properly, non-zero means an
+error occurred as \fI<curl/curl.h>\fP defines. See the \fIlibcurl-errors(3)\fP
+man page for the full list with descriptions.
+
+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_FAILED_INIT\fP.
+.SH "SEE ALSO"
+.BR curl_easy_init "(3), " curl_easy_cleanup "(3), " curl_easy_reset "(3)"
diff --git a/docs/libcurl/curl_easy_strerror.3 b/docs/libcurl/curl_easy_strerror.3
new file mode 100644
index 000000000..a26c9c5db
--- /dev/null
+++ b/docs/libcurl/curl_easy_strerror.3
@@ -0,0 +1,37 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_strerror 3 "26 Apr 2004" "libcurl 7.12" "libcurl Manual"
+.SH NAME
+curl_easy_strerror - return string describing error code
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+const char *curl_easy_strerror(CURLcode errornum);
+.SH DESCRIPTION
+The curl_easy_strerror() function returns a string describing the CURLcode
+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 zero terminated string.
+.SH "SEE ALSO"
+.BR libcurl-errors "(3), " curl_multi_strerror "(3), " curl_share_strerror "(3)"
diff --git a/docs/libcurl/curl_easy_unescape.3 b/docs/libcurl/curl_easy_unescape.3
new file mode 100644
index 000000000..9b03fd0f9
--- /dev/null
+++ b/docs/libcurl/curl_easy_unescape.3
@@ -0,0 +1,51 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH curl_easy_unescape 3 "7 April 2006" "libcurl 7.15.4" "libcurl Manual"
+.SH NAME
+curl_easy_unescape - URL decodes the given string
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "char *curl_easy_unescape( CURL *" curl ", char *" url ", int "inlength
+.BI ", 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.
+
+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 zero terminated string or NULL if it failed.
+.SH "SEE ALSO"
+.I curl_easy_escape(3), curl_free(3), RFC 2396
diff --git a/docs/libcurl/curl_escape.3 b/docs/libcurl/curl_escape.3
new file mode 100644
index 000000000..75fd51f2d
--- /dev/null
+++ b/docs/libcurl/curl_escape.3
@@ -0,0 +1,48 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_escape 3 "6 March 2002" "libcurl 7.9" "libcurl Manual"
+.SH NAME
+curl_escape - URL encodes the given string
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "char *curl_escape( 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 curl_free() 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 zero terminated string or NULL if it failed.
+.SH "SEE ALSO"
+.BR curl_unescape "(3), " curl_free "(3), " RFC 2396
diff --git a/docs/libcurl/curl_formadd.3 b/docs/libcurl/curl_formadd.3
new file mode 100644
index 000000000..ce4df1e4b
--- /dev/null
+++ b/docs/libcurl/curl_formadd.3
@@ -0,0 +1,235 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_formadd 3 "24 June 2002" "libcurl 7.9.8" "libcurl Manual"
+.SH NAME
+curl_formadd - add a section to a multipart/formdata HTTP POST
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "CURLFORMcode curl_formadd(struct curl_httppost ** " firstitem,
+.BI "struct curl_httppost ** " lastitem, " ...);"
+.ad
+.SH DESCRIPTION
+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 \fBCURLOPT_HTTPPOST\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\P 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\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, or if you'd
+like it to contain zero bytes, you must set its length with
+\fBCURLFORM_NAMELENGTH\fP. 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, or if you'd like it to contain zero
+bytes, you must set its length with \fBCURLFORM_NAMELENGTH\fP.
+.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_CONTENTSLENGTH
+followed by a long giving the length of the contents. Note that for
+\fICURLFORM_STREAM\fP contents, this option is mandatory.
+.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.
+.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).
+.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\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. (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\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 RETURN VALUE
+0 means everything was ok, non-zero means an error occurred corresponding
+to a CURL_FORMADD_* constant defined in
+.I <curl/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)"
diff --git a/docs/libcurl/curl_formfree.3 b/docs/libcurl/curl_formfree.3
new file mode 100644
index 000000000..7438a1640
--- /dev/null
+++ b/docs/libcurl/curl_formfree.3
@@ -0,0 +1,44 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_formfree 3 "6 April 2001" "libcurl 7.7.1" "libcurl Manual"
+.SH NAME
+curl_formfree - free a previously build multipart/formdata HTTP POST chain
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "void curl_formfree(struct curl_httppost *" form);
+.ad
+.SH DESCRIPTION
+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
+\fBCURLOPT_HTTPPOST\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.
+.SH RETURN VALUE
+None
+.SH "SEE ALSO"
+.BR curl_formadd "(3) "
diff --git a/docs/libcurl/curl_formget.3 b/docs/libcurl/curl_formget.3
new file mode 100644
index 000000000..b52622136
--- /dev/null
+++ b/docs/libcurl/curl_formget.3
@@ -0,0 +1,70 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_formget 3 "20 June 2006" "libcurl 7.15.5" "libcurl Manual"
+.SH NAME
+curl_formget - serialize a previously built multipart/formdata HTTP POST chain
+.SH SYNOPSIS
+.nf
+.B #include <curl/curl.h>
+
+void 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
+.SH "SEE ALSO"
+.BR curl_formadd "(3) "
diff --git a/docs/libcurl/curl_free.3 b/docs/libcurl/curl_free.3
new file mode 100644
index 000000000..08ec9b6b3
--- /dev/null
+++ b/docs/libcurl/curl_free.3
@@ -0,0 +1,35 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_free 3 "12 Aug 2003" "libcurl 7.10" "libcurl Manual"
+.SH NAME
+curl_free - reclaim memory that has been obtained through a libcurl call
+.SH SYNOPSIS
+.B #include <curl/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
+curl_free() instead of free() to avoid anomalies that can result from
+differences in memory management between your application and libcurl.
+.SH "SEE ALSO"
+.I curl_unescape(3)
diff --git a/docs/libcurl/curl_getdate.3 b/docs/libcurl/curl_getdate.3
new file mode 100644
index 000000000..65eed9c57
--- /dev/null
+++ b/docs/libcurl/curl_getdate.3
@@ -0,0 +1,117 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_getdate 3 "12 Aug 2005" "libcurl 7.0" "libcurl Manual"
+.SH NAME
+curl_getdate - Convert a date string to number of seconds since January 1,
+1970
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "time_t curl_getdate(char *" datestring ", time_t *"now " );"
+.ad
+.SH DESCRIPTION
+This function returns the number of seconds since January 1st 1970 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.
+
+\fBNOTE:\fP This function was rewritten for the 7.12.2 release and this
+documentation covers the functionality of the new one. The new one is not
+feature-complete with the old one, but most of the formats supported by the
+new one was supported by the old too.
+.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 RFC2616 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.
+
+If the year is larger than 2037 on systems with 32 bit time_t, this function
+will return 0x7fffffff (since that is the largest possible signed 32 bit
+number).
+
+Having a 64 bit time_t is not a guarantee that dates beyond 03:14:07 UTC,
+January 19, 2038 will work fine. On systems with a 64 bit time_t but with a
+crippled mktime(), \fIcurl_getdate\fP will return -1 in this case.
+.SH REWRITE
+The former version of this function was built with yacc and was not only very
+large, it was also never quite understood and it wasn't possible to build with
+non-GNU tools since only GNU Bison could make it thread-safe!
+
+The rewrite was done for 7.12.2. The new one is much smaller and uses simpler
+code.
diff --git a/docs/libcurl/curl_getenv.3 b/docs/libcurl/curl_getenv.3
new file mode 100644
index 000000000..33554476a
--- /dev/null
+++ b/docs/libcurl/curl_getenv.3
@@ -0,0 +1,49 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_getenv 3 "30 April 2004" "libcurl 7.12" "libcurl Manual"
+.SH NAME
+curl_getenv - return value for environment name
+.SH SYNOPSIS
+.B #include <curl/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).
+.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
+If successful, curl_getenv() returns a pointer to the value of the specified
+environment. The memory it refers to is malloc()ed so the application must
+free() this when the data is no longer needed. When \fIcurl_getenv(3)\fP fails
+to find the specified name, it returns a null pointer.
+.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 --git a/docs/libcurl/curl_global_cleanup.3 b/docs/libcurl/curl_global_cleanup.3
new file mode 100644
index 000000000..83a54e467
--- /dev/null
+++ b/docs/libcurl/curl_global_cleanup.3
@@ -0,0 +1,49 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_global_cleanup 3 "17 Feb 2006" "libcurl 7.8" "libcurl Manual"
+.SH NAME
+curl_global_cleanup - global libcurl cleanup
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "void curl_global_cleanup(void);"
+.ad
+.SH DESCRIPTION
+This function releases resources acquired by \fBcurl_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
+\fBcurl_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 \fBlibcurl(3)\fP of global environment requirements for
+details of how to use this function.
+
+.SH "SEE ALSO"
+.BR curl_global_init "(3), "
+.BR libcurl "(3), "
+
diff --git a/docs/libcurl/curl_global_init.3 b/docs/libcurl/curl_global_init.3
new file mode 100644
index 000000000..d91e1bdb7
--- /dev/null
+++ b/docs/libcurl/curl_global_init.3
@@ -0,0 +1,80 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_global_init 3 "11 May 2004" "libcurl 7.12" "libcurl Manual"
+.SH NAME
+curl_global_init - Global libcurl initialisation
+.SH SYNOPSIS
+.B #include <curl/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()\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 \fBlibcurl\fP(3) of global environment requirements for
+details of how to use this function.
+
+.SH FLAGS
+.TP 5
+.B CURL_GLOBAL_ALL
+Initialize everything possible. This sets all known bits.
+.TP
+.B CURL_GLOBAL_SSL
+Initialize SSL
+.TP
+.B CURL_GLOBAL_WIN32
+Initialize the Win32 socket libraries.
+.TP
+.B CURL_GLOBAL_NOTHING
+Initialise nothing extra. This sets no bit.
+.TP
+.B 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.
+.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_easy_init "(3) "
+.BR libcurl "(3) "
diff --git a/docs/libcurl/curl_global_init_mem.3 b/docs/libcurl/curl_global_init_mem.3
new file mode 100644
index 000000000..d13a17c6e
--- /dev/null
+++ b/docs/libcurl/curl_global_init_mem.3
@@ -0,0 +1,60 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_global_init_mem 3 "10 May 2004" "libcurl 7.12.0" "libcurl Manual"
+.SH NAME
+curl_global_init_mem - Global libcurl initialisation with memory callbacks
+.SH SYNOPSIS
+.B #include <curl/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.
+
+This man page only adds documentation for the callbacks, see the
+\fIcurl_global_init(3)\fP man page for all the rest. When you use this
+function, all callback arguments must be set to valid function pointers.
+
+The prototypes for the given callbacks should 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()
+.SH "CAUTION"
+Manipulating these gives considerable powers to the application to severly
+screw things up for libcurl. Take care!
+.SH "SEE ALSO"
+.BR curl_global_init "(3), "
+.BR curl_global_cleanup "(3), "
+
diff --git a/docs/libcurl/curl_mprintf.3 b/docs/libcurl/curl_mprintf.3
new file mode 100644
index 000000000..cbf10e1ab
--- /dev/null
+++ b/docs/libcurl/curl_mprintf.3
@@ -0,0 +1,109 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_printf 3 "30 April 2004" "libcurl 7.12" "libcurl 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 <curl/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
+
+To easily use all these cloned functions instead of the normal ones, #define
+_MPRINTF_REPLACE before you include the <curl/mprintf.h> file. Then all the
+normal names like printf, fprintf, sprintf etc will use the curl-functions
+instead.
+.SH AVAILABILITY
+These function 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_-prefixed functions. See lib/README.curlx for further details.
+.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 --git a/docs/libcurl/curl_multi_add_handle.3 b/docs/libcurl/curl_multi_add_handle.3
new file mode 100644
index 000000000..bae2c90fe
--- /dev/null
+++ b/docs/libcurl/curl_multi_add_handle.3
@@ -0,0 +1,57 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_add_handle 3 "4 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.SH NAME
+curl_multi_add_handle - add an easy handle to a multi session
+.SH SYNOPSIS
+#include <curl/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.
+Furthermore, libcurl now initiates the connection associated with the
+specified \fIeasy_handle\fP.
+
+When an easy handle has been added to a multi stack, you can not and you must
+not use \fIcurl_easy_perform(3)\fP on that handle!
+
+If the easy handle is not set to use a shared (CURLOPT_SHARE) or global DNS
+cache (CURLOPT_DNS_USE_GLOBAL_CACHE), 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.
+
+The easy handle will remain added until you remove it again with
+\fIcurl_multi_remove_handle(3)\fP. 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)"
diff --git a/docs/libcurl/curl_multi_assign.3 b/docs/libcurl/curl_multi_assign.3
new file mode 100644
index 000000000..0b580fe27
--- /dev/null
+++ b/docs/libcurl/curl_multi_assign.3
@@ -0,0 +1,63 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_assign 3 "9 Jul 2006" "libcurl 7.16.0" "libcurl Manual"
+.SH NAME
+curl_multi_assign \- set data to association with an internal socket
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd,
+ void *sockptr);
+.SH DESCRIPTION
+This function assigns an association in the multi handle between the given
+socket and a private pointer of the application. This is (only) useful for
+\fIcurl_multi_socket(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(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, although not deemed stable yet.
+.SH "SEE ALSO"
+.BR curl_multi_setopt "(3), " curl_multi_socket "(3) "
diff --git a/docs/libcurl/curl_multi_cleanup.3 b/docs/libcurl/curl_multi_cleanup.3
new file mode 100644
index 000000000..e83c9f01b
--- /dev/null
+++ b/docs/libcurl/curl_multi_cleanup.3
@@ -0,0 +1,46 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_cleanup 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.SH NAME
+curl_multi_cleanup - close down a multi session
+.SH SYNOPSIS
+.B #include <curl/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
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code.
+.SH "SEE ALSO"
+.BR curl_multi_init "(3)," curl_easy_cleanup "(3)," curl_easy_init "(3)"
diff --git a/docs/libcurl/curl_multi_fdset.3 b/docs/libcurl/curl_multi_fdset.3
new file mode 100644
index 000000000..3dbdc4504
--- /dev/null
+++ b/docs/libcurl/curl_multi_fdset.3
@@ -0,0 +1,70 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_fdset 3 "2 Jan 2006" "libcurl 7.16.0" "libcurl Manual"
+.SH NAME
+curl_multi_fdset - extracts file descriptor information from a multi handle
+.SH SYNOPSIS
+.nf
+#include <curl/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 no file descriptors are set by libcurl, \fImax_fd\fP will contain -1 when
+this function returns. Otherwise it will contain the higher 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(). When max_fd returns with -1, you need to
+wait a while and then proceed and call \fIcurl_multi_perform\fP anyway. How
+long to wait? I would suggest 100 milliseconds at least, but you may want to
+test it out in your own particular conditions to find a suitable value.
+
+When doing select(), you should use \fBcurl_multi_timeout\fP to figure out how
+long to wait for action. Call \fIcurl_multi_perform\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_timeout "(3), " curl_multi_perform "(3) "
diff --git a/docs/libcurl/curl_multi_info_read.3 b/docs/libcurl/curl_multi_info_read.3
new file mode 100644
index 000000000..875176486
--- /dev/null
+++ b/docs/libcurl/curl_multi_info_read.3
@@ -0,0 +1,76 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_info_read 3 "18 Dec 2004" "libcurl 7.10.3" "libcurl Manual"
+.SH NAME
+curl_multi_info_read - read multi stack informationals
+.SH SYNOPSIS
+#include <curl/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" in
+present in that struct and can thus 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 "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 --git a/docs/libcurl/curl_multi_init.3 b/docs/libcurl/curl_multi_init.3
new file mode 100644
index 000000000..ca9374e15
--- /dev/null
+++ b/docs/libcurl/curl_multi_init.3
@@ -0,0 +1,40 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_init 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.SH NAME
+curl_multi_init - create a multi handle
+.SH SYNOPSIS
+.B #include <curl/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 --git a/docs/libcurl/curl_multi_perform.3 b/docs/libcurl/curl_multi_perform.3
new file mode 100644
index 000000000..304197b1a
--- /dev/null
+++ b/docs/libcurl/curl_multi_perform.3
@@ -0,0 +1,78 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_perform 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.SH NAME
+curl_multi_perform - reads/writes available data from each easy handle
+.SH SYNOPSIS
+#include <curl/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.
+curl_multi_perform() 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.
+
+When \fIrunning_handles\fP is set to zero (0) on the return of this function,
+there is no longer any transfers in progress.
+.SH "RETURN VALUE"
+CURLMcode type, general libcurl multi interface error code.
+
+Before version 7.20.0: If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this
+basically means that you should call \fIcurl_multi_perform\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_fdset "(3), " curl_multi_info_read "(3), "
+.BR libcurl-errors "(3)"
diff --git a/docs/libcurl/curl_multi_remove_handle.3 b/docs/libcurl/curl_multi_remove_handle.3
new file mode 100644
index 000000000..ad6d2bac8
--- /dev/null
+++ b/docs/libcurl/curl_multi_remove_handle.3
@@ -0,0 +1,43 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_remove_handle 3 "6 March 2002" "libcurl 7.9.5" "libcurl Manual"
+.SH NAME
+curl_multi_remove_handle - remove an easy handle from a multi session
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle);
+.ad
+.SH DESCRIPTION
+Removes a given easy_handle from the multi_handle. 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()\fP on this easy handle.
+
+Removing an easy handle while being used, will effectively halt the transfer
+in progress involving that easy handle. All other easy handles and transfers
+will remain unaffected.
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code.
+.SH "SEE ALSO"
+.BR curl_multi_cleanup "(3)," curl_multi_init "(3)"
diff --git a/docs/libcurl/curl_multi_setopt.3 b/docs/libcurl/curl_multi_setopt.3
new file mode 100644
index 000000000..baaaaeac0
--- /dev/null
+++ b/docs/libcurl/curl_multi_setopt.3
@@ -0,0 +1,103 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_setopt 3 "10 Oct 2006" "libcurl 7.16.0" "libcurl Manual"
+.SH NAME
+curl_multi_setopt \- set options for a curl multi handle
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param);
+.SH DESCRIPTION
+curl_multi_setopt() 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_SOCKETFUNCTION
+Pass a pointer to a function matching the \fBcurl_socket_callback\fP
+prototype. 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 curl_socket_callback given in the
+\fBparam\fP argument. They update the status with changes since the previous
+time a \fIcurl_multi_socket(3)\fP function was called. If the given callback
+pointer is NULL, no callback will be called. Set the callback's \fBuserp\fP
+argument with \fICURLMOPT_SOCKETDATA\fP. See \fIcurl_multi_socket(3)\fP for
+more callback details.
+.IP CURLMOPT_SOCKETDATA
+Pass a pointer to whatever you want passed to the \fBcurl_socket_callback\fP's
+forth argument, the userp pointer. This is not used by libcurl but only
+passed-thru as-is. Set the callback pointer with
+\fICURLMOPT_SOCKETFUNCTION\fP.
+.IP CURLMOPT_PIPELINING
+Pass a long set to 1 to enable or 0 to disable. Enabling pipelining on a multi
+handle will make it attempt to perform HTTP Pipelining as far as possible for
+transfers using this handle. 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. (Added in
+7.16.0)
+.IP CURLMOPT_TIMERFUNCTION
+Pass a pointer to a function matching the \fBcurl_multi_timer_callback\fP
+prototype. This function will then be called when the timeout value
+changes. The timeout value is at what latest time the application should call
+one of the \&"performing" functions of the multi interface
+(\fIcurl_multi_socket_action(3)\fP and \fIcurl_multi_perform(3)\fP) - to allow
+libcurl to keep timeouts and retries etc to work. A timeout value of -1 means
+that there is no timeout at all, and 0 means that the timeout is already
+reached. Libcurl attempts to limit calling this only when the fixed future
+timeout time actually changes. See also \fICURLMOPT_TIMERDATA\fP. This
+callback can be used instead of, or in addition to,
+\fIcurl_multi_timeout(3)\fP. (Added in 7.16.0)
+.IP CURLMOPT_TIMERDATA
+Pass a pointer to whatever you want passed to the
+\fBcurl_multi_timer_callback\fP's third argument, the userp pointer. This is
+not used by libcurl but only passed-thru as-is. Set the callback pointer with
+\fICURLMOPT_TIMERFUNCTION\fP. (Added in 7.16.0)
+.IP CURLMOPT_MAXCONNECTS
+Pass a long. The set number will be used as the maximum amount of
+simultaneously open connections that libcurl may cache. Default is 10, and
+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\fP option.
+
+(Added in 7.16.3)
+.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 --git a/docs/libcurl/curl_multi_socket.3 b/docs/libcurl/curl_multi_socket.3
new file mode 100644
index 000000000..6b262f292
--- /dev/null
+++ b/docs/libcurl/curl_multi_socket.3
@@ -0,0 +1,158 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_socket 3 "9 Jul 2006" "libcurl 7.16.0" "libcurl Manual"
+.SH NAME
+curl_multi_socket \- reads/writes available data
+.SH SYNOPSIS
+.nf
+#include <curl/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 \fBcurl_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 CURLMOPT_SOCKETFUNCTION
+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\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 \fBcurl_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 \fBcurl_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 CURLMOPT_SOCKETDATA 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_SOKCET\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 CURLMOPT_SOCKETFUNCTION
+
+3. Set the timeout callback with CURLMOPT_TIMERFUNCTION, 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 --git a/docs/libcurl/curl_multi_socket_action.3 b/docs/libcurl/curl_multi_socket_action.3
new file mode 100644
index 000000000..ac3b176c7
--- /dev/null
+++ b/docs/libcurl/curl_multi_socket_action.3
@@ -0,0 +1,149 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_socket_action 3 "9 Jul 2006" "libcurl 7.16.0" "libcurl Manual"
+.SH NAME
+curl_multi_socket_action \- reads/writes available data given an action
+.SH SYNOPSIS
+.nf
+#include <curl/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.
+
+At return, the integer \fBrunning_handles\fP points to will contain 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 \fBcurl_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 CURLMOPT_SOCKETFUNCTION
+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\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 \fBcurl_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 "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 CURLMOPT_SOCKETDATA option.
+.SH "RETURN VALUE"
+CURLMcode type, general libcurl multi interface error code.
+
+Before version 7.20.0: If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this
+basically means that you should call \fIcurl_multi_socket_action(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".
+
+The return code from this function 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 CURLMOPT_SOCKETFUNCTION
+
+3. Set the timeout callback with CURLMOPT_TIMERFUNCTION, 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...) 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 --git a/docs/libcurl/curl_multi_socket_all.3 b/docs/libcurl/curl_multi_socket_all.3
new file mode 100644
index 000000000..428dd06f9
--- /dev/null
+++ b/docs/libcurl/curl_multi_socket_all.3
@@ -0,0 +1 @@
+.so man3/curl_multi_socket.3
diff --git a/docs/libcurl/curl_multi_strerror.3 b/docs/libcurl/curl_multi_strerror.3
new file mode 100644
index 000000000..40d0974c5
--- /dev/null
+++ b/docs/libcurl/curl_multi_strerror.3
@@ -0,0 +1,37 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_strerror 3 "26 Apr 2004" "libcurl 7.12" "libcurl Manual"
+.SH NAME
+curl_multi_strerror - return string describing error code
+.SH SYNOPSIS
+.nf
+.B #include <curl/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 zero terminated string.
+.SH "SEE ALSO"
+.BR libcurl-errors "(3), " curl_easy_strerror "(3), " curl_share_strerror "(3)"
diff --git a/docs/libcurl/curl_multi_timeout.3 b/docs/libcurl/curl_multi_timeout.3
new file mode 100644
index 000000000..5ad8008ea
--- /dev/null
+++ b/docs/libcurl/curl_multi_timeout.3
@@ -0,0 +1,63 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_timeout 3 "2 Jan 2006" "libcurl 7.16.0" "libcurl Manual"
+.SH NAME
+curl_multi_timeout \- how long to wait for action before proceeding
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLMcode curl_multi_timeout(CURLM *multi_handle, long *timeout);
+.SH DESCRIPTION
+
+An application using the libcurl multi interface should call
+\fBcurl_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
+\fBcurl_multi_socket_action(3)\fP function with the \fBsockfd\fP argument set
+to CURL_SOCKET_TIMEOUT, or call \fBcurl_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 "RETURN VALUE"
+The standard CURLMcode for multi interface error codes.
+.SH "TYPICAL USAGE"
+Call \fBcurl_multi_timeout(3)\fP, then wait for action on the sockets. You
+figure out which sockets to wait for by calling \fBcurl_multi_fdset(3)\fP or
+by a previous call to \fBcurl_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 --git a/docs/libcurl/curl_multi_wait.3 b/docs/libcurl/curl_multi_wait.3
new file mode 100644
index 000000000..b14760bf3
--- /dev/null
+++ b/docs/libcurl/curl_multi_wait.3
@@ -0,0 +1,75 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_wait 3 "12 Jul 2012" "libcurl 7.28.0" "libcurl Manual"
+.SH NAME
+curl_multi_wait - polls on all easy handles in a multi handle
+.SH SYNOPSIS
+.nf
+#include <curl/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
+This function polls on 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.
+
+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 supplied, it will be populated with the
+number of file descriptors on which interesting events occured.
+
+If no extra file descriptors are provided and libcurl has no file descriptor
+to offer to wait for, this function will return immediately.
+
+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 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)"
diff --git a/docs/libcurl/curl_share_cleanup.3 b/docs/libcurl/curl_share_cleanup.3
new file mode 100644
index 000000000..3af1707bb
--- /dev/null
+++ b/docs/libcurl/curl_share_cleanup.3
@@ -0,0 +1,40 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_share_cleanup 3 "8 Aug 2003" "libcurl 7.10.7" "libcurl Manual"
+.SH NAME
+curl_share_cleanup - Clean up a shared object
+.SH SYNOPSIS
+.B #include <curl/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.
+
+.SH RETURN VALUE
+CURLSHE_OK (zero) means that the option was set properly, non-zero means an
+error occurred as \fI<curl/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 --git a/docs/libcurl/curl_share_init.3 b/docs/libcurl/curl_share_init.3
new file mode 100644
index 000000000..ce00d958e
--- /dev/null
+++ b/docs/libcurl/curl_share_init.3
@@ -0,0 +1,44 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_share_init 3 "8 Aug 2003" "libcurl 7.10.7" "libcurl Manual"
+.SH NAME
+curl_share_init - Create a shared object
+.SH SYNOPSIS
+.B #include <curl/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\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 --git a/docs/libcurl/curl_share_setopt.3 b/docs/libcurl/curl_share_setopt.3
new file mode 100644
index 000000000..c196743ff
--- /dev/null
+++ b/docs/libcurl/curl_share_setopt.3
@@ -0,0 +1,85 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_share_setopt 3 "8 Aug 2003" "libcurl 7.10.7" "libcurl Manual"
+.SH NAME
+curl_share_setopt - Set options for a shared object
+.SH SYNOPSIS
+.B #include <curl/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);
+
+\fIdata\fP defines what data libcurl wants to lock, and you must make sure that
+only one lock is given at any time 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.
+.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 this having to
+be used!
+.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.
+.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<curl/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 --git a/docs/libcurl/curl_share_strerror.3 b/docs/libcurl/curl_share_strerror.3
new file mode 100644
index 000000000..f1bc39867
--- /dev/null
+++ b/docs/libcurl/curl_share_strerror.3
@@ -0,0 +1,37 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_share_strerror 3 "26 Apr 2004" "libcurl 7.12" "libcurl Manual"
+.SH NAME
+curl_share_strerror - return string describing error code
+.SH SYNOPSIS
+.nf
+.B #include <curl/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 zero terminated string.
+.SH "SEE ALSO"
+.BR libcurl-errors "(3), " curl_multi_strerror "(3), " curl_easy_strerror "(3)"
diff --git a/docs/libcurl/curl_slist_append.3 b/docs/libcurl/curl_slist_append.3
new file mode 100644
index 000000000..529560e8a
--- /dev/null
+++ b/docs/libcurl/curl_slist_append.3
@@ -0,0 +1,56 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_slist_append 3 "19 Jun 2003" "libcurl 7.10.4" "libcurl Manual"
+.SH NAME
+curl_slist_append - add a string to an slist
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "struct curl_slist *curl_slist_append(struct curl_slist *" list,
+.BI "const char * "string ");"
+.ad
+.SH DESCRIPTION
+curl_slist_append() appends a specified string to a linked list of
+strings. The existing \fIlist\fP should be passed as the first argument while
+the new list is returned from this function. The specified \fIstring\fP has
+been appended when this function returns. curl_slist_append() copies the
+string.
+
+The list should be freed again (after usage) with
+\fBcurl_slist_free_all(3)\fP.
+.SH RETURN VALUE
+A null pointer is returned if anything went wrong, otherwise the new list
+pointer is returned.
+.SH EXAMPLE
+.nf
+ CURL handle;
+ struct curl_slist *slist=NULL;
+
+ slist = curl_slist_append(slist, "pragma:");
+ 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 --git a/docs/libcurl/curl_slist_free_all.3 b/docs/libcurl/curl_slist_free_all.3
new file mode 100644
index 000000000..fab3d6080
--- /dev/null
+++ b/docs/libcurl/curl_slist_free_all.3
@@ -0,0 +1,37 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_slist_free_all 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
+.SH NAME
+curl_slist_free_all - free an entire curl_slist list
+.SH SYNOPSIS
+.B #include <curl/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.
+.SH RETURN VALUE
+Nothing.
+.SH "SEE ALSO"
+.BR curl_slist_append "(3), "
+
diff --git a/docs/libcurl/curl_strequal.3 b/docs/libcurl/curl_strequal.3
new file mode 100644
index 000000000..ce575d7ac
--- /dev/null
+++ b/docs/libcurl/curl_strequal.3
@@ -0,0 +1,51 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_strequal 3 "30 April 2004" "libcurl 7.12" "libcurl Manual"
+.SH NAME
+curl_strequal, curl_strnequal - case insensitive string comparisons
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "int curl_strequal(char *" str1 ", char *" str2 ");"
+.sp
+.BI "int curl_strenqual(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 --git a/docs/libcurl/curl_strnequal.3 b/docs/libcurl/curl_strnequal.3
new file mode 100644
index 000000000..ce41d3e41
--- /dev/null
+++ b/docs/libcurl/curl_strnequal.3
@@ -0,0 +1 @@
+.so man3/curl_strequal.3
diff --git a/docs/libcurl/curl_unescape.3 b/docs/libcurl/curl_unescape.3
new file mode 100644
index 000000000..2a24866d3
--- /dev/null
+++ b/docs/libcurl/curl_unescape.3
@@ -0,0 +1,48 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_unescape 3 "22 March 2001" "libcurl 7.7" "libcurl Manual"
+.SH NAME
+curl_unescape - URL decodes the given string
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "char *curl_unescape( 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 curl_free() 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 zero terminated string or NULL if it failed.
+.SH "SEE ALSO"
+.I curl_easy_escape(3), curl_easy_unescape(3), curl_free(3), RFC 2396
diff --git a/docs/libcurl/curl_version.3 b/docs/libcurl/curl_version.3
new file mode 100644
index 000000000..003329800
--- /dev/null
+++ b/docs/libcurl/curl_version.3
@@ -0,0 +1,36 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_version 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
+.SH NAME
+curl_version - returns the libcurl version string
+.SH SYNOPSIS
+.B #include <curl/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).
+.SH RETURN VALUE
+A pointer to a zero terminated string.
+.SH "SEE ALSO"
+.BR curl_version_info "(3)"
diff --git a/docs/libcurl/curl_version_info.3 b/docs/libcurl/curl_version_info.3
new file mode 100644
index 000000000..ccb202834
--- /dev/null
+++ b/docs/libcurl/curl_version_info.3
@@ -0,0 +1,154 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH curl_version_info 3 "10 June 2009" "libcurl 7.19.6" "libcurl Manual"
+.SH NAME
+curl_version_info - returns run-time libcurl version info
+.SH SYNOPSIS
+.B #include <curl/curl.h>
+.sp
+.BI "curl_version_info_data *curl_version_info( CURLversion "type ");"
+.ad
+.SH DESCRIPTION
+Returns a pointer to a filled in struct with information about various
+run-time features in libcurl. \fItype\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. CURLVERSION_NOW 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 */
+
+ /* when 'age' is 0 or higher, the members below also exist: */
+ 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 **protocols; /* list of protocols */
+
+ /* when 'age' is 1 or higher, the members below also exist: */
+ const char *ares; /* human readable string */
+ int ares_num; /* number */
+
+ /* when 'age' is 2 or higher, the member below also exists: */
+ const char *libidn; /* human readable string */
+
+ /* when 'age' is 3 or higher, the members below also exist: */
+ int iconv_ver_num; /* '_libiconv_version' if iconv support enabled */
+
+ const char *libssh_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_IPV6
+supports IPv6
+.IP CURL_VERSION_KERBEROS4
+supports kerberos4 (when using FTP)
+.IP CURL_VERSION_SSL
+supports SSL (HTTPS/FTPS) (Added in 7.10)
+.IP CURL_VERSION_LIBZ
+supports HTTP deflate using libz (Added in 7.10)
+.IP CURL_VERSION_NTLM
+supports HTTP NTLM (added in 7.10.6)
+.IP CURL_VERSION_GSSNEGOTIATE
+supports HTTP GSS-Negotiate (added in 7.10.6)
+.IP CURL_VERSION_DEBUG
+libcurl was built with debug capabilities (added in 7.10.6)
+.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_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_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_LARGEFILE
+libcurl was built with support for large files. (Added in 7.11.1)
+.IP CURL_VERSION_IDN
+libcurl was built with support for IDNA, domain names with international
+letters. (Added in 7.12.0)
+.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 NTLM authentication. It also
+allows libcurl to use the current user and the current user's password without
+the app having to pass them on. (Added in 7.13.2)
+.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_TLSAUTH_SRP
+libcurl was built with support for TLS-SRP. (Added in 7.21.4)
+.IP CURL_VERSION_NTLM_WB
+libcurl was built with support for NTLM delegation to a winbind helper.
+(Added in 7.22.0)
+.RE
+\fIssl_version\fP is an ASCII string for the OpenSSL version used. If libcurl
+has no SSL support, this is NULL.
+
+\fIssl_version_num\fP is the numerical OpenSSL version value as defined by the
+OpenSSL project. If libcurl has no SSL support, this is 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 --git a/docs/libcurl/getinfo-times b/docs/libcurl/getinfo-times
new file mode 100644
index 000000000..d767d7aae
--- /dev/null
+++ b/docs/libcurl/getinfo-times
@@ -0,0 +1,27 @@
+An overview of the six time values available from curl_easy_getinfo()
+
+curk_easy_perform()
+ |
+ |--NT
+ |--|--CT
+ |--|--|--PT
+ |--|--|--|--ST
+ |--|--|--TT
+ |--|--|--|--|--RT
+
+NT = CURLINFO_NAMELOOKUP_TIME. The time it took from the start until the name
+ resolving was completed.
+CT = CURLINFO_CONNECT_TIME. The time it took from the start until the connect
+ to the remote host (or proxy) was completed.
+PT = CURLINFO_PRETRANSFER_TIME. 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.
+ST = CURLINFO_STARTTRANSFER_TIME. The time it took from the start until the
+ first byte is just about to be transferred.
+TT = CURLINFO_TOTAL_TIME. Time of the previous transfer. This time does not
+ include the connect time (CT), so if you want the complete operation
+ time, you should add that.
+RT = CURLINFO_REDIRECT_TIME. 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.
diff --git a/docs/libcurl/index.html b/docs/libcurl/index.html
new file mode 100644
index 000000000..287a2dd69
--- /dev/null
+++ b/docs/libcurl/index.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<title>Index to libcurl documentation</title>
+</head>
+
+<body>
+<h1 align="center">Index to libcurl documentation</h1>
+
+<h2>Programs</h2>
+<p><a href="../index.html">curl and tools</a>
+
+<h2>Overviews</h2>
+<A HREF="libcurl.html">libcurl</A>
+<br><a href="libcurl-easy.html">libcurl-easy</a>
+<br><a href="libcurl-multi.html">libcurl-multi</a>
+<br><a href="libcurl-share.html">libcurl-share</a>
+<br><a href="libcurl-errors.html">libcurl-errors</a>
+<br><a href="libcurl-tutorial.html">libcurl-tutorial</a>
+
+<H2>Library Functions (A-Z)</H2>
+<a href="curl_easy_cleanup.html">curl_easy_cleanup</A>
+<br><a href="curl_easy_duphandle.html">curl_easy_duphandle</A>
+<br><a href="curl_easy_getinfo.html">curl_easy_getinfo</A>
+<br><a href="curl_easy_init.html">curl_easy_init</A>
+<br><a href="curl_easy_perform.html">curl_easy_perform</A>
+<br><a href="curl_easy_recv.html">curl_easy_recv</A>
+<br><a href="curl_easy_reset.html">curl_easy_reset</A>
+<br><a href="curl_easy_send.html">curl_easy_send</A>
+<br><a href="curl_easy_setopt.html">curl_easy_setopt</A>
+<br><a href="curl_easy_strerror.html">curl_easy_strerror</A>
+<br><a href="curl_escape.html">curl_escape</A>
+<br><a href="curl_formadd.html">curl_formadd</A>
+<br><a href="curl_formfree.html">curl_formfree</A>
+<br><a href="curl_free.html">curl_free</A>
+<br><a href="curl_getdate.html">curl_getdate</A>
+<br><a href="curl_getenv.html">curl_getenv</A>
+<br><a href="curl_global_cleanup.html">curl_global_cleanup</A>
+<br><a href="curl_global_init.html">curl_global_init</A>
+<br><a href="curl_global_init_mem.html">curl_global_init_mem</A>
+<br><a href="curl_mprintf.html">curl_mprintf</A>
+<br><a href="curl_multi_add_handle.html">curl_multi_add_handle</a>
+<br><a href="curl_multi_cleanup.html">curl_multi_cleanup</a>
+<br><a href="curl_multi_fdset.html">curl_multi_fdset</a>
+<br><a href="curl_multi_info_read.html">curl_multi_info_read</a>
+<br><a href="curl_multi_init.html">curl_multi_init</a>
+<br><a href="curl_multi_perform.html">curl_multi_perform</a>
+<br><a href="curl_multi_remove_handle.html">curl_multi_remove_handle</a>
+<br><a href="curl_multi_strerror.html">curl_multi_strerror.html</a>
+<br><a href="curl_share_cleanup.html">curl_share_cleanup</A>
+<br><a href="curl_share_init.html">curl_share_init</A>
+<br><a href="curl_share_setopt.html">curl_share_setopt</A>
+<br><a href="curl_share_strerror.html">curl_share_strerror.html</a>
+<br><a href="curl_slist_append.html">curl_slist_append</A>
+<br><a href="curl_slist_free_all.html">curl_slist_free_all</A>
+<br><a href="curl_strequal.html">curl_strequal and curl_strnequal</A>
+<br><a href="curl_unescape.html">curl_unescape</A>
+<br><a href="curl_version.html">curl_version</A>
+<br><a href="curl_version_info.html">curl_version_info</A>
+
+</body></html>
diff --git a/docs/libcurl/libcurl-easy.3 b/docs/libcurl/libcurl-easy.3
new file mode 100644
index 000000000..698a4ce72
--- /dev/null
+++ b/docs/libcurl/libcurl-easy.3
@@ -0,0 +1,45 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the 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 "12 Aug 2003" "libcurl 7.10.7" "libcurl easy interface"
+.SH NAME
+libcurl-easy \- easy interface overview
+.SH DESCRIPTION
+When using libcurl's "easy" interface you init your session and get a handle
+(often referred to as an "easy handle"), which you use as input to the easy
+interface functions you use. Use \fIcurl_easy_init(3)\fP to get the handle.
+
+You continue by setting all the options you want in the upcoming transfer, the
+most important among them is the URL itself (you can't transfer anything
+without a specified URL as you may have figured out yourself). You might want
+to set some callbacks as well that will be called from the library when data
+is available etc. \fIcurl_easy_setopt(3)\fP is used for all this.
+
+When all is setup, you tell libcurl to perform the transfer using
+\fIcurl_easy_perform(3)\fP. It will then do the entire operation and won't
+return until it is done (successfully or not).
+
+After the transfer has been made, you can set new options and make another
+transfer, or if you're done, cleanup the session by calling
+\fIcurl_easy_cleanup(3)\fP. If you want persistent connections, you don't
+cleanup immediately, but instead run ahead and perform other transfers using
+the same easy handle.
+
diff --git a/docs/libcurl/libcurl-errors.3 b/docs/libcurl/libcurl-errors.3
new file mode 100644
index 000000000..beee3971f
--- /dev/null
+++ b/docs/libcurl/libcurl-errors.3
@@ -0,0 +1,289 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the 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-errors 3 "1 Jan 2010" "libcurl 7.20.0" "libcurl errors"
+.SH NAME
+libcurl-errors \- error codes in libcurl
+.SH DESCRIPTION
+This man page includes most, if not all, available error codes in libcurl.
+Why they occur and possibly what you can do to fix the problem are also included.
+.SH "CURLcode"
+Almost all "easy" interface functions return a CURLcode error code. No matter
+what, using the \fIcurl_easy_setopt(3)\fP option \fICURLOPT_ERRORBUFFER\fP is
+a good idea as it will give you a human readable error string that may offer
+more details about the cause of the error than just the error code.
+\fIcurl_easy_strerror(3)\fP can be called to get an error string from a
+given CURLcode number.
+
+CURLcode is one of the following:
+.IP "CURLE_OK (0)"
+All fine. Proceed as usual.
+.IP "CURLE_UNSUPPORTED_PROTOCOL (1)"
+The URL you passed to libcurl used a protocol that this libcurl does not
+support. The support might be a compile-time option that you didn't use, it
+can be a misspelled protocol string or just a protocol libcurl has no code
+for.
+.IP "CURLE_FAILED_INIT (2)"
+Very early initialization code failed. This is likely to be an internal error
+or problem, or a resource problem where something fundamental couldn't get
+done at init time.
+.IP "CURLE_URL_MALFORMAT (3)"
+The URL was not properly formatted.
+.IP "CURLE_NOT_BUILT_IN (4)"
+A requested feature, protocol or option was not found built-in in this libcurl
+due to a build-time decision. This means that a feature or option was not
+enabled or explicitly disabled when libcurl was built and in order to get it
+to function you have to get a rebuilt libcurl.
+.IP "CURLE_COULDNT_RESOLVE_PROXY (5)"
+Couldn't resolve proxy. The given proxy host could not be resolved.
+.IP "CURLE_COULDNT_RESOLVE_HOST (6)"
+Couldn't resolve host. The given remote host was not resolved.
+.IP "CURLE_COULDNT_CONNECT (7)"
+Failed to connect() to host or proxy.
+.IP "CURLE_FTP_WEIRD_SERVER_REPLY (8)"
+After connecting to a FTP server, libcurl expects to get a certain reply
+back. This error code implies that it got a strange or bad reply. The given
+remote server is probably not an OK FTP server.
+.IP "CURLE_REMOTE_ACCESS_DENIED (9)"
+We were denied access to the resource given in the URL. For FTP, this occurs
+while trying to change to the remote directory.
+.IP "CURLE_FTP_ACCEPT_FAILED (10)"
+While waiting for the server to connect back when an active FTP session is
+used, an error code was sent over the control connection or similar.
+.IP "CURLE_FTP_WEIRD_PASS_REPLY (11)"
+After having sent the FTP password to the server, libcurl expects a proper
+reply. This error code indicates that an unexpected code was returned.
+.IP "CURLE_FTP_ACCEPT_TIMEOUT (12)"
+During an active FTP session while waiting for the server to connect, the
+\fICURLOPT_ACCEPTTIMOUT_MS\fP (or the internal default) timeout expired.
+.IP "CURLE_FTP_WEIRD_PASV_REPLY (13)"
+libcurl failed to get a sensible result back from the server as a response to
+either a PASV or a EPSV command. The server is flawed.
+.IP "CURLE_FTP_WEIRD_227_FORMAT (14)"
+FTP servers return a 227-line as a response to a PASV command. If libcurl
+fails to parse that line, this return code is passed back.
+.IP "CURLE_FTP_CANT_GET_HOST (15)"
+An internal failure to lookup the host used for the new connection.
+.IP "CURLE_FTP_COULDNT_SET_TYPE (17)"
+Received an error when trying to set the transfer mode to binary or ASCII.
+.IP "CURLE_PARTIAL_FILE (18)"
+A file transfer was shorter or larger than expected. This happens when the
+server first reports an expected transfer size, and then delivers data that
+doesn't match the previously given size.
+.IP "CURLE_FTP_COULDNT_RETR_FILE (19)"
+This was either a weird reply to a 'RETR' command or a zero byte transfer
+complete.
+.IP "CURLE_QUOTE_ERROR (21)"
+When sending custom "QUOTE" commands to the remote server, one of the commands
+returned an error code that was 400 or higher (for FTP) or otherwise
+indicated unsuccessful completion of the command.
+.IP "CURLE_HTTP_RETURNED_ERROR (22)"
+This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server
+returns an error code that is >= 400.
+.IP "CURLE_WRITE_ERROR (23)"
+An error occurred when writing received data to a local file, or an error was
+returned to libcurl from a write callback.
+.IP "CURLE_UPLOAD_FAILED (25)"
+Failed starting the upload. For FTP, the server typically denied the STOR
+command. The error buffer usually contains the server's explanation for this.
+.IP "CURLE_READ_ERROR (26)"
+There was a problem reading a local file or an error returned by the read
+callback.
+.IP "CURLE_OUT_OF_MEMORY (27)"
+A memory allocation request failed. This is serious badness and
+things are severely screwed up if this ever occurs.
+.IP "CURLE_OPERATION_TIMEDOUT (28)"
+Operation timeout. The specified time-out period was reached according to the
+conditions.
+.IP "CURLE_FTP_PORT_FAILED (30)"
+The FTP PORT command returned error. This mostly happens when you haven't
+specified a good enough address for libcurl to use. See \fICURLOPT_FTPPORT\fP.
+.IP "CURLE_FTP_COULDNT_USE_REST (31)"
+The FTP REST command returned error. This should never happen if the server is
+sane.
+.IP "CURLE_RANGE_ERROR (33)"
+The server does not support or accept range requests.
+.IP "CURLE_HTTP_POST_ERROR (34)"
+This is an odd error that mainly occurs due to internal confusion.
+.IP "CURLE_SSL_CONNECT_ERROR (35)"
+A problem occurred somewhere in the SSL/TLS handshake. You really want the
+error buffer and read the message there as it pinpoints the problem slightly
+more. Could be certificates (file formats, paths, permissions), passwords, and
+others.
+.IP "CURLE_BAD_DOWNLOAD_RESUME (36)"
+The download could not be resumed because the specified offset was out of the
+file boundary.
+.IP "CURLE_FILE_COULDNT_READ_FILE (37)"
+A file given with FILE:// couldn't be opened. Most likely because the file
+path doesn't identify an existing file. Did you check file permissions?
+.IP "CURLE_LDAP_CANNOT_BIND (38)"
+LDAP cannot bind. LDAP bind operation failed.
+.IP "CURLE_LDAP_SEARCH_FAILED (39)"
+LDAP search failed.
+.IP "CURLE_FUNCTION_NOT_FOUND (41)"
+Function not found. A required zlib function was not found.
+.IP "CURLE_ABORTED_BY_CALLBACK (42)"
+Aborted by callback. A callback returned "abort" to libcurl.
+.IP "CURLE_BAD_FUNCTION_ARGUMENT (43)"
+Internal error. A function was called with a bad parameter.
+.IP "CURLE_INTERFACE_FAILED (45)"
+Interface error. A specified outgoing interface could not be used. Set which
+interface to use for outgoing connections' source IP address with
+CURLOPT_INTERFACE.
+.IP "CURLE_TOO_MANY_REDIRECTS (47)"
+Too many redirects. When following redirects, libcurl hit the maximum amount.
+Set your limit with CURLOPT_MAXREDIRS.
+.IP "CURLE_UNKNOWN_OPTION (48)"
+An option passed to libcurl is not recognized/known. Refer to the appropriate
+documentation. This is most likely a problem in the program that uses
+libcurl. The error buffer might contain more specific information about which
+exact option it concerns.
+.IP "CURLE_TELNET_OPTION_SYNTAX (49)"
+A telnet option string was Illegally formatted.
+.IP "CURLE_PEER_FAILED_VERIFICATION (51)"
+The remote server's SSL certificate or SSH md5 fingerprint was deemed not OK.
+.IP "CURLE_GOT_NOTHING (52)"
+Nothing was returned from the server, and under the circumstances, getting
+nothing is considered an error.
+.IP "CURLE_SSL_ENGINE_NOTFOUND (53)"
+The specified crypto engine wasn't found.
+.IP "CURLE_SSL_ENGINE_SETFAILED (54)"
+Failed setting the selected SSL crypto engine as default!
+.IP "CURLE_SEND_ERROR (55)"
+Failed sending network data.
+.IP "CURLE_RECV_ERROR (56)"
+Failure with receiving network data.
+.IP "CURLE_SSL_CERTPROBLEM (58)"
+problem with the local client certificate.
+.IP "CURLE_SSL_CIPHER (59)"
+Couldn't use specified cipher.
+.IP "CURLE_SSL_CACERT (60)"
+Peer certificate cannot be authenticated with known CA certificates.
+.IP "CURLE_BAD_CONTENT_ENCODING (61)"
+Unrecognized transfer encoding.
+.IP "CURLE_LDAP_INVALID_URL (62)"
+Invalid LDAP URL.
+.IP "CURLE_FILESIZE_EXCEEDED (63)"
+Maximum file size exceeded.
+.IP "CURLE_USE_SSL_FAILED (64)"
+Requested FTP SSL level failed.
+.IP "CURLE_SEND_FAIL_REWIND (65)"
+When doing a send operation curl had to rewind the data to retransmit, but the
+rewinding operation failed.
+.IP "CURLE_SSL_ENGINE_INITFAILED (66)"
+Initiating the SSL Engine failed.
+.IP "CURLE_LOGIN_DENIED (67)"
+The remote server denied curl to login (Added in 7.13.1)
+.IP "CURLE_TFTP_NOTFOUND (68)"
+File not found on TFTP server.
+.IP "CURLE_TFTP_PERM (69)"
+Permission problem on TFTP server.
+.IP "CURLE_REMOTE_DISK_FULL (70)"
+Out of disk space on the server.
+.IP "CURLE_TFTP_ILLEGAL (71)"
+Illegal TFTP operation.
+.IP "CURLE_TFTP_UNKNOWNID (72)"
+Unknown TFTP transfer ID.
+.IP "CURLE_REMOTE_FILE_EXISTS (73)"
+File already exists and will not be overwritten.
+.IP "CURLE_TFTP_NOSUCHUSER (74)"
+This error should never be returned by a properly functioning TFTP server.
+.IP "CURLE_CONV_FAILED (75)"
+Character conversion failed.
+.IP "CURLE_CONV_REQD (76)"
+Caller must register conversion callbacks.
+.IP "CURLE_SSL_CACERT_BADFILE (77)"
+Problem with reading the SSL CA cert (path? access rights?)
+.IP "CURLE_REMOTE_FILE_NOT_FOUND (78)"
+The resource referenced in the URL does not exist.
+.IP "CURLE_SSH (79)"
+An unspecified error occurred during the SSH session.
+.IP "CURLE_SSL_SHUTDOWN_FAILED (80)"
+Failed to shut down the SSL connection.
+.IP "CURLE_AGAIN (81)"
+Socket is not ready for send/recv wait till it's ready and try again. This
+return code is only returned from \fIcurl_easy_recv(3)\fP and
+\fIcurl_easy_send(3)\fP (Added in 7.18.2)
+.IP "CURLE_SSL_CRL_BADFILE (82)"
+Failed to load CRL file (Added in 7.19.0)
+.IP "CURLE_SSL_ISSUER_ERROR (83)"
+Issuer check failed (Added in 7.19.0)
+.IP "CURLE_FTP_PRET_FAILED (84)"
+The FTP server does not understand the PRET command at all or does not support
+the given argument. Be careful when using \fICURLOPT_CUSTOMREQUEST\fP, a
+custom LIST command will be sent with PRET CMD before PASV as well. (Added in
+7.20.0)
+.IP "CURLE_RTSP_CSEQ_ERROR (85)"
+Mismatch of RTSP CSeq numbers.
+.IP "CURLE_RTSP_SESSION_ERROR (86)"
+Mismatch of RTSP Session Identifiers.
+.IP "CURLE_FTP_BAD_FILE_LIST (87)"
+Unable to parse FTP file list (during FTP wildcard downloading).
+.IP "CURLE_CHUNK_FAILED (88)"
+Chunk callback reported error.
+.IP "CURLE_OBSOLETE*"
+These error codes will never be returned. They were used in an old libcurl
+version and are currently unused.
+.SH "CURLMcode"
+This is the generic return code used by functions in the libcurl multi
+interface. Also consider \fIcurl_multi_strerror(3)\fP.
+.IP "CURLM_CALL_MULTI_PERFORM (-1)"
+This is not really an error. It means you should call
+\fIcurl_multi_perform(3)\fP again without doing select() or similar in
+between. Before version 7.20.0 this could be returned by
+\fIcurl_multi_perform(3)\fP, but in later versions this return code is never
+used.
+.IP "CURLM_OK (0)"
+Things are fine.
+.IP "CURLM_BAD_HANDLE (1)"
+The passed-in handle is not a valid CURLM handle.
+.IP "CURLM_BAD_EASY_HANDLE (2)"
+An easy handle was not good/valid. It could mean that it isn't an easy handle
+at all, or possibly that the handle already is in used by this or another
+multi handle.
+.IP "CURLM_OUT_OF_MEMORY (3)"
+You are doomed.
+.IP "CURLM_INTERNAL_ERROR (4)"
+This can only be returned if libcurl bugs. Please report it to us!
+.IP "CURLM_BAD_SOCKET (5)"
+The passed-in socket is not a valid one that libcurl already knows about.
+(Added in 7.15.4)
+.IP "CURLM_UNKNOWN_OPTION (6)"
+curl_multi_setopt() with unsupported option
+(Added in 7.15.4)
+.SH "CURLSHcode"
+The "share" interface will return a CURLSHcode to indicate when an error has
+occurred. Also consider \fIcurl_share_strerror(3)\fP.
+.IP "CURLSHE_OK (0)"
+All fine. Proceed as usual.
+.IP "CURLSHE_BAD_OPTION (1)"
+An invalid option was passed to the function.
+.IP "CURLSHE_IN_USE (2)"
+The share object is currently in use.
+.IP "CURLSHE_INVALID (3)"
+An invalid share object was passed to the function.
+.IP "CURLSHE_NOMEM (4)"
+Not enough memory was available.
+(Added in 7.12.0)
+.IP "CURLSHE_NOT_BUILT_IN (5)"
+The requested sharing could not be done because the library you use don't have
+that particular feature enabled. (Added in 7.23.0)
diff --git a/docs/libcurl/libcurl-multi.3 b/docs/libcurl/libcurl-multi.3
new file mode 100644
index 000000000..2af029961
--- /dev/null
+++ b/docs/libcurl/libcurl-multi.3
@@ -0,0 +1,151 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the 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-multi 3 "3 Feb 2007" "libcurl 7.16.0" "libcurl multi interface"
+.SH NAME
+libcurl-multi \- how to use the multi interface
+.SH DESCRIPTION
+This is an overview on how to use the libcurl multi interface in your C
+programs. There are specific man pages for each function mentioned in
+here. There's also the \fIlibcurl-tutorial(3)\fP man page for a complete
+tutorial to programming with libcurl and the \fIlibcurl-easy(3)\fP man page
+for an overview of the libcurl easy interface.
+
+All functions in the multi interface are prefixed with curl_multi.
+.SH "OBJECTIVES"
+The multi interface offers several abilities that the easy interface doesn't.
+They are mainly:
+
+1. Enable a "pull" interface. The application that uses libcurl decides where
+and when to ask libcurl to get/send data.
+
+2. Enable multiple simultaneous transfers in the same thread without making it
+complicated for the application.
+
+3. Enable the application to wait for action on its own file descriptors and
+curl's file descriptors simultaneous easily.
+.SH "ONE MULTI HANDLE MANY EASY HANDLES"
+To use the multi interface, you must first create a 'multi handle' with
+\fIcurl_multi_init(3)\fP. This handle is then used as input to all further
+curl_multi_* functions.
+
+Each single transfer is built up with an easy handle. You must create them,
+and setup the appropriate options for each easy handle, as outlined in the
+\fIlibcurl(3)\fP man page, using \fIcurl_easy_setopt(3)\fP.
+
+When the easy handle is setup for a transfer, then instead of using
+\fIcurl_easy_perform(3)\fP (as when using the easy interface for transfers),
+you should instead add the easy handle to the multi handle using
+\fIcurl_multi_add_handle(3)\fP. The multi handle is sometimes referred to as a
+\'multi stack\' because of the fact that it may hold a large amount of easy
+handles.
+
+Should you change your mind, the easy handle is again removed from the multi
+stack using \fIcurl_multi_remove_handle(3)\fP. Once removed from the multi
+handle, you can again use other easy interface functions like
+\fIcurl_easy_perform(3)\fP on the handle or whatever you think is necessary.
+
+Adding the easy handle to the multi handle does not start the transfer.
+Remember that one of the main ideas with this interface is to let your
+application drive. You drive the transfers by invoking
+\fIcurl_multi_perform(3)\fP. libcurl will then transfer data if there is
+anything available to transfer. It'll use the callbacks and everything else
+you have setup in the individual easy handles. It'll transfer data on all
+current transfers in the multi stack that are ready to transfer anything. It
+may be all, it may be none.
+
+Your application can acquire knowledge from libcurl when it would like to get
+invoked to transfer data, so that you don't have to busy-loop and call that
+\fIcurl_multi_perform(3)\fP like crazy. \fIcurl_multi_fdset(3)\fP offers an
+interface using which you can extract fd_sets from libcurl to use in select()
+or poll() calls in order to get to know when the transfers in the multi stack
+might need attention. This also makes it very easy for your program to wait
+for input on your own private file descriptors at the same time or perhaps
+timeout every now and then, should you want that.
+
+\fIcurl_multi_perform(3)\fP stores the number of still running transfers in
+one of its input arguments, and by reading that you can figure out when all
+the transfers in the multi handles are done. 'done' does not mean
+successful. One or more of the transfers may have failed. Tracking when this
+number changes, you know when one or more transfers are done.
+
+To get information about completed transfers, to figure out success or not and
+similar, \fIcurl_multi_info_read(3)\fP should be called. It can return a
+message about a current or previous transfer. Repeated invokes of the function
+get more messages until the message queue is empty. The information you
+receive there includes an easy handle pointer which you may use to identify
+which easy handle the information regards.
+
+When a single transfer is completed, the easy handle is still left added to
+the multi stack. You need to first remove the easy handle with
+\fIcurl_multi_remove_handle(3)\fP and then close it with
+\fIcurl_easy_cleanup(3)\fP, or possibly set new options to it and add it again
+with \fIcurl_multi_add_handle(3)\fP to start another transfer.
+
+When all transfers in the multi stack are done, cleanup the multi handle with
+\fIcurl_multi_cleanup(3)\fP. Be careful and please note that you \fBMUST\fP
+invoke separate \fIcurl_easy_cleanup(3)\fP calls on every single easy handle
+to clean them up properly.
+
+If you want to re-use an easy handle that was added to the multi handle for
+transfer, you must first remove it from the multi stack and then re-add it
+again (possibly after having altered some options at your own choice).
+.SH "MULTI_SOCKET"
+\fIcurl_multi_socket_action(3)\fP function offers a way for applications to
+not only avoid being forced to use select(), but it also offers a much more
+high-performance API that will make a significant difference for applications
+using large numbers of simultaneous connections.
+
+\fIcurl_multi_socket_action(3)\fP is then used instead of
+\fIcurl_multi_perform(3)\fP.
+
+When using this API, you add easy handles to the multi handle just as with the
+normal multi interface. Then you also set two callbacks with the
+CURLMOPT_SOCKETFUNCTION and CURLMOPT_TIMERFUNCTION options to
+\fIcurl_multi_setopt(3)\fP.
+
+The API is then designed to inform your application about which sockets
+libcurl is currently using and for what activities (read and/or write) on
+those sockets your application is expected to wait for.
+
+Your application must then make sure to receive all sockets informed about in
+the CURLMOPT_SOCKETFUNCTION callback and make sure it reacts on the given
+activity on them. When a socket has the given activity, you call
+\fIcurl_multi_socket_action(3)\fP specifying which socket and action there
+are.
+
+The CURLMOPT_TIMERFUNCTION callback is called to set a timeout. When that
+timeout expires, your application should call the
+\fIcurl_multi_socket_action(3)\fP function saying it was due to a timeout.
+.SH "BLOCKING"
+A few areas in the code are still using blocking code, even when used from the
+multi interface. While we certainly want and intend for these to get fixed in
+the future, you should be aware of the following current restrictions:
+
+.nf
+ - Name resolves unless the c-ares or threaded-resolver backends are used
+ - NSS SSL connections
+ - HTTP proxy CONNECT operations
+ - SOCKS proxy handshakes
+ - file:// transfers
+ - TELNET transfers
+.fi
diff --git a/docs/libcurl/libcurl-share.3 b/docs/libcurl/libcurl-share.3
new file mode 100644
index 000000000..583902152
--- /dev/null
+++ b/docs/libcurl/libcurl-share.3
@@ -0,0 +1,62 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the 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-share 3 "8 Aug 2003" "libcurl 7.10.7" "libcurl share interface"
+.SH NAME
+libcurl-share \- how to use the share interface
+.SH DESCRIPTION
+This is an overview on how to use the libcurl share interface in your C
+programs. There are specific man pages for each function mentioned in
+here.
+
+All functions in the share interface are prefixed with curl_share.
+
+.SH "OBJECTIVES"
+The share interface was added to enable sharing of data between curl
+\&"handles".
+.SH "ONE SET OF DATA - MANY TRANSFERS"
+You can have multiple easy handles share data between them. Have them update
+and use the \fBsame\fP cookie database or DNS cache! This way, each single
+transfer will take advantage from data updates made by the other transfer(s).
+.SH "SHARE OBJECT"
+You create a shared object with \fIcurl_share_init(3)\fP. It returns a handle
+for a newly created one.
+
+You tell the shared object what data you want it to share by using
+\fIcurl_share_setopt(3)\fP.
+
+Since you can use this share from multiple threads, and libcurl has no
+internal thread synchronization, you must provide mutex callbacks if you're
+using this multi-threaded. You set lock and unlock functions with
+\fIcurl_share_setopt(3)\fP too.
+
+Then, you make an easy handle to use this share, you set the
+\fICURLOPT_SHARE\fP option with \fIcurl_easy_setopt(3)\fP, and pass in share
+handle. You can make any number of easy handles share the same share handle.
+
+To make an easy handle stop using that particular share, you set
+\fICURLOPT_SHARE\fP to NULL for that easy handle. To make a handle stop
+sharing a particular data, you can \fICURLSHOPT_UNSHARE\fP it.
+
+When you're done using the share, make sure that no easy handle is still using
+it, and call \fIcurl_share_cleanup(3)\fP on the handle.
+.SH "SEE ALSO"
+.BR curl_share_init "(3), " curl_share_setopt "(3), " curl_share_cleanup "(3)"
diff --git a/docs/libcurl/libcurl-tutorial.3 b/docs/libcurl/libcurl-tutorial.3
new file mode 100644
index 000000000..1cca23f33
--- /dev/null
+++ b/docs/libcurl/libcurl-tutorial.3
@@ -0,0 +1,1369 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the 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-tutorial 3 "4 Mar 2009" "libcurl" "libcurl programming"
+.SH NAME
+libcurl-tutorial \- libcurl programming tutorial
+.SH "Objective"
+This document attempts to describe the general principles and some basic
+approaches to consider when programming with libcurl. The text will focus
+mainly on the C interface but might apply fairly well on other interfaces as
+well as they usually follow the C one pretty closely.
+
+This document will refer to 'the user' as the person writing the source code
+that uses libcurl. That would probably be you or someone in your position.
+What will be generally referred to as 'the program' will be the collected
+source code that you write that is using libcurl for transfers. The program
+is outside libcurl and libcurl is outside of the program.
+
+To get more details on all options and functions described herein, please
+refer to their respective man pages.
+
+.SH "Building"
+There are many different ways to build C programs. This chapter will assume a
+UNIX-style build process. If you use a different build system, you can still
+read this to get general information that may apply to your environment as
+well.
+.IP "Compiling the Program"
+Your compiler needs to know where the libcurl headers are located. Therefore
+you must set your compiler's include path to point to the directory where you
+installed them. The 'curl-config'[3] tool can be used to get this information:
+
+$ curl-config --cflags
+
+.IP "Linking the Program with libcurl"
+When having compiled the program, you need to link your object files to create
+a single executable. For that to succeed, you need to link with libcurl and
+possibly also with other libraries that libcurl itself depends on. Like the
+OpenSSL libraries, but even some standard OS libraries may be needed on the
+command line. To figure out which flags to use, once again the 'curl-config'
+tool comes to the rescue:
+
+$ curl-config --libs
+
+.IP "SSL or Not"
+libcurl can be built and customized in many ways. One of the things that
+varies from different libraries and builds is the support for SSL-based
+transfers, like HTTPS and FTPS. If a supported SSL library was detected
+properly at build-time, libcurl will be built with SSL support. To figure out
+if an installed libcurl has been built with SSL support enabled, use
+\&'curl-config' like this:
+
+$ curl-config --feature
+
+And if SSL is supported, the keyword 'SSL' will be written to stdout,
+possibly together with a few other features that could be either on or off on
+for different libcurls.
+
+See also the "Features libcurl Provides" further down.
+.IP "autoconf macro"
+When you write your configure script to detect libcurl and setup variables
+accordingly, we offer a prewritten macro that probably does everything you
+need in this area. See docs/libcurl/libcurl.m4 file - it includes docs on how
+to use it.
+
+.SH "Portable Code in a Portable World"
+The people behind libcurl have put a considerable effort to make libcurl work
+on a large amount of different operating systems and environments.
+
+You program libcurl the same way on all platforms that libcurl runs on. There
+are only very few minor considerations that differ. If you just make sure to
+write your code portable enough, you may very well create yourself a very
+portable program. libcurl shouldn't stop you from that.
+
+.SH "Global Preparation"
+The program must initialize some of the libcurl functionality globally. That
+means it should be done exactly once, no matter how many times you intend to
+use the library. Once for your program's entire life time. This is done using
+
+ curl_global_init()
+
+and it takes one parameter which is a bit pattern that tells libcurl what to
+initialize. Using \fICURL_GLOBAL_ALL\fP will make it initialize all known
+internal sub modules, and might be a good default option. The current two bits
+that are specified are:
+.RS
+.IP "CURL_GLOBAL_WIN32"
+which only does anything on Windows machines. When used on
+a Windows machine, it'll make libcurl initialize the win32 socket
+stuff. Without having that initialized properly, your program cannot use
+sockets properly. You should only do this once for each application, so if
+your program already does this or of another library in use does it, you
+should not tell libcurl to do this as well.
+.IP CURL_GLOBAL_SSL
+which only does anything on libcurls compiled and built SSL-enabled. On these
+systems, this will make libcurl initialize the SSL library properly for this
+application. This only needs to be done once for each application so if your
+program or another library already does this, this bit should not be needed.
+.RE
+
+libcurl has a default protection mechanism that detects if
+\fIcurl_global_init(3)\fP hasn't been called by the time
+\fIcurl_easy_perform(3)\fP is called and if that is the case, libcurl runs the
+function itself with a guessed bit pattern. Please note that depending solely
+on this is not considered nice nor very good.
+
+When the program no longer uses libcurl, it should call
+\fIcurl_global_cleanup(3)\fP, which is the opposite of the init call. It will
+then do the reversed operations to cleanup the resources the
+\fIcurl_global_init(3)\fP call initialized.
+
+Repeated calls to \fIcurl_global_init(3)\fP and \fIcurl_global_cleanup(3)\fP
+should be avoided. They should only be called once each.
+
+.SH "Features libcurl Provides"
+It is considered best-practice to determine libcurl features at run-time
+rather than at build-time (if possible of course). By calling
+\fIcurl_version_info(3)\fP and checking out the details of the returned
+struct, your program can figure out exactly what the currently running libcurl
+supports.
+
+.SH "Handle the Easy libcurl"
+libcurl first introduced the so called easy interface. All operations in the
+easy interface are prefixed with 'curl_easy'.
+
+Recent libcurl versions also offer the multi interface. More about that
+interface, what it is targeted for and how to use it is detailed in a separate
+chapter further down. You still need to understand the easy interface first,
+so please continue reading for better understanding.
+
+To use the easy interface, you must first create yourself an easy handle. You
+need one handle for each easy session you want to perform. Basically, you
+should use one handle for every thread you plan to use for transferring. You
+must never share the same handle in multiple threads.
+
+Get an easy handle with
+
+ easyhandle = curl_easy_init();
+
+It returns an easy handle. Using that you proceed to the next step: setting
+up your preferred actions. A handle is just a logic entity for the upcoming
+transfer or series of transfers.
+
+You set properties and options for this handle using
+\fIcurl_easy_setopt(3)\fP. They control how the subsequent transfer or
+transfers will be made. Options remain set in the handle until set again to
+something different. Alas, multiple requests using the same handle will use
+the same options.
+
+Many of the options you set in libcurl are "strings", pointers to data
+terminated with a zero byte. When you set strings with
+\fIcurl_easy_setopt(3)\fP, libcurl makes its own copy so that they don't
+need to be kept around in your application after being set[4].
+
+One of the most basic properties to set in the handle is the URL. You set
+your preferred URL to transfer with CURLOPT_URL in a manner similar to:
+
+.nf
+ curl_easy_setopt(handle, CURLOPT_URL, "http://domain.com/");
+.fi
+
+Let's assume for a while that you want to receive data as the URL identifies a
+remote resource you want to get here. Since you write a sort of application
+that needs this transfer, I assume that you would like to get the data passed
+to you directly instead of simply getting it passed to stdout. So, you write
+your own function that matches this prototype:
+
+ size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);
+
+You tell libcurl to pass all data to this function by issuing a function
+similar to this:
+
+ curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, write_data);
+
+You can control what data your callback function gets in the fourth argument
+by setting another property:
+
+ curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &internal_struct);
+
+Using that property, you can easily pass local data between your application
+and the function that gets invoked by libcurl. libcurl itself won't touch the
+data you pass with \fICURLOPT_WRITEDATA\fP.
+
+libcurl offers its own default internal callback that will take care of the data
+if you don't set the callback with \fICURLOPT_WRITEFUNCTION\fP. It will then
+simply output the received data to stdout. You can have the default callback
+write the data to a different file handle by passing a 'FILE *' to a file
+opened for writing with the \fICURLOPT_WRITEDATA\fP option.
+
+Now, we need to take a step back and have a deep breath. Here's one of those
+rare platform-dependent nitpicks. Did you spot it? On some platforms[2],
+libcurl won't be able to operate on files opened by the program. Thus, if you
+use the default callback and pass in an open file with
+\fICURLOPT_WRITEDATA\fP, it will crash. You should therefore avoid this to
+make your program run fine virtually everywhere.
+
+(\fICURLOPT_WRITEDATA\fP was formerly known as \fICURLOPT_FILE\fP. Both names
+still work and do the same thing).
+
+If you're using libcurl as a win32 DLL, you MUST use the
+\fICURLOPT_WRITEFUNCTION\fP if you set \fICURLOPT_WRITEDATA\fP - or you will
+experience crashes.
+
+There are of course many more options you can set, and we'll get back to a few
+of them later. Let's instead continue to the actual transfer:
+
+ success = curl_easy_perform(easyhandle);
+
+\fIcurl_easy_perform(3)\fP will connect to the remote site, do the necessary
+commands and receive the transfer. Whenever it receives data, it calls the
+callback function we previously set. The function may get one byte at a time,
+or it may get many kilobytes at once. libcurl delivers as much as possible as
+often as possible. Your callback function should return the number of bytes it
+\&"took care of". If that is not the exact same amount of bytes that was
+passed to it, libcurl will abort the operation and return with an error code.
+
+When the transfer is complete, the function returns a return code that informs
+you if it succeeded in its mission or not. If a return code isn't enough for
+you, you can use the CURLOPT_ERRORBUFFER to point libcurl to a buffer of yours
+where it'll store a human readable error message as well.
+
+If you then want to transfer another file, the handle is ready to be used
+again. Mind you, it is even preferred that you re-use an existing handle if
+you intend to make another transfer. libcurl will then attempt to re-use the
+previous connection.
+
+For some protocols, downloading a file can involve a complicated process of
+logging in, setting the transfer mode, changing the current directory and
+finally transferring the file data. libcurl takes care of all that
+complication for you. Given simply the URL to a file, libcurl will take care
+of all the details needed to get the file moved from one machine to another.
+
+.SH "Multi-threading Issues"
+The first basic rule is that you must \fBnever\fP simultaneously share a
+libcurl handle (be it easy or multi or whatever) between multiple
+threads. Only use one handle in one thread at any time. You can pass the
+handles around among threads, but you must never use a single handle from more
+than one thread at any given time.
+
+libcurl is completely thread safe, except for two issues: signals and SSL/TLS
+handlers. Signals are used for timing out name resolves (during DNS lookup) -
+when built without c-ares support and not on Windows.
+
+If you are accessing HTTPS or FTPS URLs in a multi-threaded manner, you are
+then of course using the underlying SSL library multi-threaded and those libs
+might have their own requirements on this issue. Basically, you need to
+provide one or two functions to allow it to function properly. For all
+details, see this:
+
+OpenSSL
+
+ http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
+
+GnuTLS
+
+ http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
+
+NSS
+
+ is claimed to be thread-safe already without anything required.
+
+PolarSSL
+
+ Required actions unknown.
+
+yassl
+
+ Required actions unknown.
+
+axTLS
+
+ Required actions unknown.
+
+When using multiple threads you should set the CURLOPT_NOSIGNAL option to 1
+for all handles. Everything will or might work fine except that timeouts are
+not honored during the DNS lookup - which you can work around by building
+libcurl with c-ares support. c-ares is a library that provides asynchronous
+name resolves. On some platforms, libcurl simply will not function properly
+multi-threaded unless this option is set.
+
+Also, note that CURLOPT_DNS_USE_GLOBAL_CACHE is not thread-safe.
+
+.SH "When It Doesn't Work"
+There will always be times when the transfer fails for some reason. You might
+have set the wrong libcurl option or misunderstood what the libcurl option
+actually does, or the remote server might return non-standard replies that
+confuse the library which then confuses your program.
+
+There's one golden rule when these things occur: set the CURLOPT_VERBOSE
+option to 1. It'll cause the library to spew out the entire protocol
+details it sends, some internal info and some received protocol data as well
+(especially when using FTP). If you're using HTTP, adding the headers in the
+received output to study is also a clever way to get a better understanding
+why the server behaves the way it does. Include headers in the normal body
+output with CURLOPT_HEADER set 1.
+
+Of course, there are bugs left. We need to know about them to be able
+to fix them, so we're quite dependent on your bug reports! When you do report
+suspected bugs in libcurl, please include as many details as you possibly can: a
+protocol dump that CURLOPT_VERBOSE produces, library version, as much as
+possible of your code that uses libcurl, operating system name and version,
+compiler name and version etc.
+
+If CURLOPT_VERBOSE is not enough, you increase the level of debug data your
+application receive by using the CURLOPT_DEBUGFUNCTION.
+
+Getting some in-depth knowledge about the protocols involved is never wrong,
+and if you're trying to do funny things, you might very well understand
+libcurl and how to use it better if you study the appropriate RFC documents
+at least briefly.
+
+.SH "Upload Data to a Remote Site"
+libcurl tries to keep a protocol independent approach to most transfers, thus
+uploading to a remote FTP site is very similar to uploading data to a HTTP
+server with a PUT request.
+
+Of course, first you either create an easy handle or you re-use one existing
+one. Then you set the URL to operate on just like before. This is the remote
+URL, that we now will upload.
+
+Since we write an application, we most likely want libcurl to get the upload
+data by asking us for it. To make it do that, we set the read callback and
+the custom pointer libcurl will pass to our read callback. The read callback
+should have a prototype similar to:
+
+ size_t function(char *bufptr, size_t size, size_t nitems, void *userp);
+
+Where bufptr is the pointer to a buffer we fill in with data to upload and
+size*nitems is the size of the buffer and therefore also the maximum amount
+of data we can return to libcurl in this call. The 'userp' pointer is the
+custom pointer we set to point to a struct of ours to pass private data
+between the application and the callback.
+
+ curl_easy_setopt(easyhandle, CURLOPT_READFUNCTION, read_function);
+
+ curl_easy_setopt(easyhandle, CURLOPT_READDATA, &filedata);
+
+Tell libcurl that we want to upload:
+
+ curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, 1L);
+
+A few protocols won't behave properly when uploads are done without any prior
+knowledge of the expected file size. So, set the upload file size using the
+CURLOPT_INFILESIZE_LARGE for all known file sizes like this[1]:
+
+.nf
+ /* in this example, file_size must be an curl_off_t variable */
+ curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE_LARGE, file_size);
+.fi
+
+When you call \fIcurl_easy_perform(3)\fP this time, it'll perform all the
+necessary operations and when it has invoked the upload it'll call your
+supplied callback to get the data to upload. The program should return as much
+data as possible in every invoke, as that is likely to make the upload perform
+as fast as possible. The callback should return the number of bytes it wrote
+in the buffer. Returning 0 will signal the end of the upload.
+
+.SH "Passwords"
+Many protocols use or even require that user name and password are provided
+to be able to download or upload the data of your choice. libcurl offers
+several ways to specify them.
+
+Most protocols support that you specify the name and password in the URL
+itself. libcurl will detect this and use them accordingly. This is written
+like this:
+
+ protocol://user:password@example.com/path/
+
+If you need any odd letters in your user name or password, you should enter
+them URL encoded, as %XX where XX is a two-digit hexadecimal number.
+
+libcurl also provides options to set various passwords. The user name and
+password as shown embedded in the URL can instead get set with the
+CURLOPT_USERPWD option. The argument passed to libcurl should be a char * to
+a string in the format "user:password". In a manner like this:
+
+ curl_easy_setopt(easyhandle, CURLOPT_USERPWD, "myname:thesecret");
+
+Another case where name and password might be needed at times, is for those
+users who need to authenticate themselves to a proxy they use. libcurl offers
+another option for this, the CURLOPT_PROXYUSERPWD. It is used quite similar
+to the CURLOPT_USERPWD option like this:
+
+ curl_easy_setopt(easyhandle, CURLOPT_PROXYUSERPWD, "myname:thesecret");
+
+There's a long time UNIX "standard" way of storing ftp user names and
+passwords, namely in the $HOME/.netrc file. The file should be made private
+so that only the user may read it (see also the "Security Considerations"
+chapter), as it might contain the password in plain text. libcurl has the
+ability to use this file to figure out what set of user name and password to
+use for a particular host. As an extension to the normal functionality,
+libcurl also supports this file for non-FTP protocols such as HTTP. To make
+curl use this file, use the CURLOPT_NETRC option:
+
+ curl_easy_setopt(easyhandle, CURLOPT_NETRC, 1L);
+
+And a very basic example of how such a .netrc file may look like:
+
+.nf
+ machine myhost.mydomain.com
+ login userlogin
+ password secretword
+.fi
+
+All these examples have been cases where the password has been optional, or
+at least you could leave it out and have libcurl attempt to do its job
+without it. There are times when the password isn't optional, like when
+you're using an SSL private key for secure transfers.
+
+To pass the known private key password to libcurl:
+
+ curl_easy_setopt(easyhandle, CURLOPT_KEYPASSWD, "keypassword");
+
+.SH "HTTP Authentication"
+The previous chapter showed how to set user name and password for getting
+URLs that require authentication. When using the HTTP protocol, there are
+many different ways a client can provide those credentials to the server and
+you can control which way libcurl will (attempt to) use them. The default HTTP
+authentication method is called 'Basic', which is sending the name and
+password in clear-text in the HTTP request, base64-encoded. This is insecure.
+
+At the time of this writing, libcurl can be built to use: Basic, Digest, NTLM,
+Negotiate, GSS-Negotiate and SPNEGO. You can tell libcurl which one to use
+with CURLOPT_HTTPAUTH as in:
+
+ curl_easy_setopt(easyhandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
+
+And when you send authentication to a proxy, you can also set authentication
+type the same way but instead with CURLOPT_PROXYAUTH:
+
+ curl_easy_setopt(easyhandle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
+
+Both these options allow you to set multiple types (by ORing them together),
+to make libcurl pick the most secure one out of the types the server/proxy
+claims to support. This method does however add a round-trip since libcurl
+must first ask the server what it supports:
+
+ curl_easy_setopt(easyhandle, CURLOPT_HTTPAUTH,
+ CURLAUTH_DIGEST|CURLAUTH_BASIC);
+
+For convenience, you can use the 'CURLAUTH_ANY' define (instead of a list
+with specific types) which allows libcurl to use whatever method it wants.
+
+When asking for multiple types, libcurl will pick the available one it
+considers "best" in its own internal order of preference.
+
+.SH "HTTP POSTing"
+We get many questions regarding how to issue HTTP POSTs with libcurl the
+proper way. This chapter will thus include examples using both different
+versions of HTTP POST that libcurl supports.
+
+The first version is the simple POST, the most common version, that most HTML
+pages using the <form> tag uses. We provide a pointer to the data and tell
+libcurl to post it all to the remote site:
+
+.nf
+ char *data="name=daniel&project=curl";
+ curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, data);
+ curl_easy_setopt(easyhandle, CURLOPT_URL, "http://posthere.com/");
+
+ curl_easy_perform(easyhandle); /* post away! */
+.fi
+
+Simple enough, huh? Since you set the POST options with the
+CURLOPT_POSTFIELDS, this automatically switches the handle to use POST in the
+upcoming request.
+
+Ok, so what if you want to post binary data that also requires you to set the
+Content-Type: header of the post? Well, binary posts prevent libcurl from
+being able to do strlen() on the data to figure out the size, so therefore we
+must tell libcurl the size of the post data. Setting headers in libcurl
+requests are done in a generic way, by building a list of our own headers and
+then passing that list to libcurl.
+
+.nf
+ struct curl_slist *headers=NULL;
+ headers = curl_slist_append(headers, "Content-Type: text/xml");
+
+ /* post binary data */
+ curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, binaryptr);
+
+ /* set the size of the postfields data */
+ curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDSIZE, 23L);
+
+ /* pass our list of custom made headers */
+ curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
+
+ curl_easy_perform(easyhandle); /* post away! */
+
+ curl_slist_free_all(headers); /* free the header list */
+.fi
+
+While the simple examples above cover the majority of all cases where HTTP
+POST operations are required, they don't do multi-part formposts. Multi-part
+formposts were introduced as a better way to post (possibly large) binary data
+and were first documented in the RFC1867 (updated in RFC2388). They're called
+multi-part because they're built by a chain of parts, each part being a single
+unit of data. Each part has its own name and contents. You can in fact create
+and post a multi-part formpost with the regular libcurl POST support described
+above, but that would require that you build a formpost yourself and provide
+to libcurl. To make that easier, libcurl provides \fIcurl_formadd(3)\fP. Using
+this function, you add parts to the form. When you're done adding parts, you
+post the whole form.
+
+The following example sets two simple text parts with plain textual contents,
+and then a file with binary contents and uploads the whole thing.
+
+.nf
+ struct curl_httppost *post=NULL;
+ struct curl_httppost *last=NULL;
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "name",
+ CURLFORM_COPYCONTENTS, "daniel", CURLFORM_END);
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "project",
+ CURLFORM_COPYCONTENTS, "curl", CURLFORM_END);
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "logotype-image",
+ CURLFORM_FILECONTENT, "curl.png", CURLFORM_END);
+
+ /* Set the form info */
+ curl_easy_setopt(easyhandle, CURLOPT_HTTPPOST, post);
+
+ curl_easy_perform(easyhandle); /* post away! */
+
+ /* free the post data again */
+ curl_formfree(post);
+.fi
+
+Multipart formposts are chains of parts using MIME-style separators and
+headers. It means that each one of these separate parts get a few headers set
+that describe the individual content-type, size etc. To enable your
+application to handicraft this formpost even more, libcurl allows you to
+supply your own set of custom headers to such an individual form part. You can
+of course supply headers to as many parts as you like, but this little example
+will show how you set headers to one specific part when you add that to the
+post handle:
+
+.nf
+ struct curl_slist *headers=NULL;
+ headers = curl_slist_append(headers, "Content-Type: text/xml");
+
+ curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, "logotype-image",
+ CURLFORM_FILECONTENT, "curl.xml",
+ CURLFORM_CONTENTHEADER, headers,
+ CURLFORM_END);
+
+ curl_easy_perform(easyhandle); /* post away! */
+
+ curl_formfree(post); /* free post */
+ curl_slist_free_all(headers); /* free custom header list */
+.fi
+
+Since all options on an easyhandle are "sticky", they remain the same until
+changed even if you do call \fIcurl_easy_perform(3)\fP, you may need to tell
+curl to go back to a plain GET request if you intend to do one as your
+next request. You force an easyhandle to go back to GET by using the
+CURLOPT_HTTPGET option:
+
+ curl_easy_setopt(easyhandle, CURLOPT_HTTPGET, 1L);
+
+Just setting CURLOPT_POSTFIELDS to "" or NULL will *not* stop libcurl from
+doing a POST. It will just make it POST without any data to send!
+
+.SH "Showing Progress"
+
+For historical and traditional reasons, libcurl has a built-in progress meter
+that can be switched on and then makes it present a progress meter in your
+terminal.
+
+Switch on the progress meter by, oddly enough, setting CURLOPT_NOPROGRESS to
+zero. This option is set to 1 by default.
+
+For most applications however, the built-in progress meter is useless and
+what instead is interesting is the ability to specify a progress
+callback. The function pointer you pass to libcurl will then be called on
+irregular intervals with information about the current transfer.
+
+Set the progress callback by using CURLOPT_PROGRESSFUNCTION. And pass a
+pointer to a function that matches this prototype:
+
+.nf
+ int progress_callback(void *clientp,
+ double dltotal,
+ double dlnow,
+ double ultotal,
+ double ulnow);
+.fi
+
+If any of the input arguments is unknown, a 0 will be passed. The first
+argument, the 'clientp' is the pointer you pass to libcurl with
+CURLOPT_PROGRESSDATA. libcurl won't touch it.
+
+.SH "libcurl with C++"
+
+There's basically only one thing to keep in mind when using C++ instead of C
+when interfacing libcurl:
+
+The callbacks CANNOT be non-static class member functions
+
+Example C++ code:
+
+.nf
+class AClass {
+ static size_t write_data(void *ptr, size_t size, size_t nmemb,
+ void *ourpointer)
+ {
+ /* do what you want with the data */
+ }
+ }
+.fi
+
+.SH "Proxies"
+
+What "proxy" means according to Merriam-Webster: "a person authorized to act
+for another" but also "the agency, function, or office of a deputy who acts as
+a substitute for another".
+
+Proxies are exceedingly common these days. Companies often only offer Internet
+access to employees through their proxies. Network clients or user-agents ask
+the proxy for documents, the proxy does the actual request and then it returns
+them.
+
+libcurl supports SOCKS and HTTP proxies. When a given URL is wanted, libcurl
+will ask the proxy for it instead of trying to connect to the actual host
+identified in the URL.
+
+If you're using a SOCKS proxy, you may find that libcurl doesn't quite support
+all operations through it.
+
+For HTTP proxies: the fact that the proxy is a HTTP proxy puts certain
+restrictions on what can actually happen. A requested URL that might not be a
+HTTP URL will be still be passed to the HTTP proxy to deliver back to
+libcurl. This happens transparently, and an application may not need to
+know. I say "may", because at times it is very important to understand that
+all operations over a HTTP proxy use the HTTP protocol. For example, you
+can't invoke your own custom FTP commands or even proper FTP directory
+listings.
+
+.IP "Proxy Options"
+
+To tell libcurl to use a proxy at a given port number:
+
+ curl_easy_setopt(easyhandle, CURLOPT_PROXY, "proxy-host.com:8080");
+
+Some proxies require user authentication before allowing a request, and you
+pass that information similar to this:
+
+ curl_easy_setopt(easyhandle, CURLOPT_PROXYUSERPWD, "user:password");
+
+If you want to, you can specify the host name only in the CURLOPT_PROXY
+option, and set the port number separately with CURLOPT_PROXYPORT.
+
+Tell libcurl what kind of proxy it is with CURLOPT_PROXYTYPE (if not, it will
+default to assume a HTTP proxy):
+
+ curl_easy_setopt(easyhandle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
+
+.IP "Environment Variables"
+
+libcurl automatically checks and uses a set of environment variables to know
+what proxies to use for certain protocols. The names of the variables are
+following an ancient de facto standard and are built up as "[protocol]_proxy"
+(note the lower casing). Which makes the variable \&'http_proxy' checked for a
+name of a proxy to use when the input URL is HTTP. Following the same rule,
+the variable named 'ftp_proxy' is checked for FTP URLs. Again, the proxies are
+always HTTP proxies, the different names of the variables simply allows
+different HTTP proxies to be used.
+
+The proxy environment variable contents should be in the format
+\&"[protocol://][user:password@]machine[:port]". Where the protocol:// part is
+simply ignored if present (so http://proxy and bluerk://proxy will do the
+same) and the optional port number specifies on which port the proxy operates
+on the host. If not specified, the internal default port number will be used
+and that is most likely *not* the one you would like it to be.
+
+There are two special environment variables. 'all_proxy' is what sets proxy
+for any URL in case the protocol specific variable wasn't set, and
+\&'no_proxy' defines a list of hosts that should not use a proxy even though a
+variable may say so. If 'no_proxy' is a plain asterisk ("*") it matches all
+hosts.
+
+To explicitly disable libcurl's checking for and using the proxy environment
+variables, set the proxy name to "" - an empty string - with CURLOPT_PROXY.
+.IP "SSL and Proxies"
+
+SSL is for secure point-to-point connections. This involves strong encryption
+and similar things, which effectively makes it impossible for a proxy to
+operate as a "man in between" which the proxy's task is, as previously
+discussed. Instead, the only way to have SSL work over a HTTP proxy is to ask
+the proxy to tunnel trough everything without being able to check or fiddle
+with the traffic.
+
+Opening an SSL connection over a HTTP proxy is therefor a matter of asking the
+proxy for a straight connection to the target host on a specified port. This
+is made with the HTTP request CONNECT. ("please mr proxy, connect me to that
+remote host").
+
+Because of the nature of this operation, where the proxy has no idea what kind
+of data that is passed in and out through this tunnel, this breaks some of the
+very few advantages that come from using a proxy, such as caching. Many
+organizations prevent this kind of tunneling to other destination port numbers
+than 443 (which is the default HTTPS port number).
+
+.IP "Tunneling Through Proxy"
+As explained above, tunneling is required for SSL to work and often even
+restricted to the operation intended for SSL; HTTPS.
+
+This is however not the only time proxy-tunneling might offer benefits to
+you or your application.
+
+As tunneling opens a direct connection from your application to the remote
+machine, it suddenly also re-introduces the ability to do non-HTTP
+operations over a HTTP proxy. You can in fact use things such as FTP
+upload or FTP custom commands this way.
+
+Again, this is often prevented by the administrators of proxies and is
+rarely allowed.
+
+Tell libcurl to use proxy tunneling like this:
+
+ curl_easy_setopt(easyhandle, CURLOPT_HTTPPROXYTUNNEL, 1L);
+
+In fact, there might even be times when you want to do plain HTTP
+operations using a tunnel like this, as it then enables you to operate on
+the remote server instead of asking the proxy to do so. libcurl will not
+stand in the way for such innovative actions either!
+
+.IP "Proxy Auto-Config"
+
+Netscape first came up with this. It is basically a web page (usually using a
+\&.pac extension) with a Javascript that when executed by the browser with the
+requested URL as input, returns information to the browser on how to connect
+to the URL. The returned information might be "DIRECT" (which means no proxy
+should be used), "PROXY host:port" (to tell the browser where the proxy for
+this particular URL is) or "SOCKS host:port" (to direct the browser to a SOCKS
+proxy).
+
+libcurl has no means to interpret or evaluate Javascript and thus it doesn't
+support this. If you get yourself in a position where you face this nasty
+invention, the following advice have been mentioned and used in the past:
+
+- Depending on the Javascript complexity, write up a script that translates it
+to another language and execute that.
+
+- Read the Javascript code and rewrite the same logic in another language.
+
+- Implement a Javascript interpreter; people have successfully used the
+Mozilla Javascript engine in the past.
+
+- Ask your admins to stop this, for a static proxy setup or similar.
+
+.SH "Persistence Is The Way to Happiness"
+
+Re-cycling the same easy handle several times when doing multiple requests is
+the way to go.
+
+After each single \fIcurl_easy_perform(3)\fP operation, libcurl will keep the
+connection alive and open. A subsequent request using the same easy handle to
+the same host might just be able to use the already open connection! This
+reduces network impact a lot.
+
+Even if the connection is dropped, all connections involving SSL to the same
+host again, will benefit from libcurl's session ID cache that drastically
+reduces re-connection time.
+
+FTP connections that are kept alive save a lot of time, as the command-
+response round-trips are skipped, and also you don't risk getting blocked
+without permission to login again like on many FTP servers only allowing N
+persons to be logged in at the same time.
+
+libcurl caches DNS name resolving results, to make lookups of a previously
+looked up name a lot faster.
+
+Other interesting details that improve performance for subsequent requests
+may also be added in the future.
+
+Each easy handle will attempt to keep the last few connections alive for a
+while in case they are to be used again. You can set the size of this "cache"
+with the CURLOPT_MAXCONNECTS option. Default is 5. There is very seldom any
+point in changing this value, and if you think of changing this it is often
+just a matter of thinking again.
+
+To force your upcoming request to not use an already existing connection (it
+will even close one first if there happens to be one alive to the same host
+you're about to operate on), you can do that by setting CURLOPT_FRESH_CONNECT
+to 1. In a similar spirit, you can also forbid the upcoming request to be
+"lying" around and possibly get re-used after the request by setting
+CURLOPT_FORBID_REUSE to 1.
+
+.SH "HTTP Headers Used by libcurl"
+When you use libcurl to do HTTP requests, it'll pass along a series of headers
+automatically. It might be good for you to know and understand these. You
+can replace or remove them by using the CURLOPT_HTTPHEADER option.
+
+.IP "Host"
+This header is required by HTTP 1.1 and even many 1.0 servers and should be
+the name of the server we want to talk to. This includes the port number if
+anything but default.
+
+.IP "Accept"
+\&"*/*".
+
+.IP "Expect"
+When doing POST requests, libcurl sets this header to \&"100-continue" to ask
+the server for an "OK" message before it proceeds with sending the data part
+of the post. If the POSTed data amount is deemed "small", libcurl will not use
+this header.
+
+.SH "Customizing Operations"
+There is an ongoing development today where more and more protocols are built
+upon HTTP for transport. This has obvious benefits as HTTP is a tested and
+reliable protocol that is widely deployed and has excellent proxy-support.
+
+When you use one of these protocols, and even when doing other kinds of
+programming you may need to change the traditional HTTP (or FTP or...)
+manners. You may need to change words, headers or various data.
+
+libcurl is your friend here too.
+
+.IP CUSTOMREQUEST
+If just changing the actual HTTP request keyword is what you want, like when
+GET, HEAD or POST is not good enough for you, CURLOPT_CUSTOMREQUEST is there
+for you. It is very simple to use:
+
+ curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "MYOWNREQUEST");
+
+When using the custom request, you change the request keyword of the actual
+request you are performing. Thus, by default you make a GET request but you can
+also make a POST operation (as described before) and then replace the POST
+keyword if you want to. You're the boss.
+
+.IP "Modify Headers"
+HTTP-like protocols pass a series of headers to the server when doing the
+request, and you're free to pass any amount of extra headers that you
+think fit. Adding headers is this easy:
+
+.nf
+ struct curl_slist *headers=NULL; /* init to NULL is important */
+
+ headers = curl_slist_append(headers, "Hey-server-hey: how are you?");
+ headers = curl_slist_append(headers, "X-silly-content: yes");
+
+ /* pass our list of custom made headers */
+ curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
+
+ curl_easy_perform(easyhandle); /* transfer http */
+
+ curl_slist_free_all(headers); /* free the header list */
+.fi
+
+\&... and if you think some of the internally generated headers, such as
+Accept: or Host: don't contain the data you want them to contain, you can
+replace them by simply setting them too:
+
+.nf
+ headers = curl_slist_append(headers, "Accept: Agent-007");
+ headers = curl_slist_append(headers, "Host: munged.host.line");
+.fi
+
+.IP "Delete Headers"
+If you replace an existing header with one with no contents, you will prevent
+the header from being sent. For instance, if you want to completely prevent the
+\&"Accept:" header from being sent, you can disable it with code similar to this:
+
+ headers = curl_slist_append(headers, "Accept:");
+
+Both replacing and canceling internal headers should be done with careful
+consideration and you should be aware that you may violate the HTTP protocol
+when doing so.
+
+.IP "Enforcing chunked transfer-encoding"
+
+By making sure a request uses the custom header "Transfer-Encoding: chunked"
+when doing a non-GET HTTP operation, libcurl will switch over to "chunked"
+upload, even though the size of the data to upload might be known. By default,
+libcurl usually switches over to chunked upload automatically if the upload
+data size is unknown.
+
+.IP "HTTP Version"
+
+All HTTP requests includes the version number to tell the server which version
+we support. libcurl speaks HTTP 1.1 by default. Some very old servers don't
+like getting 1.1-requests and when dealing with stubborn old things like that,
+you can tell libcurl to use 1.0 instead by doing something like this:
+
+ curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
+
+.IP "FTP Custom Commands"
+
+Not all protocols are HTTP-like, and thus the above may not help you when
+you want to make, for example, your FTP transfers to behave differently.
+
+Sending custom commands to a FTP server means that you need to send the
+commands exactly as the FTP server expects them (RFC959 is a good guide
+here), and you can only use commands that work on the control-connection
+alone. All kinds of commands that require data interchange and thus need
+a data-connection must be left to libcurl's own judgement. Also be aware
+that libcurl will do its very best to change directory to the target
+directory before doing any transfer, so if you change directory (with CWD
+or similar) you might confuse libcurl and then it might not attempt to
+transfer the file in the correct remote directory.
+
+A little example that deletes a given file before an operation:
+
+.nf
+ headers = curl_slist_append(headers, "DELE file-to-remove");
+
+ /* pass the list of custom commands to the handle */
+ curl_easy_setopt(easyhandle, CURLOPT_QUOTE, headers);
+
+ curl_easy_perform(easyhandle); /* transfer ftp data! */
+
+ curl_slist_free_all(headers); /* free the header list */
+.fi
+
+If you would instead want this operation (or chain of operations) to happen
+_after_ the data transfer took place the option to \fIcurl_easy_setopt(3)\fP
+would instead be called CURLOPT_POSTQUOTE and used the exact same way.
+
+The custom FTP command will be issued to the server in the same order they are
+added to the list, and if a command gets an error code returned back from the
+server, no more commands will be issued and libcurl will bail out with an
+error code (CURLE_QUOTE_ERROR). Note that if you use CURLOPT_QUOTE to send
+commands before a transfer, no transfer will actually take place when a quote
+command has failed.
+
+If you set the CURLOPT_HEADER to 1, you will tell libcurl to get
+information about the target file and output "headers" about it. The headers
+will be in "HTTP-style", looking like they do in HTTP.
+
+The option to enable headers or to run custom FTP commands may be useful to
+combine with CURLOPT_NOBODY. If this option is set, no actual file content
+transfer will be performed.
+
+.IP "FTP Custom CUSTOMREQUEST"
+If you do want to list the contents of a FTP directory using your own defined FTP
+command, CURLOPT_CUSTOMREQUEST will do just that. "NLST" is the default one
+for listing directories but you're free to pass in your idea of a good
+alternative.
+
+.SH "Cookies Without Chocolate Chips"
+In the HTTP sense, a cookie is a name with an associated value. A server sends
+the name and value to the client, and expects it to get sent back on every
+subsequent request to the server that matches the particular conditions
+set. The conditions include that the domain name and path match and that the
+cookie hasn't become too old.
+
+In real-world cases, servers send new cookies to replace existing ones to
+update them. Server use cookies to "track" users and to keep "sessions".
+
+Cookies are sent from server to clients with the header Set-Cookie: and
+they're sent from clients to servers with the Cookie: header.
+
+To just send whatever cookie you want to a server, you can use CURLOPT_COOKIE
+to set a cookie string like this:
+
+ curl_easy_setopt(easyhandle, CURLOPT_COOKIE, "name1=var1; name2=var2;");
+
+In many cases, that is not enough. You might want to dynamically save
+whatever cookies the remote server passes to you, and make sure those cookies
+are then used accordingly on later requests.
+
+One way to do this, is to save all headers you receive in a plain file and
+when you make a request, you tell libcurl to read the previous headers to
+figure out which cookies to use. Set the header file to read cookies from with
+CURLOPT_COOKIEFILE.
+
+The CURLOPT_COOKIEFILE option also automatically enables the cookie parser in
+libcurl. Until the cookie parser is enabled, libcurl will not parse or
+understand incoming cookies and they will just be ignored. However, when the
+parser is enabled the cookies will be understood and the cookies will be kept
+in memory and used properly in subsequent requests when the same handle is
+used. Many times this is enough, and you may not have to save the cookies to
+disk at all. Note that the file you specify to CURLOPT_COOKIEFILE doesn't have
+to exist to enable the parser, so a common way to just enable the parser and
+not read any cookies is to use the name of a file you know doesn't exist.
+
+If you would rather use existing cookies that you've previously received with
+your Netscape or Mozilla browsers, you can make libcurl use that cookie file
+as input. The CURLOPT_COOKIEFILE is used for that too, as libcurl will
+automatically find out what kind of file it is and act accordingly.
+
+Perhaps the most advanced cookie operation libcurl offers, is saving the
+entire internal cookie state back into a Netscape/Mozilla formatted cookie
+file. We call that the cookie-jar. When you set a file name with
+CURLOPT_COOKIEJAR, that file name will be created and all received cookies
+will be stored in it when \fIcurl_easy_cleanup(3)\fP is called. This enables
+cookies to get passed on properly between multiple handles without any
+information getting lost.
+
+.SH "FTP Peculiarities We Need"
+
+FTP transfers use a second TCP/IP connection for the data transfer. This is
+usually a fact you can forget and ignore but at times this fact will come
+back to haunt you. libcurl offers several different ways to customize how the
+second connection is being made.
+
+libcurl can either connect to the server a second time or tell the server to
+connect back to it. The first option is the default and it is also what works
+best for all the people behind firewalls, NATs or IP-masquerading setups.
+libcurl then tells the server to open up a new port and wait for a second
+connection. This is by default attempted with EPSV first, and if that doesn't
+work it tries PASV instead. (EPSV is an extension to the original FTP spec
+and does not exist nor work on all FTP servers.)
+
+You can prevent libcurl from first trying the EPSV command by setting
+CURLOPT_FTP_USE_EPSV to zero.
+
+In some cases, you will prefer to have the server connect back to you for the
+second connection. This might be when the server is perhaps behind a firewall
+or something and only allows connections on a single port. libcurl then
+informs the remote server which IP address and port number to connect to.
+This is made with the CURLOPT_FTPPORT option. If you set it to "-", libcurl
+will use your system's "default IP address". If you want to use a particular
+IP, you can set the full IP address, a host name to resolve to an IP address
+or even a local network interface name that libcurl will get the IP address
+from.
+
+When doing the "PORT" approach, libcurl will attempt to use the EPRT and the
+LPRT before trying PORT, as they work with more protocols. You can disable
+this behavior by setting CURLOPT_FTP_USE_EPRT to zero.
+
+.SH "Headers Equal Fun"
+
+Some protocols provide "headers", meta-data separated from the normal
+data. These headers are by default not included in the normal data stream,
+but you can make them appear in the data stream by setting CURLOPT_HEADER to
+1.
+
+What might be even more useful, is libcurl's ability to separate the headers
+from the data and thus make the callbacks differ. You can for example set a
+different pointer to pass to the ordinary write callback by setting
+CURLOPT_WRITEHEADER.
+
+Or, you can set an entirely separate function to receive the headers, by
+using CURLOPT_HEADERFUNCTION.
+
+The headers are passed to the callback function one by one, and you can
+depend on that fact. It makes it easier for you to add custom header parsers
+etc.
+
+\&"Headers" for FTP transfers equal all the FTP server responses. They aren't
+actually true headers, but in this case we pretend they are! ;-)
+
+.SH "Post Transfer Information"
+
+ [ curl_easy_getinfo ]
+
+.SH "Security Considerations"
+
+The libcurl project takes security seriously. The library is written with
+caution and precautions are taken to mitigate many kinds of risks encountered
+while operating with potentially malicious servers on the Internet. It is a
+powerful library, however, which allows application writers to make trade offs
+between ease of writing and exposure to potential risky operations. If
+used the right way, you can use libcurl to transfer data pretty safely.
+
+Many applications are used in closed networks where users and servers
+can be trusted, but many others are used on arbitrary servers and are fed
+input from potentially untrusted users. Following is a discussion about
+some risks in the ways in which applications commonly use libcurl and
+potential mitigations of those risks. It is by no means comprehensive, but
+shows classes of attacks that robust applications should consider. The
+Common Weakness Enumeration project at http://cwe.mitre.org/ is a good
+reference for many of these and similar types of weaknesses of which
+application writers should be aware.
+
+.IP "Command Lines"
+If you use a command line tool (such as curl) that uses libcurl, and you give
+options to the tool on the command line those options can very likely get read
+by other users of your system when they use 'ps' or other tools to list
+currently running processes.
+
+To avoid this problem, never feed sensitive things to programs using command
+line options. Write them to a protected file and use the \-K option to
+avoid this.
+
+.IP ".netrc"
+\&.netrc is a pretty handy file/feature that allows you to login quickly and
+automatically to frequently visited sites. The file contains passwords in
+clear text and is a real security risk. In some cases, your .netrc is also
+stored in a home directory that is NFS mounted or used on another network
+based file system, so the clear text password will fly through your network
+every time anyone reads that file!
+
+To avoid this problem, don't use .netrc files and never store passwords in
+plain text anywhere.
+
+.IP "Clear Text Passwords"
+Many of the protocols libcurl supports send name and password unencrypted as
+clear text (HTTP Basic authentication, FTP, TELNET etc). It is very easy for
+anyone on your network or a network nearby yours to just fire up a network
+analyzer tool and eavesdrop on your passwords. Don't let the fact that HTTP
+Basic uses base64 encoded passwords fool you. They may not look readable at a
+first glance, but they very easily "deciphered" by anyone within seconds.
+
+To avoid this problem, use HTTP authentication methods or other protocols that
+don't let snoopers see your password: HTTP with Digest, NTLM or GSS
+authentication, HTTPS, FTPS, SCP, SFTP and FTP-Kerberos are a few examples.
+
+.IP "Redirects"
+The CURLOPT_FOLLOWLOCATION option automatically follows HTTP redirects sent
+by a remote server. These redirects can refer to any kind of URL, not just
+HTTP. A redirect to a file: URL would cause the libcurl to read (or write)
+arbitrary files from the local filesystem. If the application returns
+the data back to the user (as would happen in some kinds of CGI scripts),
+an attacker could leverage this to read otherwise forbidden data (e.g.
+file://localhost/etc/passwd).
+
+If authentication credentials are stored in the ~/.netrc file, or Kerberos
+is in use, any other URL type (not just file:) that requires
+authentication is also at risk. A redirect such as
+ftp://some-internal-server/private-file would then return data even when
+the server is password protected.
+
+In the same way, if an unencrypted SSH private key has been configured for
+the user running the libcurl application, SCP: or SFTP: URLs could access
+password or private-key protected resources,
+e.g. sftp://user@some-internal-server/etc/passwd
+
+The CURLOPT_REDIR_PROTOCOLS and CURLOPT_NETRC options can be used to
+mitigate against this kind of attack.
+
+A redirect can also specify a location available only on the machine running
+libcurl, including servers hidden behind a firewall from the attacker.
+e.g. http://127.0.0.1/ or http://intranet/delete-stuff.cgi?delete=all or
+tftp://bootp-server/pc-config-data
+
+Apps can mitigate against this by disabling CURLOPT_FOLLOWLOCATION and
+handling redirects itself, sanitizing URLs as necessary. Alternately, an
+app could leave CURLOPT_FOLLOWLOCATION enabled but set CURLOPT_REDIR_PROTOCOLS
+and install a CURLOPT_OPENSOCKETFUNCTION callback function in which addresses
+are sanitized before use.
+
+.IP "Private Resources"
+A user who can control the DNS server of a domain being passed in within
+a URL can change the address of the host to a local, private address
+which the libcurl application will then use. e.g. The innocuous URL
+http://fuzzybunnies.example.com/ could actually resolve to the IP address
+of a server behind a firewall, such as 127.0.0.1 or 10.1.2.3
+Apps can mitigate against this by setting a CURLOPT_OPENSOCKETFUNCTION
+and checking the address before a connection.
+
+All the malicious scenarios regarding redirected URLs apply just as well
+to non-redirected URLs, if the user is allowed to specify an arbitrary URL
+that could point to a private resource. For example, a web app providing
+a translation service might happily translate file://localhost/etc/passwd
+and display the result. Apps can mitigate against this with the
+CURLOPT_PROTOCOLS option as well as by similar mitigation techniques for
+redirections.
+
+A malicious FTP server could in response to the PASV command return an
+IP address and port number for a server local to the app running libcurl
+but behind a firewall. Apps can mitigate against this by using the
+CURLOPT_FTP_SKIP_PASV_IP option or CURLOPT_FTPPORT.
+
+.IP Uploads
+When uploading, a redirect can cause a local (or remote) file to be
+overwritten. Apps must not allow any unsanitized URL to be passed in
+for uploads. Also, CURLOPT_FOLLOWLOCATION should not be used on uploads.
+Instead, the app should handle redirects itself, sanitizing each URL first.
+
+.IP Authentication
+Use of CURLOPT_UNRESTRICTED_AUTH could cause authentication information to
+be sent to an unknown second server. Apps can mitigate against this
+by disabling CURLOPT_FOLLOWLOCATION and handling redirects itself,
+sanitizing where necessary.
+
+Use of the CURLAUTH_ANY option to CURLOPT_HTTPAUTH could result in user
+name and password being sent in clear text to an HTTP server. Instead,
+use CURLAUTH_ANYSAFE which ensures that the password is encrypted over
+the network, or else fail the request.
+
+Use of the CURLUSESSL_TRY option to CURLOPT_USE_SSL could result in user
+name and password being sent in clear text to an FTP server. Instead,
+use CURLUSESSL_CONTROL to ensure that an encrypted connection is used or
+else fail the request.
+
+.IP Cookies
+If cookies are enabled and cached, then a user could craft a URL which
+performs some malicious action to a site whose authentication is already
+stored in a cookie. e.g. http://mail.example.com/delete-stuff.cgi?delete=all
+Apps can mitigate against this by disabling cookies or clearing them
+between requests.
+
+.IP "Dangerous URLs"
+SCP URLs can contain raw commands within the scp: URL, which is a side effect
+of how the SCP protocol is designed. e.g.
+scp://user:pass@host/a;date >/tmp/test;
+Apps must not allow unsanitized SCP: URLs to be passed in for downloads.
+
+.IP "Denial of Service"
+A malicious server could cause libcurl to effectively hang by sending
+a trickle of data through, or even no data at all but just keeping the TCP
+connection open. This could result in a denial-of-service attack. The
+CURLOPT_TIMEOUT and/or CURLOPT_LOW_SPEED_LIMIT options can be used to
+mitigate against this.
+
+A malicious server could cause libcurl to effectively hang by starting to
+send data, then severing the connection without cleanly closing the
+TCP connection. The app could install a CURLOPT_SOCKOPTFUNCTION callback
+function and set the TCP SO_KEEPALIVE option to mitigate against this.
+Setting one of the timeout options would also work against this attack.
+
+A malicious server could cause libcurl to download an infinite amount of
+data, potentially causing all of memory or disk to be filled. Setting
+the CURLOPT_MAXFILESIZE_LARGE option is not sufficient to guard against this.
+Instead, the app should monitor the amount of data received within the
+write or progress callback and abort once the limit is reached.
+
+A malicious HTTP server could cause an infinite redirection loop, causing a
+denial-of-service. This can be mitigated by using the CURLOPT_MAXREDIRS
+option.
+
+.IP "Arbitrary Headers"
+User-supplied data must be sanitized when used in options like
+CURLOPT_USERAGENT, CURLOPT_HTTPHEADER, CURLOPT_POSTFIELDS and others that
+are used to generate structured data. Characters like embedded carriage
+returns or ampersands could allow the user to create additional headers or
+fields that could cause malicious transactions.
+
+.IP "Server-supplied Names"
+A server can supply data which the application may, in some cases, use as
+a file name. The curl command-line tool does this with --remote-header-name,
+using the Content-disposition: header to generate a file name. An application
+could also use CURLINFO_EFFECTIVE_URL to generate a file name from a
+server-supplied redirect URL. Special care must be taken to sanitize such
+names to avoid the possibility of a malicious server supplying one like
+"/etc/passwd", "\autoexec.bat" or even ".bashrc".
+
+.IP "Server Certificates"
+A secure application should never use the CURLOPT_SSL_VERIFYPEER option to
+disable certificate validation. There are numerous attacks that are enabled
+by apps that fail to properly validate server TLS/SSL certificates,
+thus enabling a malicious server to spoof a legitimate one. HTTPS without
+validated certificates is potentially as insecure as a plain HTTP connection.
+
+.IP "Showing What You Do"
+On a related issue, be aware that even in situations like when you have
+problems with libcurl and ask someone for help, everything you reveal in order
+to get best possible help might also impose certain security related
+risks. Host names, user names, paths, operating system specifics, etc (not to
+mention passwords of course) may in fact be used by intruders to gain
+additional information of a potential target.
+
+To avoid this problem, you must of course use your common sense. Often, you
+can just edit out the sensitive data or just search/replace your true
+information with faked data.
+
+.SH "Multiple Transfers Using the multi Interface"
+
+The easy interface as described in detail in this document is a synchronous
+interface that transfers one file at a time and doesn't return until it is
+done.
+
+The multi interface, on the other hand, allows your program to transfer
+multiple files in both directions at the same time, without forcing you
+to use multiple threads. The name might make it seem that the multi
+interface is for multi-threaded programs, but the truth is almost the
+reverse. The multi interface can allow a single-threaded application
+to perform the same kinds of multiple, simultaneous transfers that
+multi-threaded programs can perform. It allows many of the benefits
+of multi-threaded transfers without the complexity of managing and
+synchronizing many threads.
+
+To use this interface, you are better off if you first understand the basics
+of how to use the easy interface. The multi interface is simply a way to make
+multiple transfers at the same time by adding up multiple easy handles into
+a "multi stack".
+
+You create the easy handles you want and you set all the options just like you
+have been told above, and then you create a multi handle with
+\fIcurl_multi_init(3)\fP and add all those easy handles to that multi handle
+with \fIcurl_multi_add_handle(3)\fP.
+
+When you've added the handles you have for the moment (you can still add new
+ones at any time), you start the transfers by calling
+\fIcurl_multi_perform(3)\fP.
+
+\fIcurl_multi_perform(3)\fP is asynchronous. It will only execute as little as
+possible and then return back control to your program. It is designed to never
+block.
+
+The best usage of this interface is when you do a select() on all possible
+file descriptors or sockets to know when to call libcurl again. This also
+makes it easy for you to wait and respond to actions on your own application's
+sockets/handles. You figure out what to select() for by using
+\fIcurl_multi_fdset(3)\fP, that fills in a set of fd_set variables for you
+with the particular file descriptors libcurl uses for the moment.
+
+When you then call select(), it'll return when one of the file handles signal
+action and you then call \fIcurl_multi_perform(3)\fP to allow libcurl to do
+what it wants to do. Take note that libcurl does also feature some time-out
+code so we advise you to never use very long timeouts on select() before you
+call \fIcurl_multi_perform(3)\fP, which thus should be called unconditionally
+every now and then even if none of its file descriptors have signaled
+ready. Another precaution you should use: always call
+\fIcurl_multi_fdset(3)\fP immediately before the select() call since the
+current set of file descriptors may change when calling a curl function.
+
+If you want to stop the transfer of one of the easy handles in the stack, you
+can use \fIcurl_multi_remove_handle(3)\fP to remove individual easy
+handles. Remember that easy handles should be \fIcurl_easy_cleanup(3)\fPed.
+
+When a transfer within the multi stack has finished, the counter of running
+transfers (as filled in by \fIcurl_multi_perform(3)\fP) will decrease. When
+the number reaches zero, all transfers are done.
+
+\fIcurl_multi_info_read(3)\fP can be used to get information about completed
+transfers. It then returns the CURLcode for each easy transfer, to allow you
+to figure out success on each individual transfer.
+
+.SH "SSL, Certificates and Other Tricks"
+
+ [ seeding, passwords, keys, certificates, ENGINE, ca certs ]
+
+.SH "Sharing Data Between Easy Handles"
+You can share some data between easy handles when the easy interface is used,
+and some data is share automatically when you use the multi interface.
+
+When you add easy handles to a multi handle, these easy handles will
+automatically share a lot of the data that otherwise would be kept on a
+per-easy handle basis when the easy interface is used.
+
+The DNS cache is shared between handles within a multi handle, making
+subsequent name resolvings faster and the connection pool that is kept to
+better allow persistent connections and connection re-use is shared. If you're
+using the easy interface, you can still share these between specific easy
+handles by using the share interface, see \fIlibcurl-share(3)\fP.
+
+Some things are never shared automatically, not within multi handles, like for
+example cookies so the only way to share that is with the share interface.
+.SH "Footnotes"
+
+.IP "[1]"
+libcurl 7.10.3 and later have the ability to switch over to chunked
+Transfer-Encoding in cases where HTTP uploads are done with data of an unknown
+size.
+.IP "[2]"
+This happens on Windows machines when libcurl is built and used as a
+DLL. However, you can still do this on Windows if you link with a static
+library.
+.IP "[3]"
+The curl-config tool is generated at build-time (on UNIX-like systems) and
+should be installed with the 'make install' or similar instruction that
+installs the library, header files, man pages etc.
+.IP "[4]"
+This behavior was different in versions before 7.17.0, where strings had to
+remain valid past the end of the \fIcurl_easy_setopt(3)\fP call.
diff --git a/docs/libcurl/libcurl.3 b/docs/libcurl/libcurl.3
new file mode 100644
index 000000000..d2dcd7838
--- /dev/null
+++ b/docs/libcurl/libcurl.3
@@ -0,0 +1,222 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at http://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the 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 "19 March 2002" "libcurl 7.9.6" "libcurl overview"
+.SH NAME
+libcurl \- client-side URL transfers
+.SH DESCRIPTION
+This is a short overview on how to use libcurl in your C programs. There are
+specific man pages for each function mentioned in here. There are also the
+\fIlibcurl-easy(3)\fP man page, the \fIlibcurl-multi(3)\fP man page, the
+\fIlibcurl-share(3)\fP man page and the \fIlibcurl-tutorial(3)\fP man page for
+in-depth understanding on how to program with libcurl.
+
+There are more than thirty custom bindings available that bring libcurl access
+to your favourite language. Look elsewhere for documentation on those.
+
+libcurl has a global constant environment that you must set up and
+maintain while using libcurl. This essentially means you call
+\fIcurl_global_init(3)\fP at the start of your program and
+\fIcurl_global_cleanup(3)\fP at the end. See GLOBAL CONSTANTS below
+for details.
+
+To transfer files, you always set up an "easy handle" using
+\fIcurl_easy_init(3)\fP, but when you want the file(s) transferred you have
+the option of using the "easy" interface, or the "multi" interface.
+
+The easy interface is a synchronous interface with which you call
+\fIcurl_easy_perform(3)\fP and let it perform the transfer. When it is
+completed, the function returns and you can continue. More details are found in
+the \fIlibcurl-easy(3)\fP man page.
+
+The multi interface on the other hand is an asynchronous interface, that you
+call and that performs only a little piece of the transfer on each invoke. It
+is perfect if you want to do things while the transfer is in progress, or
+similar. The multi interface allows you to select() on libcurl action, and
+even to easily download multiple files simultaneously using a single thread. See further details in the \fIlibcurl-multi(3)\fP man page.
+
+You can have multiple easy handles share certain data, even if they are used
+in different threads. This magic is setup using the share interface, as
+described in the \fIlibcurl-share(3)\fP man page.
+
+There is also a series of other helpful functions to use, including these:
+.RS
+.IP curl_version_info()
+gets detailed libcurl (and other used libraries) version info
+.IP curl_getdate()
+converts a date string to time_t
+.IP curl_easy_getinfo()
+get information about a performed transfer
+.IP curl_formadd()
+helps building an HTTP form POST
+.IP curl_formfree()
+free a list built with \fIcurl_formadd(3)\fP
+.IP curl_slist_append()
+builds a linked list
+.IP curl_slist_free_all()
+frees a whole curl_slist
+.RE
+
+.SH "LINKING WITH LIBCURL"
+On unix-like machines, there's a tool named curl-config that gets installed
+with the rest of the curl stuff when 'make install' is performed.
+
+curl-config is added to make it easier for applications to link with libcurl
+and developers to learn about libcurl and how to use it.
+
+Run 'curl-config --libs' to get the (additional) linker options you need to
+link with the particular version of libcurl you've installed. See the
+\fIcurl-config(1)\fP man page for further details.
+
+Unix-like operating system that ship libcurl as part of their distributions
+often don't provide the curl-config tool, but simply install the library and
+headers in the common path for this purpose.
+
+.SH "LIBCURL SYMBOL NAMES"
+All public functions in the libcurl interface are prefixed with 'curl_' (with
+a lowercase c). You can find other functions in the library source code, but
+other prefixes indicate that the functions are private and may change without
+further notice in the next release.
+
+Only use documented functions and functionality!
+.SH "PORTABILITY"
+libcurl works
+.B exactly
+the same, on any of the platforms it compiles and builds on.
+.SH "THREADS"
+Never ever call curl-functions simultaneously using the same handle from
+several threads. libcurl is thread-safe and can be used in any number of
+threads, but you must use separate curl handles if you want to use libcurl in
+more than one thread simultaneously.
+
+The global environment functions are not thread-safe. See GLOBAL CONSTANTS
+below for details.
+
+.SH "PERSISTENT CONNECTIONS"
+Persistent connections means that libcurl can re-use the same connection for
+several transfers, if the conditions are right.
+
+libcurl will \fBalways\fP attempt to use persistent connections. Whenever you
+use \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP, libcurl will
+attempt to use an existing connection to do the transfer, and if none exists
+it'll open a new one that will be subject for re-use on a possible following
+call to \fIcurl_easy_perform(3)\fP or \fIcurl_multi_perform(3)\fP.
+
+To allow libcurl to take full advantage of persistent connections, you should
+do as many of your file transfers as possible using the same curl handle. When
+you call \fIcurl_easy_cleanup(3)\fP, all the possibly open connections held by
+libcurl will be closed and forgotten.
+
+Note that the options set with \fIcurl_easy_setopt(3)\fP will be used on
+every repeated \fIcurl_easy_perform(3)\fP call.
+
+.SH "GLOBAL CONSTANTS"
+There are a variety of constants that libcurl uses, mainly through its
+internal use of other libraries, which are too complicated for the
+library loader to set up. Therefore, a program must call a library
+function after the program is loaded and running to finish setting up
+the library code. For example, when libcurl is built for SSL
+capability via the GNU TLS library, there is an elaborate tree inside
+that library that describes the SSL protocol.
+
+\fIcurl_global_init()\fP is the function that you must call. This may
+allocate resources (e.g. the memory for the GNU TLS tree mentioned
+above), so the companion function \fIcurl_global_cleanup()\fP releases
+them.
+
+The basic rule for constructing a program that uses libcurl is this:
+Call \fIcurl_global_init()\fP, with a \fICURL_GLOBAL_ALL\fP argument,
+immediately after the program starts, while it is still only one
+thread and before it uses libcurl at all. Call
+\fIcurl_global_cleanup()\fP immediately before the program exits, when
+the program is again only one thread and after its last use of
+libcurl.
+
+You can call both of these multiple times, as long as all calls meet
+these requirements and the number of calls to each is the same.
+
+It isn't actually required that the functions be called at the beginning
+and end of the program -- that's just usually the easiest way to do it.
+It \fIis\fP required that the functions be called when no other thread
+in the program is running.
+
+These global constant functions are \fInot thread safe\fP, so you must
+not call them when any other thread in the program is running. It
+isn't good enough that no other thread is using libcurl at the time,
+because these functions internally call similar functions of other
+libraries, and those functions are similarly thread-unsafe. You can't
+generally know what these libraries are, or whether other threads are
+using them.
+
+The global constant situation merits special consideration when the
+code you are writing to use libcurl is not the main program, but rather
+a modular piece of a program, e.g. another library. As a module,
+your code doesn't know about other parts of the program -- it doesn't
+know whether they use libcurl or not. And its code doesn't necessarily
+run at the start and end of the whole program.
+
+A module like this must have global constant functions of its own,
+just like \fIcurl_global_init()\fP and \fIcurl_global_cleanup()\fP.
+The module thus has control at the beginning and end of the program
+and has a place to call the libcurl functions. Note that if multiple
+modules in the program use libcurl, they all will separately call the
+libcurl functions, and that's OK because only the first
+\fIcurl_global_init()\fP and the last \fIcurl_global_cleanup()\fP in a
+program change anything. (libcurl uses a reference count in static
+memory).
+
+In a C++ module, it is common to deal with the global constant
+situation by defining a special class that represents the global
+constant environment of the module. A program always has exactly one
+object of the class, in static storage. That way, the program
+automatically calls the constructor of the object as the program
+starts up and the destructor as it terminates. As the author of this
+libcurl-using module, you can make the constructor call
+\fIcurl_global_init()\fP and the destructor call
+\fIcurl_global_cleanup()\fP and satisfy libcurl's requirements without
+your user having to think about it.
+
+\fIcurl_global_init()\fP has an argument that tells what particular
+parts of the global constant environment to set up. In order to
+successfully use any value except \fICURL_GLOBAL_ALL\fP (which says to
+set up the whole thing), you must have specific knowledge of internal
+workings of libcurl and all other parts of the program of which it is
+part.
+
+A special part of the global constant environment is the identity of
+the memory allocator. \fIcurl_global_init()\fP selects the system
+default memory allocator, but you can use \fIcurl_global_init_mem()\fP
+to supply one of your own. However, there is no way to use
+\fIcurl_global_init_mem()\fP in a modular program -- all modules in
+the program that might use libcurl would have to agree on one
+allocator.
+
+There is a failsafe in libcurl that makes it usable in simple
+situations without you having to worry about the global constant
+environment at all: \fIcurl_easy_init()\fP sets up the environment
+itself if it hasn't been done yet. The resources it acquires to do so
+get released by the operating system automatically when the program
+exits.
+
+This failsafe feature exists mainly for backward compatibility because
+there was a time when the global functions didn't exist. Because it
+is sufficient only in the simplest of programs, it is not recommended
+for any program to rely on it.
diff --git a/docs/libcurl/libcurl.m4 b/docs/libcurl/libcurl.m4
new file mode 100644
index 000000000..d7d5a5259
--- /dev/null
+++ b/docs/libcurl/libcurl.m4
@@ -0,0 +1,251 @@
+# 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,
+ AC_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 <curl/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_FILE;
+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 --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
new file mode 100644
index 000000000..1de1aceb7
--- /dev/null
+++ b/docs/libcurl/symbols-in-versions
@@ -0,0 +1,705 @@
+ _ _ ____ _
+ ___| | | | _ \| |
+ / __| | | | |_) | |
+ | (__| |_| | _ <| |___
+ \___|\___/|_| \_\_____|
+
+ This document lists defines and other symbols present in libcurl, together
+ with exact information about the first libcurl version that provides the
+ symbol, the first version in which the symbol was marked as deprecated and
+ for a few symbols the last version that featured it. The names appear in
+ alphabetical order.
+
+ Name Introduced Deprecated Removed
+
+CURLAUTH_ANY 7.10.6
+CURLAUTH_ANYSAFE 7.10.6
+CURLAUTH_BASIC 7.10.6
+CURLAUTH_DIGEST 7.10.6
+CURLAUTH_DIGEST_IE 7.19.3
+CURLAUTH_GSSNEGOTIATE 7.10.6
+CURLAUTH_NONE 7.10.6
+CURLAUTH_NTLM 7.10.6
+CURLAUTH_NTLM_WB 7.22.0
+CURLAUTH_ONLY 7.21.3
+CURLCLOSEPOLICY_CALLBACK 7.7
+CURLCLOSEPOLICY_LEAST_RECENTLY_USED 7.7
+CURLCLOSEPOLICY_LEAST_TRAFFIC 7.7
+CURLCLOSEPOLICY_NONE 7.7
+CURLCLOSEPOLICY_OLDEST 7.7
+CURLCLOSEPOLICY_SLOWEST 7.7
+CURLE_ABORTED_BY_CALLBACK 7.1
+CURLE_AGAIN 7.18.2
+CURLE_ALREADY_COMPLETE 7.7.2
+CURLE_BAD_CALLING_ORDER 7.1 7.17.0
+CURLE_BAD_CONTENT_ENCODING 7.10
+CURLE_BAD_DOWNLOAD_RESUME 7.10
+CURLE_BAD_FUNCTION_ARGUMENT 7.1
+CURLE_BAD_PASSWORD_ENTERED 7.4.2 7.17.0
+CURLE_CHUNK_FAILED 7.21.0
+CURLE_CONV_FAILED 7.15.4
+CURLE_CONV_REQD 7.15.4
+CURLE_COULDNT_CONNECT 7.1
+CURLE_COULDNT_RESOLVE_HOST 7.1
+CURLE_COULDNT_RESOLVE_PROXY 7.1
+CURLE_FAILED_INIT 7.1
+CURLE_FILESIZE_EXCEEDED 7.10.8
+CURLE_FILE_COULDNT_READ_FILE 7.1
+CURLE_FTP_ACCEPT_FAILED 7.24.0
+CURLE_FTP_ACCEPT_TIMEOUT 7.24.0
+CURLE_FTP_ACCESS_DENIED 7.1
+CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1 7.1
+CURLE_FTP_BAD_FILE_LIST 7.21.0
+CURLE_FTP_CANT_GET_HOST 7.1
+CURLE_FTP_CANT_RECONNECT 7.1 7.17.0
+CURLE_FTP_COULDNT_GET_SIZE 7.1 7.17.0
+CURLE_FTP_COULDNT_RETR_FILE 7.1
+CURLE_FTP_COULDNT_SET_ASCII 7.1 7.17.0
+CURLE_FTP_COULDNT_SET_BINARY 7.1 7.17.0
+CURLE_FTP_COULDNT_SET_TYPE 7.17.0
+CURLE_FTP_COULDNT_STOR_FILE 7.1
+CURLE_FTP_COULDNT_USE_REST 7.1
+CURLE_FTP_PARTIAL_FILE 7.1 7.1
+CURLE_FTP_PORT_FAILED 7.1
+CURLE_FTP_PRET_FAILED 7.20.0
+CURLE_FTP_QUOTE_ERROR 7.1 7.17.0
+CURLE_FTP_SSL_FAILED 7.11.0 7.17.0
+CURLE_FTP_USER_PASSWORD_INCORRECT 7.1 7.17.0
+CURLE_FTP_WEIRD_227_FORMAT 7.1
+CURLE_FTP_WEIRD_PASS_REPLY 7.1
+CURLE_FTP_WEIRD_PASV_REPLY 7.1
+CURLE_FTP_WEIRD_SERVER_REPLY 7.1
+CURLE_FTP_WEIRD_USER_REPLY 7.1 7.17.0
+CURLE_FTP_WRITE_ERROR 7.1 7.17.0
+CURLE_FUNCTION_NOT_FOUND 7.1
+CURLE_GOT_NOTHING 7.9.1
+CURLE_HTTP_NOT_FOUND 7.1
+CURLE_HTTP_PORT_FAILED 7.3 7.12.0
+CURLE_HTTP_POST_ERROR 7.1
+CURLE_HTTP_RANGE_ERROR 7.1 7.17.0
+CURLE_HTTP_RETURNED_ERROR 7.10.3
+CURLE_INTERFACE_FAILED 7.12.0
+CURLE_LDAP_CANNOT_BIND 7.1
+CURLE_LDAP_INVALID_URL 7.10.8
+CURLE_LDAP_SEARCH_FAILED 7.1
+CURLE_LIBRARY_NOT_FOUND 7.1 7.17.0
+CURLE_LOGIN_DENIED 7.13.1
+CURLE_MALFORMAT_USER 7.1 7.17.0
+CURLE_NOT_BUILT_IN 7.21.5
+CURLE_OK 7.1
+CURLE_OPERATION_TIMEDOUT 7.10.2
+CURLE_OPERATION_TIMEOUTED 7.1 7.17.0
+CURLE_OUT_OF_MEMORY 7.1
+CURLE_PARTIAL_FILE 7.1
+CURLE_PEER_FAILED_VERIFICATION 7.17.1
+CURLE_QUOTE_ERROR 7.17.0
+CURLE_RANGE_ERROR 7.17.0
+CURLE_READ_ERROR 7.1
+CURLE_RECV_ERROR 7.10
+CURLE_REMOTE_ACCESS_DENIED 7.17.0
+CURLE_REMOTE_DISK_FULL 7.17.0
+CURLE_REMOTE_FILE_EXISTS 7.17.0
+CURLE_REMOTE_FILE_NOT_FOUND 7.16.1
+CURLE_RTSP_CSEQ_ERROR 7.20.0
+CURLE_RTSP_SESSION_ERROR 7.20.0
+CURLE_SEND_ERROR 7.10
+CURLE_SEND_FAIL_REWIND 7.12.3
+CURLE_SHARE_IN_USE 7.9.6 7.17.0
+CURLE_SSH 7.16.1
+CURLE_SSL_CACERT 7.10
+CURLE_SSL_CACERT_BADFILE 7.16.0
+CURLE_SSL_CERTPROBLEM 7.10
+CURLE_SSL_CIPHER 7.10
+CURLE_SSL_CONNECT_ERROR 7.1
+CURLE_SSL_CRL_BADFILE 7.19.0
+CURLE_SSL_ENGINE_INITFAILED 7.12.3
+CURLE_SSL_ENGINE_NOTFOUND 7.9.3
+CURLE_SSL_ENGINE_SETFAILED 7.9.3
+CURLE_SSL_ISSUER_ERROR 7.19.0
+CURLE_SSL_PEER_CERTIFICATE 7.8 7.17.1
+CURLE_SSL_SHUTDOWN_FAILED 7.16.1
+CURLE_TELNET_OPTION_SYNTAX 7.7
+CURLE_TFTP_DISKFULL 7.15.0 7.17.0
+CURLE_TFTP_EXISTS 7.15.0 7.17.0
+CURLE_TFTP_ILLEGAL 7.15.0
+CURLE_TFTP_NOSUCHUSER 7.15.0
+CURLE_TFTP_NOTFOUND 7.15.0
+CURLE_TFTP_PERM 7.15.0
+CURLE_TFTP_UNKNOWNID 7.15.0
+CURLE_TOO_MANY_REDIRECTS 7.5
+CURLE_UNKNOWN_OPTION 7.21.5
+CURLE_UNKNOWN_TELNET_OPTION 7.7
+CURLE_UNSUPPORTED_PROTOCOL 7.1
+CURLE_UPLOAD_FAILED 7.16.3
+CURLE_URL_MALFORMAT 7.1
+CURLE_URL_MALFORMAT_USER 7.1 7.17.0
+CURLE_USE_SSL_FAILED 7.17.0
+CURLE_WRITE_ERROR 7.1
+CURLFILETYPE_DEVICE_BLOCK 7.21.0
+CURLFILETYPE_DEVICE_CHAR 7.21.0
+CURLFILETYPE_DIRECTORY 7.21.0
+CURLFILETYPE_DOOR 7.21.0
+CURLFILETYPE_FILE 7.21.0
+CURLFILETYPE_NAMEDPIPE 7.21.0
+CURLFILETYPE_SOCKET 7.21.0
+CURLFILETYPE_SYMLINK 7.21.0
+CURLFILETYPE_UNKNOWN 7.21.0
+CURLFINFOFLAG_KNOWN_FILENAME 7.21.0
+CURLFINFOFLAG_KNOWN_FILETYPE 7.21.0
+CURLFINFOFLAG_KNOWN_GID 7.21.0
+CURLFINFOFLAG_KNOWN_HLINKCOUNT 7.21.0
+CURLFINFOFLAG_KNOWN_PERM 7.21.0
+CURLFINFOFLAG_KNOWN_SIZE 7.21.0
+CURLFINFOFLAG_KNOWN_TIME 7.21.0
+CURLFINFOFLAG_KNOWN_UID 7.21.0
+CURLFORM_ARRAY 7.9.1
+CURLFORM_ARRAY_END 7.9.1 7.9.5 7.9.6
+CURLFORM_ARRAY_START 7.9.1 7.9.5 7.9.6
+CURLFORM_BUFFER 7.9.8
+CURLFORM_BUFFERLENGTH 7.9.8
+CURLFORM_BUFFERPTR 7.9.8
+CURLFORM_CONTENTHEADER 7.9.3
+CURLFORM_CONTENTSLENGTH 7.9
+CURLFORM_CONTENTTYPE 7.9
+CURLFORM_COPYCONTENTS 7.9
+CURLFORM_COPYNAME 7.9
+CURLFORM_END 7.9
+CURLFORM_FILE 7.9
+CURLFORM_FILECONTENT 7.9.1
+CURLFORM_FILENAME 7.9.6
+CURLFORM_NAMELENGTH 7.9
+CURLFORM_NOTHING 7.9
+CURLFORM_PTRCONTENTS 7.9
+CURLFORM_PTRNAME 7.9
+CURLFORM_STREAM 7.18.2
+CURLFTPAUTH_DEFAULT 7.12.2
+CURLFTPAUTH_SSL 7.12.2
+CURLFTPAUTH_TLS 7.12.2
+CURLFTPMETHOD_DEFAULT 7.15.3
+CURLFTPMETHOD_MULTICWD 7.15.3
+CURLFTPMETHOD_NOCWD 7.15.3
+CURLFTPMETHOD_SINGLECWD 7.15.3
+CURLFTPSSL_ALL 7.11.0 7.17.0
+CURLFTPSSL_CCC_ACTIVE 7.16.2
+CURLFTPSSL_CCC_NONE 7.16.2
+CURLFTPSSL_CCC_PASSIVE 7.16.1
+CURLFTPSSL_CONTROL 7.11.0 7.17.0
+CURLFTPSSL_NONE 7.11.0 7.17.0
+CURLFTPSSL_TRY 7.11.0 7.17.0
+CURLFTP_CREATE_DIR 7.19.4
+CURLFTP_CREATE_DIR_NONE 7.19.4
+CURLFTP_CREATE_DIR_RETRY 7.19.4
+CURLGSSAPI_DELEGATION_FLAG 7.22.0
+CURLGSSAPI_DELEGATION_NONE 7.22.0
+CURLGSSAPI_DELEGATION_POLICY_FLAG 7.22.0
+CURLINFO_APPCONNECT_TIME 7.19.0
+CURLINFO_CERTINFO 7.19.1
+CURLINFO_CONDITION_UNMET 7.19.4
+CURLINFO_CONNECT_TIME 7.4.1
+CURLINFO_CONTENT_LENGTH_DOWNLOAD 7.6.1
+CURLINFO_CONTENT_LENGTH_UPLOAD 7.6.1
+CURLINFO_CONTENT_TYPE 7.9.4
+CURLINFO_COOKIELIST 7.14.1
+CURLINFO_DATA_IN 7.9.6
+CURLINFO_DATA_OUT 7.9.6
+CURLINFO_DOUBLE 7.4.1
+CURLINFO_EFFECTIVE_URL 7.4
+CURLINFO_END 7.9.6
+CURLINFO_FILETIME 7.5
+CURLINFO_FTP_ENTRY_PATH 7.15.4
+CURLINFO_HEADER_IN 7.9.6
+CURLINFO_HEADER_OUT 7.9.6
+CURLINFO_HEADER_SIZE 7.4.1
+CURLINFO_HTTPAUTH_AVAIL 7.10.8
+CURLINFO_HTTP_CODE 7.4.1 7.10.8
+CURLINFO_HTTP_CONNECTCODE 7.10.7
+CURLINFO_LASTONE 7.4.1
+CURLINFO_LASTSOCKET 7.15.2
+CURLINFO_LOCAL_IP 7.21.0
+CURLINFO_LOCAL_PORT 7.21.0
+CURLINFO_LONG 7.4.1
+CURLINFO_MASK 7.4.1
+CURLINFO_NAMELOOKUP_TIME 7.4.1
+CURLINFO_NONE 7.4.1
+CURLINFO_NUM_CONNECTS 7.12.3
+CURLINFO_OS_ERRNO 7.12.2
+CURLINFO_PRETRANSFER_TIME 7.4.1
+CURLINFO_PRIMARY_IP 7.19.0
+CURLINFO_PRIMARY_PORT 7.21.0
+CURLINFO_PRIVATE 7.10.3
+CURLINFO_PROXYAUTH_AVAIL 7.10.8
+CURLINFO_REDIRECT_COUNT 7.9.7
+CURLINFO_REDIRECT_TIME 7.9.7
+CURLINFO_REDIRECT_URL 7.18.2
+CURLINFO_REQUEST_SIZE 7.4.1
+CURLINFO_RESPONSE_CODE 7.10.8
+CURLINFO_RTSP_CLIENT_CSEQ 7.20.0
+CURLINFO_RTSP_CSEQ_RECV 7.20.0
+CURLINFO_RTSP_SERVER_CSEQ 7.20.0
+CURLINFO_RTSP_SESSION_ID 7.20.0
+CURLINFO_SIZE_DOWNLOAD 7.4.1
+CURLINFO_SIZE_UPLOAD 7.4.1
+CURLINFO_SLIST 7.12.3
+CURLINFO_SPEED_DOWNLOAD 7.4.1
+CURLINFO_SPEED_UPLOAD 7.4.1
+CURLINFO_SSL_DATA_IN 7.12.1
+CURLINFO_SSL_DATA_OUT 7.12.1
+CURLINFO_SSL_ENGINES 7.12.3
+CURLINFO_SSL_VERIFYRESULT 7.5
+CURLINFO_STARTTRANSFER_TIME 7.9.2
+CURLINFO_STRING 7.4.1
+CURLINFO_TEXT 7.9.6
+CURLINFO_TOTAL_TIME 7.4.1
+CURLINFO_TYPEMASK 7.4.1
+CURLIOCMD_NOP 7.12.3
+CURLIOCMD_RESTARTREAD 7.12.3
+CURLIOE_FAILRESTART 7.12.3
+CURLIOE_OK 7.12.3
+CURLIOE_UNKNOWNCMD 7.12.3
+CURLKHMATCH_MISMATCH 7.19.6
+CURLKHMATCH_MISSING 7.19.6
+CURLKHMATCH_OK 7.19.6
+CURLKHSTAT_DEFER 7.19.6
+CURLKHSTAT_FINE 7.19.6
+CURLKHSTAT_FINE_ADD_TO_FILE 7.19.6
+CURLKHSTAT_REJECT 7.19.6
+CURLKHTYPE_DSS 7.19.6
+CURLKHTYPE_RSA 7.19.6
+CURLKHTYPE_RSA1 7.19.6
+CURLKHTYPE_UNKNOWN 7.19.6
+CURLMOPT_MAXCONNECTS 7.16.3
+CURLMOPT_PIPELINING 7.16.0
+CURLMOPT_SOCKETDATA 7.15.4
+CURLMOPT_SOCKETFUNCTION 7.15.4
+CURLMOPT_TIMERDATA 7.16.0
+CURLMOPT_TIMERFUNCTION 7.16.0
+CURLMSG_DONE 7.9.6
+CURLMSG_NONE 7.9.6
+CURLM_BAD_EASY_HANDLE 7.9.6
+CURLM_BAD_HANDLE 7.9.6
+CURLM_BAD_SOCKET 7.15.4
+CURLM_CALL_MULTI_PERFORM 7.9.6
+CURLM_CALL_MULTI_SOCKET 7.15.5
+CURLM_INTERNAL_ERROR 7.9.6
+CURLM_OK 7.9.6
+CURLM_OUT_OF_MEMORY 7.9.6
+CURLM_UNKNOWN_OPTION 7.15.4
+CURLOPTTYPE_FUNCTIONPOINT 7.1
+CURLOPTTYPE_LONG 7.1
+CURLOPTTYPE_OBJECTPOINT 7.1
+CURLOPTTYPE_OFF_T 7.11.0
+CURLOPT_ACCEPTTIMEOUT_MS 7.24.0
+CURLOPT_ACCEPT_ENCODING 7.21.6
+CURLOPT_ADDRESS_SCOPE 7.19.0
+CURLOPT_APPEND 7.17.0
+CURLOPT_AUTOREFERER 7.1
+CURLOPT_BUFFERSIZE 7.10
+CURLOPT_CAINFO 7.4.2
+CURLOPT_CAPATH 7.9.8
+CURLOPT_CERTINFO 7.19.1
+CURLOPT_CHUNK_BGN_FUNCTION 7.21.0
+CURLOPT_CHUNK_DATA 7.21.0
+CURLOPT_CHUNK_END_FUNCTION 7.21.0
+CURLOPT_CLOSEFUNCTION 7.7 7.11.1 7.15.5
+CURLOPT_CLOSEPOLICY 7.7 7.16.1
+CURLOPT_CLOSESOCKETDATA 7.21.7
+CURLOPT_CLOSESOCKETFUNCTION 7.21.7
+CURLOPT_CONNECTTIMEOUT 7.7
+CURLOPT_CONNECTTIMEOUT_MS 7.16.2
+CURLOPT_CONNECT_ONLY 7.15.2
+CURLOPT_CONV_FROM_NETWORK_FUNCTION 7.15.4
+CURLOPT_CONV_FROM_UTF8_FUNCTION 7.15.4
+CURLOPT_CONV_TO_NETWORK_FUNCTION 7.15.4
+CURLOPT_COOKIE 7.1
+CURLOPT_COOKIEFILE 7.1
+CURLOPT_COOKIEJAR 7.9
+CURLOPT_COOKIELIST 7.14.1
+CURLOPT_COOKIESESSION 7.9.7
+CURLOPT_COPYPOSTFIELDS 7.17.1
+CURLOPT_CRLF 7.1
+CURLOPT_CRLFILE 7.19.0
+CURLOPT_CUSTOMREQUEST 7.1
+CURLOPT_DEBUGDATA 7.9.6
+CURLOPT_DEBUGFUNCTION 7.9.6
+CURLOPT_DIRLISTONLY 7.17.0
+CURLOPT_DNS_CACHE_TIMEOUT 7.9.3
+CURLOPT_DNS_SERVERS 7.24.0
+CURLOPT_DNS_USE_GLOBAL_CACHE 7.9.3 7.11.1
+CURLOPT_EGDSOCKET 7.7
+CURLOPT_ENCODING 7.10
+CURLOPT_ERRORBUFFER 7.1
+CURLOPT_FAILONERROR 7.1
+CURLOPT_FILE 7.1 7.9.7
+CURLOPT_FILETIME 7.5
+CURLOPT_FNMATCH_DATA 7.21.0
+CURLOPT_FNMATCH_FUNCTION 7.21.0
+CURLOPT_FOLLOWLOCATION 7.1
+CURLOPT_FORBID_REUSE 7.7
+CURLOPT_FRESH_CONNECT 7.7
+CURLOPT_FTPAPPEND 7.1 7.16.4
+CURLOPT_FTPASCII 7.1 7.11.1 7.15.5
+CURLOPT_FTPLISTONLY 7.1 7.16.4
+CURLOPT_FTPPORT 7.1
+CURLOPT_FTPSSLAUTH 7.12.2
+CURLOPT_FTP_ACCOUNT 7.13.0
+CURLOPT_FTP_ALTERNATIVE_TO_USER 7.15.5
+CURLOPT_FTP_CREATE_MISSING_DIRS 7.10.7
+CURLOPT_FTP_FILEMETHOD 7.15.1
+CURLOPT_FTP_RESPONSE_TIMEOUT 7.10.8
+CURLOPT_FTP_SKIP_PASV_IP 7.15.0
+CURLOPT_FTP_SSL 7.11.0 7.16.4
+CURLOPT_FTP_SSL_CCC 7.16.1
+CURLOPT_FTP_USE_EPRT 7.10.5
+CURLOPT_FTP_USE_EPSV 7.9.2
+CURLOPT_FTP_USE_PRET 7.20.0
+CURLOPT_GSSAPI_DELEGATION 7.22.0
+CURLOPT_HEADER 7.1
+CURLOPT_HEADERDATA 7.10
+CURLOPT_HEADERFUNCTION 7.7.2
+CURLOPT_HTTP200ALIASES 7.10.3
+CURLOPT_HTTPAUTH 7.10.6
+CURLOPT_HTTPGET 7.8.1
+CURLOPT_HTTPHEADER 7.1
+CURLOPT_HTTPPOST 7.1
+CURLOPT_HTTPPROXYTUNNEL 7.3
+CURLOPT_HTTPREQUEST 7.1 - 7.15.5
+CURLOPT_HTTP_CONTENT_DECODING 7.16.2
+CURLOPT_HTTP_TRANSFER_DECODING 7.16.2
+CURLOPT_HTTP_VERSION 7.9.1
+CURLOPT_IGNORE_CONTENT_LENGTH 7.14.1
+CURLOPT_INFILE 7.1 7.9.7
+CURLOPT_INFILESIZE 7.1
+CURLOPT_INFILESIZE_LARGE 7.11.0
+CURLOPT_INTERFACE 7.3
+CURLOPT_INTERLEAVEDATA 7.20.0
+CURLOPT_INTERLEAVEFUNCTION 7.20.0
+CURLOPT_IOCTLDATA 7.12.3
+CURLOPT_IOCTLFUNCTION 7.12.3
+CURLOPT_IPRESOLVE 7.10.8
+CURLOPT_ISSUERCERT 7.19.0
+CURLOPT_KEYPASSWD 7.17.0
+CURLOPT_KRB4LEVEL 7.3 7.17.0
+CURLOPT_KRBLEVEL 7.16.4
+CURLOPT_LOCALPORT 7.15.2
+CURLOPT_LOCALPORTRANGE 7.15.2
+CURLOPT_LOW_SPEED_LIMIT 7.1
+CURLOPT_LOW_SPEED_TIME 7.1
+CURLOPT_MAIL_AUTH 7.25.0
+CURLOPT_MAIL_FROM 7.20.0
+CURLOPT_MAIL_RCPT 7.20.0
+CURLOPT_MAXCONNECTS 7.7
+CURLOPT_MAXFILESIZE 7.10.8
+CURLOPT_MAXFILESIZE_LARGE 7.11.0
+CURLOPT_MAXREDIRS 7.5
+CURLOPT_MAX_RECV_SPEED_LARGE 7.15.5
+CURLOPT_MAX_SEND_SPEED_LARGE 7.15.5
+CURLOPT_MUTE 7.1 7.8 7.15.5
+CURLOPT_NETRC 7.1
+CURLOPT_NETRC_FILE 7.11.0
+CURLOPT_NEW_DIRECTORY_PERMS 7.16.4
+CURLOPT_NEW_FILE_PERMS 7.16.4
+CURLOPT_NOBODY 7.1
+CURLOPT_NOPROGRESS 7.1
+CURLOPT_NOPROXY 7.19.4
+CURLOPT_NOSIGNAL 7.10
+CURLOPT_NOTHING 7.1.1 7.11.1 7.11.0
+CURLOPT_OPENSOCKETDATA 7.17.1
+CURLOPT_OPENSOCKETFUNCTION 7.17.1
+CURLOPT_PASSWDDATA 7.4.2 7.11.1 7.15.5
+CURLOPT_PASSWDFUNCTION 7.4.2 7.11.1 7.15.5
+CURLOPT_PASSWORD 7.19.1
+CURLOPT_PASV_HOST 7.12.1 7.16.0 7.15.5
+CURLOPT_PORT 7.1
+CURLOPT_POST 7.1
+CURLOPT_POST301 7.17.1 7.19.1
+CURLOPT_POSTFIELDS 7.1
+CURLOPT_POSTFIELDSIZE 7.2
+CURLOPT_POSTFIELDSIZE_LARGE 7.11.1
+CURLOPT_POSTQUOTE 7.1
+CURLOPT_POSTREDIR 7.19.1
+CURLOPT_PREQUOTE 7.9.5
+CURLOPT_PRIVATE 7.10.3
+CURLOPT_PROGRESSDATA 7.1
+CURLOPT_PROGRESSFUNCTION 7.1
+CURLOPT_PROTOCOLS 7.19.4
+CURLOPT_PROXY 7.1
+CURLOPT_PROXYAUTH 7.10.7
+CURLOPT_PROXYPASSWORD 7.19.1
+CURLOPT_PROXYPORT 7.1
+CURLOPT_PROXYTYPE 7.10
+CURLOPT_PROXYUSERNAME 7.19.1
+CURLOPT_PROXYUSERPWD 7.1
+CURLOPT_PROXY_TRANSFER_MODE 7.18.0
+CURLOPT_PUT 7.1
+CURLOPT_QUOTE 7.1
+CURLOPT_RANDOM_FILE 7.7
+CURLOPT_RANGE 7.1
+CURLOPT_READDATA 7.9.7
+CURLOPT_READFUNCTION 7.1
+CURLOPT_REDIR_PROTOCOLS 7.19.4
+CURLOPT_REFERER 7.1
+CURLOPT_RESOLVE 7.21.3
+CURLOPT_RESUME_FROM 7.1
+CURLOPT_RESUME_FROM_LARGE 7.11.0
+CURLOPT_RTSPHEADER 7.20.0
+CURLOPT_RTSP_CLIENT_CSEQ 7.20.0
+CURLOPT_RTSP_REQUEST 7.20.0
+CURLOPT_RTSP_SERVER_CSEQ 7.20.0
+CURLOPT_RTSP_SESSION_ID 7.20.0
+CURLOPT_RTSP_STREAM_URI 7.20.0
+CURLOPT_RTSP_TRANSPORT 7.20.0
+CURLOPT_SEEKDATA 7.18.0
+CURLOPT_SEEKFUNCTION 7.18.0
+CURLOPT_SERVER_RESPONSE_TIMEOUT 7.20.0
+CURLOPT_SHARE 7.10
+CURLOPT_SOCKOPTDATA 7.16.0
+CURLOPT_SOCKOPTFUNCTION 7.16.0
+CURLOPT_SOCKS5_GSSAPI_NEC 7.19.4
+CURLOPT_SOCKS5_GSSAPI_SERVICE 7.19.4
+CURLOPT_SOURCE_HOST 7.12.1 - 7.15.5
+CURLOPT_SOURCE_PATH 7.12.1 - 7.15.5
+CURLOPT_SOURCE_PORT 7.12.1 - 7.15.5
+CURLOPT_SOURCE_POSTQUOTE 7.12.1 - 7.15.5
+CURLOPT_SOURCE_PREQUOTE 7.12.1 - 7.15.5
+CURLOPT_SOURCE_QUOTE 7.13.0 - 7.15.5
+CURLOPT_SOURCE_URL 7.13.0 - 7.15.5
+CURLOPT_SOURCE_USERPWD 7.12.1 - 7.15.5
+CURLOPT_SSH_AUTH_TYPES 7.16.1
+CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 7.17.1
+CURLOPT_SSH_KEYDATA 7.19.6
+CURLOPT_SSH_KEYFUNCTION 7.19.6
+CURLOPT_SSH_KNOWNHOSTS 7.19.6
+CURLOPT_SSH_PRIVATE_KEYFILE 7.16.1
+CURLOPT_SSH_PUBLIC_KEYFILE 7.16.1
+CURLOPT_SSLCERT 7.1
+CURLOPT_SSLCERTPASSWD 7.1.1 7.17.0
+CURLOPT_SSLCERTTYPE 7.9.3
+CURLOPT_SSLENGINE 7.9.3
+CURLOPT_SSLENGINE_DEFAULT 7.9.3
+CURLOPT_SSLKEY 7.9.3
+CURLOPT_SSLKEYPASSWD 7.9.3 7.17.0
+CURLOPT_SSLKEYTYPE 7.9.3
+CURLOPT_SSLVERSION 7.1
+CURLOPT_SSL_CIPHER_LIST 7.9
+CURLOPT_SSL_CTX_DATA 7.10.6
+CURLOPT_SSL_CTX_FUNCTION 7.10.6
+CURLOPT_SSL_OPTIONS 7.25.0
+CURLOPT_SSL_SESSIONID_CACHE 7.16.0
+CURLOPT_SSL_VERIFYHOST 7.8.1
+CURLOPT_SSL_VERIFYPEER 7.4.2
+CURLOPT_STDERR 7.1
+CURLOPT_TCP_KEEPALIVE 7.25.0
+CURLOPT_TCP_KEEPIDLE 7.25.0
+CURLOPT_TCP_KEEPINTVL 7.25.0
+CURLOPT_TCP_NODELAY 7.11.2
+CURLOPT_TELNETOPTIONS 7.7
+CURLOPT_TFTP_BLKSIZE 7.19.4
+CURLOPT_TIMECONDITION 7.1
+CURLOPT_TIMEOUT 7.1
+CURLOPT_TIMEOUT_MS 7.16.2
+CURLOPT_TIMEVALUE 7.1
+CURLOPT_TLSAUTH_PASSWORD 7.21.4
+CURLOPT_TLSAUTH_TYPE 7.21.4
+CURLOPT_TLSAUTH_USERNAME 7.21.4
+CURLOPT_TRANSFERTEXT 7.1.1
+CURLOPT_TRANSFER_ENCODING 7.21.6
+CURLOPT_UNRESTRICTED_AUTH 7.10.4
+CURLOPT_UPLOAD 7.1
+CURLOPT_URL 7.1
+CURLOPT_USERAGENT 7.1
+CURLOPT_USERNAME 7.19.1
+CURLOPT_USERPWD 7.1
+CURLOPT_USE_SSL 7.17.0
+CURLOPT_VERBOSE 7.1
+CURLOPT_WILDCARDMATCH 7.21.0
+CURLOPT_WRITEDATA 7.9.7
+CURLOPT_WRITEFUNCTION 7.1
+CURLOPT_WRITEHEADER 7.1
+CURLOPT_WRITEINFO 7.1
+CURLPAUSE_ALL 7.18.0
+CURLPAUSE_CONT 7.18.0
+CURLPAUSE_RECV 7.18.0
+CURLPAUSE_RECV_CONT 7.18.0
+CURLPAUSE_SEND 7.18.0
+CURLPAUSE_SEND_CONT 7.18.0
+CURLPROTO_ALL 7.19.4
+CURLPROTO_DICT 7.19.4
+CURLPROTO_FILE 7.19.4
+CURLPROTO_FTP 7.19.4
+CURLPROTO_FTPS 7.19.4
+CURLPROTO_GOPHER 7.21.2
+CURLPROTO_HTTP 7.19.4
+CURLPROTO_HTTPS 7.19.4
+CURLPROTO_IMAP 7.20.0
+CURLPROTO_IMAPS 7.20.0
+CURLPROTO_LDAP 7.19.4
+CURLPROTO_LDAPS 7.19.4
+CURLPROTO_POP3 7.20.0
+CURLPROTO_POP3S 7.20.0
+CURLPROTO_RTMP 7.21.0
+CURLPROTO_RTMPE 7.21.0
+CURLPROTO_RTMPS 7.21.0
+CURLPROTO_RTMPT 7.21.0
+CURLPROTO_RTMPTE 7.21.0
+CURLPROTO_RTMPTS 7.21.0
+CURLPROTO_RTSP 7.20.0
+CURLPROTO_SCP 7.19.4
+CURLPROTO_SFTP 7.19.4
+CURLPROTO_SMTP 7.20.0
+CURLPROTO_SMTPS 7.20.0
+CURLPROTO_TELNET 7.19.4
+CURLPROTO_TFTP 7.19.4
+CURLPROXY_HTTP 7.10
+CURLPROXY_HTTP_1_0 7.19.4
+CURLPROXY_SOCKS4 7.10
+CURLPROXY_SOCKS4A 7.18.0
+CURLPROXY_SOCKS5 7.10
+CURLPROXY_SOCKS5_HOSTNAME 7.18.0
+CURLSHE_BAD_OPTION 7.10.3
+CURLSHE_INVALID 7.10.3
+CURLSHE_IN_USE 7.10.3
+CURLSHE_NOMEM 7.12.0
+CURLSHE_NOT_BUILT_IN 7.23.0
+CURLSHE_OK 7.10.3
+CURLSHOPT_LOCKFUNC 7.10.3
+CURLSHOPT_NONE 7.10.3
+CURLSHOPT_SHARE 7.10.3
+CURLSHOPT_UNLOCKFUNC 7.10.3
+CURLSHOPT_UNSHARE 7.10.3
+CURLSHOPT_USERDATA 7.10.3
+CURLSOCKTYPE_ACCEPT 7.28.0
+CURLSOCKTYPE_IPCXN 7.16.0
+CURLSSH_AUTH_AGENT 7.28.0
+CURLSSH_AUTH_ANY 7.16.1
+CURLSSH_AUTH_DEFAULT 7.16.1
+CURLSSH_AUTH_HOST 7.16.1
+CURLSSH_AUTH_KEYBOARD 7.16.1
+CURLSSH_AUTH_NONE 7.16.1
+CURLSSH_AUTH_PASSWORD 7.16.1
+CURLSSH_AUTH_PUBLICKEY 7.16.1
+CURLSSLOPT_ALLOW_BEAST 7.25.0
+CURLUSESSL_ALL 7.17.0
+CURLUSESSL_CONTROL 7.17.0
+CURLUSESSL_NONE 7.17.0
+CURLUSESSL_TRY 7.17.0
+CURLVERSION_FIRST 7.10
+CURLVERSION_FOURTH 7.16.1
+CURLVERSION_NOW 7.10
+CURLVERSION_SECOND 7.11.1
+CURLVERSION_THIRD 7.12.0
+CURL_CHUNK_BGN_FUNC_FAIL 7.21.0
+CURL_CHUNK_BGN_FUNC_OK 7.21.0
+CURL_CHUNK_BGN_FUNC_SKIP 7.21.0
+CURL_CHUNK_END_FUNC_FAIL 7.21.0
+CURL_CHUNK_END_FUNC_OK 7.21.0
+CURL_CSELECT_ERR 7.16.3
+CURL_CSELECT_IN 7.16.3
+CURL_CSELECT_OUT 7.16.3
+CURL_EASY_NONE 7.14.0 - 7.15.4
+CURL_EASY_TIMEOUT 7.14.0 - 7.15.4
+CURL_ERROR_SIZE 7.1
+CURL_FNMATCHFUNC_FAIL 7.21.0
+CURL_FNMATCHFUNC_MATCH 7.21.0
+CURL_FNMATCHFUNC_NOMATCH 7.21.0
+CURL_FORMADD_DISABLED 7.12.1
+CURL_FORMADD_ILLEGAL_ARRAY 7.9.8
+CURL_FORMADD_INCOMPLETE 7.9.8
+CURL_FORMADD_MEMORY 7.9.8
+CURL_FORMADD_NULL 7.9.8
+CURL_FORMADD_OK 7.9.8
+CURL_FORMADD_OPTION_TWICE 7.9.8
+CURL_FORMADD_UNKNOWN_OPTION 7.9.8
+CURL_GLOBAL_ALL 7.8
+CURL_GLOBAL_DEFAULT 7.8
+CURL_GLOBAL_NOTHING 7.8
+CURL_GLOBAL_SSL 7.8
+CURL_GLOBAL_WIN32 7.8.1
+CURL_HTTP_VERSION_1_0 7.9.1
+CURL_HTTP_VERSION_1_1 7.9.1
+CURL_HTTP_VERSION_NONE 7.9.1
+CURL_IPRESOLVE_V4 7.10.8
+CURL_IPRESOLVE_V6 7.10.8
+CURL_IPRESOLVE_WHATEVER 7.10.8
+CURL_LOCK_ACCESS_NONE 7.10.3
+CURL_LOCK_ACCESS_SHARED 7.10.3
+CURL_LOCK_ACCESS_SINGLE 7.10.3
+CURL_LOCK_DATA_CONNECT 7.10.3
+CURL_LOCK_DATA_COOKIE 7.10.3
+CURL_LOCK_DATA_DNS 7.10.3
+CURL_LOCK_DATA_NONE 7.10.3
+CURL_LOCK_DATA_SHARE 7.10.4
+CURL_LOCK_DATA_SSL_SESSION 7.10.3
+CURL_LOCK_TYPE_CONNECT 7.10 - 7.10.2
+CURL_LOCK_TYPE_COOKIE 7.10 - 7.10.2
+CURL_LOCK_TYPE_DNS 7.10 - 7.10.2
+CURL_LOCK_TYPE_NONE 7.10 - 7.10.2
+CURL_LOCK_TYPE_SSL_SESSION 7.10 - 7.10.2
+CURL_MAX_HTTP_HEADER 7.19.7
+CURL_MAX_WRITE_SIZE 7.9.7
+CURL_NETRC_IGNORED 7.9.8
+CURL_NETRC_OPTIONAL 7.9.8
+CURL_NETRC_REQUIRED 7.9.8
+CURL_POLL_IN 7.14.0
+CURL_POLL_INOUT 7.14.0
+CURL_POLL_NONE 7.14.0
+CURL_POLL_OUT 7.14.0
+CURL_POLL_REMOVE 7.14.0
+CURL_PROGRESS_BAR 7.1.1 - 7.4.1
+CURL_PROGRESS_STATS 7.1.1 - 7.4.1
+CURL_READFUNC_ABORT 7.12.1
+CURL_READFUNC_PAUSE 7.18.0
+CURL_REDIR_GET_ALL 7.19.1
+CURL_REDIR_POST_301 7.19.1
+CURL_REDIR_POST_302 7.19.1
+CURL_REDIR_POST_303 7.25.1
+CURL_REDIR_POST_ALL 7.19.1
+CURL_RTSPREQ_ANNOUNCE 7.20.0
+CURL_RTSPREQ_DESCRIBE 7.20.0
+CURL_RTSPREQ_GET_PARAMETER 7.20.0
+CURL_RTSPREQ_NONE 7.20.0
+CURL_RTSPREQ_OPTIONS 7.20.0
+CURL_RTSPREQ_PAUSE 7.20.0
+CURL_RTSPREQ_PLAY 7.20.0
+CURL_RTSPREQ_RECEIVE 7.20.0
+CURL_RTSPREQ_RECORD 7.20.0
+CURL_RTSPREQ_SETUP 7.20.0
+CURL_RTSPREQ_SET_PARAMETER 7.20.0
+CURL_RTSPREQ_TEARDOWN 7.20.0
+CURL_SEEKFUNC_CANTSEEK 7.19.5
+CURL_SEEKFUNC_FAIL 7.19.5
+CURL_SEEKFUNC_OK 7.19.5
+CURL_SOCKET_BAD 7.14.0
+CURL_SOCKET_TIMEOUT 7.14.0
+CURL_SOCKOPT_ALREADY_CONNECTED 7.21.5
+CURL_SOCKOPT_ERROR 7.21.5
+CURL_SOCKOPT_OK 7.21.5
+CURL_SSLVERSION_DEFAULT 7.9.2
+CURL_SSLVERSION_SSLv2 7.9.2
+CURL_SSLVERSION_SSLv3 7.9.2
+CURL_SSLVERSION_TLSv1 7.9.2
+CURL_TIMECOND_IFMODSINCE 7.9.7
+CURL_TIMECOND_IFUNMODSINCE 7.9.7
+CURL_TIMECOND_LASTMOD 7.9.7
+CURL_TIMECOND_NONE 7.9.7
+CURL_TLSAUTH_NONE 7.21.4
+CURL_TLSAUTH_SRP 7.21.4
+CURL_VERSION_ASYNCHDNS 7.10.7
+CURL_VERSION_CONV 7.15.4
+CURL_VERSION_CURLDEBUG 7.19.6
+CURL_VERSION_DEBUG 7.10.6
+CURL_VERSION_GSSNEGOTIATE 7.10.6
+CURL_VERSION_IDN 7.12.0
+CURL_VERSION_IPV6 7.10
+CURL_VERSION_KERBEROS4 7.10
+CURL_VERSION_LARGEFILE 7.11.1
+CURL_VERSION_LIBZ 7.10
+CURL_VERSION_NTLM 7.10.6
+CURL_VERSION_NTLM_WB 7.22.0
+CURL_VERSION_SPNEGO 7.10.8
+CURL_VERSION_SSL 7.10
+CURL_VERSION_SSPI 7.13.2
+CURL_VERSION_TLSAUTH_SRP 7.21.4
+CURL_WAIT_POLLIN 7.28.0
+CURL_WAIT_POLLOUT 7.28.0
+CURL_WAIT_POLLPRI 7.28.0
+CURL_WRITEFUNC_PAUSE 7.18.0
diff --git a/docs/libcurl/symbols.pl b/docs/libcurl/symbols.pl
new file mode 100755
index 000000000..d1ff7a656
--- /dev/null
+++ b/docs/libcurl/symbols.pl
@@ -0,0 +1,100 @@
+#!/usr/bin/perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# Experience has shown that the symbols-in-versions file is very useful to
+# applications that want to build with a wide range of libcurl versions.
+# It is however easy to get it wrong and the source gets a bit messy with all
+# the fixed numerical comparisions.
+#
+# The point of this script is to provide an easy-to-use macro for libcurl-
+# using applications to do preprocessor checks for specific libcurl defines,
+# and yet make the code clearly show what the macro is used for.
+#
+# Run this script and generate libcurl-symbols.h and then use that header in
+# a fashion similar to:
+#
+# #include "libcurl-symbols.h"
+#
+# #if LIBCURL_HAS(CURLOPT_MUTE)
+# has mute
+# #else
+# no mute
+# #endif
+#
+#
+open F, "<symbols-in-versions";
+
+sub str2num {
+ my ($str)=@_;
+ if($str =~ /([0-9]*)\.([0-9]*)\.*([0-9]*)/) {
+ return sprintf("0x%06x", $1<<16 | $2 << 8 | $3);
+ }
+}
+
+print <<EOS
+
+#include <curl/curl.h>
+
+#define LIBCURL_HAS(x) \\
+ (defined(x ## _FIRST) && (x ## _FIRST <= LIBCURL_VERSION_NUM) && \\
+ (!defined(x ## _LAST) || ( x ## _LAST >= LIBCURL_VERSION_NUM)))
+
+EOS
+ ;
+
+while(<F>) {
+ if(/^(CURL[^ ]*)[ \t]*(.*)/) {
+ my ($sym, $vers)=($1, $2);
+
+ my $intr;
+ my $rm;
+ my $dep;
+
+ # is there removed info?
+ if($vers =~ /([\d.]+)[ \t-]+([\d.]+)[ \t]+([\d.]+)/) {
+ ($intr, $dep, $rm)=($1, $2, $3);
+ }
+ # is it a dep-only line?
+ elsif($vers =~ /([\d.]+)[ \t-]+([\d.]+)/) {
+ ($intr, $dep)=($1, $2);
+ }
+ else {
+ $intr = $vers;
+ }
+
+ my $inum = str2num($intr);
+
+ print <<EOS
+#define ${sym}_FIRST $inum /* Added in $intr */
+EOS
+;
+ my $irm = str2num($rm);
+ if($rm) {
+ print <<EOS
+#define ${sym}_LAST $irm /* Last featured in $rm */
+EOS
+;
+ }
+
+ }
+}